#pragma once #include #include #include #include #include #include #include class OpenFileResponseState : public MirroredMessageResponseState { public: OpenFileResponseState() : isIndirectCommErr(true) { } explicit OpenFileResponseState(Deserializer& des) { serialize(this, des); } OpenFileResponseState(FhgfsOpsErr result, const std::string& fileHandleID, const StripePattern& pattern, const PathInfo& pathInfo, uint32_t fileVersion) : isIndirectCommErr(false), result(result), fileHandleID(fileHandleID), pattern(pattern.clone()), pathInfo(pathInfo), fileVersion(fileVersion) { } void sendResponse(NetMessage::ResponseContext& ctx) override { if (isIndirectCommErr) ctx.sendResponse( GenericResponseMsg( GenericRespMsgCode_INDIRECTCOMMERR, "Communication with storage targets failed")); else ctx.sendResponse( OpenFileRespMsg( result, fileHandleID, pattern.get(), &pathInfo, fileVersion)); } bool changesObservableState() const override { return !isIndirectCommErr && result == FhgfsOpsErr_SUCCESS; } protected: uint32_t serializerTag() const override { return NETMSGTYPE_OpenFile; } template static void serialize(This* obj, Ctx& ctx) { ctx % obj->isIndirectCommErr; if (!obj->isIndirectCommErr) ctx % serdes::as(obj->result) % obj->fileHandleID % obj->pattern % obj->pathInfo; } void serializeContents(Serializer& ser) const override { serialize(this, ser); } private: bool isIndirectCommErr; FhgfsOpsErr result; std::string fileHandleID; std::unique_ptr pattern; PathInfo pathInfo; uint32_t fileVersion; }; class OpenFileMsgEx : public MirroredMessage { public: typedef OpenFileResponseState ResponseState; bool processIncoming(ResponseContext& ctx) override; FileIDLock lock(EntryLockStore& store) override; std::unique_ptr executeLocally(ResponseContext& ctx, bool isSecondary) override; void forwardToSecondary(ResponseContext& ctx) override; bool isMirrored() override { return getEntryInfo()->getIsBuddyMirrored(); } private: FhgfsOpsErr processSecondaryResponse(NetMessage& resp) override { return (FhgfsOpsErr) static_cast(resp).getResult(); } const char* mirrorLogContext() const override { return "OpenFileMsgEx/forward"; } std::string fileHandleID; };