From 6633a68ee49016ef1e8854b62c2d696edf9a7c0d Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Thu, 12 Sep 2024 19:44:46 +0800 Subject: [PATCH 1/7] [enhancement](cloud) Prohibit changing deployment mode --- be/src/olap/olap_define.h | 1 + be/src/runtime/exec_env.h | 1 + be/src/runtime/exec_env_init.cpp | 35 +++++++++++++++++++ .../main/java/org/apache/doris/DorisFE.java | 4 ++- .../java/org/apache/doris/catalog/Env.java | 19 ++++++++++ .../org/apache/doris/persist/Storage.java | 31 ++++++++++++++++ 6 files changed, 90 insertions(+), 1 deletion(-) diff --git a/be/src/olap/olap_define.h b/be/src/olap/olap_define.h index 0e6d0155d60096..0d72e662dd4a20 100644 --- a/be/src/olap/olap_define.h +++ b/be/src/olap/olap_define.h @@ -87,6 +87,7 @@ enum OLAPDataVersion { // Different types of folder names under storage_root_path static const std::string MINI_PREFIX = "mini_download"; static const std::string CLUSTER_ID_PREFIX = "cluster_id"; +static const std::string DEPLOY_MODE_PREFIX = "mode"; static const std::string DATA_PREFIX = "data"; static const std::string DPP_PREFIX = "dpp_download"; static const std::string SNAPSHOT_PREFIX = "snapshot"; diff --git a/be/src/runtime/exec_env.h b/be/src/runtime/exec_env.h index 38fcaceb47953a..b0b870aa327c74 100644 --- a/be/src/runtime/exec_env.h +++ b/be/src/runtime/exec_env.h @@ -333,6 +333,7 @@ class ExecEnv { void _destroy(); Status _init_mem_env(); + Status _check_deploy_mode(); void _register_metrics(); void _deregister_metrics(); diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp index a69709d24d2466..9c88124ce0f4c3 100644 --- a/be/src/runtime/exec_env_init.cpp +++ b/be/src/runtime/exec_env_init.cpp @@ -343,6 +343,8 @@ Status ExecEnv::_init(const std::vector& store_paths, options.store_paths = store_paths; options.broken_paths = broken_paths; options.backend_uid = doris::UniqueId::gen_uid(); + // Check if the startup mode has been modified + RETURN_IF_ERROR(_check_deploy_mode()); if (config::is_cloud_mode()) { std::cout << "start BE in cloud mode, cloud_unique_id: " << config::cloud_unique_id << ", meta_service_endpoint: " << config::meta_service_endpoint << std::endl; @@ -615,6 +617,39 @@ void ExecEnv::init_mem_tracker() { MemTrackerLimiter::create_shared(MemTrackerLimiter::Type::LOAD, "StreamLoadPipe"); } +Status ExecEnv::_check_deploy_mode() { + for (auto _path : _store_paths) { + auto deploy_mode_path = fmt::format("{}/{}", _path.path, DEPLOY_MODE_PREFIX); + std::string expected_mode = doris::config::is_cloud_mode() ? "cloud" : "local"; + bool exists = false; + RETURN_IF_ERROR(io::global_local_filesystem()->exists(deploy_mode_path, &exists)); + if (exists) { + // check if is ok + io::FileReaderSPtr reader; + RETURN_IF_ERROR(io::global_local_filesystem()->open_file(deploy_mode_path, &reader)); + size_t fsize = reader->size(); + if (fsize > 0) { + std::string actual_mode; + actual_mode.resize(fsize, '\0'); + size_t bytes_read = 0; + RETURN_IF_ERROR(reader->read_at(0, {actual_mode.data(), fsize}, &bytes_read)); + DCHECK_EQ(fsize, bytes_read); + if (expected_mode != actual_mode) { + return Status::InternalError("You can't switch deploy mode from {} to {}.\n", + actual_mode.c_str(), expected_mode.c_str()); + } + } + } else { + io::FileWriterPtr file_writer; + RETURN_IF_ERROR( + io::global_local_filesystem()->create_file(deploy_mode_path, &file_writer)); + RETURN_IF_ERROR(file_writer->append(expected_mode)); + RETURN_IF_ERROR(file_writer->close()); + } + } + return Status::OK(); +} + void ExecEnv::_register_metrics() { REGISTER_HOOK_METRIC(send_batch_thread_pool_thread_num, [this]() { return _send_batch_thread_pool->num_threads(); }); diff --git a/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java b/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java index d028f3aeae1437..d5b7cd7354eb1f 100755 --- a/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java +++ b/fe/fe-core/src/main/java/org/apache/doris/DorisFE.java @@ -231,7 +231,9 @@ public static void start(String dorisHomeDir, String pidDir, String[] args, Star // Some exception may thrown before LOG is inited. // So need to print to stdout e.printStackTrace(); - LOG.warn("", e); + LOG.error("", e); + // to avoid nonDaemon Thread block main Thread, we need to force exit + System.exit(-1); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 35bf31ad3fcdb3..ae225fb08d34bb 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -1075,6 +1075,7 @@ public void initialize(String[] args) throws Exception { // 2. get cluster id and role (Observer or Follower) if (!Config.enable_check_compatibility_mode) { + checkDeployMode(); getClusterIdAndRole(); } else { isElectable = true; @@ -1344,6 +1345,23 @@ protected void getClusterIdAndRole() throws IOException { clusterId, isElectable, role.name(), nodeName); } + /** + * write cloud/local to MODE_FILE. + */ + protected void checkDeployMode() throws IOException { + File modeFile = new File(this.imageDir, Storage.MODE_FILE); + Storage storage = new Storage(this.imageDir); + String expectedMode = Config.isCloudMode() ? Storage.CLOUD_MODE : Storage.LOCAL_MODE; + if (modeFile.exists()) { + String actualMode = storage.getDeployMode(); + Preconditions.checkArgument(expectedMode.equals(actualMode), + "You can't switch deploy mode from %s to %s", actualMode, expectedMode); + } else { + storage.setDeployMode(expectedMode); + storage.writeClusterMode(); + } + } + public static String genFeNodeName(String host, int port, boolean isOldStyle) { if (isOldStyle) { return host + "_" + port; @@ -6642,3 +6660,4 @@ private void replayJournalsAndExit() { System.exit(0); } } + diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java index 910a42ab7610b8..a617f4c6e47784 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java @@ -55,11 +55,16 @@ public class Storage { public static final String IMAGE_NEW = "image.ckpt"; public static final String VERSION_FILE = "VERSION"; public static final String ROLE_FILE = "ROLE"; + public static final String MODE_FILE = "MODE"; + public static final String DEPLOY_MODE = "mode"; + public static final String CLOUD_MODE = "cloud"; + public static final String LOCAL_MODE = "local"; private int clusterID = 0; private String token; private FrontendNodeType role = FrontendNodeType.UNKNOWN; private String nodeName; + private String deployMode; private long editsSeq; private long latestImageSeq = 0; private long latestValidatedImageSeq = 0; @@ -116,6 +121,14 @@ public void reload() throws IOException { nodeName = prop.getProperty(NODE_NAME, null); } + File modeFile = getModeFile(); + if (modeFile.isFile()) { + try (FileInputStream in = new FileInputStream(modeFile)) { + prop.load(in); + } + deployMode = prop.getProperty(DEPLOY_MODE); + } + // Find the latest two images File dir = new File(metaDir); File[] children = dir.listFiles(); @@ -165,6 +178,14 @@ public FrontendNodeType getRole() { return role; } + public String getDeployMode() { + return deployMode; + } + + public void setDeployMode(String deployMode) { + this.deployMode = deployMode; + } + public String getNodeName() { return nodeName; } @@ -224,6 +245,12 @@ public void writeFrontendRoleAndNodeName(FrontendNodeType role, String nameNode) writePropertiesToFile(properties, ROLE_FILE); } + public void writeClusterMode() throws IOException { + Properties properties = new Properties(); + properties.setProperty(DEPLOY_MODE, deployMode); + writePropertiesToFile(properties, MODE_FILE); + } + private void writePropertiesToFile(Properties properties, String fileName) throws IOException { RandomAccessFile file = new RandomAccessFile(new File(metaDir, fileName), "rws"); FileOutputStream out = null; @@ -287,6 +314,10 @@ public final File getRoleFile() { return new File(metaDir, ROLE_FILE); } + public final File getModeFile() { + return new File(metaDir, MODE_FILE); + } + public File getCurrentEditsFile() { return new File(metaDir, EDITS); } From db942b7375754285b819771564f33d65ee1075b1 Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Thu, 12 Sep 2024 21:33:39 +0800 Subject: [PATCH 2/7] add more logs --- be/src/olap/olap_define.h | 2 +- be/src/runtime/exec_env_init.cpp | 12 ++++++++++-- .../src/main/java/org/apache/doris/catalog/Env.java | 10 +++++++++- .../main/java/org/apache/doris/persist/Storage.java | 2 +- 4 files changed, 21 insertions(+), 5 deletions(-) diff --git a/be/src/olap/olap_define.h b/be/src/olap/olap_define.h index 0d72e662dd4a20..5131c51ca01c20 100644 --- a/be/src/olap/olap_define.h +++ b/be/src/olap/olap_define.h @@ -87,7 +87,7 @@ enum OLAPDataVersion { // Different types of folder names under storage_root_path static const std::string MINI_PREFIX = "mini_download"; static const std::string CLUSTER_ID_PREFIX = "cluster_id"; -static const std::string DEPLOY_MODE_PREFIX = "mode"; +static const std::string DEPLOY_MODE_PREFIX = "deploy_mode"; static const std::string DATA_PREFIX = "data"; static const std::string DPP_PREFIX = "dpp_download"; static const std::string SNAPSHOT_PREFIX = "snapshot"; diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp index 9c88124ce0f4c3..90745aad844066 100644 --- a/be/src/runtime/exec_env_init.cpp +++ b/be/src/runtime/exec_env_init.cpp @@ -635,9 +635,11 @@ Status ExecEnv::_check_deploy_mode() { RETURN_IF_ERROR(reader->read_at(0, {actual_mode.data(), fsize}, &bytes_read)); DCHECK_EQ(fsize, bytes_read); if (expected_mode != actual_mode) { - return Status::InternalError("You can't switch deploy mode from {} to {}.\n", - actual_mode.c_str(), expected_mode.c_str()); + return Status::InternalError( + "You can't switch deploy mode from {} to {}, maybe you need to check be.conf\n", + actual_mode.c_str(), expected_mode.c_str()); } + LOG(INFO) << "The current deployment mode is " << expected_mode << "."; } } else { io::FileWriterPtr file_writer; @@ -645,6 +647,12 @@ Status ExecEnv::_check_deploy_mode() { io::global_local_filesystem()->create_file(deploy_mode_path, &file_writer)); RETURN_IF_ERROR(file_writer->append(expected_mode)); RETURN_IF_ERROR(file_writer->close()); + LOG(INFO) << "The file deploy_made doesn't exist, create it."; + auto cluster_id_path = fmt::format("{}/{}", _path.path, CLUSTER_ID_PREFIX); + RETURN_IF_ERROR(io::global_local_filesystem()->exists(cluster_id_path, &exists)); + if (exists) { + LOG(WARNING) << "This may be an upgrade from old version, or the DEPLOY_MADE file has been manually deleted"; + } } } return Status::OK(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index ae225fb08d34bb..db2cb35f7c5bbf 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -1355,10 +1355,18 @@ protected void checkDeployMode() throws IOException { if (modeFile.exists()) { String actualMode = storage.getDeployMode(); Preconditions.checkArgument(expectedMode.equals(actualMode), - "You can't switch deploy mode from %s to %s", actualMode, expectedMode); + "You can't switch deploy mode from %s to %s, maybe you need to check fe.conf", + actualMode, expectedMode); + LOG.info("The current deployment mode is " + expectedMode + "."); } else { storage.setDeployMode(expectedMode); storage.writeClusterMode(); + LOG.info("The file DEPLOY_MADE doesn't exist, create it."); + File versionFile = new File(this.imageDir, Storage.VERSION_FILE); + if (versionFile.exists()) { + LOG.warn("This may be an upgrade from old version, " + "or the DEPLOY_MADE file has been manually deleted"); + } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java index a617f4c6e47784..78bd6827a5fcd2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java @@ -55,7 +55,7 @@ public class Storage { public static final String IMAGE_NEW = "image.ckpt"; public static final String VERSION_FILE = "VERSION"; public static final String ROLE_FILE = "ROLE"; - public static final String MODE_FILE = "MODE"; + public static final String MODE_FILE = "DEPLOY_MODE"; public static final String DEPLOY_MODE = "mode"; public static final String CLOUD_MODE = "cloud"; public static final String LOCAL_MODE = "local"; From 7dd3b62463fd2fcbbe76d64c74d8bfbecb70d8f3 Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Thu, 12 Sep 2024 21:40:44 +0800 Subject: [PATCH 3/7] add more logs --- be/src/runtime/exec_env_init.cpp | 5 +++-- fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp index 90745aad844066..05e36efa273a83 100644 --- a/be/src/runtime/exec_env_init.cpp +++ b/be/src/runtime/exec_env_init.cpp @@ -647,11 +647,12 @@ Status ExecEnv::_check_deploy_mode() { io::global_local_filesystem()->create_file(deploy_mode_path, &file_writer)); RETURN_IF_ERROR(file_writer->append(expected_mode)); RETURN_IF_ERROR(file_writer->close()); - LOG(INFO) << "The file deploy_made doesn't exist, create it."; + LOG(INFO) << "The file deploy_mode doesn't exist, create it."; auto cluster_id_path = fmt::format("{}/{}", _path.path, CLUSTER_ID_PREFIX); RETURN_IF_ERROR(io::global_local_filesystem()->exists(cluster_id_path, &exists)); if (exists) { - LOG(WARNING) << "This may be an upgrade from old version, or the DEPLOY_MADE file has been manually deleted"; + LOG(WARNING) << "This may be an upgrade from old version, + << or the deploy_mode file has been manually deleted"; } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index db2cb35f7c5bbf..30ac9a5f387489 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -1361,11 +1361,11 @@ protected void checkDeployMode() throws IOException { } else { storage.setDeployMode(expectedMode); storage.writeClusterMode(); - LOG.info("The file DEPLOY_MADE doesn't exist, create it."); + LOG.info("The file DEPLOY_MODE doesn't exist, create it."); File versionFile = new File(this.imageDir, Storage.VERSION_FILE); if (versionFile.exists()) { - LOG.warn("This may be an upgrade from old version, " - "or the DEPLOY_MADE file has been manually deleted"); + LOG.warn("This may be an upgrade from old version, " + + "or the DEPLOY_MODE file has been manually deleted"); } } } From df4ad2de291e05c9b0816c6502753d971f0c6b64 Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Thu, 12 Sep 2024 22:45:43 +0800 Subject: [PATCH 4/7] fix code smell --- be/src/runtime/exec_env_init.cpp | 7 ++++--- fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp index 05e36efa273a83..15c7b946b76f16 100644 --- a/be/src/runtime/exec_env_init.cpp +++ b/be/src/runtime/exec_env_init.cpp @@ -636,7 +636,8 @@ Status ExecEnv::_check_deploy_mode() { DCHECK_EQ(fsize, bytes_read); if (expected_mode != actual_mode) { return Status::InternalError( - "You can't switch deploy mode from {} to {}, maybe you need to check be.conf\n", + "You can't switch deploy mode from {} to {}, " + + "maybe you need to check be.conf\n", actual_mode.c_str(), expected_mode.c_str()); } LOG(INFO) << "The current deployment mode is " << expected_mode << "."; @@ -651,8 +652,8 @@ Status ExecEnv::_check_deploy_mode() { auto cluster_id_path = fmt::format("{}/{}", _path.path, CLUSTER_ID_PREFIX); RETURN_IF_ERROR(io::global_local_filesystem()->exists(cluster_id_path, &exists)); if (exists) { - LOG(WARNING) << "This may be an upgrade from old version, - << or the deploy_mode file has been manually deleted"; + LOG(WARNING) << "This may be an upgrade from old version," + << "or the deploy_mode file has been manually deleted"; } } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 30ac9a5f387489..4bc9ebb9add461 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -1364,8 +1364,8 @@ protected void checkDeployMode() throws IOException { LOG.info("The file DEPLOY_MODE doesn't exist, create it."); File versionFile = new File(this.imageDir, Storage.VERSION_FILE); if (versionFile.exists()) { - LOG.warn("This may be an upgrade from old version, " + - "or the DEPLOY_MODE file has been manually deleted"); + LOG.warn("This may be an upgrade from old version, " + + "or the DEPLOY_MODE file has been manually deleted"); } } } From ae23c3b4eb5ed7d254a5a6c34e444837fa72c137 Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Thu, 12 Sep 2024 22:53:00 +0800 Subject: [PATCH 5/7] fix code smell --- be/src/runtime/exec_env_init.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/be/src/runtime/exec_env_init.cpp b/be/src/runtime/exec_env_init.cpp index 15c7b946b76f16..cc6c416b3a61da 100644 --- a/be/src/runtime/exec_env_init.cpp +++ b/be/src/runtime/exec_env_init.cpp @@ -636,7 +636,7 @@ Status ExecEnv::_check_deploy_mode() { DCHECK_EQ(fsize, bytes_read); if (expected_mode != actual_mode) { return Status::InternalError( - "You can't switch deploy mode from {} to {}, " + + "You can't switch deploy mode from {} to {}, " "maybe you need to check be.conf\n", actual_mode.c_str(), expected_mode.c_str()); } From 29814289a1ce6be611a0e43679305cde7c63664f Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Wed, 16 Oct 2024 19:31:03 +0800 Subject: [PATCH 6/7] add deploymode heartbeat between FEs --- .../java/org/apache/doris/catalog/Env.java | 8 +++++-- .../apache/doris/httpv2/meta/MetaService.java | 23 +++++++++++++++++++ .../org/apache/doris/persist/Storage.java | 8 +++---- .../doris/service/FrontendServiceImpl.java | 13 +++++++++++ .../org/apache/doris/system/HeartbeatMgr.java | 1 + gensrc/thrift/FrontendService.thrift | 1 + 6 files changed, 48 insertions(+), 6 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index 68c4332768d23d..4402ad99e95c89 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -1372,9 +1372,9 @@ protected void getClusterIdAndRole() throws IOException { * write cloud/local to MODE_FILE. */ protected void checkDeployMode() throws IOException { - File modeFile = new File(this.imageDir, Storage.MODE_FILE); + File modeFile = new File(this.imageDir, Storage.DEPLOY_MODE_FILE); Storage storage = new Storage(this.imageDir); - String expectedMode = Config.isCloudMode() ? Storage.CLOUD_MODE : Storage.LOCAL_MODE; + String expectedMode = getDeployMode(); if (modeFile.exists()) { String actualMode = storage.getDeployMode(); Preconditions.checkArgument(expectedMode.equals(actualMode), @@ -4229,6 +4229,10 @@ public int getClusterId() { return this.clusterId; } + public String getDeployMode() { + return Config.isCloudMode() ? Storage.CLOUD_MODE : Storage.LOCAL_MODE; + } + public String getToken() { return token; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java index 65a3ac8d2e5b41..d7c705d3e1e872 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java @@ -210,6 +210,29 @@ public Object role(HttpServletRequest request, HttpServletResponse response) thr } } + @RequestMapping(path = "/deploy_mode", method = RequestMethod.GET) + public Object deploy_mode(HttpServletRequest request, HttpServletResponse response) throws DdlException { + checkFromValidFe(request); + // For upgrade compatibility, the host parameter name remains the same + // and the new hostname parameter is added. + // host = ip + String host = request.getParameter(HOST); + String portString = request.getParameter(PORT); + if (!Strings.isNullOrEmpty(host) && !Strings.isNullOrEmpty(portString)) { + int port = Integer.parseInt(portString); + Frontend fe = Env.getCurrentEnv().checkFeExist(host, port); + if (fe == null) { + response.setHeader("deploy_mode", FrontendNodeType.UNKNOWN.name()); + } else { + response.setHeader("name", fe.getNodeName()); + response.setHeader("deploy_mode", FrontendNodeType.UNKNOWN.name()); + } + return ResponseEntityBuilder.ok(); + } else { + return ResponseEntityBuilder.badRequest("Miss parameter"); + } + } + /* * This action is used to get the electable_nodes config and the cluster id of * the fe with the given ip and port. When one frontend start, it should check diff --git a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java index 78bd6827a5fcd2..9f8cd558a57cc2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java +++ b/fe/fe-core/src/main/java/org/apache/doris/persist/Storage.java @@ -55,8 +55,8 @@ public class Storage { public static final String IMAGE_NEW = "image.ckpt"; public static final String VERSION_FILE = "VERSION"; public static final String ROLE_FILE = "ROLE"; - public static final String MODE_FILE = "DEPLOY_MODE"; - public static final String DEPLOY_MODE = "mode"; + public static final String DEPLOY_MODE_FILE = "DEPLOY_MODE"; + public static final String DEPLOY_MODE = "deploy_mode"; public static final String CLOUD_MODE = "cloud"; public static final String LOCAL_MODE = "local"; @@ -248,7 +248,7 @@ public void writeFrontendRoleAndNodeName(FrontendNodeType role, String nameNode) public void writeClusterMode() throws IOException { Properties properties = new Properties(); properties.setProperty(DEPLOY_MODE, deployMode); - writePropertiesToFile(properties, MODE_FILE); + writePropertiesToFile(properties, DEPLOY_MODE_FILE); } private void writePropertiesToFile(Properties properties, String fileName) throws IOException { @@ -315,7 +315,7 @@ public final File getRoleFile() { } public final File getModeFile() { - return new File(metaDir, MODE_FILE); + return new File(metaDir, DEPLOY_MODE_FILE); } public File getCurrentEditsFile() { diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java index f592a20f84df3c..8017f09835142e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java @@ -2246,6 +2246,19 @@ public TFrontendPingFrontendResult ping(TFrontendPingFrontendRequest request) th result.setMsg("invalid cluster id: " + Env.getCurrentEnv().getClusterId()); } + if (result.getStatus() == TFrontendPingFrontendStatusCode.OK) { + // If the version of FE is too old, we need to ensure compatibility. + if (request.getDeployMode() == null) { + LOG.warn("Couldn't find deployMode in heartbeat info, " + + "maybe you need upgrade FE master."); + } else if (!request.getDeployMode().equals(Env.getCurrentEnv().getDeployMode())) { + result.setStatus(TFrontendPingFrontendStatusCode.FAILED); + result.setMsg("expected deployMode: " + + request.getDeployMode() + + ", but found deployMode: " + + Env.getCurrentEnv().getDeployMode()); + } + } if (result.getStatus() == TFrontendPingFrontendStatusCode.OK) { if (!request.getToken().equals(Env.getCurrentEnv().getToken())) { result.setStatus(TFrontendPingFrontendStatusCode.FAILED); diff --git a/fe/fe-core/src/main/java/org/apache/doris/system/HeartbeatMgr.java b/fe/fe-core/src/main/java/org/apache/doris/system/HeartbeatMgr.java index 3fc09b31f2d312..123c3772281589 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/system/HeartbeatMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/system/HeartbeatMgr.java @@ -374,6 +374,7 @@ private HeartbeatResponse getHeartbeatResponse() { try { client = ClientPool.frontendHeartbeatPool.borrowObject(addr); TFrontendPingFrontendRequest request = new TFrontendPingFrontendRequest(clusterId, token); + request.setDeployMode(Env.getCurrentEnv().getDeployMode()); TFrontendPingFrontendResult result = client.ping(request); ok = true; if (result.getStatus() == TFrontendPingFrontendStatusCode.OK) { diff --git a/gensrc/thrift/FrontendService.thrift b/gensrc/thrift/FrontendService.thrift index 5efe26590cd8dd..874d0f6c471f1f 100644 --- a/gensrc/thrift/FrontendService.thrift +++ b/gensrc/thrift/FrontendService.thrift @@ -950,6 +950,7 @@ enum TFrontendPingFrontendStatusCode { struct TFrontendPingFrontendRequest { 1: required i32 clusterId 2: required string token + 3: optional string deployMode } struct TDiskInfo { From 8a3408d36a865ff78b21d5e684a568e564218d22 Mon Sep 17 00:00:00 2001 From: yagagagaga Date: Mon, 11 Nov 2024 11:27:31 +0800 Subject: [PATCH 7/7] remove useless code --- .../apache/doris/httpv2/meta/MetaService.java | 23 ------------------- 1 file changed, 23 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java index d7c705d3e1e872..65a3ac8d2e5b41 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/MetaService.java @@ -210,29 +210,6 @@ public Object role(HttpServletRequest request, HttpServletResponse response) thr } } - @RequestMapping(path = "/deploy_mode", method = RequestMethod.GET) - public Object deploy_mode(HttpServletRequest request, HttpServletResponse response) throws DdlException { - checkFromValidFe(request); - // For upgrade compatibility, the host parameter name remains the same - // and the new hostname parameter is added. - // host = ip - String host = request.getParameter(HOST); - String portString = request.getParameter(PORT); - if (!Strings.isNullOrEmpty(host) && !Strings.isNullOrEmpty(portString)) { - int port = Integer.parseInt(portString); - Frontend fe = Env.getCurrentEnv().checkFeExist(host, port); - if (fe == null) { - response.setHeader("deploy_mode", FrontendNodeType.UNKNOWN.name()); - } else { - response.setHeader("name", fe.getNodeName()); - response.setHeader("deploy_mode", FrontendNodeType.UNKNOWN.name()); - } - return ResponseEntityBuilder.ok(); - } else { - return ResponseEntityBuilder.badRequest("Miss parameter"); - } - } - /* * This action is used to get the electable_nodes config and the cluster id of * the fe with the given ip and port. When one frontend start, it should check