• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

taosdata / TDengine / #3621

22 Feb 2025 11:44AM UTC coverage: 2.037% (-61.5%) from 63.573%
#3621

push

travis-ci

web-flow
Merge pull request #29874 from taosdata/merge/mainto3.0

merge: from main to 3.0 branch

4357 of 287032 branches covered (1.52%)

Branch coverage included in aggregate %.

0 of 174 new or added lines in 18 files covered. (0.0%)

213359 existing lines in 469 files now uncovered.

7260 of 283369 relevant lines covered (2.56%)

23737.72 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/source/dnode/mgmt/mgmt_mnode/src/mmFile.c
1
/*
2
 * Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
3
 *
4
 * This program is free software: you can use, redistribute, and/or modify
5
 * it under the terms of the GNU Affero General Public License, version 3
6
 * or later ("AGPL"), as published by the Free Software Foundation.
7
 *
8
 * This program is distributed in the hope that it will be useful, but WITHOUT
9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
 * FITNESS FOR A PARTICULAR PURPOSE.
11
 *
12
 * You should have received a copy of the GNU Affero General Public License
13
 * along with this program. If not, see <http:www.gnu.org/licenses/>.
14
 */
15

16
#define _DEFAULT_SOURCE
17
#include "mmInt.h"
18
#include "tjson.h"
19

UNCOV
20
static int32_t mmDecodeOption(SJson *pJson, SMnodeOpt *pOption) {
×
UNCOV
21
  int32_t code = 0;
×
22

UNCOV
23
  tjsonGetInt32ValueFromDouble(pJson, "deployed", pOption->deploy, code);
×
UNCOV
24
  if (code < 0) return code;
×
UNCOV
25
  tjsonGetInt32ValueFromDouble(pJson, "selfIndex", pOption->selfIndex, code);
×
UNCOV
26
  if (code < 0) return code;
×
UNCOV
27
  tjsonGetInt32ValueFromDouble(pJson, "lastIndex", pOption->lastIndex, code);
×
UNCOV
28
  if (code < 0) return code;
×
29

UNCOV
30
  SJson *replicas = tjsonGetObjectItem(pJson, "replicas");
×
UNCOV
31
  if (replicas == NULL) return 0;
×
UNCOV
32
  pOption->numOfTotalReplicas = tjsonGetArraySize(replicas);
×
33

UNCOV
34
  pOption->numOfReplicas = 0;
×
35

UNCOV
36
  for (int32_t i = 0; i < pOption->numOfTotalReplicas; ++i) {
×
UNCOV
37
    SJson *replica = tjsonGetArrayItem(replicas, i);
×
UNCOV
38
    if (replica == NULL) return TSDB_CODE_INVALID_JSON_FORMAT;
×
39

UNCOV
40
    SReplica *pReplica = pOption->replicas + i;
×
UNCOV
41
    tjsonGetInt32ValueFromDouble(replica, "id", pReplica->id, code);
×
UNCOV
42
    if (code < 0) return code;
×
UNCOV
43
    code = tjsonGetStringValue(replica, "fqdn", pReplica->fqdn);
×
UNCOV
44
    if (code < 0) return code;
×
UNCOV
45
    tjsonGetUInt16ValueFromDouble(replica, "port", pReplica->port, code);
×
UNCOV
46
    if (code < 0) return code;
×
UNCOV
47
    tjsonGetInt32ValueFromDouble(replica, "role", pOption->nodeRoles[i], code);
×
UNCOV
48
    if (code < 0) return code;
×
UNCOV
49
    if (pOption->nodeRoles[i] == TAOS_SYNC_ROLE_VOTER) {
×
UNCOV
50
      pOption->numOfReplicas++;
×
51
    }
52
  }
53

UNCOV
54
  for (int32_t i = 0; i < pOption->numOfTotalReplicas; ++i) {
×
55
  }
56

UNCOV
57
  return 0;
×
58
}
59

