2025-08-10 01:34:16 +02:00

147 lines
3.9 KiB
C

#ifndef FHGFSOPSCOMMKIT_H_
#define FHGFSOPSCOMMKIT_H_
#include <common/storage/PathInfo.h>
#ifdef BEEGFS_NVFS
#include <common/storage/RdmaInfo.h>
#endif
#include <os/iov_iter.h>
#include "FhgfsOpsCommKitCommon.h"
struct FileOpState;
typedef struct FileOpState FileOpState;
struct FsyncContext;
bool FhgfsOpsCommKit_initEmergencyPools(void);
void FhgfsOpsCommKit_releaseEmergencyPools(void);
extern void FhgfsOpsCommkit_communicate(App* app, RemotingIOInfo* ioInfo,
struct list_head* targetInfos, const struct CommKitContextOps* ops, void* private);
extern void FhgfsOpsCommKit_readfileV2bCommunicate(App* app, RemotingIOInfo* ioInfo,
struct list_head* states, void (*nextIter)(CommKitContext*, FileOpState*),
void (*prepare)(CommKitContext*, FileOpState*));
extern void FhgfsOpsCommKit_writefileV2bCommunicate(App* app, RemotingIOInfo* ioInfo,
struct list_head* states, void (*nextIter)(CommKitContext*, FileOpState*),
void (*prepare)(CommKitContext*, FileOpState*));
extern void FhgfsOpsCommKit_fsyncCommunicate(App* app, RemotingIOInfo* ioInfo,
struct FsyncContext* context);
extern void FhgfsOpsCommKit_statStorageCommunicate(App* app, struct list_head* targets);
extern void FhgfsOpsCommKit_initFileOpState(FileOpState* state, loff_t offset, size_t size,
uint16_t targetID);
enum CommKitState
{
CommKitState_PREPARE,
CommKitState_SENDHEADER,
CommKitState_SENDDATA,
CommKitState_RECVHEADER,
CommKitState_RECVDATA,
CommKitState_SOCKETINVALIDATE,
CommKitState_CLEANUP,
CommKitState_RETRYWAIT,
CommKitState_DONE,
};
struct CommKitTargetInfo
{
struct list_head targetInfoList;
// (set to _PREPARE in the beginning, assigned by the state-creator)
enum CommKitState state; // the current stage of the individual communication process
// used by GenericResponse handler
struct {
unsigned peerTryAgain:1;
unsigned indirectCommError:1;
unsigned indirectCommErrorNoRetry:1;
} logged;
// assigned by the state-creator
char* headerBuffer; // for serialization
uint16_t targetID;
uint16_t selectedTargetID; // either targetID or the buddy, if useBuddyMirrorSecond
bool useBuddyMirrorSecond; // if buddy mirroring, this msg goes to secondary
// set by _PREPARE handler
Node* node; // target-node reference
Socket* socket; // target-node connection
unsigned headerSize;
// error if negative, other set by specialized actions
int64_t nodeResult;
};
struct FileOpState
{
struct CommKitTargetInfo base;
// data for spefic modes (will be assigned by the corresponding modes)
size_t transmitted; // how much data has been transmitted already
size_t toBeTransmitted; // how much data has to be transmitted
size_t totalSize; // how much data was requested
// data for all modes
// (assigned by the state-creator)
struct iov_iter data;
loff_t offset; // target-node local offset
bool firstWriteDoneForTarget; /* true if a chunk was previously written to this target in
this session; used for the session check */
bool receiveFileData; /* if false, receive the int64 fragment length, else the fragment */
// result data
int64_t expectedNodeResult; // the amount of data that we wanted to read
#ifdef BEEGFS_NVFS
RdmaInfo* rdmap;
#endif
};
struct FsyncContext {
unsigned userID;
bool forceRemoteFlush;
bool checkSession;
bool doSyncOnClose;
struct list_head states;
};
struct FsyncState {
struct CommKitTargetInfo base;
bool firstWriteDoneForTarget;
};
extern void FhgfsOpsCommKit_initFsyncState(struct FsyncContext* context, struct FsyncState* state,
uint16_t targetID);
struct StatStorageState
{
struct CommKitTargetInfo base;
int64_t totalSize;
int64_t totalFree;
};
extern void FhgfsOpsCommKit_initStatStorageState(struct list_head* states,
struct StatStorageState* state, uint16_t targetID);
#endif /*FHGFSOPSCOMMKIT_H_*/