From 9f43b6b56a2f7e1fa94a803fd1f757bf5efdf289 Mon Sep 17 00:00:00 2001 From: HeimingZ Date: Mon, 19 Sep 2022 18:57:07 +0800 Subject: [PATCH 1/3] Restrict multi_dir_strategy to MaxDiskUsableSpaceFirstStrategy when using cluster --- .../resources/conf/iotdb-datanode.properties | 2 +- .../java/org/apache/iotdb/db/conf/IoTDBConfig.java | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/server/src/assembly/resources/conf/iotdb-datanode.properties b/server/src/assembly/resources/conf/iotdb-datanode.properties index 6f9173bc6333d..c22f841e37c95 100644 --- a/server/src/assembly/resources/conf/iotdb-datanode.properties +++ b/server/src/assembly/resources/conf/iotdb-datanode.properties @@ -229,7 +229,7 @@ target_config_nodes=127.0.0.1:22277 # data_dirs=data/data -# mult_dir_strategy +# multi_dir_strategy # The strategy is used to choose a directory from data_dirs for the system to store a new tsfile. # System provides four strategies to choose from, or user can create his own strategy by extending org.apache.iotdb.db.conf.directories.strategy.DirectoryStrategy. # The info of the four strategies are as follows: diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java index 9e14dc37ed48d..f875c905b9d21 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java @@ -22,6 +22,7 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.db.conf.directories.DirectoryManager; +import org.apache.iotdb.db.conf.directories.strategy.MaxDiskUsableSpaceFirstStrategy; import org.apache.iotdb.db.engine.compaction.constant.CompactionPriority; import org.apache.iotdb.db.engine.compaction.constant.CrossCompactionPerformer; import org.apache.iotdb.db.engine.compaction.constant.CrossCompactionSelector; @@ -1391,6 +1392,17 @@ public String getMultiDirStrategyClassName() { } void setMultiDirStrategyClassName(String multiDirStrategyClassName) { + if (IoTDBDescriptor.getInstance().getConfig().isClusterMode() + && !(multiDirStrategyClassName.equals(MaxDiskUsableSpaceFirstStrategy.class.getSimpleName()) + || multiDirStrategyClassName.equals( + MaxDiskUsableSpaceFirstStrategy.class.getCanonicalName()))) { + String msg = + String.format( + "Cannot set multi_dir_strategy to %s, because cluster mode only allows MaxDiskUsableSpaceFirstStrategy.", + multiDirStrategyClassName); + logger.error(msg); + throw new RuntimeException(msg); + } this.multiDirStrategyClassName = multiDirStrategyClassName; } From 508335baf00f92ed5f629fb411caed84d21d58ba Mon Sep 17 00:00:00 2001 From: HeimingZ Date: Tue, 20 Sep 2022 12:36:58 +0800 Subject: [PATCH 2/3] check multi_dir_strategy after setClusterMode --- .../org/apache/iotdb/db/conf/IoTDBConfig.java | 13 +++--- .../apache/iotdb/db/conf/IoTDBDescriptor.java | 1 + .../org/apache/iotdb/db/service/DataNode.java | 42 +++++++------------ .../org/apache/iotdb/db/service/IoTDB.java | 4 -- 4 files changed, 25 insertions(+), 35 deletions(-) diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java index f875c905b9d21..71c1f8bfad28e 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBConfig.java @@ -22,7 +22,6 @@ import org.apache.iotdb.commons.conf.IoTDBConstant; import org.apache.iotdb.consensus.ConsensusFactory; import org.apache.iotdb.db.conf.directories.DirectoryManager; -import org.apache.iotdb.db.conf.directories.strategy.MaxDiskUsableSpaceFirstStrategy; import org.apache.iotdb.db.engine.compaction.constant.CompactionPriority; import org.apache.iotdb.db.engine.compaction.constant.CrossCompactionPerformer; import org.apache.iotdb.db.engine.compaction.constant.CrossCompactionSelector; @@ -1392,10 +1391,14 @@ public String getMultiDirStrategyClassName() { } void setMultiDirStrategyClassName(String multiDirStrategyClassName) { - if (IoTDBDescriptor.getInstance().getConfig().isClusterMode() - && !(multiDirStrategyClassName.equals(MaxDiskUsableSpaceFirstStrategy.class.getSimpleName()) + this.multiDirStrategyClassName = multiDirStrategyClassName; + } + + public void checkMultiDirStrategyClassName() { + if (isClusterMode + && !(multiDirStrategyClassName.equals(DEFAULT_MULTI_DIR_STRATEGY) || multiDirStrategyClassName.equals( - MaxDiskUsableSpaceFirstStrategy.class.getCanonicalName()))) { + MULTI_DIR_STRATEGY_PREFIX + DEFAULT_MULTI_DIR_STRATEGY))) { String msg = String.format( "Cannot set multi_dir_strategy to %s, because cluster mode only allows MaxDiskUsableSpaceFirstStrategy.", @@ -1403,7 +1406,6 @@ void setMultiDirStrategyClassName(String multiDirStrategyClassName) { logger.error(msg); throw new RuntimeException(msg); } - this.multiDirStrategyClassName = multiDirStrategyClassName; } public int getBatchSize() { @@ -2985,6 +2987,7 @@ public boolean isClusterMode() { public void setClusterMode(boolean isClusterMode) { this.isClusterMode = isClusterMode; + checkMultiDirStrategyClassName(); } public int getDataNodeId() { diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java index 7171b70191d69..4d5d0e519b944 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java @@ -347,6 +347,7 @@ public void loadProperties(Properties properties) { conf.setMultiDirStrategyClassName( properties.getProperty("multi_dir_strategy", conf.getMultiDirStrategyClassName())); + conf.checkMultiDirStrategyClassName(); conf.setBatchSize( Integer.parseInt( diff --git a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java index 139233c310560..bf6efa34b7f7b 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/DataNode.java +++ b/server/src/main/java/org/apache/iotdb/db/service/DataNode.java @@ -124,8 +124,8 @@ protected void serverCheckAndInit() throws ConfigurationException, IOException { if (config.getRpcAddress().equals("0.0.0.0")) { config.setRpcAddress(config.getInternalAddress()); } - thisNode.setIp(IoTDBDescriptor.getInstance().getConfig().getInternalAddress()); - thisNode.setPort(IoTDBDescriptor.getInstance().getConfig().getInternalPort()); + thisNode.setIp(config.getInternalAddress()); + thisNode.setPort(config.getInternalPort()); } protected void doAddNode() { @@ -161,16 +161,15 @@ private void prepareDataNode() throws StartupException { // Register services JMXService.registerMBean(getInstance(), mbeanName); // set the mpp mode to true - IoTDBDescriptor.getInstance().getConfig().setMppMode(true); - IoTDBDescriptor.getInstance().getConfig().setClusterMode(true); + config.setMppMode(true); + config.setClusterMode(true); } /** register DataNode with ConfigNode */ private void registerInConfigNode() throws StartupException { int retry = DEFAULT_JOIN_RETRY; - ConfigNodeInfo.getInstance() - .updateConfigNodeList(IoTDBDescriptor.getInstance().getConfig().getTargetConfigNodeList()); + ConfigNodeInfo.getInstance().updateConfigNodeList(config.getTargetConfigNodeList()); while (retry > 0) { logger.info("start registering to the cluster."); try (ConfigNodeClient configNodeClient = new ConfigNodeClient()) { @@ -227,7 +226,7 @@ private void registerInConfigNode() throws StartupException { try { // wait 5s to start the next try - Thread.sleep(IoTDBDescriptor.getInstance().getConfig().getJoinClusterTimeOutMs()); + Thread.sleep(config.getJoinClusterTimeOutMs()); } catch (InterruptedException e) { Thread.currentThread().interrupt(); logger.warn("Unexpected interruption when waiting to register to the cluster", e); @@ -331,7 +330,7 @@ private void setUpRPCService() throws StartupException { IoTDBDescriptor.getInstance() .getConfig() .setRpcImplClassName(ClientRPCServiceImpl.class.getName()); - if (IoTDBDescriptor.getInstance().getConfig().isEnableRpcService()) { + if (config.isEnableRpcService()) { registerManager.register(RPCService.getInstance()); } // init service protocols @@ -369,27 +368,18 @@ private void registerUdfServices() throws StartupException { registerManager.register(TemporaryQueryDataFileService.getInstance()); registerManager.register( UDFExecutableManager.setupAndGetInstance( - IoTDBDescriptor.getInstance().getConfig().getUdfTemporaryLibDir(), - IoTDBDescriptor.getInstance().getConfig().getUdfDir())); - registerManager.register( - UDFClassLoaderManager.setupAndGetInstance( - IoTDBDescriptor.getInstance().getConfig().getUdfDir())); + config.getUdfTemporaryLibDir(), config.getUdfDir())); + registerManager.register(UDFClassLoaderManager.setupAndGetInstance(config.getUdfDir())); registerManager.register( UDFRegistrationService.setupAndGetInstance( - IoTDBDescriptor.getInstance().getConfig().getSystemDir() - + File.separator - + "udf" - + File.separator)); + config.getSystemDir() + File.separator + "udf" + File.separator)); } private void registerTriggerServices() throws StartupException { registerManager.register( TriggerExecutableManager.setupAndGetInstance( - IoTDBDescriptor.getInstance().getConfig().getTriggerTemporaryLibDir(), - IoTDBDescriptor.getInstance().getConfig().getTriggerDir())); - registerManager.register( - TriggerClassLoaderManager.setupAndGetInstance( - IoTDBDescriptor.getInstance().getConfig().getTriggerDir())); + config.getTriggerTemporaryLibDir(), config.getTriggerDir())); + registerManager.register(TriggerClassLoaderManager.setupAndGetInstance(config.getTriggerDir())); registerManager.register(TriggerManagementService.setupAndGetInstance()); } @@ -400,8 +390,8 @@ private void initSchemaEngine() { logger.info("spend {}ms to recover schema.", end); logger.info( "After initializing, sequence tsFile threshold is {}, unsequence tsFile threshold is {}", - IoTDBDescriptor.getInstance().getConfig().getSeqTsFileSize(), - IoTDBDescriptor.getInstance().getConfig().getUnSeqTsFileSize()); + config.getSeqTsFileSize(), + config.getUnSeqTsFileSize()); } public void stop() { @@ -421,11 +411,11 @@ private void initServiceProvider() throws QueryProcessException { } private void initProtocols() throws StartupException { - if (IoTDBDescriptor.getInstance().getConfig().isEnableInfluxDBRpcService()) { + if (config.isEnableInfluxDBRpcService()) { registerManager.register(InfluxDBRPCService.getInstance()); IoTDB.initInfluxDBMManager(); } - if (IoTDBDescriptor.getInstance().getConfig().isEnableMQTTService()) { + if (config.isEnableMQTTService()) { registerManager.register(MQTTService.getInstance()); } if (IoTDBRestServiceDescriptor.getInstance().getConfig().isEnableRestService()) { diff --git a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java index 3a15ac2a6ece2..8785aad28e237 100644 --- a/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java +++ b/server/src/main/java/org/apache/iotdb/db/service/IoTDB.java @@ -97,10 +97,6 @@ public static void setServiceProvider(ServiceProvider serviceProvider) { IoTDB.serviceProvider = serviceProvider; } - public static void setClusterMode() { - config.setClusterMode(true); - } - public void active() { StartupChecks checks = new StartupChecks().withDefaultTest(); try { From fec1113bc459b321400624637b4e0ee578ca7253 Mon Sep 17 00:00:00 2001 From: HeimingZ Date: Wed, 21 Sep 2022 09:44:29 +0800 Subject: [PATCH 3/3] fix --- .../java/org/apache/iotdb/db/conf/IoTDBDescriptor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java index 4d5d0e519b944..b91d4a2fab838 100644 --- a/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java +++ b/server/src/main/java/org/apache/iotdb/db/conf/IoTDBDescriptor.java @@ -345,9 +345,15 @@ public void loadProperties(Properties properties) { conf.setSyncMlogPeriodInMs(forceMlogPeriodInMs); } + String oldMultiDirStrategyClassName = conf.getMultiDirStrategyClassName(); conf.setMultiDirStrategyClassName( properties.getProperty("multi_dir_strategy", conf.getMultiDirStrategyClassName())); - conf.checkMultiDirStrategyClassName(); + try { + conf.checkMultiDirStrategyClassName(); + } catch (Exception e) { + conf.setMultiDirStrategyClassName(oldMultiDirStrategyClassName); + throw e; + } conf.setBatchSize( Integer.parseInt(