#pragma once #include #include #include #include #include #include #include #include #include class BuddyResyncerBulkSyncSlave; class BuddyResyncerModSyncSlave; class BuddyResyncJob : public PThread { public: BuddyResyncJob(); ~BuddyResyncJob(); virtual void run(); void abort(bool wait_for_completion); MetaBuddyResyncJobStatistics getJobStats(); std::atomic threadCount{ 0 }; private: BuddyResyncJobState state; Mutex stateMutex; int64_t startTime; int64_t endTime; NumNodeID buddyNodeID; MetaSyncCandidateStore syncCandidates; std::unique_ptr gatherSlave; std::vector> bulkSyncSlaves; std::unique_ptr modSyncSlave; std::unique_ptr sessionStoreResyncer; bool startGatherSlaves(); bool startSyncSlaves(); void joinGatherSlaves(); public: BuddyResyncJobState getState() { std::lock_guard lock(stateMutex); return state; } bool isRunning() { std::lock_guard lock(stateMutex); return state == BuddyResyncJobState_RUNNING; } void enqueue(MetaSyncCandidateFile syncCandidate, PThread* caller) { syncCandidates.add(std::move(syncCandidate), caller); } void registerOps() { this->threadCount += 1; } void unregisterOps() { this->threadCount -= 1; } private: void setState(const BuddyResyncJobState state) { LOG_DEBUG(__func__, Log_DEBUG, "Setting state: " + StringTk::uintToStr(static_cast(state) ) ); std::lock_guard lock(stateMutex); this->state = state; } TargetConsistencyState newBuddyState(); void informBuddy(const TargetConsistencyState newTargetState); void informMgmtd(const TargetConsistencyState newTargetState); void stopAllWorkersOn(Barrier& barrier); };