#pragma once #include #include #include #include class UnlinkFileMsgEx : public MirroredMessage> { public: typedef ErrorCodeResponseState ResponseState; virtual bool processIncoming(ResponseContext& ctx) override; std::tuple lock(EntryLockStore& store) override; std::unique_ptr executeLocally(ResponseContext& ctx, bool isSecondary) override; bool isMirrored() override { return getParentInfo()->getIsBuddyMirrored(); } private: /** * Execute unlink operation on primary and secondary metadata nodes. * Primary handles metadata removal, chunk cleanup, and event logging. * Secondary handles only metadata operations. * * @param ctx Response context * @param dir Parent directory reference. Functions guarantee directory reference * release before return, including error paths. * @return Response state containing operation result. */ std::unique_ptr executePrimary(ResponseContext& ctx, DirInode& dir); std::unique_ptr executeSecondary(ResponseContext& ctx, DirInode& dir); void forwardToSecondary(ResponseContext& ctx) override; FhgfsOpsErr processSecondaryResponse(NetMessage& resp) override { return (FhgfsOpsErr) static_cast(resp).getValue(); } const char* mirrorLogContext() const override { return "UnlinkFileMsgEx/forward"; } };