partial work
This commit is contained in:
		
							parent
							
								
									24b9f1eb63
								
							
						
					
					
						commit
						5d54e85540
					
				| 
						 | 
					@ -365,14 +365,17 @@ typedef struct {
 | 
				
			||||||
#define TSDB_FILE_F(tf) (&((tf)->f)))
 | 
					#define TSDB_FILE_F(tf) (&((tf)->f)))
 | 
				
			||||||
#define TSDB_FILE_FD(tf) ((tf)->fd)
 | 
					#define TSDB_FILE_FD(tf) ((tf)->fd)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int  tsdbOpenFS(STsdbRepo *pRepo);
 | 
					int       tsdbOpenFS(STsdbRepo* pRepo);
 | 
				
			||||||
void tsdbCloseFS(STsdbRepo *pRepo);
 | 
					void      tsdbCloseFS(STsdbRepo* pRepo);
 | 
				
			||||||
int  tsdbFSNewTxn(STsdbRepo *pRepo);
 | 
					int       tsdbFSNewTxn(STsdbRepo* pRepo);
 | 
				
			||||||
int  tsdbFSEndTxn(STsdbRepo *pRepo, bool hasError);
 | 
					int       tsdbFSEndTxn(STsdbRepo* pRepo, bool hasError);
 | 
				
			||||||
int  tsdbUpdateMFile(STsdbRepo *pRepo, SMFile *pMFile);
 | 
					int       tsdbUpdateMFile(STsdbRepo* pRepo, SMFile* pMFile);
 | 
				
			||||||
int  tsdbUpdateDFileSet(STsdbRepo *pRepo, SDFileSet *pSet);
 | 
					int       tsdbUpdateDFileSet(STsdbRepo* pRepo, SDFileSet* pSet);
 | 
				
			||||||
void tsdbRemoveExpiredDFileSet(STsdbRepo *pRepo, int mfid);
 | 
					void      tsdbRemoveExpiredDFileSet(STsdbRepo* pRepo, int mfid);
 | 
				
			||||||
int  tsdbRemoveDFileSet(SDFileSet *pSet);
 | 
					int       tsdbRemoveDFileSet(SDFileSet* pSet);
 | 
				
			||||||
 | 
					int       tsdbEncodeMFInfo(void** buf, SMFInfo* pInfo);
 | 
				
			||||||
 | 
					void*     tsdbDecodeMFInfo(void* buf, SMFInfo* pInfo);
 | 
				
			||||||
 | 
					SDFileSet tsdbMoveDFileSet(SDFileSet* pOldSet, int to);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static FORCE_INLINE int tsdbRLockFS(STsdbFS *pFs) {
 | 
					static FORCE_INLINE int tsdbRLockFS(STsdbFS *pFs) {
 | 
				
			||||||
  int code = pthread_rwlock_rdlock(&(pFs->lock));
 | 
					  int code = pthread_rwlock_rdlock(&(pFs->lock));
 | 
				
			||||||
| 
						 | 
					@ -401,6 +404,31 @@ static FORCE_INLINE int tsdbUnLockFS(STsdbFS *pFs) {
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// ================= tsdbStore.c
 | 
				
			||||||
 | 
					#define KVSTORE_FILE_VERSION ((uint32_t)0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef int (*iterFunc)(void*, void* cont, int contLen);
 | 
				
			||||||
 | 
					typedef void (*afterFunc)(void*);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  SMFile    f;
 | 
				
			||||||
 | 
					  SHashObj* map;
 | 
				
			||||||
 | 
					  iterFunc  iFunc;
 | 
				
			||||||
 | 
					  afterFunc aFunc;
 | 
				
			||||||
 | 
					  void*     appH;
 | 
				
			||||||
 | 
					} SKVStore;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define KVSTORE_MAGIC(s) (s)->f.info.magic
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int       tdCreateKVStore(char* fname);
 | 
				
			||||||
 | 
					int       tdDestroyKVStore(char* fname);
 | 
				
			||||||
 | 
					SKVStore* tdOpenKVStore(char* fname, iterFunc iFunc, afterFunc aFunc, void* appH);
 | 
				
			||||||
 | 
					void      tdCloseKVStore(SKVStore* pStore);
 | 
				
			||||||
 | 
					int       tdKVStoreStartCommit(SKVStore* pStore);
 | 
				
			||||||
 | 
					int       tdUpdateKVStoreRecord(SKVStore* pStore, uint64_t uid, void* cont, int contLen);
 | 
				
			||||||
 | 
					int       tdDropKVStoreRecord(SKVStore* pStore, uint64_t uid);
 | 
				
			||||||
 | 
					int       tdKVStoreEndCommit(SKVStore* pStore);
 | 
				
			||||||
 | 
					void      tsdbGetStoreInfo(char* fname, uint32_t* magic, int64_t* size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ================= tsdbFile.c
 | 
					// ================= tsdbFile.c
 | 
				
			||||||
// extern const char* tsdbFileSuffix[];
 | 
					// extern const char* tsdbFileSuffix[];
 | 
				
			||||||
| 
						 | 
					@ -467,7 +495,7 @@ static FORCE_INLINE int tsdbUnLockFS(STsdbFS *pFs) {
 | 
				
			||||||
// } SFileGroupIter;
 | 
					// } SFileGroupIter;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// #define TSDB_FILE_NAME(pFile) ((pFile)->file.aname)
 | 
					// #define TSDB_FILE_NAME(pFile) ((pFile)->file.aname)
 | 
				
			||||||
// #define TSDB_KEY_FILEID(key, daysPerFile, precision) ((key) / tsMsPerDay[(precision)] / (daysPerFile))
 | 
					#define TSDB_KEY_FILEID(key, daysPerFile, precision) ((key) / tsMsPerDay[(precision)] / (daysPerFile))
 | 
				
			||||||
// #define TSDB_MAX_FILE(keep, daysPerFile) ((keep) / (daysPerFile) + 3)
 | 
					// #define TSDB_MAX_FILE(keep, daysPerFile) ((keep) / (daysPerFile) + 3)
 | 
				
			||||||
// #define TSDB_MIN_FILE_ID(fh) (fh)->pFGroup[0].fileId
 | 
					// #define TSDB_MIN_FILE_ID(fh) (fh)->pFGroup[0].fileId
 | 
				
			||||||
// #define TSDB_MAX_FILE_ID(fh) (fh)->pFGroup[(fh)->nFGroups - 1].fileId
 | 
					// #define TSDB_MAX_FILE_ID(fh) (fh)->pFGroup[(fh)->nFGroups - 1].fileId
 | 
				
			||||||
| 
						 | 
					@ -496,7 +524,7 @@ static FORCE_INLINE int tsdbUnLockFS(STsdbFS *pFs) {
 | 
				
			||||||
// int         tsdbLoadFileHeader(SFile* pFile, uint32_t* version);
 | 
					// int         tsdbLoadFileHeader(SFile* pFile, uint32_t* version);
 | 
				
			||||||
// void        tsdbGetFileInfoImpl(char* fname, uint32_t* magic, int64_t* size);
 | 
					// void        tsdbGetFileInfoImpl(char* fname, uint32_t* magic, int64_t* size);
 | 
				
			||||||
// void        tsdbGetFidGroup(STsdbCfg* pCfg, SFidGroup* pFidGroup);
 | 
					// void        tsdbGetFidGroup(STsdbCfg* pCfg, SFidGroup* pFidGroup);
 | 
				
			||||||
// void        tsdbGetFidKeyRange(int daysPerFile, int8_t precision, int fileId, TSKEY *minKey, TSKEY *maxKey);
 | 
					void        tsdbGetFidKeyRange(int daysPerFile, int8_t precision, int fileId, TSKEY *minKey, TSKEY *maxKey);
 | 
				
			||||||
// int         tsdbApplyRetention(STsdbRepo* pRepo, SFidGroup *pFidGroup);
 | 
					// int         tsdbApplyRetention(STsdbRepo* pRepo, SFidGroup *pFidGroup);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ================= tsdbMain.c
 | 
					// ================= tsdbMain.c
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,7 +15,14 @@
 | 
				
			||||||
#include "tsdbMain.h"
 | 
					#include "tsdbMain.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  SFidGroup    fidg;
 | 
					  int   minFid;
 | 
				
			||||||
 | 
					  int   midFid;
 | 
				
			||||||
 | 
					  int   maxFid;
 | 
				
			||||||
 | 
					  TSKEY minKey;
 | 
				
			||||||
 | 
					} SRtn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
					  SRtn         rtn;
 | 
				
			||||||
  SCommitIter *iters;
 | 
					  SCommitIter *iters;
 | 
				
			||||||
  SRWHelper    whelper;
 | 
					  SRWHelper    whelper;
 | 
				
			||||||
  SDataCols *  pDataCols;
 | 
					  SDataCols *  pDataCols;
 | 
				
			||||||
| 
						 | 
					@ -32,6 +39,8 @@ static void         tsdbDestroyCommitIters(SCommitIter *iters, int maxTables);
 | 
				
			||||||
static void         tsdbSeekCommitIter(SCommitIter *pIters, int nIters, TSKEY key);
 | 
					static void         tsdbSeekCommitIter(SCommitIter *pIters, int nIters, TSKEY key);
 | 
				
			||||||
static int          tsdbInitCommitH(STsdbRepo *pRepo, SCommitH *pch);
 | 
					static int          tsdbInitCommitH(STsdbRepo *pRepo, SCommitH *pch);
 | 
				
			||||||
static void         tsdbDestroyCommitH(SCommitH *pch, int niter);
 | 
					static void         tsdbDestroyCommitH(SCommitH *pch, int niter);
 | 
				
			||||||
 | 
					static void         tsdbGetRtnSnap(STsdbRepo *pRepo, SRtn *pRtn);
 | 
				
			||||||
 | 
					static int          tsdbGetFidLevel(int fid, SRtn *pRtn);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void *tsdbCommitData(STsdbRepo *pRepo) {
 | 
					void *tsdbCommitData(STsdbRepo *pRepo) {
 | 
				
			||||||
  if (tsdbStartCommit(pRepo) < 0) {
 | 
					  if (tsdbStartCommit(pRepo) < 0) {
 | 
				
			||||||
| 
						 | 
					@ -64,45 +73,28 @@ _err:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tsdbCommitTSData(STsdbRepo *pRepo) {
 | 
					static int tsdbCommitTSData(STsdbRepo *pRepo) {
 | 
				
			||||||
  SMemTable *pMem = pRepo->imem;
 | 
					  SMemTable *pMem = pRepo->imem;
 | 
				
			||||||
  SCommitH   ch = {0};
 | 
					 | 
				
			||||||
  STsdbCfg * pCfg = &(pRepo->config);
 | 
					  STsdbCfg * pCfg = &(pRepo->config);
 | 
				
			||||||
  // SFidGroup  fidGroup = {0};
 | 
					  SCommitH   ch = {0};
 | 
				
			||||||
  TSKEY      minKey = 0;
 | 
					 | 
				
			||||||
  TSKEY      maxKey = 0;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (pMem->numOfRows <= 0) return 0;
 | 
					  if (pMem->numOfRows <= 0) return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsdbGetFidGroup(pCfg, &(ch.fidg));
 | 
					 | 
				
			||||||
  tsdbGetFidKeyRange(pCfg->daysPerFile, pCfg->precision, ch.fidg.minFid, &minKey, &maxKey);
 | 
					 | 
				
			||||||
  tsdbRemoveFilesBeyondRetention(pRepo, &(ch.fidg));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (tsdbInitCommitH(pRepo, &ch) < 0) {
 | 
					  if (tsdbInitCommitH(pRepo, &ch) < 0) {
 | 
				
			||||||
    goto _err;
 | 
					    return -1;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  int sfid = (int)(TSDB_KEY_FILEID(pMem->keyFirst, pCfg->daysPerFile, pCfg->precision));
 | 
					  // TODO
 | 
				
			||||||
  int efid = (int)(TSDB_KEY_FILEID(pMem->keyLast, pCfg->daysPerFile, pCfg->precision));
 | 
					  int sfid = MIN(TSDB_KEY_FILEID(pMem->keyFirst, pCfg->daysPerFile, pCfg->precision), 1 /*TODO*/);
 | 
				
			||||||
 | 
					  int efid = MAX(TSDB_KEY_FILEID(pMem->keyLast, pCfg->daysPerFile, pCfg->precision), 1 /*TODO*/);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsdbSeekCommitIter(ch.iters, pMem->maxTables, minKey);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Loop to commit to each file
 | 
					 | 
				
			||||||
  for (int fid = sfid; fid <= efid; fid++) {
 | 
					  for (int fid = sfid; fid <= efid; fid++) {
 | 
				
			||||||
    if (fid < ch.fidg.minFid) continue;
 | 
					    if (tsdbCommitToFile(pRepo, fid, &ch) < 0) {
 | 
				
			||||||
 | 
					      tsdbDestroyCommitH(&ch, pMem->maxTables);
 | 
				
			||||||
    if (tsdbCommitToFile(pRepo, fid, &(ch)) < 0) {
 | 
					      return -1;
 | 
				
			||||||
      tsdbError("vgId:%d failed to commit to file %d since %s", REPO_ID(pRepo), fid, tstrerror(terrno));
 | 
					 | 
				
			||||||
      goto _err;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsdbApplyRetention(pRepo, &(ch.fidg));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tsdbDestroyCommitH(&ch, pMem->maxTables);
 | 
					  tsdbDestroyCommitH(&ch, pMem->maxTables);
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
_err:
 | 
					 | 
				
			||||||
  tsdbDestroyCommitH(&ch, pMem->maxTables);
 | 
					 | 
				
			||||||
  return -1;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tsdbCommitMeta(STsdbRepo *pRepo) {
 | 
					static int tsdbCommitMeta(STsdbRepo *pRepo) {
 | 
				
			||||||
| 
						 | 
					@ -148,7 +140,7 @@ static int tsdbCommitMeta(STsdbRepo *pRepo) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // TODO: update meta file
 | 
					  // TODO: update meta file
 | 
				
			||||||
  tsdbUpdateMFile(pRepo, NULL);
 | 
					  tsdbUpdateMFile(pRepo, &(pMeta->pStore.f));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,116 +187,56 @@ static bool tsdbHasDataToCommit(SCommitIter *iters, int nIters, TSKEY minKey, TS
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitH *pch) {
 | 
					static int tsdbCommitToFile(STsdbRepo *pRepo, int fid, SCommitH *pch) {
 | 
				
			||||||
  STsdbCfg *   pCfg = &pRepo->config;
 | 
					  STsdbCfg * pCfg = &(pRepo->config);
 | 
				
			||||||
  STsdbFileH * pFileH = pRepo->tsdbFileH;
 | 
					  SMemTable *pMem = pRepo->imem;
 | 
				
			||||||
  SFileGroup * pGroup = NULL;
 | 
					  TSKEY      minKey, maxKey;
 | 
				
			||||||
  SMemTable *  pMem = pRepo->imem;
 | 
					  SDFileSet *pOldSet = NULL;
 | 
				
			||||||
  bool         newLast = false;
 | 
					  SDFileSet  newSet = {0};
 | 
				
			||||||
  TSKEY        minKey = 0;
 | 
					 | 
				
			||||||
  TSKEY        maxKey = 0;
 | 
					 | 
				
			||||||
  SCommitIter *iters = pch->iters;
 | 
					 | 
				
			||||||
  SRWHelper *  pHelper = &(pch->whelper);
 | 
					 | 
				
			||||||
  SDataCols *  pDataCols = pch->pDataCols;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsdbGetFidKeyRange(pCfg->daysPerFile, pCfg->precision, fid, &minKey, &maxKey);
 | 
					  tsdbGetFidKeyRange(pCfg->daysPerFile, pCfg->precision, fid, &minKey, &maxKey);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Check if there are data to commit to this file
 | 
					  if (pOldSet) {  // file exists
 | 
				
			||||||
  if (!tsdbHasDataToCommit(iters, pMem->maxTables, minKey, maxKey)) {
 | 
					    int level = tsdbGetFidLevel(fid, &(pch->rtn));
 | 
				
			||||||
    tsdbDebug("vgId:%d no data to commit to file %d", REPO_ID(pRepo), fid);
 | 
					    if (level < 0) {  // if out of data, remove it and ignore expired memory data
 | 
				
			||||||
    return 0;
 | 
					      tsdbRemoveExpiredDFileSet(pRepo, fid);
 | 
				
			||||||
  }
 | 
					      tsdbSeekCommitIter(pch->iters, pMem->maxTables, maxKey + 1);
 | 
				
			||||||
 | 
					      return 0;
 | 
				
			||||||
  if ((pGroup = tsdbSearchFGroup(pFileH, fid, TD_EQ)) == NULL) {
 | 
					 | 
				
			||||||
    pGroup = tsdbCreateFGroup(pRepo, fid, tsdbGetFidLevel(fid, pch->fidg));
 | 
					 | 
				
			||||||
    if (pGroup == NULL) {
 | 
					 | 
				
			||||||
      tsdbError("vgId:%d failed to create file group %d since %s", REPO_ID(pRepo), fid, tstrerror(terrno));
 | 
					 | 
				
			||||||
      return -1;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Move the data file set to correct level
 | 
				
			||||||
 | 
					    tsdbMoveDFileSet(pOldSet, level);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Open files for write/read
 | 
					  if (tsdbHasDataToCommit(pch->iters, pMem->maxTables, minKey, maxKey)) {
 | 
				
			||||||
  if (tsdbSetAndOpenHelperFile(pHelper, pGroup) < 0) {
 | 
					    if (tsdbSetAndOpenHelperFile(&(pch->whelper), pOldSet, &newSet) < 0) return -1;
 | 
				
			||||||
    tsdbError("vgId:%d failed to set helper file since %s", REPO_ID(pRepo), tstrerror(terrno));
 | 
					 | 
				
			||||||
    goto _err;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  newLast = TSDB_NLAST_FILE_OPENED(pHelper);
 | 
					    if (tsdbLoadCompIdx(&pch->whelper, NULL) < 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tsdbLoadCompIdx(pHelper, NULL) < 0) {
 | 
					    for (int tid = 0; tid < pMem->maxTables; tid++) {
 | 
				
			||||||
    tsdbError("vgId:%d failed to load SBlockIdx part since %s", REPO_ID(pRepo), tstrerror(terrno));
 | 
					      SCommitIter *pIter = pch->iters + tid;
 | 
				
			||||||
    goto _err;
 | 
					      if (pIter->pTable == NULL) continue;
 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // Loop to commit data in each table
 | 
					      if (tsdbSetHelperTable(&(pch->whelper), pIter->pTable, pRepo) < 0) return -1;
 | 
				
			||||||
  for (int tid = 1; tid < pMem->maxTables; tid++) {
 | 
					 | 
				
			||||||
    SCommitIter *pIter = iters + tid;
 | 
					 | 
				
			||||||
    if (pIter->pTable == NULL) continue;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TSDB_RLOCK_TABLE(pIter->pTable);
 | 
					      TSDB_RLOCK_TABLE(pIter->pTable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (tsdbSetHelperTable(pHelper, pIter->pTable, pRepo) < 0) goto _err;
 | 
					      if (pIter->pIter != NULL) {  // has data in memory to commit
 | 
				
			||||||
 | 
					 | 
				
			||||||
    if (pIter->pIter != NULL) {
 | 
					 | 
				
			||||||
      if (tdInitDataCols(pDataCols, tsdbGetTableSchemaImpl(pIter->pTable, false, false, -1)) < 0) {
 | 
					 | 
				
			||||||
        terrno = TSDB_CODE_TDB_OUT_OF_MEMORY;
 | 
					 | 
				
			||||||
        goto _err;
 | 
					 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      if (tsdbCommitTableData(pHelper, pIter, pDataCols, maxKey) < 0) {
 | 
					      TSDB_RUNLOCK_TABLE(pIter->pTable);
 | 
				
			||||||
        TSDB_RUNLOCK_TABLE(pIter->pTable);
 | 
					      if (tsdbMoveLastBlockIfNeccessary() < 0) return -1;
 | 
				
			||||||
        tsdbError("vgId:%d failed to write data of table %s tid %d uid %" PRIu64 " since %s", REPO_ID(pRepo),
 | 
					
 | 
				
			||||||
                  TABLE_CHAR_NAME(pIter->pTable), TABLE_TID(pIter->pTable), TABLE_UID(pIter->pTable),
 | 
					      if (tsdbWriteCompInfo() < 0) return -1;
 | 
				
			||||||
                  tstrerror(terrno));
 | 
					 | 
				
			||||||
        goto _err;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    TSDB_RUNLOCK_TABLE(pIter->pTable);
 | 
					    if (tsdbWriteCompIdx() < 0) return -1;
 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Move the last block to the new .l file if neccessary
 | 
					 | 
				
			||||||
    if (tsdbMoveLastBlockIfNeccessary(pHelper) < 0) {
 | 
					 | 
				
			||||||
      tsdbError("vgId:%d, failed to move last block, since %s", REPO_ID(pRepo), tstrerror(terrno));
 | 
					 | 
				
			||||||
      goto _err;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    // Write the SBlock part
 | 
					 | 
				
			||||||
    if (tsdbWriteCompInfo(pHelper) < 0) {
 | 
					 | 
				
			||||||
      tsdbError("vgId:%d, failed to write compInfo part since %s", REPO_ID(pRepo), tstrerror(terrno));
 | 
					 | 
				
			||||||
      goto _err;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (tsdbWriteCompIdx(pHelper) < 0) {
 | 
					  if (/*file exists OR has data to commit*/) {
 | 
				
			||||||
    tsdbError("vgId:%d failed to write compIdx part to file %d since %s", REPO_ID(pRepo), fid, tstrerror(terrno));
 | 
					    tsdbUpdateDFileSet(pRepo, &newSet);
 | 
				
			||||||
    goto _err;
 | 
					 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  tsdbCloseHelperFile(pHelper, 0, pGroup);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pthread_rwlock_wrlock(&(pFileH->fhlock));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // tfsremove(&(helperHeadF(pHelper)->file));
 | 
					 | 
				
			||||||
  (void)rename(TSDB_FILE_NAME(helperNewHeadF(pHelper)), TSDB_FILE_NAME(helperHeadF(pHelper)));
 | 
					 | 
				
			||||||
  tfsDecDiskFile(helperNewHeadF(pHelper)->file.level, helperNewHeadF(pHelper)->file.id, 1);
 | 
					 | 
				
			||||||
  pGroup->files[TSDB_FILE_TYPE_HEAD].info = helperNewHeadF(pHelper)->info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (newLast) {
 | 
					 | 
				
			||||||
    (void)rename(TSDB_FILE_NAME(helperNewLastF(pHelper)), TSDB_FILE_NAME(helperLastF(pHelper)));
 | 
					 | 
				
			||||||
    tfsDecDiskFile(helperNewLastF(pHelper)->file.level, helperNewLastF(pHelper)->file.id, 1);
 | 
					 | 
				
			||||||
    pGroup->files[TSDB_FILE_TYPE_LAST].info = helperNewLastF(pHelper)->info;
 | 
					 | 
				
			||||||
  } else {
 | 
					 | 
				
			||||||
    pGroup->files[TSDB_FILE_TYPE_LAST].info = helperLastF(pHelper)->info;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pGroup->files[TSDB_FILE_TYPE_DATA].info = helperDataF(pHelper)->info;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  pthread_rwlock_unlock(&(pFileH->fhlock));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
 | 
					 | 
				
			||||||
_err:
 | 
					 | 
				
			||||||
  tsdbCloseHelperFile(pHelper, 1, pGroup);
 | 
					 | 
				
			||||||
  return -1;
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static SCommitIter *tsdbCreateCommitIters(STsdbRepo *pRepo) {
 | 
					static SCommitIter *tsdbCreateCommitIters(STsdbRepo *pRepo) {
 | 
				
			||||||
| 
						 | 
					@ -399,4 +331,31 @@ static void tsdbDestroyCommitH(SCommitH *pch, int niter) {
 | 
				
			||||||
  tdFreeDataCols(pch->pDataCols);
 | 
					  tdFreeDataCols(pch->pDataCols);
 | 
				
			||||||
  tsdbDestroyCommitIters(pch->iters, niter);
 | 
					  tsdbDestroyCommitIters(pch->iters, niter);
 | 
				
			||||||
  tsdbDestroyHelper(&(pch->whelper));
 | 
					  tsdbDestroyHelper(&(pch->whelper));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void tsdbGetRtnSnap(STsdbRepo *pRepo, SRtn *pRtn) {
 | 
				
			||||||
 | 
					  STsdbCfg *pCfg = &(pRepo->config);
 | 
				
			||||||
 | 
					  TSKEY     minKey, midKey, maxKey, now;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  now = taosGetTimestamp(pCfg->precision);
 | 
				
			||||||
 | 
					  minKey = now - pCfg->keep * tsMsPerDay[pCfg->precision];
 | 
				
			||||||
 | 
					  midKey = now - pCfg->keep2 * tsMsPerDay[pCfg->precision];
 | 
				
			||||||
 | 
					  maxKey = now - pCfg->keep1 * tsMsPerDay[pCfg->precision];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  pRtn->minKey = minKey;
 | 
				
			||||||
 | 
					  pRtn->minFid = TSDB_KEY_FILEID(minKey, pCfg->daysPerFile, pCfg->precision);
 | 
				
			||||||
 | 
					  pRtn->midFid = TSDB_KEY_FILEID(midKey, pCfg->daysPerFile, pCfg->precision);
 | 
				
			||||||
 | 
					  pRtn->maxFid = TSDB_KEY_FILEID(maxKey, pCfg->daysPerFile, pCfg->precision);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int tsdbGetFidLevel(int fid, SRtn *pRtn) {
 | 
				
			||||||
 | 
					  if (fid >= pRtn->maxFid) {
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					  } else if (fid >= pRtn->midFid) {
 | 
				
			||||||
 | 
					    return 1;
 | 
				
			||||||
 | 
					  } else if (fid >= pRtn->minFid) {
 | 
				
			||||||
 | 
					    return 2;
 | 
				
			||||||
 | 
					  } else {
 | 
				
			||||||
 | 
					    return -1;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ int tsdbUpdateDFileSet(STsdbRepo *pRepo, SDFileSet *pSet) {
 | 
				
			||||||
      return -1;
 | 
					      return -1;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  } else {
 | 
					  } else {
 | 
				
			||||||
    int index = TARRAY_ELEM_IDX(dfArray, ptr);
 | 
					    int index = TARRAY_ELEM_IDX(pSnapshot->df, pOldSet);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (pOldSet->id == pSet->id) {
 | 
					    if (pOldSet->id == pSet->id) {
 | 
				
			||||||
      taosArraySet(pSnapshot->df, index, pSet);
 | 
					      taosArraySet(pSnapshot->df, index, pSet);
 | 
				
			||||||
| 
						 | 
					@ -125,6 +125,32 @@ void tsdbRemoveExpiredDFileSet(STsdbRepo *pRepo, int mfid) {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int tsdbEncodeMFInfo(void **buf, SMFInfo *pInfo) {
 | 
				
			||||||
 | 
					  int tlen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  tlen += taosEncodeVariantI64(buf, pInfo->size);
 | 
				
			||||||
 | 
					  tlen += taosEncodeVariantI64(buf, pInfo->tombSize);
 | 
				
			||||||
 | 
					  tlen += taosEncodeVariantI64(buf, pInfo->nRecords);
 | 
				
			||||||
 | 
					  tlen += taosEncodeVariantI64(buf, pInfo->nDels);
 | 
				
			||||||
 | 
					  tlen += taosEncodeFixedU32(buf, pInfo->magic);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return tlen;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void *tsdbDecodeMFInfo(void *buf, SMFInfo *pInfo) {
 | 
				
			||||||
 | 
					  buf = taosDecodeVariantI64(buf, &(pInfo->size));
 | 
				
			||||||
 | 
					  buf = taosDecodeVariantI64(buf, &(pInfo->tombSize));
 | 
				
			||||||
 | 
					  buf = taosDecodeVariantI64(buf, &(pInfo->nRecords));
 | 
				
			||||||
 | 
					  buf = taosDecodeVariantI64(buf, &(pInfo->nDels));
 | 
				
			||||||
 | 
					  buf = taosDecodeFixedU32(buf, &(pInfo->magic));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return buf;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SDFileSet tsdbMoveDFileSet(SDFileSet *pOldSet, int to) {
 | 
				
			||||||
 | 
					  // TODO
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tsdbSaveFSSnapshot(int fd, SFSSnapshot *pSnapshot) {
 | 
					static int tsdbSaveFSSnapshot(int fd, SFSSnapshot *pSnapshot) {
 | 
				
			||||||
  // TODO
 | 
					  // TODO
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
| 
						 | 
					@ -152,28 +178,6 @@ static int tsdbOpenFSImpl(STsdbRepo *pRepo) {
 | 
				
			||||||
  return 0;
 | 
					  return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int tsdbEncodeMFInfo(void **buf, SMFInfo *pInfo) {
 | 
					 | 
				
			||||||
  int tlen = 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  tlen += taosEncodeVariantI64(buf, pInfo->size);
 | 
					 | 
				
			||||||
  tlen += taosEncodeVariantI64(buf, pInfo->tombSize);
 | 
					 | 
				
			||||||
  tlen += taosEncodeVariantI64(buf, pInfo->nRecords);
 | 
					 | 
				
			||||||
  tlen += taosEncodeVariantI64(buf, pInfo->nDels);
 | 
					 | 
				
			||||||
  tlen += taosEncodeFixedU32(buf, pInfo->magic);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return tlen;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void *tsdbDecodeMFInfo(void *buf, SMFInfo *pInfo) {
 | 
					 | 
				
			||||||
  buf = taosDecodeVariantI64(buf, &(pInfo->size));
 | 
					 | 
				
			||||||
  buf = taosDecodeVariantI64(buf, &(pInfo->tombSize));
 | 
					 | 
				
			||||||
  buf = taosDecodeVariantI64(buf, &(pInfo->nRecords));
 | 
					 | 
				
			||||||
  buf = taosDecodeVariantI64(buf, &(pInfo->nDels));
 | 
					 | 
				
			||||||
  buf = taosDecodeFixedU32(buf, &(pInfo->magic));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return buf;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static int tsdbEncodeMFile(void **buf, SMFile *pMFile) {
 | 
					static int tsdbEncodeMFile(void **buf, SMFile *pMFile) {
 | 
				
			||||||
  int tlen = 0;
 | 
					  int tlen = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,20 +15,8 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define _DEFAULT_SOURCE
 | 
					#define _DEFAULT_SOURCE
 | 
				
			||||||
#define TAOS_RANDOM_FILE_FAIL_TEST
 | 
					#define TAOS_RANDOM_FILE_FAIL_TEST
 | 
				
			||||||
#include "os.h"
 | 
					 | 
				
			||||||
#include "hash.h"
 | 
					 | 
				
			||||||
#include "taoserror.h"
 | 
					 | 
				
			||||||
#include "tchecksum.h"
 | 
					 | 
				
			||||||
#include "tcoding.h"
 | 
					 | 
				
			||||||
#include "tkvstore.h"
 | 
					 | 
				
			||||||
#include "tulog.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TD_KVSTORE_HEADER_SIZE 512
 | 
					#include "tsdbMain.h"
 | 
				
			||||||
#define TD_KVSTORE_MAJOR_VERSION 1
 | 
					 | 
				
			||||||
#define TD_KVSTORE_MAINOR_VERSION 0
 | 
					 | 
				
			||||||
#define TD_KVSTORE_SNAP_SUFFIX ".snap"
 | 
					 | 
				
			||||||
#define TD_KVSTORE_NEW_SUFFIX ".new"
 | 
					 | 
				
			||||||
#define TD_KVSTORE_INIT_MAGIC 0xFFFFFFFF
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct {
 | 
					typedef struct {
 | 
				
			||||||
  uint64_t uid;
 | 
					  uint64_t uid;
 | 
				
			||||||
| 
						 | 
					@ -1,63 +0,0 @@
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is free software: you can use, redistribute, and/or modify
 | 
					 | 
				
			||||||
 * it under the terms of the GNU Affero General Public License, version 3
 | 
					 | 
				
			||||||
 * or later ("AGPL"), as published by the Free Software Foundation.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This program is distributed in the hope that it will be useful, but WITHOUT
 | 
					 | 
				
			||||||
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | 
					 | 
				
			||||||
 * FITNESS FOR A PARTICULAR PURPOSE.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * You should have received a copy of the GNU Affero General Public License
 | 
					 | 
				
			||||||
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
#ifndef _TD_KVSTORE_H_
 | 
					 | 
				
			||||||
#define _TD_KVSTORE_H_
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
extern "C" {
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#include <stdint.h>
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define KVSTORE_FILE_VERSION ((uint32_t)0)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef int (*iterFunc)(void *, void *cont, int contLen);
 | 
					 | 
				
			||||||
typedef void (*afterFunc)(void *);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
  int64_t  size;  // including 512 bytes of header size
 | 
					 | 
				
			||||||
  int64_t  tombSize;
 | 
					 | 
				
			||||||
  int64_t  nRecords;
 | 
					 | 
				
			||||||
  int64_t  nDels;
 | 
					 | 
				
			||||||
  uint32_t magic;
 | 
					 | 
				
			||||||
} SStoreInfo;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
typedef struct {
 | 
					 | 
				
			||||||
  char *     fname;
 | 
					 | 
				
			||||||
  int        fd;
 | 
					 | 
				
			||||||
  SHashObj * map;
 | 
					 | 
				
			||||||
  iterFunc   iFunc;
 | 
					 | 
				
			||||||
  afterFunc  aFunc;
 | 
					 | 
				
			||||||
  void *     appH;
 | 
					 | 
				
			||||||
  SStoreInfo info;
 | 
					 | 
				
			||||||
} SKVStore;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#define KVSTORE_MAGIC(s) (s)->info.magic
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int       tdCreateKVStore(char *fname);
 | 
					 | 
				
			||||||
int       tdDestroyKVStore(char *fname);
 | 
					 | 
				
			||||||
SKVStore *tdOpenKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH);
 | 
					 | 
				
			||||||
void      tdCloseKVStore(SKVStore *pStore);
 | 
					 | 
				
			||||||
int       tdKVStoreStartCommit(SKVStore *pStore);
 | 
					 | 
				
			||||||
int       tdUpdateKVStoreRecord(SKVStore *pStore, uint64_t uid, void *cont, int contLen);
 | 
					 | 
				
			||||||
int       tdDropKVStoreRecord(SKVStore *pStore, uint64_t uid);
 | 
					 | 
				
			||||||
int       tdKVStoreEndCommit(SKVStore *pStore);
 | 
					 | 
				
			||||||
void      tsdbGetStoreInfo(char *fname, uint32_t *magic, int64_t *size);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#ifdef __cplusplus
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
		Loading…
	
		Reference in New Issue