diff --git a/include/util/taoserror.h b/include/util/taoserror.h index f0cb30e7e0..b091d870ec 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -529,6 +529,7 @@ int32_t taosGetErrSize(); #define TSDB_CODE_VND_META_DATA_UNSAFE_DELETE TAOS_DEF_ERROR_CODE(0, 0x0535) #define TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0536) #define TSDB_CODE_VND_ARB_NOT_SYNCED TAOS_DEF_ERROR_CODE(0, 0x0537) // internal +#define TSDB_CODE_VND_WRITE_DISABLED TAOS_DEF_ERROR_CODE(0, 0x0538) // internal // tsdb #define TSDB_CODE_TDB_INVALID_TABLE_ID TAOS_DEF_ERROR_CODE(0, 0x0600) diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h index 43684b9641..e81b858d0e 100644 --- a/source/dnode/vnode/src/inc/vnodeInt.h +++ b/source/dnode/vnode/src/inc/vnodeInt.h @@ -473,6 +473,7 @@ struct SVnode { STfs* pTfs; int32_t diskPrimary; SMsgCb msgCb; + bool disableWrite; // Buffer Pool TdThreadMutex mutex; diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c index 8a2b10d2ef..4f5d7c24e1 100644 --- a/source/dnode/vnode/src/vnd/vnodeOpen.c +++ b/source/dnode/vnode/src/vnd/vnodeOpen.c @@ -403,6 +403,7 @@ SVnode *vnodeOpen(const char *path, int32_t diskPrimary, STfs *pTfs, SMsgCb msgC pVnode->msgCb = msgCb; (void)taosThreadMutexInit(&pVnode->lock, NULL); pVnode->blocked = false; + pVnode->disableWrite = false; (void)tsem_init(&pVnode->syncSem, 0, 0); (void)taosThreadMutexInit(&pVnode->mutex, NULL); diff --git a/source/dnode/vnode/src/vnd/vnodeSnapshot.c b/source/dnode/vnode/src/vnd/vnodeSnapshot.c index a54beff00b..28e7ae97ca 100644 --- a/source/dnode/vnode/src/vnd/vnodeSnapshot.c +++ b/source/dnode/vnode/src/vnd/vnodeSnapshot.c @@ -609,7 +609,10 @@ int32_t vnodeSnapWriterOpen(SVnode *pVnode, SSnapshotParam *pParam, SVSnapWriter int64_t sver = pParam->start; int64_t ever = pParam->end; - // cancel and disable all bg task + // disable write, cancel and disable all bg tasks + (void)taosThreadMutexLock(&pVnode->mutex); + pVnode->disableWrite = true; + (void)taosThreadMutexUnlock(&pVnode->mutex); (void)vnodeCancelAndDisableAllBgTask(pVnode); // alloc @@ -742,6 +745,9 @@ int32_t vnodeSnapWriterClose(SVSnapWriter *pWriter, int8_t rollback, SSnapshot * } (void)vnodeBegin(pVnode); + (void)taosThreadMutexLock(&pVnode->mutex); + pVnode->disableWrite = false; + (void)taosThreadMutexUnlock(&pVnode->mutex); _exit: if (code) { diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c index feaad0f46d..3f6ca053cd 100644 --- a/source/dnode/vnode/src/vnd/vnodeSvr.c +++ b/source/dnode/vnode/src/vnd/vnodeSvr.c @@ -518,6 +518,14 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg void *pReq; int32_t len; + (void)taosThreadMutexLock(&pVnode->mutex); + if (pVnode->disableWrite) { + (void)taosThreadMutexUnlock(&pVnode->mutex); + vError("vgId:%d write is disabled for snapshot, version:%" PRId64, TD_VID(pVnode), ver); + return TSDB_CODE_VND_WRITE_DISABLED; + } + (void)taosThreadMutexUnlock(&pVnode->mutex); + if (ver <= pVnode->state.applied) { vError("vgId:%d, duplicate write request. ver: %" PRId64 ", applied: %" PRId64 "", TD_VID(pVnode), ver, pVnode->state.applied); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index e9bdafcd5a..1d2e8a9100 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -409,6 +409,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_VND_ALREADY_IS_VOTER, "Vnode already is a vo TAOS_DEFINE_ERROR(TSDB_CODE_VND_DIR_ALREADY_EXIST, "Vnode directory already exist") TAOS_DEFINE_ERROR(TSDB_CODE_VND_META_DATA_UNSAFE_DELETE, "Single replica vnode data will lost permanently after this operation, if you make sure this, please use drop dnode unsafe to execute") TAOS_DEFINE_ERROR(TSDB_CODE_VND_ARB_NOT_SYNCED, "Vgroup peer is not synced") +TAOS_DEFINE_ERROR(TSDB_CODE_VND_WRITE_DISABLED, "Vnode write is disabled for snapshot") TAOS_DEFINE_ERROR(TSDB_CODE_VND_COLUMN_COMPRESS_ALREADY_EXIST,"Same with old param")