CMS 3D CMS Logo

List of all members | Classes | Public Types | Public Member Functions | Protected Member Functions | Protected Attributes
DQMImplNet< ObjType > Class Template Reference

#include <DQMNet.h>

Inheritance diagram for DQMImplNet< ObjType >:
DQMNet

Classes

struct  ImplPeer
 

Public Types

using DirMap = std::set< std::string >
 
typedef std::unordered_set< ObjType, HashOp, HashEqualObjectMap
 
typedef std::map< lat::Socket *, ImplPeerPeerMap
 
- Public Types inherited from DQMNet
using DataBlob = std::vector< unsigned char >
 
using QReports = std::vector< QValue >
 
using QValue = MonitorElementData::QReport::QValue
 
using TagList = std::vector< uint32_t >
 
using WaitList = std::list< WaitObject >
 

Public Member Functions

 DQMImplNet (const std::string &appname="")
 
 ~DQMImplNet () override=default
 
- Public Member Functions inherited from DQMNet
void debug (bool doit)
 
void delay (int delay)
 
 DQMNet (const std::string &appname="")
 
 DQMNet (const DQMNet &)=delete
 
void listenToCollector (const std::string &host, int port)
 
void lock ()
 Acquire a lock on the DQM net layer. More...
 
DQMNetoperator= (const DQMNet &)=delete
 
void run ()
 
void sendLocalChanges ()
 
void shutdown ()
 Stop the network layer and wait it to finish. More...
 
void staleObjectWaitLimit (lat::TimeSpan time)
 
void start ()
 
void startLocalServer (int port)
 
void startLocalServer (const char *path)
 
void unlock ()
 Release the lock on the DQM net layer. More...
 
void updateToCollector (const std::string &host, int port)
 
virtual ~DQMNet ()
 

Protected Member Functions

PeercreatePeer (lat::Socket *s) override
 
ObjectfindObject (Peer *p, const std::string &name, Peer **owner=nullptr) override
 
PeergetPeer (lat::Socket *s) override
 
ObjectmakeObject (Peer *p, const std::string &name) override
 
void markObjectsDead (Peer *p) override
 
void purgeDeadObjects (Peer *p) override
 
void removePeer (Peer *p, lat::Socket *s) override
 
void sendObjectListToPeer (Bucket *msg, bool all, bool clear) override
 Send all objects to a peer and optionally mark sent objects old. More...
 
void sendObjectListToPeers (bool all) override
 
void updatePeerMasks () override
 
- Protected Member Functions inherited from DQMNet
std::ostream & logme ()
 
virtual bool onMessage (Bucket *msg, Peer *p, unsigned char *data, size_t len)
 
virtual void releaseFromWait (Bucket *msg, WaitObject &w, Object *o)
 
virtual void sendObjectToPeer (Bucket *msg, Object &o, bool data)
 
virtual bool shouldStop ()
 
void updateMask (Peer *p)
 
void waitForData (Peer *p, const std::string &name, const std::string &info, Peer *owner)
 

Protected Attributes

PeerMap peers_
 
- Protected Attributes inherited from DQMNet
bool debug_
 
pthread_mutex_t lock_
 

Additional Inherited Members

- Static Public Member Functions inherited from DQMNet
static size_t dqmhash (const void *key, size_t keylen)
 
static void packQualityData (std::string &into, const QReports &qr)
 
static bool setOrder (const CoreObject &a, const CoreObject &b)
 
static void unpackQualityData (QReports &qr, uint32_t &flags, const char *from)
 
- Static Public Attributes inherited from DQMNet
static const uint32_t DQM_MSG_GET_OBJECT = 3
 
static const uint32_t DQM_MSG_HELLO = 0
 
static const uint32_t DQM_MSG_LIST_OBJECTS = 2
 
static const uint32_t DQM_MSG_UPDATE_ME = 1
 
static const uint32_t DQM_PROP_ACCUMULATE = 0x00004000
 
