diff --git a/source/libs/wal/inc/walInt.h b/source/libs/wal/inc/walInt.h index a8b2d2fc7fca178ae6a563beec7b0ad8d0365bea..f56f240904d6c96dabed87ac421d260f3165097a 100644 --- a/source/libs/wal/inc/walInt.h +++ b/source/libs/wal/inc/walInt.h @@ -83,8 +83,8 @@ int walReadMeta(SWal* pWal); int walWriteMeta(SWal* pWal); int walRollFileInfo(SWal* pWal); -char* walFileInfoSerialize(SWal* pWal); -SArray* walFileInfoDeserialize(const char* bytes); +char* walMetaSerialize(SWal* pWal); +int walMetaDeserialize(SWal* pWal, const char* bytes); //meta section end int64_t walGetSeq(); diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c index 2eec4328e605154aa47b45e8b13c71857ec201b4..65085bb96ddbffe46518d9f9f50ebf1c3162b3bc 100644 --- a/source/libs/wal/src/walMeta.c +++ b/source/libs/wal/src/walMeta.c @@ -47,49 +47,74 @@ int walRollFileInfo(SWal* pWal) { return 0; } -char* walFileInfoSerialize(SWal* pWal) { +char* walMetaSerialize(SWal* pWal) { char buf[30]; if(pWal == NULL || pWal->fileInfoSet == NULL) return 0; int sz = pWal->fileInfoSet->size; - cJSON* root = cJSON_CreateArray(); - cJSON* field; - if(root == NULL) { + cJSON* pRoot = cJSON_CreateObject(); + cJSON* pMeta = cJSON_CreateObject(); + cJSON* pFiles = cJSON_CreateArray(); + cJSON* pField; + if(pRoot == NULL || pMeta == NULL || pFiles == NULL) { //TODO return NULL; } + cJSON_AddItemToObject(pRoot, "meta", pMeta); + sprintf(buf, "%" PRId64, pWal->firstVersion); + cJSON_AddStringToObject(pMeta, "firstVer", buf); + sprintf(buf, "%" PRId64, pWal->snapshotVersion); + cJSON_AddStringToObject(pMeta, "snapshotVer", buf); + sprintf(buf, "%" PRId64, pWal->commitVersion); + cJSON_AddStringToObject(pMeta, "commitVer", buf); + sprintf(buf, "%" PRId64, pWal->lastVersion); + cJSON_AddStringToObject(pMeta, "lastVer", buf); + + cJSON_AddItemToObject(pRoot, "files", pFiles); WalFileInfo* pData = pWal->fileInfoSet->pData; for(int i = 0; i < sz; i++) { WalFileInfo* pInfo = &pData[i]; - cJSON_AddItemToArray(root, field = cJSON_CreateObject()); - if(field == NULL) { - cJSON_Delete(root); + cJSON_AddItemToArray(pFiles, pField = cJSON_CreateObject()); + if(pField == NULL) { + cJSON_Delete(pRoot); return NULL; } //cjson only support int32_t or double //string are used to prohibit the loss of precision - sprintf(buf, "%ld", pInfo->firstVer); - cJSON_AddStringToObject(field, "firstVer", buf); - sprintf(buf, "%ld", pInfo->lastVer); - cJSON_AddStringToObject(field, "lastVer", buf); - sprintf(buf, "%ld", pInfo->createTs); - cJSON_AddStringToObject(field, "createTs", buf); - sprintf(buf, "%ld", pInfo->closeTs); - cJSON_AddStringToObject(field, "closeTs", buf); - sprintf(buf, "%ld", pInfo->fileSize); - cJSON_AddStringToObject(field, "fileSize", buf); + sprintf(buf, "%" PRId64, pInfo->firstVer); + cJSON_AddStringToObject(pField, "firstVer", buf); + sprintf(buf, "%" PRId64, pInfo->lastVer); + cJSON_AddStringToObject(pField, "lastVer", buf); + sprintf(buf, "%" PRId64, pInfo->createTs); + cJSON_AddStringToObject(pField, "createTs", buf); + sprintf(buf, "%" PRId64, pInfo->closeTs); + cJSON_AddStringToObject(pField, "closeTs", buf); + sprintf(buf, "%" PRId64, pInfo->fileSize); + cJSON_AddStringToObject(pField, "fileSize", buf); } - return cJSON_Print(root); + return cJSON_Print(pRoot); } -SArray* walFileInfoDeserialize(const char* bytes) { - cJSON *root, *pInfoJson, *pField; - root = cJSON_Parse(bytes); - int sz = cJSON_GetArraySize(root); +int walMetaDeserialize(SWal* pWal, const char* bytes) { + ASSERT(taosArrayGetSize(pWal->fileInfoSet) == 0); + cJSON *pRoot, *pMeta, *pFiles, *pInfoJson, *pField; + pRoot = cJSON_Parse(bytes); + pMeta = cJSON_GetObjectItem(pRoot, "meta"); + pField = cJSON_GetObjectItem(pMeta, "firstVer"); + pWal->firstVersion = atoll(cJSON_GetStringValue(pField)); + pField = cJSON_GetObjectItem(pMeta, "snapshotVer"); + pWal->snapshotVersion = atoll(cJSON_GetStringValue(pField)); + pField = cJSON_GetObjectItem(pMeta, "commitVer"); + pWal->commitVersion = atoll(cJSON_GetStringValue(pField)); + pField = cJSON_GetObjectItem(pMeta, "lastVer"); + pWal->lastVersion = atoll(cJSON_GetStringValue(pField)); + + pFiles = cJSON_GetObjectItem(pRoot, "files"); + int sz = cJSON_GetArraySize(pFiles); //deserialize SArray* pArray = taosArrayInit(sz, sizeof(WalFileInfo)); WalFileInfo *pData = pArray->pData; for(int i = 0; i < sz; i++) { - cJSON* pInfoJson = cJSON_GetArrayItem(root, i); + cJSON* pInfoJson = cJSON_GetArrayItem(pFiles, i); WalFileInfo* pInfo = &pData[i]; pField = cJSON_GetObjectItem(pInfoJson, "firstVer"); pInfo->firstVer = atoll(cJSON_GetStringValue(pField)); @@ -103,7 +128,8 @@ SArray* walFileInfoDeserialize(const char* bytes) { pInfo->fileSize = atoll(cJSON_GetStringValue(pField)); } taosArraySetSize(pArray, sz); - return pArray; + pWal->fileInfoSet = pArray; + return 0; } static inline int walBuildMetaName(SWal* pWal, int metaVer, char* buf) { @@ -144,7 +170,7 @@ int walWriteMeta(SWal* pWal) { if(metaTfd < 0) { return -1; } - char* serialized = walFileInfoSerialize(pWal); + char* serialized = walMetaSerialize(pWal); int len = strlen(serialized); if(len != tfWrite(metaTfd, serialized, len)) { //TODO:clean file @@ -183,8 +209,8 @@ int walReadMeta(SWal* pWal) { return -1; } //load into fileInfoSet - pWal->fileInfoSet = walFileInfoDeserialize(buf); - if(pWal->fileInfoSet == NULL) { + int code = walMetaDeserialize(pWal, buf); + if(code != 0) { free(buf); return -1; } diff --git a/source/libs/wal/src/walMgmt.c b/source/libs/wal/src/walMgmt.c index 4104e0e6ce7935873042f2ae437923801c7668b4..6bf90089178370ed187195b0ca62485e21c73d70 100644 --- a/source/libs/wal/src/walMgmt.c +++ b/source/libs/wal/src/walMgmt.c @@ -175,8 +175,6 @@ static void walFreeObj(void *wal) { tfClose(pWal->writeIdxTfd); taosArrayDestroy(pWal->fileInfoSet); pWal->fileInfoSet = NULL; - taosArrayDestroy(pWal->fileInfoSet); - pWal->fileInfoSet = NULL; pthread_mutex_destroy(&pWal->mutex); tfree(pWal); } diff --git a/source/libs/wal/test/walMetaTest.cpp b/source/libs/wal/test/walMetaTest.cpp index 46328bb626acf8cf1ab1fd21a091767c712b1048..96258662a1ed58e0ba532b058569c86aa86ed2b0 100644 --- a/source/libs/wal/test/walMetaTest.cpp +++ b/source/libs/wal/test/walMetaTest.cpp @@ -92,7 +92,7 @@ TEST_F(WalCleanEnv, serialize) { ASSERT(code == 0); code = walRollFileInfo(pWal); ASSERT(code == 0); - char*ss = walFileInfoSerialize(pWal); + char*ss = walMetaSerialize(pWal); printf("%s\n", ss); code = walWriteMeta(pWal); ASSERT(code == 0); @@ -113,20 +113,19 @@ TEST_F(WalCleanEnv, removeOldMeta) { TEST_F(WalKeepEnv, readOldMeta) { int code = walRollFileInfo(pWal); ASSERT(code == 0); - ASSERT(pWal->fileInfoSet != NULL); code = walWriteMeta(pWal); ASSERT(code == 0); code = walRollFileInfo(pWal); ASSERT(code == 0); code = walWriteMeta(pWal); ASSERT(code == 0); - char*oldss = walFileInfoSerialize(pWal); + char*oldss = walMetaSerialize(pWal); TearDown(); SetUp(); code = walReadMeta(pWal); ASSERT(code == 0); - char* newss = walFileInfoSerialize(pWal); + char* newss = walMetaSerialize(pWal); int len = strlen(oldss); ASSERT_EQ(len, strlen(newss));