beegfs/meta/source/net/message/storage/creating/RmDirEntryMsgEx.cpp
2025-08-10 01:34:16 +02:00

68 lines
1.8 KiB
C++

#include <program/Program.h>
#include <common/net/message/storage/creating/RmDirEntryRespMsg.h>
#include <common/toolkit/MessagingTk.h>
#include "RmDirEntryMsgEx.h"
bool RmDirEntryMsgEx::processIncoming(ResponseContext& ctx)
{
EntryInfo* parentInfo = getParentInfo();
std::string entryName = getEntryName();
FhgfsOpsErr rmRes = rmDirEntry(parentInfo, entryName);
ctx.sendResponse(RmDirEntryRespMsg(rmRes) );
App* app = Program::getApp();
app->getNodeOpStats()->updateNodeOp(ctx.getSocket()->getPeerIP(), MetaOpCounter_RMLINK,
getMsgHeaderUserID() );
return true;
}
FhgfsOpsErr RmDirEntryMsgEx::rmDirEntry(EntryInfo* parentInfo, std::string& entryName)
{
const char* logContext = "RmDirEntryMsg (rm entry)";
MetaStore* metaStore = Program::getApp()->getMetaStore();
FhgfsOpsErr retVal;
// reference parent
DirInode* parentDir = metaStore->referenceDir(parentInfo->getEntryID(),
parentInfo->getIsBuddyMirrored(), true);
if(!parentDir)
return FhgfsOpsErr_PATHNOTEXISTS;
DirEntry removeDentry(entryName);
bool getRes = parentDir->getDentry(entryName, removeDentry);
if(!getRes)
retVal = FhgfsOpsErr_PATHNOTEXISTS;
else
{
if(DirEntryType_ISDIR(removeDentry.getEntryType() ) )
{ // remove dir link
retVal = parentDir->removeDir(entryName, NULL);
}
else
if(DirEntryType_ISFILE(removeDentry.getEntryType() ) )
{
retVal = parentDir->unlinkDirEntry(entryName, &removeDentry,
DirEntry_UNLINK_ID_AND_FILENAME);
}
else
{ // unknown entry type
LogContext(logContext).logErr(std::string("Unknown entry type: ") +
StringTk::intToStr(removeDentry.getEntryType() ) );
retVal = FhgfsOpsErr_INTERNAL;
}
}
// clean-up
metaStore->releaseDir(parentInfo->getEntryID() );
return retVal;
}