UNCOV
60
int32_t mmReadFile(const char *path, SMnodeOpt *pOption) {
×
UNCOV
61
  int32_t   code = -1;
×
UNCOV
62
  TdFilePtr pFile = NULL;
×
UNCOV
63
  char     *pData = NULL;
×
UNCOV
64
  SJson    *pJson = NULL;
×
UNCOV
65
  char      file[PATH_MAX] = {0};
×
66

UNCOV
67
  int32_t nBytes = snprintf(file, sizeof(file), "%s%smnode.json", path, TD_DIRSEP);
×
UNCOV
68
  if (nBytes <= 0 || nBytes >= sizeof(file)) {
×
69
    code = TSDB_CODE_OUT_OF_BUFFER;
×
70
    goto _OVER;
×
71
  }
72

UNCOV
73
  if (taosStatFile(file, NULL, NULL, NULL) < 0) {
×
UNCOV
74
    dInfo("mnode file:%s not exist, reason:%s", file, tstrerror(terrno));
×
UNCOV
75
    return 0;
×
76
  }
77

UNCOV
78
  pFile = taosOpenFile(file, TD_FILE_READ);
×
UNCOV
79
  if (pFile == NULL) {
×
80
    code = terrno;
×
81
    dError("failed to open mnode file:%s since %s", file, tstrerror(code));
×
82
    goto _OVER;
×
83
  }
84

UNCOV
85
  int64_t size = 0;
×
UNCOV
86
  code = taosFStatFile(pFile, &size, NULL);
×
UNCOV
87
  if (code != 0) {
×
88
    dError("failed to fstat mnode file:%s since %s", file, tstrerror(code));
×
89
    goto _OVER;
×
90
  }
91

UNCOV
92
  pData = taosMemoryMalloc(size + 1);
×
UNCOV
93
  if (pData == NULL) {
×
94
    code = terrno;
×
95
    goto _OVER;
×
96
  }
97

UNCOV
98
  if (taosReadFile(pFile, pData, size) != size) {
×
99
    code = terrno;
×
100
    dError("failed to read mnode file:%s since %s", file, tstrerror(code));
×
101
    goto _OVER;
×
102
  }
103

UNCOV
104
  pData[size] = '\0';
×
105

UNCOV
106
  pJson = tjsonParse(pData);
×
UNCOV
107
  if (pJson == NULL) {
×
108
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
109
    goto _OVER;
×
110
  }
111

UNCOV
112
  if ((code = mmDecodeOption(pJson, pOption)) < 0) {
×
113
    goto _OVER;
×
114
  }
115

UNCOV
116
  code = 0;
×
UNCOV
117
  dInfo("succceed to read mnode file %s", file);
×
118

119
_OVER:
×
UNCOV
120
  if (pData != NULL) taosMemoryFree(pData);
×
UNCOV
121
  if (pJson != NULL) cJSON_Delete(pJson);
×
UNCOV
122
  if (pFile != NULL) taosCloseFile(&pFile);
×
123

UNCOV
124
  if (code != 0) {
×
125
    dError("failed to read mnode file:%s since %s", file, tstrerror(code));
×
126
  }
UNCOV
127
  return code;
×
128
}
129

UNCOV
130
static int32_t mmEncodeOption(SJson *pJson, const SMnodeOpt *pOption) {
×
UNCOV
131
  int32_t code = 0;
×
UNCOV
132
  if (pOption->deploy && pOption->numOfTotalReplicas > 0) {
×
UNCOV
133
    if ((code = tjsonAddDoubleToObject(pJson, "selfIndex", pOption->selfIndex)) < 0) return code;
×
134

UNCOV
135
    SJson *replicas = tjsonCreateArray();
×
UNCOV
136
    if (replicas == NULL) {
×
137
      return terrno;
×
138
    }
UNCOV
139
    if ((code = tjsonAddItemToObject(pJson, "replicas", replicas)) < 0) return code;
×
140

UNCOV
141
    for (int32_t i = 0; i < pOption->numOfTotalReplicas; ++i) {
×
UNCOV
142
      SJson *replica = tjsonCreateObject();
×
UNCOV
143
      if (replica == NULL) {
×
144
        return terrno;
×
145
      }
146

UNCOV
147
      const SReplica *pReplica = pOption->replicas + i;
×
UNCOV
148
      if ((code = tjsonAddDoubleToObject(replica, "id", pReplica->id)) < 0) return code;
×
UNCOV
149
      if ((code = tjsonAddStringToObject(replica, "fqdn", pReplica->fqdn)) < 0) return code;
×
UNCOV
150
      if ((code = tjsonAddDoubleToObject(replica, "port", pReplica->port)) < 0) return code;
×
UNCOV
151
      if ((code = tjsonAddDoubleToObject(replica, "role", pOption->nodeRoles[i])) < 0) return code;
×
UNCOV
152
      if ((code = tjsonAddItemToArray(replicas, replica)) < 0) return code;
×
153
    }
154
  }
155

UNCOV
156
  if ((code = tjsonAddDoubleToObject(pJson, "lastIndex", pOption->lastIndex)) < 0) return code;
×
157

UNCOV
158
  if ((code = tjsonAddDoubleToObject(pJson, "deployed", pOption->deploy)) < 0) return code;
×
159

UNCOV
160
  return code;
×
161
}
162

