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

61 lines
1.8 KiB
C++

#include "DeleteChunksMsgEx.h"
#include <program/Program.h>
#include <toolkit/StorageTkEx.h>
bool DeleteChunksMsgEx::processIncoming(ResponseContext& ctx)
{
const char* logContext = "DeleteChunksMsg incoming";
App* app = Program::getApp();
ChunkStore* chunkDirStore = app->getChunkDirStore();
FsckChunkList& chunks = getChunks();
FsckChunkList failedDeletes;
for ( FsckChunkListIter iter = chunks.begin(); iter != chunks.end(); iter++ )
{
std::string chunkDirRelative;
std::string delPathStrRelative;
bool isMirrorFD = iter->getBuddyGroupID();
chunkDirRelative = iter->getSavedPath()->str();
delPathStrRelative = chunkDirRelative + "/" + iter->getID();
auto* const target = app->getStorageTargets()->getTarget(iter->getTargetID());
if (!target)
{ // unknown targetID
LogContext(logContext).logErr(std::string("Unknown targetID: ") +
StringTk::uintToStr(iter->getTargetID()));
failedDeletes.push_back(*iter);
}
else
{ // valid targetID
int targetFD = isMirrorFD ? *target->getMirrorFD() : *target->getChunkFD();
int unlinkRes = unlinkat(targetFD, delPathStrRelative.c_str(), 0);
if ( (unlinkRes == -1) && (errno != ENOENT) )
{ // error
LogContext(logContext).logErr(
"Unable to unlink file: " + delPathStrRelative + ". " + "SysErr: "
+ System::getErrString());
failedDeletes.push_back(*iter);
}
// Now try to rmdir chunkDirPath (checks if it is empty)
if (unlinkRes == 0)
{
Path chunkDirRelativeVec(chunkDirRelative);
chunkDirStore->rmdirChunkDirPath(targetFD, &chunkDirRelativeVec);
}
}
}
ctx.sendResponse(DeleteChunksRespMsg(&failedDeletes) );
return true;
}