static const uint32_t DQM_PROP_DEAD = 0x00080000
 
static const uint32_t DQM_PROP_EFFICIENCY_PLOT = 0x00200000
 
static const uint32_t DQM_PROP_HAS_REFERENCE = 0x00001000
 
static const uint32_t DQM_PROP_LUMI = 0x00040000
 
static const uint32_t DQM_PROP_MARKTODELETE = 0x01000000
 
static const uint32_t DQM_PROP_NEW = 0x00010000
 
static const uint32_t DQM_PROP_RECEIVED = 0x00020000
 
static const uint32_t DQM_PROP_REPORT_ALARM = (DQM_PROP_REPORT_ERROR | DQM_PROP_REPORT_WARN | DQM_PROP_REPORT_OTHER)
 
static const uint32_t DQM_PROP_REPORT_CLEAR = 0x00000000
 
static const uint32_t DQM_PROP_REPORT_ERROR = 0x00000100
 
static const uint32_t DQM_PROP_REPORT_MASK = 0x00000f00
 
static const uint32_t DQM_PROP_REPORT_OTHER = 0x00000400
 
static const uint32_t DQM_PROP_REPORT_WARN = 0x00000200
 
static const uint32_t DQM_PROP_RESET = 0x00008000
 
static const uint32_t DQM_PROP_STALE = 0x00100000
 
static const uint32_t DQM_PROP_TAGGED = 0x00002000
 
static const uint32_t DQM_PROP_TYPE_DATABLOB = 0x00000050
 
static const uint32_t DQM_PROP_TYPE_INT = 0x00000001
 
static const uint32_t DQM_PROP_TYPE_INVALID = 0x00000000
 
static const uint32_t DQM_PROP_TYPE_MASK = 0x000000ff
 
static const uint32_t DQM_PROP_TYPE_REAL = 0x00000002
 
static const uint32_t DQM_PROP_TYPE_SCALAR = 0x0000000f
 
static const uint32_t DQM_PROP_TYPE_STRING = 0x00000003
 
static const uint32_t DQM_PROP_TYPE_TH1D = 0x00000012
 
static const uint32_t DQM_PROP_TYPE_TH1F = 0x00000010
 
static const uint32_t DQM_PROP_TYPE_TH1I = 0x00000013
 
static const uint32_t DQM_PROP_TYPE_TH1S = 0x00000011
 
static const uint32_t DQM_PROP_TYPE_TH2D = 0x00000022
 
static const uint32_t DQM_PROP_TYPE_TH2F = 0x00000020
 
static const uint32_t DQM_PROP_TYPE_TH2I = 0x00000023
 
static const uint32_t DQM_PROP_TYPE_TH2S = 0x00000021
 
static const uint32_t DQM_PROP_TYPE_TH3D = 0x00000032
 
static const uint32_t DQM_PROP_TYPE_TH3F = 0x00000030
 
static const uint32_t DQM_PROP_TYPE_TH3S = 0x00000031
 
static const uint32_t DQM_PROP_TYPE_TPROF = 0x00000040
 
static const uint32_t DQM_PROP_TYPE_TPROF2D = 0x00000041
 
static const uint32_t DQM_REPLY_LIST_BEGIN = 101
 
static const uint32_t DQM_REPLY_LIST_END = 102
 
static const uint32_t DQM_REPLY_NONE = 103
 
static const uint32_t DQM_REPLY_OBJECT = 104
 
static const uint32_t MAX_PEER_WAITREQS = 128
 
- Static Protected Member Functions inherited from DQMNet
static void copydata (Bucket *b, const void *data, size_t len)
 
static void discard (Bucket *&b)
 

Detailed Description

template<class ObjType>
class DQMImplNet< ObjType >

Definition at line 381 of file DQMNet.h.

Member Typedef Documentation

◆ DirMap

template<class ObjType>
using DQMImplNet< ObjType >::DirMap = std::set<std::string>