UNCOV
163
int32_t mmWriteFile(const char *path, const SMnodeOpt *pOption) {
×
UNCOV
164
  int32_t   code = -1;
×
UNCOV
165
  char     *buffer = NULL;
×
UNCOV
166
  SJson    *pJson = NULL;
×
UNCOV
167
  TdFilePtr pFile = NULL;
×
UNCOV
168
  char      file[PATH_MAX] = {0};
×
UNCOV
169
  char      realfile[PATH_MAX] = {0};
×
170

UNCOV
171
  int32_t nBytes = snprintf(file, sizeof(file), "%s%smnode.json.bak", path, TD_DIRSEP);
×
UNCOV
172
  if (nBytes <= 0 || nBytes >= sizeof(file)) {
×
173
    code = TSDB_CODE_OUT_OF_BUFFER;
×
174
    goto _OVER;
×
175
  }
176

UNCOV
177
  nBytes = snprintf(realfile, sizeof(realfile), "%s%smnode.json", path, TD_DIRSEP);
×
UNCOV
178
  if (nBytes <= 0 || nBytes >= sizeof(realfile)) {
×
179
    code = TSDB_CODE_OUT_OF_BUFFER;
×
180
    goto _OVER;
×
181
  }
182

183
  // terrno = TSDB_CODE_OUT_OF_MEMORY;
UNCOV
184
  pJson = tjsonCreateObject();
×
UNCOV
185
  if (pJson == NULL) {
×
186
    code = terrno;
×
187
    goto _OVER;
×
188
  }
189

UNCOV
190
  TAOS_CHECK_GOTO(mmEncodeOption(pJson, pOption), NULL, _OVER);
×
191

UNCOV
192
  buffer = tjsonToString(pJson);
×
UNCOV
193
  if (buffer == NULL) {
×
194
    code = TSDB_CODE_INVALID_JSON_FORMAT;
×
195
    goto _OVER;
×
196
  }
197

UNCOV
198
  pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_WRITE_THROUGH);
×
UNCOV
199
  if (pFile == NULL) {
×
200
    code = terrno;
×
201
    goto _OVER;
×
202
  }
203

UNCOV
204
  int32_t len = strlen(buffer);
×
UNCOV
205
  if (taosWriteFile(pFile, buffer, len) <= 0) {
×
206
    code = terrno;
×
207
    goto _OVER;
×
208
  }
UNCOV
209
  if (taosFsyncFile(pFile) < 0) {
×
210
    code = terrno;
×
211
    goto _OVER;
×
212
  }
213

UNCOV
214
  if (taosCloseFile(&pFile) < 0) {
×
215
    code = TAOS_SYSTEM_ERROR(errno);
×
216
    goto _OVER;
×
217
  }
UNCOV
218
  TAOS_CHECK_GOTO(taosRenameFile(file, realfile), NULL, _OVER);
×
219

UNCOV
220
  dInfo("succeed to write mnode file:%s, deloyed:%d", realfile, pOption->deploy);
×
221

222
_OVER:
×
UNCOV
223
  if (pJson != NULL) tjsonDelete(pJson);
×
UNCOV
224
  if (buffer != NULL) taosMemoryFree(buffer);
×
UNCOV
225
  if (pFile != NULL) taosCloseFile(&pFile);
×
226

UNCOV
227
  if (code != 0) {
×
228
    dError("failed to write mnode file:%s since %s, deloyed:%d", realfile, tstrerror(code), pOption->deploy);
×
229
  }
UNCOV
230
  return code;
×
231
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc