From edbdc573323478fca72ca73a190b3ad38282e38d Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Tue, 2 Mar 2021 11:39:25 +0100 Subject: [PATCH] shm: make shmId also available as uint64_t --- fairmq/shmem/Common.h | 17 ++++++++++++++--- fairmq/shmem/Monitor.cxx | 8 ++++---- fairmq/shmem/TransportFactory.h | 14 +++++--------- fairmq/shmem/runMonitor.cxx | 2 +- 4 files changed, 24 insertions(+), 17 deletions(-) diff --git a/fairmq/shmem/Common.h b/fairmq/shmem/Common.h index f9a7fb1e..6f0109ac 100644 --- a/fairmq/shmem/Common.h +++ b/fairmq/shmem/Common.h @@ -11,6 +11,7 @@ #include #include +#include #include #include // std::equal_to @@ -194,15 +195,25 @@ struct RegionBlock // find id for unique shmem name: // a hash of user id + session id, truncated to 8 characters (to accommodate for name size limit on some systems (MacOS)). -inline std::string buildShmIdFromSessionIdAndUserId(const std::string& sessionId) +inline std::string makeShmIdStr(const std::string& sessionId) { std::string seed((std::to_string(geteuid()) + sessionId)); // generate a 8-digit hex value out of sha256 hash std::vector hash(4); picosha2::hash256(seed.begin(), seed.end(), hash.begin(), hash.end()); - std::string shmId = picosha2::bytes_to_hex_string(hash.begin(), hash.end()); - return shmId; + return picosha2::bytes_to_hex_string(hash.begin(), hash.end()); +} + +inline uint64_t makeShmIdUint64(const std::string& sessionId) +{ + std::string shmId = makeShmIdStr(sessionId); + uint64_t id = 0; + std::stringstream ss; + ss << std::hex << shmId; + ss >> id; + + return id; } struct SegmentSize : public boost::static_visitor diff --git a/fairmq/shmem/Monitor.cxx b/fairmq/shmem/Monitor.cxx index 9f1d8f8c..519dc5ef 100644 --- a/fairmq/shmem/Monitor.cxx +++ b/fairmq/shmem/Monitor.cxx @@ -393,7 +393,7 @@ void Monitor::PrintDebugInfo(const ShmId& shmId __attribute__((unused))) void Monitor::PrintDebugInfo(const SessionId& sessionId) { - ShmId shmId{buildShmIdFromSessionIdAndUserId(sessionId.sessionId)}; + ShmId shmId{makeShmIdStr(sessionId.sessionId)}; PrintDebugInfo(shmId); } @@ -429,7 +429,7 @@ unordered_map> Monitor::GetDebugInfo(cons } unordered_map> Monitor::GetDebugInfo(const SessionId& sessionId) { - ShmId shmId{buildShmIdFromSessionIdAndUserId(sessionId.sessionId)}; + ShmId shmId{makeShmIdStr(sessionId.sessionId)}; return GetDebugInfo(shmId); } @@ -536,7 +536,7 @@ std::vector> Monitor::Cleanup(const ShmId& shmId, b std::vector> Monitor::Cleanup(const SessionId& sessionId, bool verbose /* = true */) { - ShmId shmId{buildShmIdFromSessionIdAndUserId(sessionId.sessionId)}; + ShmId shmId{makeShmIdStr(sessionId.sessionId)}; if (verbose) { cout << "Cleanup called with session id '" << sessionId.sessionId << "', translating to shared memory id '" << shmId.shmId << "'" << endl; } @@ -553,7 +553,7 @@ std::vector> Monitor::CleanupFull(const ShmId& shmI std::vector> Monitor::CleanupFull(const SessionId& sessionId, bool verbose /* = true */) { - ShmId shmId{buildShmIdFromSessionIdAndUserId(sessionId.sessionId)}; + ShmId shmId{makeShmIdStr(sessionId.sessionId)}; if (verbose) { cout << "Cleanup called with session id '" << sessionId.sessionId << "', translating to shared memory id '" << shmId.shmId << "'" << endl; } diff --git a/fairmq/shmem/TransportFactory.h b/fairmq/shmem/TransportFactory.h index 61849ecb..85ef80dc 100644 --- a/fairmq/shmem/TransportFactory.h +++ b/fairmq/shmem/TransportFactory.h @@ -35,10 +35,8 @@ namespace fair::mq::shmem class TransportFactory final : public fair::mq::TransportFactory { public: - TransportFactory(const std::string& id = "", const ProgOptions* config = nullptr) - : fair::mq::TransportFactory(id) - , fDeviceId(id) - , fShmId() + TransportFactory(const std::string& deviceId = "", const ProgOptions* config = nullptr) + : fair::mq::TransportFactory(deviceId) , fZmqCtx(zmq_ctx_new()) , fManager(nullptr) { @@ -69,8 +67,8 @@ class TransportFactory final : public fair::mq::TransportFactory throw SharedMemoryError(tools::ToString("Provided shared memory allocation algorithm '", allocationAlgorithm, "' is not supported. Supported are 'rbtree_best_fit'/'simple_seq_fit'")); } - fShmId = buildShmIdFromSessionIdAndUserId(sessionName); - LOG(debug) << "Generated shmid '" << fShmId << "' out of session id '" << sessionName << "'."; + std::string shmId = makeShmIdStr(sessionName); + LOG(debug) << "Generated shmid '" << shmId << "' out of session id '" << sessionName << "'."; try { if (zmq_ctx_set(fZmqCtx, ZMQ_IO_THREADS, numIoThreads) != 0) { @@ -82,7 +80,7 @@ class TransportFactory final : public fair::mq::TransportFactory LOG(error) << "failed configuring context, reason: " << zmq_strerror(errno); } - fManager = std::make_unique(fShmId, fDeviceId, segmentSize, config); + fManager = std::make_unique(shmId, deviceId, segmentSize, config); } catch (boost::interprocess::interprocess_exception& e) { LOG(error) << "Could not initialize shared memory transport: " << e.what(); throw std::runtime_error(tools::ToString("Could not initialize shared memory transport: ", e.what())); @@ -200,8 +198,6 @@ class TransportFactory final : public fair::mq::TransportFactory } private: - std::string fDeviceId; - std::string fShmId; void* fZmqCtx; std::unique_ptr fManager; }; diff --git a/fairmq/shmem/runMonitor.cxx b/fairmq/shmem/runMonitor.cxx index b704958e..a128becd 100644 --- a/fairmq/shmem/runMonitor.cxx +++ b/fairmq/shmem/runMonitor.cxx @@ -111,7 +111,7 @@ int main(int argc, char** argv) } if (shmId == "") { - shmId = buildShmIdFromSessionIdAndUserId(sessionName); + shmId = makeShmIdStr(sessionName); } if (cleanup) {