Definition at line 385 of file DQMNet.h.

◆ ObjectMap

template<class ObjType>
typedef std::unordered_set<ObjType, HashOp, HashEqual> DQMImplNet< ObjType >::ObjectMap

Definition at line 386 of file DQMNet.h.

◆ PeerMap

template<class ObjType>
typedef std::map<lat::Socket *, ImplPeer> DQMImplNet< ObjType >::PeerMap

Definition at line 387 of file DQMNet.h.

Constructor & Destructor Documentation

◆ DQMImplNet()

template<class ObjType>
DQMImplNet< ObjType >::DQMImplNet ( const std::string &  appname = "")
inline

Definition at line 394 of file DQMNet.h.

394 : DQMNet(appname) {}
DQMNet(const std::string &appname="")
Definition: DQMNet.cc:914

◆ ~DQMImplNet()

template<class ObjType>
DQMImplNet< ObjType >::~DQMImplNet ( )
overridedefault

Member Function Documentation

◆ createPeer()

template<class ObjType>
Peer* DQMImplNet< ObjType >::createPeer ( lat::Socket *  s)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 488 of file DQMNet.h.

488  {
489  ImplPeer *ip = &peers_[s];
490  ip->socket = nullptr;
491  ip->sendq = nullptr;
492  ip->sendpos = 0;
493  ip->mask = 0;
494  ip->source = false;
495  ip->update = false;
496  ip->updated = false;
497  ip->updates = 0;
498  ip->waiting = 0;
499  ip->automatic = nullptr;
500  return ip;
501  }
PeerMap peers_
Definition: DQMNet.h:590

◆ findObject()

template<class ObjType>
Object* DQMImplNet< ObjType >::findObject ( Peer p,
const std::string &  name,
Peer **  owner = nullptr 
)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 399 of file DQMNet.h.

399  {
400  size_t slash = name.rfind('/');
401  size_t dirpos = (slash == std::string::npos ? 0 : slash);
402  size_t namepos = (slash == std::string::npos ? 0 : slash + 1);
403  std::string path(name, 0, dirpos);
404  ObjType proto;
405  proto.hash = dqmhash(name.c_str(), name.size());
406  proto.dirname = path;
407  proto.objname.append(name, namepos, std::string::npos);
408 
409  typename ObjectMap::iterator pos;
410  typename PeerMap::iterator i, e;
411  if (owner)
412  *owner = nullptr;
413  if (p) {
414  auto *ip = static_cast<ImplPeer *>(p);
415  pos = ip->objs.find(proto);
416  if (pos == ip->objs.end())
417  return nullptr;
418  else {
419  if (owner)
420  *owner = ip;
421  return const_cast<ObjType *>(&*pos);
422  }
423  } else {
424  for (i = peers_.begin(), e = peers_.end(); i != e; ++i) {
425  pos = i->second.objs.find(proto);
426  if (pos != i->second.objs.end()) {
427  if (owner)
428  *owner = &i->second;
429  return const_cast<ObjType *>(&*pos);
430  }
431  }
432  return nullptr;
433  }
434  }
static size_t dqmhash(const void *key, size_t keylen)
Definition: DQMNet.h:196
PeerMap peers_
Definition: DQMNet.h:590

◆ getPeer()

template<class ObjType>
Peer* DQMImplNet< ObjType >::getPeer ( lat::Socket *  s)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 482 of file DQMNet.h.

482  {
483  auto pos = peers_.find(s);
484  auto end = peers_.end();
485  return pos == end ? nullptr : &pos->second;
486  }
PeerMap peers_
Definition: DQMNet.h:590

◆ makeObject()

template<class ObjType>
Object* DQMImplNet< ObjType >::makeObject ( Peer p,
const std::string &  name 
)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 436 of file DQMNet.h.

