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

78 lines
2.3 KiB
C++

#include "CreateEmptyContDirsMsgEx.h"
#include <program/Program.h>
#include <toolkit/BuddyCommTk.h>
bool CreateEmptyContDirsMsgEx::processIncoming(ResponseContext& ctx)
{
const char* logContext = "CreateEmptyContDirsMsg incoming";
App* app = Program::getApp();
MetaStore* metaStore = app->getMetaStore();
StringList failedIDs;
for (auto iter = items.begin(); iter != items.end(); iter++)
{
const std::string& dirID = std::get<0>(*iter);
const bool isBuddyMirrored = std::get<1>(*iter);
std::string contentsDirStr = MetaStorageTk::getMetaDirEntryPath(
isBuddyMirrored
? app->getBuddyMirrorDentriesPath()->str()
: app->getDentriesPath()->str(), dirID);
// create contents directory
int mkRes = mkdir(contentsDirStr.c_str(), 0755);
if ( mkRes != 0 )
{ // error
LOG(GENERAL, ERR, "Unable to create contents directory.", contentsDirStr, sysErr);
failedIDs.push_back(dirID);
continue;
}
// create the dirEntryID directory, which allows access to inlined inodes via dirID access
std::string contentsDirIDStr = MetaStorageTk::getMetaDirEntryIDPath(contentsDirStr);
int mkDirIDRes = mkdir(contentsDirIDStr.c_str(), 0755);
if ( mkDirIDRes != 0 )
{ // error
LOG(GENERAL, ERR, "Unable to create dirEntryID directory.", contentsDirIDStr, sysErr);
failedIDs.push_back(dirID);
continue;
}
FileIDLock lock;
if (isBuddyMirrored)
lock = {Program::getApp()->getMirroredSessions()->getEntryLockStore(), dirID, true};
// update the dir attribs
DirInode* dirInode = metaStore->referenceDir(dirID, isBuddyMirrored, true);
if (!dirInode)
{
LOG(GENERAL, ERR, "Unable to reference directory.", dirID);
failedIDs.push_back(dirID);
continue;
}
FhgfsOpsErr refreshRes = dirInode->refreshMetaInfo();
if (refreshRes != FhgfsOpsErr_SUCCESS)
{
LogContext(logContext).log(Log_NOTICE, "Unable to refresh contents directory metadata: "
+ contentsDirStr + ". " + "SysErr: " + System::getErrString());
}
metaStore->releaseDir(dirID);
}
ctx.sendResponse(CreateEmptyContDirsRespMsg(&failedIDs) );
return true;
}