beegfs/meta/source/net/message/session/GetFileVersionMsgEx.h
2025-08-10 01:34:16 +02:00

75 lines
2.4 KiB
C++

#pragma once
#include <common/net/message/session/GetFileVersionMsg.h>
#include <common/net/message/session/GetFileVersionRespMsg.h>
#include <common/net/message/session/GetFileVersionRespMsg.h>
#include <net/message/MirroredMessage.h>
class GetFileVersionMsgResponseState : public MirroredMessageResponseState
{
public:
GetFileVersionMsgResponseState() : result(FhgfsOpsErr_INTERNAL), version(0)
{
}
GetFileVersionMsgResponseState(GetFileVersionMsgResponseState&& other) :
result(other.result),
version(other.version)
{
}
void sendResponse(NetMessage::ResponseContext& ctx) override
{
GetFileVersionRespMsg resp(result, version);
ctx.sendResponse(resp);
}
// GetFileVersionMsgEx is transformed into a mirrored message to leverage
// MirroredMessage::lock(), preventing races with operations such as unlink.
// However, forwarding this message to the secondary is unnecessary.
// Overriding the changeObservableState() function to always return false ensures
// that this message is never forwarded unnecessarily.
bool changesObservableState() const override
{
return false;
}
void setGetFileVersionResult(FhgfsOpsErr result) { this->result = result; }
void setFileVersion(uint32_t version) { this->version = version; }
protected:
uint32_t serializerTag() const override { return NETMSGTYPE_GetFileVersion; }
void serializeContents(Serializer& ser) const override {}
private:
FhgfsOpsErr result;
uint32_t version;
};
class GetFileVersionMsgEx : public MirroredMessage<GetFileVersionMsg, FileIDLock>
{
public:
typedef GetFileVersionMsgResponseState ResponseState;
virtual bool processIncoming(ResponseContext& ctx) override;
FileIDLock lock(EntryLockStore& store) override;
bool isMirrored() override
{
return getEntryInfo().getIsBuddyMirrored();
}
private:
private:
std::unique_ptr<MirroredMessageResponseState> executeLocally(ResponseContext& ctx,
bool isSecondary) override;
void forwardToSecondary(ResponseContext& ctx) override {}
FhgfsOpsErr processSecondaryResponse(NetMessage& resp) override
{
return FhgfsOpsErr_SUCCESS;
}
const char* mirrorLogContext() const override { return "GetFileVersionMsgEx/forward"; }
};