436  {
437  auto *ip = static_cast<ImplPeer *>(p);
438  size_t slash = name.rfind('/');
439  size_t dirpos = (slash == std::string::npos ? 0 : slash);
440  size_t namepos = (slash == std::string::npos ? 0 : slash + 1);
441  ObjType o;
442  o.flags = 0;
443  o.tag = 0;
444  o.version = 0;
445  o.lastreq = 0;
446  o.dirname = *ip->dirs.insert(name.substr(0, dirpos)).first;
447  o.objname.append(name, namepos, std::string::npos);
448  o.hash = dqmhash(name.c_str(), name.size());
449  return const_cast<ObjType *>(&*ip->objs.insert(o).first);
450  }
static size_t dqmhash(const void *key, size_t keylen)
Definition: DQMNet.h:196

◆ markObjectsDead()

template<class ObjType>
void DQMImplNet< ObjType >::markObjectsDead ( Peer p)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 459 of file DQMNet.h.

459  {
460  uint64_t minreq = (lat::Time::current() - lat::TimeSpan(0, 0, 5 /* minutes */, 0, 0)).ns();
461  auto *ip = static_cast<ImplPeer *>(p);
462  typename ObjectMap::iterator i, e;
463  for (i = ip->objs.begin(), e = ip->objs.end(); i != e; ++i) {
464  if (i->lastreq && i->lastreq < minreq)
465  const_cast<ObjType &>(*i).lastreq = 0;
466  const_cast<ObjType &>(*i).flags |= DQM_PROP_DEAD;
467  }
468  }
static const uint32_t DQM_PROP_DEAD
Definition: DQMNet.h:64
unsigned long long uint64_t
Definition: Time.h:13

◆ purgeDeadObjects()

template<class ObjType>
void DQMImplNet< ObjType >::purgeDeadObjects ( Peer p)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 471 of file DQMNet.h.

471  {
472  auto *ip = static_cast<ImplPeer *>(p);
473  typename ObjectMap::iterator i, e;
474  for (i = ip->objs.begin(), e = ip->objs.end(); i != e;) {
475  if (i->flags & DQM_PROP_DEAD)
476  ip->objs.erase(i++);
477  else
478  ++i;
479  }
480  }
static const uint32_t DQM_PROP_DEAD
Definition: DQMNet.h:64

◆ removePeer()

template<class ObjType>
void DQMImplNet< ObjType >::removePeer ( Peer p,
lat::Socket *  s 
)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 503 of file DQMNet.h.

503  {
504  auto *ip = static_cast<ImplPeer *>(p);
505  bool needflush = !ip->objs.empty();
506 
507  typename ObjectMap::iterator i, e;
508  for (i = ip->objs.begin(), e = ip->objs.end(); i != e;)
509  ip->objs.erase(i++);
510 
511  peers_.erase(s);
512 
513  // If we removed a peer with objects, our list of objects
514  // has changed and we need to update downstream peers.
515  if (needflush)
517  }
void sendLocalChanges()
Definition: DQMNet.cc:1203
PeerMap peers_
Definition: DQMNet.h:590

◆ sendObjectListToPeer()

template<class ObjType>
void DQMImplNet< ObjType >::sendObjectListToPeer ( Bucket msg,
bool  all,
bool  clear 
)
inlineoverrideprotectedvirtual

Send all objects to a peer and optionally mark sent objects old.

Implements DQMNet.

Definition at line 520 of file DQMNet.h.

Referenced by DQMImplNet< DQMNet::Object >::sendObjectListToPeers().

