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

116 lines
3.0 KiB
C++

#pragma once
#include <common/net/message/control/GenericResponseMsg.h>
#include <common/storage/EntryInfo.h>
class MirroredMessageResponseState
{
public:
virtual ~MirroredMessageResponseState()
{
}
virtual void sendResponse(NetMessage::ResponseContext& ctx) = 0;
virtual bool changesObservableState() const = 0;
void serialize(Serializer& ser) const;
static std::unique_ptr<MirroredMessageResponseState> deserialize(Deserializer& des);
protected:
virtual uint32_t serializerTag() const = 0;
virtual void serializeContents(Serializer& ser) const = 0;
};
template<typename RespMsgT, uint32_t SerializerTag>
class ErrorCodeResponseState : public MirroredMessageResponseState
{
public:
explicit ErrorCodeResponseState(Deserializer& des)
{
des % serdes::as<int32_t>(result);
}
explicit ErrorCodeResponseState(FhgfsOpsErr result) : result(result) {}
void sendResponse(NetMessage::ResponseContext& ctx) override
{
if (result == FhgfsOpsErr_COMMUNICATION)
ctx.sendResponse(
GenericResponseMsg(
GenericRespMsgCode_INDIRECTCOMMERR,
"Communication with storage targets failed"));
else
ctx.sendResponse(RespMsgT(result));
}
bool changesObservableState() const override
{
return result == FhgfsOpsErr_SUCCESS;
}
FhgfsOpsErr getResult() const { return result; }
protected:
uint32_t serializerTag() const override { return SerializerTag; }
void serializeContents(Serializer& ser) const override
{
ser % serdes::as<int32_t>(result);
}
private:
FhgfsOpsErr result;
};
template<typename RespMsgT, uint32_t SerializerTag>
class ErrorAndEntryResponseState : public MirroredMessageResponseState
{
public:
explicit ErrorAndEntryResponseState(Deserializer& des)
{
des
% serdes::as<int32_t>(result)
% info;
}
ErrorAndEntryResponseState(FhgfsOpsErr result, EntryInfo info)
: result(result), info(std::move(info))
{
}
void sendResponse(NetMessage::ResponseContext& ctx) override
{
if (result == FhgfsOpsErr_COMMUNICATION)
ctx.sendResponse(
GenericResponseMsg(
GenericRespMsgCode_INDIRECTCOMMERR,
"Communication with storage targets failed"));
else
ctx.sendResponse(RespMsgT(result, &info));
}
bool changesObservableState() const override
{
return result == FhgfsOpsErr_SUCCESS;
}
FhgfsOpsErr getResult() const { return result; }
protected:
uint32_t serializerTag() const override { return SerializerTag; }
void serializeContents(Serializer& ser) const override
{
ser
% serdes::as<int32_t>(result)
% info;
}
private:
FhgfsOpsErr result;
EntryInfo info;
};