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

145 lines
4.3 KiB
C

#ifndef REMOTINGIOINFO_H_
#define REMOTINGIOINFO_H_
#include <common/Common.h>
#include <common/storage/PathInfo.h>
#include <common/storage/striping/StripePattern.h>
#include <toolkit/BitStore.h>
#include <app/App.h>
struct RemotingIOInfo;
typedef struct RemotingIOInfo RemotingIOInfo;
// inliners
static inline void RemotingIOInfo_initOpen(App* app, unsigned accessFlags,
AtomicInt* pMaxUsedTargetIndex, PathInfo* pathInfo, RemotingIOInfo* outIOInfo);
static inline void RemotingIOInfo_initSpecialClose(App* app, const char* fileHandleID,
AtomicInt* maxUsedTargetIndex, unsigned accessFlags, RemotingIOInfo* outIOInfo);
static inline void RemotingIOInfo_freeVals(RemotingIOInfo* outIOInfo);
static inline size_t RemotingIOInfo_getNumPagesPerStripe(RemotingIOInfo* ioInfo);
static inline size_t RemotingIOInfo_getNumPagesPerChunk(RemotingIOInfo* ioInfo);
struct RemotingIOInfo
{
App* app;
const char* fileHandleID;
struct StripePattern* pattern;
PathInfo* pathInfo;
unsigned accessFlags; // OPENFILE_ACCESS_... flags
// pointers to fhgfsInode->fileHandles[handleType]...
bool* needsAppendLockCleanup; // (note: can be NULL in some cases, implies "false")
AtomicInt* maxUsedTargetIndex;
BitStore* firstWriteDone;
unsigned userID; // only used in storage server write message
unsigned groupID; // only used in storage server write message
#ifdef BEEGFS_NVFS
bool nvfs;
#endif
};
/**
* Prepares a RemotingIOInfo for Remoting_openfile().
*
* Note: Be careful with this. This is only useful in very special cases (e.g. stateless file IO,
* when you call FhgfsOpsRemoting_openfile() directly). Some values like userID also need to be
* set manually in these cases.
* You will typically rather go through the inode and thus use FhgfsInode_referenceHandle().
*
* @param accessFlags OPENFILE_ACCESS_... flags
* @param maxUsedTargetIndex may be NULL for open, but in case you will use the ioInfo also for
* IO, you will probably want to set it.
*/
void RemotingIOInfo_initOpen(App* app, unsigned accessFlags, AtomicInt* maxUsedTargetIndex,
PathInfo* pathInfo, RemotingIOInfo* outIOInfo)
{
outIOInfo->app = app;
outIOInfo->fileHandleID = NULL;
outIOInfo->pattern = NULL;
outIOInfo->pathInfo = pathInfo;
outIOInfo->accessFlags = accessFlags;
outIOInfo->needsAppendLockCleanup = NULL;
outIOInfo->maxUsedTargetIndex = maxUsedTargetIndex;
outIOInfo->firstWriteDone = NULL;
outIOInfo->userID = 0;
outIOInfo->groupID = 0;
#ifdef BEEGFS_NVFS
outIOInfo->nvfs = false;
#endif
}
/**
* Initialize RemotingIOInfo for close only. This is used for very special failures in
* atomic_open and lookup_open.
*/
void RemotingIOInfo_initSpecialClose(App* app, const char* fileHandleID,
AtomicInt* maxUsedTargetIndex, unsigned accessFlags, RemotingIOInfo* outIOInfo)
{
outIOInfo->app = app;
outIOInfo->fileHandleID = fileHandleID;
outIOInfo->pattern = NULL;
outIOInfo->pathInfo = NULL;
outIOInfo->accessFlags = accessFlags;
outIOInfo->needsAppendLockCleanup = NULL;
outIOInfo->maxUsedTargetIndex = maxUsedTargetIndex;
outIOInfo->firstWriteDone = NULL;
outIOInfo->userID = 0;
outIOInfo->groupID = 0;
#ifdef BEEGFS_NVFS
outIOInfo->nvfs = false;
#endif
}
/**
* Note: Be careful with this. This is only useful in very special cases (e.g. stateless file IO,
* when you called Remoting_openfile() directly). You will typically rather use the
* FhgfsInode_referenceHandle() & Co routines.
*/
void RemotingIOInfo_freeVals(RemotingIOInfo* outIOInfo)
{
SAFE_DESTRUCT(outIOInfo->pattern, StripePattern_virtualDestruct);
SAFE_KFREE(outIOInfo->fileHandleID);
if (outIOInfo->pathInfo)
PathInfo_uninit(outIOInfo->pathInfo);
}
/**
* Return the number of pages per stripe
*/
size_t RemotingIOInfo_getNumPagesPerStripe(RemotingIOInfo* ioInfo)
{
StripePattern* pattern = ioInfo->pattern;
UInt16Vec* targetIDs = pattern->getStripeTargetIDs(pattern);
size_t numStripeNodes = UInt16Vec_length(targetIDs);
return RemotingIOInfo_getNumPagesPerChunk(ioInfo) * numStripeNodes;
}
size_t RemotingIOInfo_getNumPagesPerChunk(RemotingIOInfo* ioInfo)
{
StripePattern* pattern = ioInfo->pattern;
unsigned chunkSize = StripePattern_getChunkSize(pattern);
return chunkSize / PAGE_SIZE;
}
#endif /* REMOTINGIOINFO_H_ */