#pragma once #include #include #include #include class ChunkBalancerJob; class ChunkBalanceMsgResponseState : public ErrorCodeResponseState { public: ChunkBalanceMsgResponseState() : ErrorCodeResponseState(FhgfsOpsErr_INTERNAL) { } ChunkBalanceMsgResponseState(ChunkBalanceMsgResponseState&& other) : ErrorCodeResponseState(other.result) { } /* // Always return false from changeObservableState() to prohibit forwarding // to secondary. See MirroredMessage::finishOperation() for more details. */ bool changesObservableState() const override { return false; } void setResult(FhgfsOpsErr result) { this->result = result; } private: FhgfsOpsErr result; }; class ChunkBalanceMsgEx : public MirroredMessage { public: typedef ChunkBalanceMsgResponseState ResponseState; virtual bool processIncoming(ResponseContext& ctx) override; std::unique_ptr executeLocally(ResponseContext& ctx, bool isSecondary) override; FileIDLock lock(EntryLockStore& store) override; bool isMirrored() override { return getEntryInfo()->getIsBuddyMirrored(); } private: Mutex ChunkBalanceJobMutex; ChunkBalancerJob* addChunkBalanceJob(); void forwardToSecondary(ResponseContext& ctx) override {}; FhgfsOpsErr processSecondaryResponse(NetMessage& resp) override { return FhgfsOpsErr_SUCCESS; } const char* mirrorLogContext() const override { return "ChunkBalanceMsgEx/forward"; } };