beegfs/meta/source/components/buddyresyncer/BuddyResyncerGatherSlave.h
2025-08-10 01:34:16 +02:00

74 lines
1.7 KiB
C++

#pragma once
#include <common/app/log/LogContext.h>
#include <common/threading/PThread.h>
#include <components/buddyresyncer/SyncCandidate.h>
#include <mutex>
class BuddyResyncerGatherSlave : public PThread
{
// Grant access to internal mutex
friend class BuddyResyncer;
friend class BuddyResyncJob;
public:
BuddyResyncerGatherSlave(MetaSyncCandidateStore* syncCandidates);
void workLoop();
private:
Mutex stateMutex;
Condition isRunningChangeCond;
AtomicUInt64 numDirsDiscovered;
AtomicUInt64 numErrors;
std::string metaBuddyPath;
bool isRunning;
MetaSyncCandidateStore* syncCandidates;
virtual void run();
void crawlDir(const std::string& path, const MetaSyncDirType type, const unsigned level = 0);
public:
bool getIsRunning()
{
std::lock_guard<Mutex> lock(stateMutex);
return this->isRunning;
}
struct Stats
{
uint64_t dirsDiscovered;
uint64_t errors;
};
Stats getStats()
{
return Stats{ numDirsDiscovered.read(), numErrors.read() };
}
private:
void setIsRunning(const bool isRunning)
{
std::lock_guard<Mutex> lock(stateMutex);
this->isRunning = isRunning;
isRunningChangeCond.broadcast();
}
void addCandidate(const std::string& path, const MetaSyncDirType type)
{
const std::string& relPath = path.substr(metaBuddyPath.size() + 1);
syncCandidates->add(MetaSyncCandidateDir(relPath, type), this);
}
};
typedef std::vector<BuddyResyncerGatherSlave*> BuddyResyncerGatherSlaveVec;
typedef BuddyResyncerGatherSlaveVec::iterator BuddyResyncerGatherSlaveVecIter;