520  {
521  typename PeerMap::iterator pi, pe;
522  typename ObjectMap::iterator oi, oe;
523  size_t size = 0;
524  size_t numobjs = 0;
525  for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
526  for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi, ++numobjs)
527  if (all || (oi->flags & DQM_PROP_NEW))
528  size += 9 * sizeof(uint32_t) + oi->dirname.size() + oi->objname.size() + 1 + oi->scalar.size() +
529  oi->qdata.size() + (oi->lastreq > 0 ? oi->rawdata.size() : 0);
530 
531  msg->data.reserve(msg->data.size() + size + 8 * sizeof(uint32_t));
532 
533  uint32_t nupdates = 0;
534  uint32_t words[4];
535  words[0] = sizeof(words);
536  words[1] = DQM_REPLY_LIST_BEGIN;
537  words[2] = numobjs;
538  words[3] = all;
539  copydata(msg, &words[0], sizeof(words));
540 
541  for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi)
542  for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi)
543  if (all || (oi->flags & DQM_PROP_NEW)) {
544  sendObjectToPeer(msg, const_cast<ObjType &>(*oi), oi->lastreq > 0);
545  if (clear)
546  const_cast<ObjType &>(*oi).flags &= ~DQM_PROP_NEW;
547  ++nupdates;
548  }
549 
550  words[1] = DQM_REPLY_LIST_END;
551  words[2] = nupdates;
552  copydata(msg, &words[0], sizeof(words));
553  }
size
Write out results.
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
static const uint32_t DQM_REPLY_LIST_END
Definition: DQMNet.h:75
const Double_t pi
virtual void sendObjectToPeer(Bucket *msg, Object &o, bool data)
Definition: DQMNet.cc:398
tuple msg
Definition: mps_check.py:286
static const uint32_t DQM_REPLY_LIST_BEGIN
Definition: DQMNet.h:74
static void copydata(Bucket *b, const void *data, size_t len)
Definition: DQMNet.cc:57
static const uint32_t DQM_PROP_NEW
Definition: DQMNet.h:61
void clear(EGIsoObj &c)
Definition: egamma.h:82
PeerMap peers_
Definition: DQMNet.h:590

◆ sendObjectListToPeers()

template<class ObjType>
void DQMImplNet< ObjType >::sendObjectListToPeers ( bool  all)
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 555 of file DQMNet.h.

555  {
556  typename PeerMap::iterator i, e;
557  typename ObjectMap::iterator oi, oe;
558  for (i = peers_.begin(), e = peers_.end(); i != e; ++i) {
559  ImplPeer &p = i->second;
560  if (!p.update)
561  continue;
562 
563  if (debug_)
564  logme() << "DEBUG: notifying " << p.peeraddr << std::endl;
565 
566  Bucket msg;
567  msg.next = nullptr;
568  sendObjectListToPeer(&msg, !p.updated || all, true);
569 
570  if (!msg.data.empty()) {
571  Bucket **prev = &p.sendq;
572  while (*prev)
573  prev = &(*prev)->next;
574 
575  *prev = new Bucket;
576  (*prev)->next = nullptr;
577  (*prev)->data.swap(msg.data);
578  }
579  p.updated = true;
580  }
581  }
def all(container)
workaround iterator generators for ROOT classes
Definition: cmstools.py:25
std::ostream & logme()
Definition: DQMNet.cc:50
tuple msg
Definition: mps_check.py:286
void sendObjectListToPeer(Bucket *msg, bool all, bool clear) override
Send all objects to a peer and optionally mark sent objects old.
Definition: DQMNet.h:520
bool debug_
Definition: DQMNet.h:341
PeerMap peers_
Definition: DQMNet.h:590

◆ updatePeerMasks()

template<class ObjType>
void DQMImplNet< ObjType >::updatePeerMasks ( )
inlineoverrideprotectedvirtual

Implements DQMNet.

Definition at line 583 of file DQMNet.h.

583  {
584  typename PeerMap::iterator i, e;
585  for (i = peers_.begin(), e = peers_.end(); i != e;)
586  updateMask(&(i++)->second);
587  }
void updateMask(Peer *p)
Definition: DQMNet.cc:888
PeerMap peers_
Definition: DQMNet.h:590

Member Data Documentation

◆ peers_

template<class ObjType>
PeerMap DQMImplNet< ObjType >::peers_
protected