![]() |
![]() |
#include <DQMServices/Core/interface/DQMNet.h>
Public Types | |
typedef std::map< std::string, ObjType > | ObjectMap |
typedef std::map< lat::Socket *, ImplPeer > | PeerMap |
Public Member Functions | |
DQMImplNet (const std::string &appname="") | |
~DQMImplNet (void) | |
Protected Member Functions | |
virtual Peer * | createPeer (lat::Socket *s) |
virtual Object * | findObject (Peer *p, const std::string &name, Peer **owner=0) |
virtual Peer * | getPeer (lat::Socket *s) |
virtual Object * | makeObject (Peer *p, const std::string &name) |
virtual void | markObjectsDead (Peer *p) |
virtual void | markObjectsZombies (Peer *p) |
virtual void | purgeDeadObject (ObjType &o) |
virtual void | purgeDeadObjects (lat::Time oldobj, lat::Time deadobj) |
virtual void | removePeer (Peer *p, lat::Socket *s) |
virtual void | requestFullUpdatesFromPeers (void) |
virtual void | sendObjectListToPeer (Bucket *msg, bool data, bool all, bool clear) |
Send all objects to a peer and optionally mark sent objects old. | |
virtual void | sendObjectListToPeers (bool all) |
virtual void | updatePeerMasks (void) |
Protected Attributes | |
PeerMap | peers_ |
Classes | |
struct | ImplPeer |
Definition at line 218 of file DQMNet.h.
typedef std::map<std::string, ObjType> DQMImplNet< ObjType >::ObjectMap |
typedef std::map<lat::Socket *, ImplPeer> DQMImplNet< ObjType >::PeerMap |
DQMImplNet< ObjType >::DQMImplNet | ( | const std::string & | appname = "" |
) | [inline] |
DQMImplNet< ObjType >::~DQMImplNet | ( | void | ) | [inline] |
Definition at line 233 of file DQMNet.h.
00234 { 00235 typename PeerMap::iterator pi, pe; 00236 typename ObjectMap::iterator oi, oe; 00237 for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi) 00238 for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi) 00239 { 00240 ObjType &o = oi->second; 00241 delete o.object; 00242 delete o.reference; 00243 o.object = 0; 00244 o.reference = 0; 00245 } 00246 }
virtual Peer* DQMImplNet< ObjType >::createPeer | ( | lat::Socket * | s | ) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 379 of file DQMNet.h.
00380 { 00381 ImplPeer *ip = &peers_[s]; 00382 ip->socket = 0; 00383 ip->sendq = 0; 00384 ip->sendpos = 0; 00385 ip->mask = 0; 00386 ip->source = false; 00387 ip->update = false; 00388 ip->updated = false; 00389 ip->updatefull = false; 00390 ip->updates = 0; 00391 ip->waiting = 0; 00392 ip->automatic = 0; 00393 return ip; 00394 }
virtual Object* DQMImplNet< ObjType >::findObject | ( | Peer * | p, | |
const std::string & | name, | |||
Peer ** | owner = 0 | |||
) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 250 of file DQMNet.h.
00251 { 00252 typename ObjectMap::iterator pos; 00253 typename PeerMap::iterator i, e; 00254 if (owner) 00255 *owner = 0; 00256 if (p) 00257 { 00258 ImplPeer *ip = static_cast<ImplPeer *>(p); 00259 pos = ip->objs.find(name); 00260 if (pos == ip->objs.end()) 00261 return 0; 00262 else 00263 { 00264 if (owner) *owner = ip; 00265 return &pos->second; 00266 } 00267 } 00268 else 00269 { 00270 for (i = peers_.begin(), e = peers_.end(); i != e; ++i) 00271 { 00272 pos = i->second.objs.find(name); 00273 if (pos != i->second.objs.end()) 00274 { 00275 if (owner) *owner = &i->second; 00276 return &pos->second; 00277 } 00278 } 00279 return 0; 00280 } 00281 }
virtual Peer* DQMImplNet< ObjType >::getPeer | ( | lat::Socket * | s | ) | [inline, protected, virtual] |
virtual Object* DQMImplNet< ObjType >::makeObject | ( | Peer * | p, | |
const std::string & | name | |||
) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 284 of file DQMNet.h.
00285 { 00286 ImplPeer *ip = static_cast<ImplPeer *>(p); 00287 ObjType *o = &ip->objs[name]; 00288 o->version = 0; 00289 o->name = name; 00290 o->object = 0; 00291 o->reference = 0; 00292 o->flags = 0; 00293 o->lastreq = 0; 00294 return o; 00295 }
virtual void DQMImplNet< ObjType >::markObjectsDead | ( | Peer * | p | ) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 314 of file DQMNet.h.
00315 { 00316 ImplPeer *ip = static_cast<ImplPeer *>(p); 00317 typename ObjectMap::iterator i, e; 00318 for (i = ip->objs.begin(), e = ip->objs.end(); i != e; ++i) 00319 if (i->second.flags & DQM_FLAG_ZOMBIE) 00320 i->second.flags = (i->second.flags & ~DQM_FLAG_ZOMBIE) | DQM_FLAG_DEAD; 00321 }
virtual void DQMImplNet< ObjType >::markObjectsZombies | ( | Peer * | p | ) | [inline, protected, virtual] |
virtual void DQMImplNet< ObjType >::purgeDeadObject | ( | ObjType & | o | ) | [inline, protected, virtual] |
Definition at line 368 of file DQMNet.h.
Referenced by DQMImplNet< DQMNet::Object >::purgeDeadObjects().
virtual void DQMImplNet< ObjType >::purgeDeadObjects | ( | lat::Time | oldobj, | |
lat::Time | deadobj | |||
) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 325 of file DQMNet.h.
00326 { 00327 typename PeerMap::iterator pi, pe; 00328 typename ObjectMap::iterator oi, oe; 00329 for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi) 00330 for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ) 00331 { 00332 ObjType &o = oi->second; 00333 00334 // Compact non-scalar objects that are unused. We send scalar 00335 // objects to the web server so we keep them around. 00336 if (o.lastreq < oldobj && o.object && ! (o.flags & DQM_FLAG_SCALAR)) 00337 { 00338 if (debug_) 00339 logme() 00340 << "DEBUG: compacting idle '" << o.name 00341 << "' from " << pi->second.peeraddr << std::endl; 00342 00343 delete o.object; 00344 delete o.reference; 00345 o.object = 0; 00346 o.reference = 0; 00347 purgeDeadObject(o); 00348 } 00349 00350 // Remove if dead, old and unused. 00351 if (o.lastreq < deadobj 00352 && o.version < deadobj 00353 && (o.flags & DQM_FLAG_DEAD)) 00354 { 00355 if (debug_) 00356 logme() 00357 << "DEBUG: removing dead '" << o.name 00358 << "' from " << pi->second.peeraddr << std::endl; 00359 00360 pi->second.objs.erase(oi++); 00361 } 00362 else 00363 ++oi; 00364 } 00365 }
virtual void DQMImplNet< ObjType >::removePeer | ( | Peer * | p, | |
lat::Socket * | s | |||
) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 397 of file DQMNet.h.
00398 { 00399 ImplPeer *ip = static_cast<ImplPeer *>(p); 00400 bool needflush = ! ip->objs.empty(); 00401 00402 typename ObjectMap::iterator i, e; 00403 for (i = ip->objs.begin(), e = ip->objs.end(); i != e; ) 00404 { 00405 ObjType &o = i->second; 00406 delete o.object; 00407 delete o.reference; 00408 ip->objs.erase(i++); 00409 } 00410 00411 peers_.erase(s); 00412 00413 // If we removed a peer with objects, our list of objects 00414 // has changed and we need to update downstream peers. 00415 if (needflush) 00416 sendLocalChanges(); 00417 }
virtual void DQMImplNet< ObjType >::requestFullUpdatesFromPeers | ( | void | ) | [inline, protected, virtual] |
Implements DQMNet.
Reimplemented in DQMBasicNet.
Definition at line 488 of file DQMNet.h.
00489 { 00490 logme() 00491 << "ERROR: invalid request for full updates from peers.\n"; 00492 }
virtual void DQMImplNet< ObjType >::sendObjectListToPeer | ( | Bucket * | msg, | |
bool | data, | |||
bool | all, | |||
bool | clear | |||
) | [inline, protected, virtual] |
Send all objects to a peer and optionally mark sent objects old.
Implements DQMNet.
Definition at line 421 of file DQMNet.h.
Referenced by DQMImplNet< DQMNet::Object >::sendObjectListToPeers().
00422 { 00423 typename PeerMap::iterator pi, pe; 00424 typename ObjectMap::iterator oi, oe; 00425 uint32_t numobjs = 0; 00426 for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi) 00427 numobjs += pi->second.objs.size(); 00428 00429 msg->data.reserve(msg->data.size() + 300*numobjs); 00430 00431 uint32_t nupdates = 0; 00432 uint32_t words [4]; 00433 words[0] = sizeof(words); 00434 words[1] = DQM_REPLY_LIST_BEGIN; 00435 words[2] = numobjs; 00436 words[3] = all; 00437 copydata(msg, &words[0], sizeof(words)); 00438 00439 for (pi = peers_.begin(), pe = peers_.end(); pi != pe; ++pi) 00440 for (oi = pi->second.objs.begin(), oe = pi->second.objs.end(); oi != oe; ++oi) 00441 if (all || (oi->second.flags & DQM_FLAG_NEW)) 00442 { 00443 sendObjectToPeer(msg, oi->second, data, sendScalarAsText_); 00444 if (clear) 00445 oi->second.flags &= ~DQM_FLAG_NEW; 00446 ++nupdates; 00447 } 00448 00449 words[1] = DQM_REPLY_LIST_END; 00450 words[2] = nupdates; 00451 copydata(msg, &words[0], sizeof(words)); 00452 }
virtual void DQMImplNet< ObjType >::sendObjectListToPeers | ( | bool | all | ) | [inline, protected, virtual] |
Implements DQMNet.
Definition at line 455 of file DQMNet.h.
00456 { 00457 typename PeerMap::iterator i, e; 00458 for (i = peers_.begin(), e = peers_.end(); i != e; ++i) 00459 { 00460 ImplPeer &p = i->second; 00461 if (! p.update) 00462 continue; 00463 00464 if (debug_) 00465 logme() 00466 << "DEBUG: notifying " << p.peeraddr 00467 << ", full = " << p.updatefull << std::endl; 00468 00469 Bucket msg; 00470 msg.next = 0; 00471 sendObjectListToPeer(&msg, p.updatefull, !p.updated || all, true); 00472 00473 if (! msg.data.empty()) 00474 { 00475 Bucket **prev = &p.sendq; 00476 while (*prev) 00477 prev = &(*prev)->next; 00478 00479 *prev = new Bucket; 00480 (*prev)->next = 0; 00481 (*prev)->data.swap(msg.data); 00482 } 00483 p.updated = true; 00484 } 00485 }
virtual void DQMImplNet< ObjType >::updatePeerMasks | ( | void | ) | [inline, protected, virtual] |
PeerMap DQMImplNet< ObjType >::peers_ [protected] |
Definition at line 503 of file DQMNet.h.
Referenced by DQMImplNet< DQMNet::Object >::createPeer(), DQMImplNet< DQMNet::Object >::findObject(), DQMImplNet< DQMNet::Object >::getPeer(), DQMImplNet< DQMNet::Object >::purgeDeadObjects(), DQMImplNet< DQMNet::Object >::removePeer(), DQMImplNet< DQMNet::Object >::sendObjectListToPeer(), DQMImplNet< DQMNet::Object >::sendObjectListToPeers(), DQMImplNet< DQMNet::Object >::updatePeerMasks(), and DQMImplNet< DQMNet::Object >::~DQMImplNet().