You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@celeborn.apache.org by "HolyLow (via GitHub)" <gi...@apache.org> on 2024/12/19 10:13:06 UTC

[PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

HolyLow opened a new pull request, #3013:
URL: https://github.com/apache/celeborn/pull/3013

   ### What changes were proposed in this pull request?
   Add baseConf to cppClient, which is the building block of conf module.
   
   ### Why are the changes needed?
   To support CelebornCpp configuration module in cppClient.
   
   ### Does this PR introduce _any_ user-facing change?
   No.
   
   ### How was this patch tested?
   Compilation and UTs.
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX commented on code in PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#discussion_r1895284734


##########
cpp/celeborn/conf/BaseConf.h:
##########
@@ -0,0 +1,263 @@
+/*
+ * Based on Config.h from Facebook Velox
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <folly/Conv.h>
+#include <folly/Optional.h>
+#include <folly/SocketAddress.h>
+#include <folly/Synchronized.h>
+#include <set>
+#include <string>
+#include <typeindex>
+#include <unordered_map>
+
+#include "celeborn/utils/Exceptions.h"
+
+namespace celeborn {
+
+class Config {
+ public:
+  virtual ~Config() = default;
+
+  virtual folly::Optional<std::string> get(const std::string& key) const = 0;
+  // virtual const string operator[](const std::string& key) = 0;
+  // overload and disable not supported cases.
+
+  template <typename T>
+  folly::Optional<T> get(const std::string& key) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return folly::none;
+    }
+  }
+
+  template <typename T>
+  T get(const std::string& key, const T& defaultValue) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return defaultValue;
+    }
+  }
+
+  virtual bool isValueExists(const std::string& key) const = 0;
+
+  virtual const std::unordered_map<std::string, std::string>& values() const {
+    CELEBORN_UNSUPPORTED("method values() is not supported by this config");
+  }
+
+  virtual std::unordered_map<std::string, std::string> valuesCopy() const {
+    CELEBORN_UNSUPPORTED("method valuesCopy() is not supported by this config");
+  }
+};
+
+namespace core {
+
+class MemConfig : public Config {
+ public:
+  explicit MemConfig(const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfig() : values_{} {}
+
+  explicit MemConfig(std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    return values_;
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return values_;
+  }
+
+ private:
+  std::unordered_map<std::string, std::string> values_;
+};
+
+/// In-memory config allowing changing properties at runtime.
+class MemConfigMutable : public Config {
+ public:
+  explicit MemConfigMutable(
+      const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfigMutable() : values_{} {}
+
+  explicit MemConfigMutable(
+      std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    CELEBORN_UNSUPPORTED(
+        "Mutable config cannot return unprotected reference to values.");
+    return *values_.rlock();
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return *values_.rlock();
+  }
+
+  /// Adds or replaces value at the given key. Can be used by debugging or
+  /// testing code.
+  void setValue(const std::string& key, const std::string& value) {
+    (*values_.wlock())[key] = value;
+  }
+
+ private:
+  folly::Synchronized<std::unordered_map<std::string, std::string>> values_;
+};
+
+} // namespace core
+
+class BaseConf {
+ public:
+  // Setting this to 'true' makes configs modifiable via server operations.
+  static constexpr std::string_view kMutableConfig{"mutable-config"};

Review Comment:
   In the Java end, we have mutable configs by default. I think just changing the default configs to mutable should be enough.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX commented on code in PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#discussion_r1895182116


##########
cpp/celeborn/conf/BaseConf.h:
##########
@@ -0,0 +1,263 @@
+/*
+ * Based on Config.h from Facebook Velox
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <folly/Conv.h>
+#include <folly/Optional.h>
+#include <folly/SocketAddress.h>
+#include <folly/Synchronized.h>
+#include <set>
+#include <string>
+#include <typeindex>
+#include <unordered_map>
+
+#include "celeborn/utils/Exceptions.h"
+
+namespace celeborn {
+
+class Config {
+ public:
+  virtual ~Config() = default;
+
+  virtual folly::Optional<std::string> get(const std::string& key) const = 0;
+  // virtual const string operator[](const std::string& key) = 0;
+  // overload and disable not supported cases.
+
+  template <typename T>
+  folly::Optional<T> get(const std::string& key) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return folly::none;
+    }
+  }
+
+  template <typename T>
+  T get(const std::string& key, const T& defaultValue) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return defaultValue;
+    }
+  }
+
+  virtual bool isValueExists(const std::string& key) const = 0;
+
+  virtual const std::unordered_map<std::string, std::string>& values() const {
+    CELEBORN_UNSUPPORTED("method values() is not supported by this config");
+  }
+
+  virtual std::unordered_map<std::string, std::string> valuesCopy() const {
+    CELEBORN_UNSUPPORTED("method valuesCopy() is not supported by this config");
+  }
+};
+
+namespace core {
+
+class MemConfig : public Config {
+ public:
+  explicit MemConfig(const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfig() : values_{} {}
+
+  explicit MemConfig(std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    return values_;
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return values_;
+  }
+
+ private:
+  std::unordered_map<std::string, std::string> values_;
+};
+
+/// In-memory config allowing changing properties at runtime.
+class MemConfigMutable : public Config {
+ public:
+  explicit MemConfigMutable(
+      const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfigMutable() : values_{} {}
+
+  explicit MemConfigMutable(
+      std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    CELEBORN_UNSUPPORTED(
+        "Mutable config cannot return unprotected reference to values.");
+    return *values_.rlock();
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return *values_.rlock();
+  }
+
+  /// Adds or replaces value at the given key. Can be used by debugging or
+  /// testing code.
+  void setValue(const std::string& key, const std::string& value) {
+    (*values_.wlock())[key] = value;
+  }
+
+ private:
+  folly::Synchronized<std::unordered_map<std::string, std::string>> values_;
+};
+
+} // namespace core
+
+class BaseConf {
+ public:
+  // Setting this to 'true' makes configs modifiable via server operations.
+  static constexpr std::string_view kMutableConfig{"mutable-config"};

Review Comment:
   Why should we need immutable in-memory configs?



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "HolyLow (via GitHub)" <gi...@apache.org>.
HolyLow commented on code in PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#discussion_r1895205858


##########
cpp/celeborn/conf/BaseConf.h:
##########
@@ -0,0 +1,263 @@
+/*
+ * Based on Config.h from Facebook Velox
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <folly/Conv.h>
+#include <folly/Optional.h>
+#include <folly/SocketAddress.h>
+#include <folly/Synchronized.h>
+#include <set>
+#include <string>
+#include <typeindex>
+#include <unordered_map>
+
+#include "celeborn/utils/Exceptions.h"
+
+namespace celeborn {
+
+class Config {
+ public:
+  virtual ~Config() = default;
+
+  virtual folly::Optional<std::string> get(const std::string& key) const = 0;
+  // virtual const string operator[](const std::string& key) = 0;
+  // overload and disable not supported cases.
+
+  template <typename T>
+  folly::Optional<T> get(const std::string& key) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return folly::none;
+    }
+  }
+
+  template <typename T>
+  T get(const std::string& key, const T& defaultValue) const {
+    auto val = get(key);
+    if (val.hasValue()) {
+      return folly::to<T>(val.value());
+    } else {
+      return defaultValue;
+    }
+  }
+
+  virtual bool isValueExists(const std::string& key) const = 0;
+
+  virtual const std::unordered_map<std::string, std::string>& values() const {
+    CELEBORN_UNSUPPORTED("method values() is not supported by this config");
+  }
+
+  virtual std::unordered_map<std::string, std::string> valuesCopy() const {
+    CELEBORN_UNSUPPORTED("method valuesCopy() is not supported by this config");
+  }
+};
+
+namespace core {
+
+class MemConfig : public Config {
+ public:
+  explicit MemConfig(const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfig() : values_{} {}
+
+  explicit MemConfig(std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    return values_;
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return values_;
+  }
+
+ private:
+  std::unordered_map<std::string, std::string> values_;
+};
+
+/// In-memory config allowing changing properties at runtime.
+class MemConfigMutable : public Config {
+ public:
+  explicit MemConfigMutable(
+      const std::unordered_map<std::string, std::string>& values)
+      : values_(values) {}
+
+  explicit MemConfigMutable() : values_{} {}
+
+  explicit MemConfigMutable(
+      std::unordered_map<std::string, std::string>&& values)
+      : values_(std::move(values)) {}
+
+  folly::Optional<std::string> get(const std::string& key) const override;
+
+  bool isValueExists(const std::string& key) const override;
+
+  const std::unordered_map<std::string, std::string>& values() const override {
+    CELEBORN_UNSUPPORTED(
+        "Mutable config cannot return unprotected reference to values.");
+    return *values_.rlock();
+  }
+
+  std::unordered_map<std::string, std::string> valuesCopy() const override {
+    return *values_.rlock();
+  }
+
+  /// Adds or replaces value at the given key. Can be used by debugging or
+  /// testing code.
+  void setValue(const std::string& key, const std::string& value) {
+    (*values_.wlock())[key] = value;
+  }
+
+ private:
+  folly::Synchronized<std::unordered_map<std::string, std::string>> values_;
+};
+
+} // namespace core
+
+class BaseConf {
+ public:
+  // Setting this to 'true' makes configs modifiable via server operations.
+  static constexpr std::string_view kMutableConfig{"mutable-config"};

Review Comment:
   For a general-purpose config system, immutable configs are required because many system-wide configs are not modifiable, such as service thread num, execution mode, etc. For these configs, immutability is by design, and modifying them at runtime would not take effect. The Mutability design here is to enforce the configs to be not modifiable.
   If this is not aligned to Java end's behavior, we could modify the default mode to mutable. Let me know if the modification is required, thanks a lot.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "HolyLow (via GitHub)" <gi...@apache.org>.
HolyLow commented on PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#issuecomment-2553323661

   @FMX Could you kindly review this PR? Thanks a lot.
   
   The BaseConf is the building block for CelebornConf, which will be added in next PR.
   
   Any suggestion is welcome.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX commented on code in PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#discussion_r1895470047


##########
cpp/celeborn/conf/BaseConf.cpp:
##########
@@ -26,7 +26,7 @@ namespace fs = std::experimental::filesystem;
 #endif
 
 #include "celeborn/conf/BaseConf.h"
-#include "celeborn/utils/CelebornUtils.h"
+// #include "celeborn/utils/CelebornUtils.h"

Review Comment:
   Is this an unintended change? After this change, the build failed.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX commented on PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#issuecomment-2553645095

   > @FMX Could you kindly review this PR? Thanks a lot.
   > 
   > The BaseConf is the building block for CelebornConf, which will be added in next PR.
   > 
   > Any suggestion is welcome.
   
   Copy that. I'll review it ASAP.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "HolyLow (via GitHub)" <gi...@apache.org>.
HolyLow commented on PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#issuecomment-2559047172

   @FMX thanks a lot, refactored as advised. Any suggestion is welcome.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX commented on code in PR #3013:
URL: https://github.com/apache/celeborn/pull/3013#discussion_r1895286352


##########
cpp/celeborn/conf/BaseConf.cpp:
##########
@@ -0,0 +1,227 @@
+/*
+ * Based on Config.h from Facebook Velox
+ *
+ * Copyright (c) Facebook, Inc. and its affiliates.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <fstream>
+#if __has_include("filesystem")
+#include <filesystem>
+namespace fs = std::filesystem;
+#else
+#include <experimental/filesystem>
+namespace fs = std::experimental::filesystem;
+#endif
+
+#include "celeborn/conf/BaseConf.h"
+#include "celeborn/utils/CelebornUtils.h"
+
+namespace celeborn {
+namespace core {
+
+folly::Optional<std::string> MemConfig::get(const std::string& key) const {
+  folly::Optional<std::string> val;
+  auto it = values_.find(key);
+  if (it != values_.end()) {
+    val = it->second;
+  }
+  return val;
+}
+
+bool MemConfig::isValueExists(const std::string& key) const {
+  return values_.find(key) != values_.end();
+}
+
+folly::Optional<std::string> MemConfigMutable::get(
+    const std::string& key) const {
+  auto lockedValues = values_.rlock();
+  folly::Optional<std::string> val;
+  auto it = lockedValues->find(key);
+  if (it != lockedValues->end()) {
+    val = it->second;
+  }
+  return val;
+}
+
+bool MemConfigMutable::isValueExists(const std::string& key) const {
+  auto lockedValues = values_.rlock();
+  return lockedValues->find(key) != lockedValues->end();
+}
+
+} // namespace core
+
+namespace util {
+
+std::unordered_map<std::string, std::string> readConfig(
+    const std::string& filePath) {
+  // https://teradata.github.io/presto/docs/141t/configuration/configuration.html
+
+  std::ifstream configFile(filePath);
+  if (!configFile.is_open()) {
+    CELEBORN_USER_FAIL("Couldn't open config file {} for reading.", filePath);
+  }
+
+  std::unordered_map<std::string, std::string> properties;
+  std::string line;
+  while (getline(configFile, line)) {
+    line.erase(std::remove_if(line.begin(), line.end(), isspace), line.end());
+    if (line[0] == '#' || line.empty()) {
+      continue;
+    }
+    auto delimiterPos = line.find('=');
+    auto name = line.substr(0, delimiterPos);
+    auto value = line.substr(delimiterPos + 1);
+    properties.emplace(name, value);
+  }
+
+  return properties;
+}
+
+std::string requiredProperty(
+    const std::unordered_map<std::string, std::string>& properties,
+    const std::string& name) {
+  auto it = properties.find(name);
+  if (it == properties.end()) {
+    CELEBORN_USER_FAIL("Missing configuration property {}", name);
+  }
+  return it->second;
+}
+
+std::string requiredProperty(
+    const Config& properties,
+    const std::string& name) {
+  auto value = properties.get(name);
+  if (!value.hasValue()) {
+    CELEBORN_USER_FAIL("Missing configuration property {}", name);
+  }
+  return value.value();
+}
+
+std::string getOptionalProperty(
+    const std::unordered_map<std::string, std::string>& properties,
+    const std::string& name,
+    const std::function<std::string()>& func) {
+  auto it = properties.find(name);
+  if (it == properties.end()) {
+    return func();
+  }
+  return it->second;
+}
+
+std::string getOptionalProperty(
+    const std::unordered_map<std::string, std::string>& properties,
+    const std::string& name,
+    const std::string& defaultValue) {
+  auto it = properties.find(name);
+  if (it == properties.end()) {
+    return defaultValue;
+  }
+  return it->second;
+}
+
+std::string getOptionalProperty(
+    const Config& properties,
+    const std::string& name,
+    const std::string& defaultValue) {
+  auto value = properties.get(name);
+  if (!value.hasValue()) {
+    return defaultValue;
+  }
+  return value.value();
+}
+
+} // namespace util
+
+BaseConf::BaseConf() : config_(std::make_unique<core::MemConfigMutable>()) {}
+
+void BaseConf::initialize(const std::string& filePath) {
+  // See if we want to create a mutable config.
+  auto values = util::readConfig(fs::path(filePath));
+  filePath_ = filePath;
+  checkRegisteredProperties(values);
+
+  bool mutableConfig{false};

Review Comment:
   Maybe changing this config to true by default could be enough to align the default behavior of the Java side.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [CELEBORN-1785][CIP-14] Add baseConf to cppClient [celeborn]

Posted by "FMX (via GitHub)" <gi...@apache.org>.
FMX closed pull request #3013: [CELEBORN-1785][CIP-14] Add baseConf to cppClient
URL: https://github.com/apache/celeborn/pull/3013


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: issues-unsubscribe@celeborn.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org