From 70871139bfd214d58f4384418b202b56e6a2afa6 Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Thu, 24 Aug 2023 17:16:28 +0800 Subject: [PATCH] enh(tsdb/openfile): lazy file open to read/write --- .../dnode/vnode/src/tsdb/tsdbReaderWriter.c | 61 +++++++++++++------ 1 file changed, 43 insertions(+), 18 deletions(-) diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c index 0a462c21e3..90ea0afb9d 100644 --- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c +++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c @@ -16,23 +16,12 @@ #include "tsdb.h" #include "vndCos.h" -// =============== PAGE-WISE FILE =============== -int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **ppFD) { - int32_t code = 0; - STsdbFD *pFD = NULL; +static int32_t tsdbOpenFileImpl(STsdbFD *pFD) { + int32_t code = 0; + const char *path = pFD->path; + int32_t szPage = pFD->szPage; + int32_t flag = pFD->flag; - *ppFD = NULL; - - pFD = (STsdbFD *)taosMemoryCalloc(1, sizeof(*pFD) + strlen(path) + 1); - if (pFD == NULL) { - code = TSDB_CODE_OUT_OF_MEMORY; - goto _exit; - } - - pFD->path = (char *)&pFD[1]; - strcpy(pFD->path, path); - pFD->szPage = szPage; - pFD->flag = flag; pFD->pFD = taosOpenFile(path, flag); if (pFD->pFD == NULL) { const char *object_name = taosDirEntryBaseName((char *)path); @@ -54,8 +43,7 @@ int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **p goto _exit; } } - pFD->szPage = szPage; - pFD->pgno = 0; + pFD->pBuf = taosMemoryCalloc(1, szPage); if (pFD->pBuf == NULL) { code = TSDB_CODE_OUT_OF_MEMORY; @@ -78,6 +66,30 @@ int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **p pFD->szFile = pFD->szFile / szPage; } +_exit: + return code; +} + +// =============== PAGE-WISE FILE =============== +int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **ppFD) { + int32_t code = 0; + STsdbFD *pFD = NULL; + + *ppFD = NULL; + + pFD = (STsdbFD *)taosMemoryCalloc(1, sizeof(*pFD) + strlen(path) + 1); + if (pFD == NULL) { + code = TSDB_CODE_OUT_OF_MEMORY; + goto _exit; + } + + pFD->path = (char *)&pFD[1]; + strcpy(pFD->path, path); + pFD->szPage = szPage; + pFD->flag = flag; + pFD->szPage = szPage; + pFD->pgno = 0; + *ppFD = pFD; _exit: @@ -97,6 +109,13 @@ void tsdbCloseFile(STsdbFD **ppFD) { static int32_t tsdbWriteFilePage(STsdbFD *pFD) { int32_t code = 0; + if (!pFD->pFD) { + code = tsdbOpenFileImpl(pFD); + if (code) { + goto _exit; + } + } + if (pFD->pgno > 0) { int64_t n = taosLSeekFile(pFD->pFD, PAGE_OFFSET(pFD->pgno, pFD->szPage), SEEK_SET); if (n < 0) { @@ -126,6 +145,12 @@ static int32_t tsdbReadFilePage(STsdbFD *pFD, int64_t pgno) { int32_t code = 0; // ASSERT(pgno <= pFD->szFile); + if (!pFD->pFD) { + code = tsdbOpenFileImpl(pFD); + if (code) { + goto _exit; + } + } // seek int64_t offset = PAGE_OFFSET(pgno, pFD->szPage);