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

54 lines
1.6 KiB
C++

#include "FetchFsckChunkListMsgEx.h"
#include <program/Program.h>
bool FetchFsckChunkListMsgEx::processIncoming(ResponseContext& ctx)
{
App* app = Program::getApp();
ChunkFetcher* chunkFetcher = app->getChunkFetcher();
FetchFsckChunkListStatus status;
FsckChunkList chunkList;
if (getLastStatus() == FetchFsckChunkListStatus_NOTSTARTED)
{
// This is the first message of a new Fsck run
if (chunkFetcher->getNumRunning() != 0 || !chunkFetcher->isQueueEmpty())
{
// another fsck is already in progress
if (!getForceRestart())
{
LOG(GENERAL, NOTICE, "Received request to start fsck although previous run is not finished. "
"Not starting.", ("From", ctx.peerName()));
ctx.sendResponse(FetchFsckChunkListRespMsg(&chunkList,
FetchFsckChunkListStatus_NOTSTARTED));
return true;
}
else
{
LOG(GENERAL, NOTICE, "Aborting previous fsck chunk fetcher run by user request.",
("From", ctx.peerName()));
chunkFetcher->stopFetching();
chunkFetcher->waitForStopFetching();
}
}
chunkFetcher->startFetching();
}
if(chunkFetcher->getIsBad())
status = FetchFsckChunkListStatus_READERROR;
else if (chunkFetcher->getNumRunning() == 0)
status = FetchFsckChunkListStatus_FINISHED;
else
status = FetchFsckChunkListStatus_RUNNING;
chunkFetcher->getAndDeleteChunks(chunkList, getMaxNumChunks());
ctx.sendResponse(FetchFsckChunkListRespMsg(&chunkList, status));
return true;
}