#include #include #include #include #include #include "MovingDirInsertMsgEx.h" bool MovingDirInsertMsgEx::processIncoming(ResponseContext& ctx) { rctx = &ctx; return BaseType::processIncoming(ctx); } std::unique_ptr MovingDirInsertMsgEx::executeLocally( ResponseContext& ctx, bool isSecondary) { MetaStore* metaStore = Program::getApp()->getMetaStore(); FhgfsOpsErr retVal; EntryInfo* toDirInfo = this->getToDirInfo(); // reference parent DirInode* parentDir = metaStore->referenceDir(toDirInfo->getEntryID(), toDirInfo->getIsBuddyMirrored(), true); if(!parentDir) return boost::make_unique(FhgfsOpsErr_PATHNOTEXISTS); /* create dir-entry and add information about its inode from the given buffer */ const std::string& newName = this->getNewName(); const char* buf = this->getSerialBuf(); Deserializer des(buf, getSerialBufLen()); DirEntry newDirEntry(newName); newDirEntry.deserializeDentry(des); if (!des.good()) { LogContext("File rename").logErr("Bug: Deserialization of remote buffer failed. Are all " "meta servers running the same version?" ); retVal = FhgfsOpsErr_INTERNAL; goto out; } if (newDirEntry.getEntryID() == parentDir->getID() ) { // attempt to rename a dir into itself retVal = FhgfsOpsErr_INVAL; goto out; } retVal = parentDir->makeDirEntry(newDirEntry); if (retVal == FhgfsOpsErr_SUCCESS && shouldFixTimestamps()) fixInodeTimestamp(*parentDir, dirTimestamps); if (retVal != FhgfsOpsErr_SUCCESS && retVal != FhgfsOpsErr_EXISTS) retVal = FhgfsOpsErr_INTERNAL; out: metaStore->releaseDir(toDirInfo->getEntryID()); return boost::make_unique(retVal); } void MovingDirInsertMsgEx::forwardToSecondary(ResponseContext& ctx) { sendToSecondary(ctx, *this, NETMSGTYPE_MovingDirInsertResp); }