TDengine/source/libs/sync/src/syncEnv.c

131 lines
4.2 KiB
C
Raw Normal View History

2022-02-26 18:24:50 +00:00
/*
* 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/>.
*/
#include "syncEnv.h"
2022-06-21 08:02:36 +00:00
// #include <ASSERT.h>
2022-02-26 18:24:50 +00:00
SSyncEnv *gSyncEnv = NULL;
2022-02-28 06:10:34 +00:00
// local function -----------------
2022-03-12 04:29:44 +00:00
static SSyncEnv *doSyncEnvStart();
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv);
static int32_t doSyncEnvStartTimer(SSyncEnv *pSyncEnv);
static int32_t doSyncEnvStopTimer(SSyncEnv *pSyncEnv);
static void syncEnvTick(void *param, void *tmrId);
2022-02-28 06:10:34 +00:00
// --------------------------------
bool syncEnvIsStart() {
if (gSyncEnv == NULL) {
return false;
}
return atomic_load_8(&(gSyncEnv->isStart));
}
2022-02-26 18:24:50 +00:00
int32_t syncEnvStart() {
2022-06-21 03:11:16 +00:00
int32_t ret = 0;
uint32_t seed = (uint32_t)(taosGetTimestampNs() & 0x00000000FFFFFFFF);
taosSeedRand(seed);
2022-04-27 10:10:57 +00:00
// gSyncEnv = doSyncEnvStart(gSyncEnv);
2022-04-24 06:37:17 +00:00
gSyncEnv = doSyncEnvStart();
2022-06-21 08:02:36 +00:00
ASSERT(gSyncEnv != NULL);
2022-06-10 08:51:17 +00:00
sTrace("sync env start ok");
2022-02-26 18:24:50 +00:00
return ret;
}
int32_t syncEnvStop() {
int32_t ret = doSyncEnvStop(gSyncEnv);
return ret;
}
2022-03-12 04:29:44 +00:00
int32_t syncEnvStartTimer() {
int32_t ret = doSyncEnvStartTimer(gSyncEnv);
return ret;
2022-02-28 06:10:34 +00:00
}
2022-03-12 04:29:44 +00:00
int32_t syncEnvStopTimer() {
int32_t ret = doSyncEnvStopTimer(gSyncEnv);
return ret;
}
2022-02-28 06:10:34 +00:00
// local function -----------------
static void syncEnvTick(void *param, void *tmrId) {
SSyncEnv *pSyncEnv = (SSyncEnv *)param;
2022-03-12 04:29:44 +00:00
if (atomic_load_64(&pSyncEnv->envTickTimerLogicClockUser) <= atomic_load_64(&pSyncEnv->envTickTimerLogicClock)) {
++(pSyncEnv->envTickTimerCounter);
2022-03-16 13:22:56 +00:00
sTrace("syncEnvTick do ... envTickTimerLogicClockUser:%" PRIu64 ", envTickTimerLogicClock:%" PRIu64
", envTickTimerCounter:%" PRIu64
", "
"envTickTimerMS:%d, tmrId:%p",
pSyncEnv->envTickTimerLogicClockUser, pSyncEnv->envTickTimerLogicClock, pSyncEnv->envTickTimerCounter,
pSyncEnv->envTickTimerMS, tmrId);
2022-03-12 04:29:44 +00:00
// do something, tick ...
taosTmrReset(syncEnvTick, pSyncEnv->envTickTimerMS, pSyncEnv, pSyncEnv->pTimerManager, &pSyncEnv->pEnvTickTimer);
2022-03-12 09:02:15 +00:00
} else {
2022-03-16 13:22:56 +00:00
sTrace("syncEnvTick pass ... envTickTimerLogicClockUser:%" PRIu64 ", envTickTimerLogicClock:%" PRIu64
", envTickTimerCounter:%" PRIu64
", "
"envTickTimerMS:%d, tmrId:%p",
pSyncEnv->envTickTimerLogicClockUser, pSyncEnv->envTickTimerLogicClock, pSyncEnv->envTickTimerCounter,
pSyncEnv->envTickTimerMS, tmrId);
2022-03-12 04:29:44 +00:00
}
2022-02-28 06:10:34 +00:00
}
2022-03-12 04:29:44 +00:00
static SSyncEnv *doSyncEnvStart() {
2022-03-25 16:29:53 +00:00
SSyncEnv *pSyncEnv = (SSyncEnv *)taosMemoryMalloc(sizeof(SSyncEnv));
2022-06-21 08:02:36 +00:00
ASSERT(pSyncEnv != NULL);
memset(pSyncEnv, 0, sizeof(SSyncEnv));
2022-03-12 04:29:44 +00:00
pSyncEnv->envTickTimerCounter = 0;
pSyncEnv->envTickTimerMS = ENV_TICK_TIMER_MS;
pSyncEnv->FpEnvTickTimer = syncEnvTick;
atomic_store_64(&pSyncEnv->envTickTimerLogicClock, 0);
atomic_store_64(&pSyncEnv->envTickTimerLogicClockUser, 0);
2022-02-28 06:10:34 +00:00
// start tmr thread
pSyncEnv->pTimerManager = taosTmrInit(1000, 50, 10000, "SYNC-ENV");
2022-04-27 10:10:57 +00:00
atomic_store_8(&(pSyncEnv->isStart), 1);
2022-03-12 04:29:44 +00:00
return pSyncEnv;
2022-02-28 06:10:34 +00:00
}
static int32_t doSyncEnvStop(SSyncEnv *pSyncEnv) {
2022-06-21 08:02:36 +00:00
ASSERT(pSyncEnv == gSyncEnv);
2022-04-24 05:38:49 +00:00
if (pSyncEnv != NULL) {
2022-04-27 10:10:57 +00:00
atomic_store_8(&(pSyncEnv->isStart), 0);
2022-04-24 05:38:49 +00:00
taosTmrCleanUp(pSyncEnv->pTimerManager);
taosMemoryFree(pSyncEnv);
}
2022-04-24 06:55:01 +00:00
gSyncEnv = NULL;
2022-02-28 06:10:34 +00:00
return 0;
}
2022-03-12 04:29:44 +00:00
static int32_t doSyncEnvStartTimer(SSyncEnv *pSyncEnv) {
int32_t ret = 0;
2022-03-12 09:02:15 +00:00
taosTmrReset(pSyncEnv->FpEnvTickTimer, pSyncEnv->envTickTimerMS, pSyncEnv, pSyncEnv->pTimerManager,
&pSyncEnv->pEnvTickTimer);
2022-03-12 04:29:44 +00:00
atomic_store_64(&pSyncEnv->envTickTimerLogicClock, pSyncEnv->envTickTimerLogicClockUser);
return ret;
2022-02-28 06:10:34 +00:00
}
2022-02-26 18:24:50 +00:00
2022-03-12 04:29:44 +00:00
static int32_t doSyncEnvStopTimer(SSyncEnv *pSyncEnv) {
2022-03-12 09:02:15 +00:00
int32_t ret = 0;
2022-03-12 04:29:44 +00:00
atomic_add_fetch_64(&pSyncEnv->envTickTimerLogicClockUser, 1);
taosTmrStop(pSyncEnv->pEnvTickTimer);
pSyncEnv->pEnvTickTimer = NULL;
2022-03-12 09:02:15 +00:00
return ret;
2022-03-12 04:29:44 +00:00
}