shm: make shmId also available as uint64_t

This commit is contained in:
Alexey Rybalchenko 2021-03-02 11:39:25 +01:00
parent 0fd2fcadc2
commit edbdc57332
4 changed files with 24 additions and 17 deletions

View File

@ -11,6 +11,7 @@
#include <picosha2.h>
#include <atomic>
#include <sstream>
#include <string>
#include <functional> // 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<unsigned char> 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<size_t>

View File

@ -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<uint16_t, std::vector<BufferDebugInfo>> Monitor::GetDebugInfo(cons
}
unordered_map<uint16_t, std::vector<BufferDebugInfo>> Monitor::GetDebugInfo(const SessionId& sessionId)
{
ShmId shmId{buildShmIdFromSessionIdAndUserId(sessionId.sessionId)};
ShmId shmId{makeShmIdStr(sessionId.sessionId)};
return GetDebugInfo(shmId);
}
@ -536,7 +536,7 @@ std::vector<std::pair<std::string, bool>> Monitor::Cleanup(const ShmId& shmId, b
std::vector<std::pair<std::string, bool>> 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<std::pair<std::string, bool>> Monitor::CleanupFull(const ShmId& shmI
std::vector<std::pair<std::string, bool>> 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;
}

View File

@ -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<Manager>(fShmId, fDeviceId, segmentSize, config);
fManager = std::make_unique<Manager>(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<Manager> fManager;
};

View File

@ -111,7 +111,7 @@ int main(int argc, char** argv)
}
if (shmId == "") {
shmId = buildShmIdFromSessionIdAndUserId(sessionName);
shmId = makeShmIdStr(sessionName);
}
if (cleanup) {