Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 9 additions & 2 deletions mooncake-store/src/transfer_task.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -416,10 +416,17 @@ TransferSubmitter::TransferSubmitter(TransferEngine& engine,
memcpy_pool_(std::make_unique<MemcpyWorkerPool>()),
fileread_pool_(std::make_unique<FilereadWorkerPool>(backend)),
transfer_metric_(transfer_metric) {
// Read MC_STORE_MEMCPY environment variable, default to false (disabled)
// Read MC_STORE_MEMCPY environment variable.
// When not set, auto-detect based on transport type:
// - TCP-only environment: enable memcpy (avoids TCP loopback overhead)
// - RDMA/other transports: disable memcpy (RDMA is more efficient)
const char* env_value = std::getenv("MC_STORE_MEMCPY");
if (env_value == nullptr) {
memcpy_enabled_ = false; // Default: disabled
memcpy_enabled_ = engine_.isTcpOnly();
LOG(INFO) << "MC_STORE_MEMCPY not set, auto-detected: "
<< (memcpy_enabled_ ? "TCP-only environment, memcpy enabled"
: "non-TCP transport available, memcpy "
"disabled");
} else {
std::string env_str(env_value);
// Convert to lowercase for case-insensitive comparison
Expand Down
8 changes: 8 additions & 0 deletions mooncake-transfer-engine/include/multi_transport.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,14 @@ class MultiTransport {

Transport *getTransport(const std::string &proto);

/**
* @brief Check if TCP is the only installed transport.
*
* When only TCP transport is available (no RDMA, NVLink, etc.),
* local memcpy is preferred over TCP loopback for same-host transfers.
*/
bool isTcpOnly() const;

std::vector<Transport *> listTransports();

void *getBaseAddr();
Expand Down
8 changes: 8 additions & 0 deletions mooncake-transfer-engine/include/transfer_engine.h
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,14 @@ class TransferEngine {

Transport* getTransport(const std::string& proto);

/**
* @brief Check if TCP is the only installed transport.
*
* When only TCP transport is available (no RDMA, NVLink, etc.),
* local memcpy is preferred over TCP loopback for same-host transfers.
*/
bool isTcpOnly() const;

int syncSegmentCache(const std::string& segment_name = "");

std::shared_ptr<TransferMetadata> getMetadata();
Expand Down
2 changes: 2 additions & 0 deletions mooncake-transfer-engine/include/transfer_engine_impl.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,6 +334,8 @@ class TransferEngineImpl {
return multi_transports_->getTransport(proto);
}

bool isTcpOnly() const { return multi_transports_->isTcpOnly(); }

int syncSegmentCache(const std::string& segment_name = "") {
return metadata_->syncSegmentCache(segment_name);
}
Expand Down
4 changes: 4 additions & 0 deletions mooncake-transfer-engine/src/multi_transport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,10 @@ Transport* MultiTransport::getTransport(const std::string& proto) {
return transport_map_[proto].get();
}

bool MultiTransport::isTcpOnly() const {
return transport_map_.size() == 1 && transport_map_.count("tcp") == 1;
}

std::vector<Transport*> MultiTransport::listTransports() {
std::vector<Transport*> transport_list;
for (auto& entry : transport_map_)
Expand Down
11 changes: 11 additions & 0 deletions mooncake-transfer-engine/src/transfer_engine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,8 @@ Transport* TransferEngine::getTransport(const std::string& proto) {
return impl_->getTransport(proto);
}

bool TransferEngine::isTcpOnly() const { return impl_->isTcpOnly(); }

int TransferEngine::syncSegmentCache(const std::string& segment_name) {
return impl_->syncSegmentCache(segment_name);
}
Expand Down Expand Up @@ -578,6 +580,15 @@ Transport* TransferEngine::getTransport(const std::string& proto) {
return impl_->getTransport(proto);
}

bool TransferEngine::isTcpOnly() const {
if (use_tent_)
// TENT already rejects TCP loopback transfers when MC_STORE_MEMCPY
// is disabled, so auto-enabling memcpy is unnecessary in TENT mode.
return false;
else
return impl_->isTcpOnly();
}

int TransferEngine::syncSegmentCache(const std::string& segment_name) {
if (use_tent_)
return 0;
Expand Down
Loading