Skip to content

Commit 4e4a215

Browse files
authored
Add sql to show configurations
1 parent 9854f01 commit 4e4a215

32 files changed

Lines changed: 658 additions & 95 deletions

File tree

integration-test/src/test/java/org/apache/iotdb/relational/it/db/it/IoTDBSetConfigurationTableIT.java

Lines changed: 55 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package org.apache.iotdb.relational.it.db.it;
2121

2222
import org.apache.iotdb.commons.conf.CommonConfig;
23+
import org.apache.iotdb.isession.ITableSession;
24+
import org.apache.iotdb.isession.SessionDataSet;
2325
import org.apache.iotdb.it.env.EnvFactory;
2426
import org.apache.iotdb.it.env.cluster.node.AbstractNodeWrapper;
2527
import org.apache.iotdb.it.framework.IoTDBTestRunner;
@@ -39,7 +41,8 @@
3941
import java.nio.file.Files;
4042
import java.sql.Connection;
4143
import java.sql.Statement;
42-
import java.util.Arrays;
44+
import java.util.HashMap;
45+
import java.util.Map;
4346

4447
@RunWith(IoTDBTestRunner.class)
4548
@Category({TableLocalStandaloneIT.class, TableClusterIT.class})
@@ -91,11 +94,11 @@ private void executeAndExpectException(
9194

9295
@Test
9396
public void testSetConfiguration() {
97+
int configNodeNum = EnvFactory.getEnv().getConfigNodeWrapperList().size();
98+
int dataNodeNum = EnvFactory.getEnv().getDataNodeWrapperList().size();
9499
try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT);
95100
Statement statement = connection.createStatement()) {
96101
statement.execute("set configuration \"enable_seq_space_compaction\"='false'");
97-
int configNodeNum = EnvFactory.getEnv().getConfigNodeWrapperList().size();
98-
int dataNodeNum = EnvFactory.getEnv().getDataNodeWrapperList().size();
99102

100103
for (int i = 0; i < configNodeNum; i++) {
101104
statement.execute("set configuration enable_unseq_space_compaction=\'false\' on " + i);
@@ -110,28 +113,29 @@ public void testSetConfiguration() {
110113
} catch (Exception e) {
111114
Assert.fail(e.getMessage());
112115
}
113-
Assert.assertTrue(
114-
EnvFactory.getEnv().getConfigNodeWrapperList().stream()
115-
.allMatch(
116-
nodeWrapper ->
117-
checkConfigFileContains(
118-
nodeWrapper,
119-
"enable_seq_space_compaction=false",
120-
"enable_unseq_space_compaction=false")));
121-
Assert.assertTrue(
122-
EnvFactory.getEnv().getDataNodeWrapperList().stream()
123-
.allMatch(
124-
nodeWrapper ->
125-
checkConfigFileContains(
126-
nodeWrapper,
127-
"enable_seq_space_compaction=false",
128-
"enable_cross_space_compaction=false",
129-
"inner_compaction_candidate_file_num=1",
130-
"max_cross_compaction_candidate_file_num=1")));
116+
for (int i = 0; i < configNodeNum; i++) {
117+
Assert.assertTrue(
118+
checkConfigFileContains(
119+
i,
120+
EnvFactory.getEnv().getConfigNodeWrapperList().get(i),
121+
"enable_seq_space_compaction=false",
122+
"enable_unseq_space_compaction=false"));
123+
}
124+
for (int i = 0; i < dataNodeNum; i++) {
125+
int dnId = configNodeNum + i;
126+
Assert.assertTrue(
127+
checkConfigFileContains(
128+
dnId,
129+
EnvFactory.getEnv().getDataNodeWrapperList().get(i),
130+
"enable_seq_space_compaction=false",
131+
"enable_cross_space_compaction=false",
132+
"inner_compaction_candidate_file_num=1",
133+
"max_cross_compaction_candidate_file_num=1"));
134+
}
131135
}
132136

133137
private static boolean checkConfigFileContains(
134-
AbstractNodeWrapper nodeWrapper, String... contents) {
138+
int nodeId, AbstractNodeWrapper nodeWrapper, String... contents) {
135139
try {
136140
String systemPropertiesPath =
137141
nodeWrapper.getNodePath()
@@ -141,9 +145,37 @@ private static boolean checkConfigFileContains(
141145
+ CommonConfig.SYSTEM_CONFIG_NAME;
142146
File f = new File(systemPropertiesPath);
143147
String fileContent = new String(Files.readAllBytes(f.toPath()));
144-
return Arrays.stream(contents).allMatch(fileContent::contains);
148+
Map<String, String> showConfigurationResults = new HashMap<>();
149+
for (String content : contents) {
150+
if (!fileContent.contains(content)) {
151+
return false;
152+
}
153+
String[] split = content.split("=");
154+
showConfigurationResults.put(split[0], split[1]);
155+
}
156+
return checkShowConfigurationContains(nodeId, showConfigurationResults);
145157
} catch (IOException ignore) {
146158
return false;
147159
}
148160
}
161+
162+
private static boolean checkShowConfigurationContains(
163+
int nodeId, Map<String, String> expectedKeyValues) {
164+
try (ITableSession tableSessionConnection = EnvFactory.getEnv().getTableSessionConnection()) {
165+
SessionDataSet sessionDataSet =
166+
tableSessionConnection.executeQueryStatement("show configuration on " + nodeId);
167+
SessionDataSet.DataIterator iterator = sessionDataSet.iterator();
168+
while (iterator.next()) {
169+
String name = iterator.getString(1);
170+
String value = iterator.isNull(2) ? null : iterator.getString(2);
171+
String expectedValue = expectedKeyValues.remove(name);
172+
if (expectedValue != null && !expectedValue.equals(value)) {
173+
return false;
174+
}
175+
}
176+
} catch (Exception e) {
177+
return false;
178+
}
179+
return expectedKeyValues.isEmpty();
180+
}
149181
}

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/CnToCnNodeRequestType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public enum CnToCnNodeRequestType {
3030
STOP_AND_CLEAR_CONFIG_NODE,
3131
SET_CONFIGURATION,
3232
SHOW_CONFIGURATION,
33+
SHOW_APPLIED_CONFIGURATIONS,
3334
SUBMIT_TEST_CONNECTION_TASK,
3435
TEST_CONNECTION,
3536
}

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/CnToDnSyncRequestType.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ public enum CnToDnSyncRequestType {
2525
STOP_AND_CLEAR_DATA_NODE,
2626
SET_SYSTEM_STATUS,
2727
SHOW_CONFIGURATION,
28+
SHOW_APPLIED_CONFIGURATIONS,
2829

2930
// Region Maintenance
3031
CREATE_DATA_REGION,

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncConfigNodeClientPool.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,8 @@ public Object sendSyncRequestToConfigNodeWithRetry(
9898
return client.submitTestConnectionTask((TNodeLocations) req);
9999
case TEST_CONNECTION:
100100
return client.testConnectionEmptyRPC();
101+
case SHOW_APPLIED_CONFIGURATIONS:
102+
return client.showAppliedConfigurations((int) req);
101103
default:
102104
return RpcUtils.getStatus(
103105
TSStatusCode.EXECUTE_STATEMENT_ERROR, "Unknown request type: " + requestType);

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/client/sync/SyncDataNodeClientPool.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,9 @@ private void buildActionMap() {
135135
(req, client) -> client.resetPeerList((TResetPeerListReq) req));
136136
actionMapBuilder.put(
137137
CnToDnSyncRequestType.SHOW_CONFIGURATION, (req, client) -> client.showConfiguration());
138+
actionMapBuilder.put(
139+
CnToDnSyncRequestType.SHOW_APPLIED_CONFIGURATIONS,
140+
(req, client) -> client.showAppliedConfigurations());
138141
actionMap = actionMapBuilder.build();
139142
}
140143

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/conf/ConfigNodeDescriptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,7 @@ private void loadProps() {
147147
}
148148

149149
private void loadProperties(TrimProperties properties) throws BadNodeUrlException, IOException {
150+
ConfigurationFileUtils.updateAppliedProperties(properties, false);
150151
conf.setClusterName(properties.getProperty(IoTDBConstant.CLUSTER_NAME, conf.getClusterName()));
151152

152153
conf.setInternalAddress(
@@ -765,6 +766,7 @@ public boolean isSeedConfigNode() {
765766
}
766767

767768
public void loadHotModifiedProps(TrimProperties properties) {
769+
ConfigurationFileUtils.updateAppliedProperties(properties, true);
768770
Optional.ofNullable(properties.getProperty(IoTDBConstant.CLUSTER_NAME))
769771
.ifPresent(conf::setClusterName);
770772
}

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/ConfigManager.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
3838
import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
3939
import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
40+
import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
4041
import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
4142
import org.apache.iotdb.common.rpc.thrift.TTimePartitionSlot;
4243
import org.apache.iotdb.commons.auth.AuthException;
@@ -1727,7 +1728,12 @@ public TSStatus setConfiguration(TSetConfigurationReq req) {
17271728
} else {
17281729
String msg =
17291730
"Unable to find the configuration file. Some modifications are made only in memory.";
1730-
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, msg);
1731+
try {
1732+
ConfigNodeDescriptor.getInstance().loadHotModifiedProps(properties);
1733+
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, msg);
1734+
} catch (Exception e) {
1735+
tsStatus = RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, e.getMessage());
1736+
}
17311737
LOGGER.warn(msg);
17321738
}
17331739
if (currentNodeId == req.getNodeId()) {
@@ -1789,6 +1795,23 @@ public TShowConfigurationResp showConfiguration(int nodeId) {
17891795
: new TShowConfigurationResp(status, "");
17901796
}
17911797

1798+
public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) {
1799+
if (ConfigNodeDescriptor.getInstance().getConf().getConfigNodeId() == nodeId) {
1800+
TShowAppliedConfigurationsResp resp = new TShowAppliedConfigurationsResp();
1801+
resp.setStatus(RpcUtils.SUCCESS_STATUS);
1802+
try {
1803+
resp.setData(ConfigurationFileUtils.getAppliedProperties());
1804+
} catch (Exception e) {
1805+
resp.setStatus(RpcUtils.getStatus(TSStatusCode.EXECUTE_STATEMENT_ERROR, e.getMessage()));
1806+
}
1807+
return resp;
1808+
}
1809+
TSStatus status = confirmLeader();
1810+
return status.getCode() == TSStatusCode.SUCCESS_STATUS.getStatusCode()
1811+
? nodeManager.showAppliedConfigurations(nodeId)
1812+
: new TShowAppliedConfigurationsResp(status);
1813+
}
1814+
17921815
@Override
17931816
public TSStatus setSystemStatus(String systemStatus) {
17941817
TSStatus status = confirmLeader();

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/IManager.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.iotdb.common.rpc.thrift.TSeriesPartitionSlot;
2828
import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
2929
import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
30+
import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
3031
import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
3132
import org.apache.iotdb.commons.auth.entity.PrivilegeUnion;
3233
import org.apache.iotdb.commons.cluster.NodeStatus;
@@ -598,6 +599,9 @@ TDataPartitionTableResp getOrCreateDataPartition(
598599
/** Show content of configuration file on specified node */
599600
TShowConfigurationResp showConfiguration(int nodeId);
600601

602+
/** Show configuration on specified node by TsBlock */
603+
TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId);
604+
601605
/** Set system status on all DataNodes. */
602606
TSStatus setSystemStatus(String status);
603607

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/manager/node/NodeManager.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.iotdb.common.rpc.thrift.TRegionReplicaSet;
2828
import org.apache.iotdb.common.rpc.thrift.TSStatus;
2929
import org.apache.iotdb.common.rpc.thrift.TSetConfigurationReq;
30+
import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
3031
import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
3132
import org.apache.iotdb.commons.cluster.NodeStatus;
3233
import org.apache.iotdb.commons.cluster.NodeType;
@@ -1124,6 +1125,37 @@ public TShowConfigurationResp showConfiguration(int nodeId) {
11241125
return resp;
11251126
}
11261127

1128+
public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) {
1129+
// data node
1130+
Map<Integer, TDataNodeLocation> dataNodeLocationMap =
1131+
configManager.getNodeManager().getRegisteredDataNodeLocations();
1132+
if (dataNodeLocationMap.containsKey(nodeId)) {
1133+
TDataNodeLocation dataNodeLocation = dataNodeLocationMap.get(nodeId);
1134+
return (TShowAppliedConfigurationsResp)
1135+
SyncDataNodeClientPool.getInstance()
1136+
.sendSyncRequestToDataNodeWithRetry(
1137+
dataNodeLocation.getInternalEndPoint(),
1138+
null,
1139+
CnToDnSyncRequestType.SHOW_APPLIED_CONFIGURATIONS);
1140+
}
1141+
1142+
// other config node
1143+
TShowAppliedConfigurationsResp resp =
1144+
new TShowAppliedConfigurationsResp(RpcUtils.SUCCESS_STATUS);
1145+
for (TConfigNodeLocation registeredConfigNode : getRegisteredConfigNodes()) {
1146+
if (registeredConfigNode.getConfigNodeId() != nodeId) {
1147+
continue;
1148+
}
1149+
return (TShowAppliedConfigurationsResp)
1150+
SyncConfigNodeClientPool.getInstance()
1151+
.sendSyncRequestToConfigNodeWithRetry(
1152+
registeredConfigNode.getInternalEndPoint(),
1153+
nodeId,
1154+
CnToCnNodeRequestType.SHOW_APPLIED_CONFIGURATIONS);
1155+
}
1156+
return resp;
1157+
}
1158+
11271159
public List<TSStatus> setSystemStatus(String status) {
11281160
Map<Integer, TDataNodeLocation> dataNodeLocationMap =
11291161
configManager.getNodeManager().getRegisteredDataNodeLocations();

iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/service/thrift/ConfigNodeRPCServiceProcessor.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.iotdb.common.rpc.thrift.TSetSpaceQuotaReq;
3131
import org.apache.iotdb.common.rpc.thrift.TSetTTLReq;
3232
import org.apache.iotdb.common.rpc.thrift.TSetThrottleQuotaReq;
33+
import org.apache.iotdb.common.rpc.thrift.TShowAppliedConfigurationsResp;
3334
import org.apache.iotdb.common.rpc.thrift.TShowConfigurationResp;
3435
import org.apache.iotdb.common.rpc.thrift.TShowTTLReq;
3536
import org.apache.iotdb.common.rpc.thrift.TTestConnectionResp;
@@ -989,6 +990,11 @@ public TShowConfigurationResp showConfiguration(int nodeId) throws TException {
989990
return configManager.showConfiguration(nodeId);
990991
}
991992

993+
@Override
994+
public TShowAppliedConfigurationsResp showAppliedConfigurations(int nodeId) throws TException {
995+
return configManager.showAppliedConfigurations(nodeId);
996+
}
997+
992998
@Override
993999
public TSStatus setSystemStatus(String status) {
9941000
return configManager.setSystemStatus(status);

0 commit comments

Comments
 (0)