Commit b5907694 authored by Ramon Nou's avatar Ramon Nou
Browse files

Solve race conditions

parent f077366c
Loading
Loading
Loading
Loading
Loading
+11 −4
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@
#include <iostream>
#include <iomanip>
#include <fstream>
#include <atomic>
#include <mutex>
#include <config.hpp>


@@ -115,11 +117,14 @@ private:
            start; ///< When we started the server


    std::map<IopsOp, unsigned long>
    std::map<IopsOp, std::atomic<unsigned long>>
            IOPS; ///< Stores total value for global mean
    std::map<SizeOp, unsigned long>
    std::map<SizeOp, std::atomic<unsigned long>>
            SIZE; ///< Stores total value for global mean

    std::mutex time_iops_mutex;
    std::mutex size_iops_mutex;

    std::map<IopsOp,
             std::deque<std::chrono::time_point<std::chrono::steady_clock>>>
            TimeIops; ///< Stores timestamp when an operation comes removes if
@@ -152,9 +157,11 @@ private:
    void
    output(std::chrono::seconds d, std::string file_output);

    std::map<std::pair<std::string, unsigned long long>, unsigned int>
    std::map<std::pair<std::string, unsigned long long>,
             std::atomic<unsigned int>>
            chunkRead; ///< Stores the number of times a chunk/file is read
    std::map<std::pair<std::string, unsigned long long>, unsigned int>
    std::map<std::pair<std::string, unsigned long long>,
             std::atomic<unsigned int>>
            chunkWrite; ///< Stores the number of times a chunk/file is write

    /**
+6 −3
Original line number Diff line number Diff line
@@ -143,11 +143,11 @@ Stats::output_map(std::ofstream& output) {
    map<unsigned int, std::set<pair<std::string, unsigned long long>>>
            orderRead;

    for(auto i : chunkRead) {
    for(const auto& i : chunkRead) {
        orderRead[i.second].insert(i.first);
    }

    for(auto i : chunkWrite) {
    for(const auto& i : chunkWrite) {
        orderWrite[i.second].insert(i.first);
    }

@@ -174,7 +174,7 @@ Stats::add_value_iops(enum IopsOp iop) {
    IOPS[iop]++;
    auto now = std::chrono::steady_clock::now();


    const std::lock_guard<std::mutex> lock(time_iops_mutex);
    if((now - TimeIops[iop].front()) > std::chrono::duration(10s)) {
        TimeIops[iop].pop_front();
    } else if(TimeIops[iop].size() >= gkfs::config::stats::max_stats)
@@ -192,6 +192,7 @@ void
Stats::add_value_size(enum SizeOp iop, unsigned long long value) {
    auto now = std::chrono::steady_clock::now();
    SIZE[iop] += value;
    const std::lock_guard<std::mutex> lock(size_iops_mutex);
    if((now - TimeSize[iop].front().first) > std::chrono::duration(10s)) {
        TimeSize[iop].pop_front();
    } else if(TimeSize[iop].size() >= gkfs::config::stats::max_stats)
@@ -237,6 +238,7 @@ std::vector<double>
Stats::get_four_means(enum SizeOp sop) {
    std::vector<double> results = {0, 0, 0, 0};
    auto now = std::chrono::steady_clock::now();
    const std::lock_guard<std::mutex> lock(size_iops_mutex);
    for(auto e : TimeSize[sop]) {
        auto duration =
                std::chrono::duration_cast<std::chrono::minutes>(now - e.first)
@@ -266,6 +268,7 @@ std::vector<double>
Stats::get_four_means(enum IopsOp iop) {
    std::vector<double> results = {0, 0, 0, 0};
    auto now = std::chrono::steady_clock::now();
    const std::lock_guard<std::mutex> lock(time_iops_mutex);
    for(auto e : TimeIops[iop]) {
        auto duration =
                std::chrono::duration_cast<std::chrono::minutes>(now - e)