shmmonitor: add session name and creator id to the output

This commit is contained in:
Alexey Rybalchenko 2021-03-27 23:26:23 +01:00
parent efd42075a9
commit effba534f0
4 changed files with 42 additions and 9 deletions

View File

@ -91,6 +91,17 @@ struct SegmentInfo
AllocationAlgorithm fAllocationAlgorithm;
};
struct SessionInfo
{
SessionInfo(const char* sessionName, int creatorId, const VoidAlloc& alloc)
: fSessionName(sessionName, alloc)
, fCreatorId(creatorId)
{}
Str fSessionName;
int fCreatorId;
};
using Uint16SegmentInfoPairAlloc = boost::interprocess::allocator<std::pair<const uint16_t, SegmentInfo>, SegmentManager>;
using Uint16SegmentInfoHashMap = boost::unordered_map<uint16_t, SegmentInfo, boost::hash<uint16_t>, std::equal_to<uint16_t>, Uint16SegmentInfoPairAlloc>;
// using Uint16SegmentInfoMap = boost::interprocess::map<uint16_t, SegmentInfo, std::less<uint16_t>, Uint16SegmentInfoPairAlloc>;

View File

@ -46,6 +46,9 @@
#include <utility> // pair
#include <vector>
#include <unistd.h> // getuid
#include <sys/types.h> // getuid
#include <sys/mman.h> // mlock
namespace fair::mq::shmem
@ -54,8 +57,8 @@ namespace fair::mq::shmem
class Manager
{
public:
Manager(std::string shmId, std::string deviceId, size_t size, const ProgOptions* config)
: fShmId(std::move(shmId))
Manager(const std::string& sessionName, std::string deviceId, size_t size, const ProgOptions* config)
: fShmId(makeShmIdStr(sessionName))
, fSegmentId(config ? config->GetProperty<uint16_t>("shm-segment-id", 0) : 0)
, fDeviceId(std::move(deviceId))
, fSegments()
@ -82,6 +85,8 @@ class Manager
{
using namespace boost::interprocess;
LOG(debug) << "Generated shmid '" << fShmId << "' out of session id '" << sessionName << "'.";
bool mlockSegment = false;
bool zeroSegment = false;
bool autolaunchMonitor = false;
@ -105,8 +110,16 @@ class Manager
fShmSegments = fManagementSegment.find_or_construct<Uint16SegmentInfoHashMap>(unique_instance)(fShmVoidAlloc);
fEventCounter = fManagementSegment.find<EventCounter>(unique_instance).first;
SessionInfo* sessionInfo = fManagementSegment.find<SessionInfo>(unique_instance).first;
if (sessionInfo) {
LOG(debug) << "session info found, name: " << sessionInfo->fSessionName << ", creator id: " << sessionInfo->fCreatorId;
} else {
LOG(debug) << "no session info found, creating and initializing";
sessionInfo = fManagementSegment.construct<SessionInfo>(unique_instance)(sessionName.c_str(), geteuid(), fShmVoidAlloc);
LOG(debug) << "initialized session info, name: " << sessionInfo->fSessionName << ", creator id: " << sessionInfo->fCreatorId;
}
fEventCounter = fManagementSegment.find<EventCounter>(unique_instance).first;
if (fEventCounter) {
LOG(debug) << "event counter found: " << fEventCounter->fCount;
} else {
@ -171,7 +184,6 @@ class Manager
fShmRegions = fManagementSegment.find_or_construct<Uint16RegionInfoHashMap>(unique_instance)(fShmVoidAlloc);
fDeviceCounter = fManagementSegment.find<DeviceCounter>(unique_instance).first;
if (fDeviceCounter) {
LOG(debug) << "device counter found, with value of " << fDeviceCounter->fCount << ". incrementing.";
(fDeviceCounter->fCount)++;

View File

@ -270,6 +270,8 @@ void Monitor::CheckSegment()
fSeenOnce = true;
unsigned int numDevices = 0;
int creatorId = -1;
std::string sessionName;
#ifdef FAIRMQ_DEBUG_MODE
Uint16MsgCounterHashMap* msgCounters = nullptr;
#endif
@ -279,6 +281,11 @@ void Monitor::CheckSegment()
if (dc) {
numDevices = dc->fCount;
}
SessionInfo* si = managementSegment.find<SessionInfo>(unique_instance).first;
if (si) {
creatorId = si->fCreatorId;
sessionName = si->fSessionName;
}
#ifdef FAIRMQ_DEBUG_MODE
msgCounters = managementSegment.find<Uint16MsgCounterHashMap>(unique_instance).first;
#endif
@ -305,7 +312,10 @@ void Monitor::CheckSegment()
size_t mused = mtotal - mfree;
ss << "shm id: " << fShmId
<< ", devices: " << numDevices << ", segments:\n";
<< ", session: " << sessionName
<< ", creator id: " << creatorId
<< ", devices: " << numDevices
<< ", segments:\n";
for (const auto& s : segments) {
size_t free = boost::apply_visitor(SegmentFreeMemory(), s.second);
size_t total = boost::apply_visitor(SegmentSize(), s.second);
@ -328,6 +338,9 @@ void Monitor::CheckSegment()
LOGV(info, user1) << ss.str();
}
} catch (bie&) {
if (!fMonitor && !fInteractive) {
cout << "No segments found." << endl;
}
fHeartbeatTriggered = false;
if (fSelfDestruct) {

View File

@ -68,9 +68,6 @@ 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'"));
}
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) {
LOG(error) << "failed configuring context, reason: " << zmq_strerror(errno);
@ -81,7 +78,7 @@ class TransportFactory final : public fair::mq::TransportFactory
LOG(error) << "failed configuring context, reason: " << zmq_strerror(errno);
}
fManager = std::make_unique<Manager>(shmId, deviceId, segmentSize, config);
fManager = std::make_unique<Manager>(sessionName, 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()));