beegfs/meta/source/net/message/fsck/DeleteDirEntriesMsgEx.cpp
2025-08-10 01:34:16 +02:00

67 lines
2.0 KiB
C++

#include "DeleteDirEntriesMsgEx.h"
#include <program/Program.h>
#include <common/fsck/FsckDirEntry.h>
#include <toolkit/BuddyCommTk.h>
#include <boost/lexical_cast.hpp>
bool DeleteDirEntriesMsgEx::processIncoming(ResponseContext& ctx)
{
LogContext log("DeleteDirEntriesMsgEx");
MetaStore* metaStore = Program::getApp()->getMetaStore();
EntryLockStore* entryLockStore = Program::getApp()->getMirroredSessions()->getEntryLockStore();
FsckDirEntryList& entries = getEntries();
FsckDirEntryList failedEntries;
for ( FsckDirEntryListIter iter = entries.begin(); iter != entries.end(); iter++ )
{
const std::string& parentID = iter->getParentDirID();
const std::string& entryName = iter->getName();
FsckDirEntryType dirEntryType = iter->getEntryType();
FileIDLock dirLock;
ParentNameLock dentryLock;
if (iter->getIsBuddyMirrored())
{
dirLock = {entryLockStore, parentID, true};
dentryLock = {entryLockStore, parentID, entryName};
}
DirInode* parentDirInode = metaStore->referenceDir(parentID, iter->getIsBuddyMirrored(),
true);
if (!parentDirInode)
{
log.log(3,"Failed to delete directory entry; ParentID: " + parentID + "; EntryName: " +
entryName + " - ParentID does not exist");
failedEntries.push_back(*iter);
continue;
}
FhgfsOpsErr unlinkRes;
if (FsckDirEntryType_ISDIR(dirEntryType))
unlinkRes = parentDirInode->removeDir(entryName, NULL);
else
unlinkRes = parentDirInode->unlinkDirEntry(entryName, NULL,
DirEntry_UNLINK_ID_AND_FILENAME);
metaStore->releaseDir(parentID);
if (unlinkRes != FhgfsOpsErr_SUCCESS )
{
log.logErr("Failed to delete directory entry; ParentID: " + parentID + "; EntryName: " +
entryName + "; Err: " + boost::lexical_cast<std::string>(unlinkRes));
failedEntries.push_back(*iter);
}
}
ctx.sendResponse(DeleteDirEntriesRespMsg(&failedEntries) );
return true;
}