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

68 lines
1.7 KiB
C++

#pragma once
#include <common/storage/mirroring/SyncCandidateStore.h>
#include <common/threading/PThread.h>
#include <common/storage/StorageErrors.h>
#include <common/nodes/Node.h>
#include <app/App.h>
#include <components/buddyresyncer/SyncCandidate.h>
#include "SyncSlaveBase.h"
class DirEntry;
class BuddyResyncerBulkSyncSlave : public SyncSlaveBase
{
friend class BuddyResyncer;
friend class BuddyResyncJob;
public:
BuddyResyncerBulkSyncSlave(BuddyResyncJob& parentJob, MetaSyncCandidateStore* syncCandidates, uint8_t slaveID,
const NumNodeID& buddyNodeID);
struct Stats
{
uint64_t dirsSynced;
uint64_t filesSynced;
uint64_t dirErrors;
uint64_t fileErrors;
};
Stats getStats()
{
return Stats{ numDirsSynced.read(), numFilesSynced.read(),
numDirErrors.read(), numFileErrors.read() };
}
private:
MetaSyncCandidateStore* syncCandidates;
AtomicUInt64 numDirsSynced;
AtomicUInt64 numFilesSynced;
AtomicUInt64 numDirErrors;
AtomicUInt64 numFileErrors;
void syncLoop();
FhgfsOpsErr resyncDirectory(const MetaSyncCandidateDir& root, const std::string& inodeID);
FhgfsOpsErr streamCandidateDir(Socket& socket, const MetaSyncCandidateDir& candidate,
const std::string& inodeID);
private:
typedef std::tuple<
BuddyResyncerBulkSyncSlave&,
const MetaSyncCandidateDir&,
const std::string&> StreamCandidateArgs;
static FhgfsOpsErr streamCandidateDir(Socket* socket, void* context)
{
using std::get;
auto& args = *(StreamCandidateArgs*) context;
return get<0>(args).streamCandidateDir(*socket, get<1>(args), get<2>(args));
}
};