diff options
| author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-10-20 16:24:21 -0700 |
|---|---|---|
| committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2015-10-20 16:24:21 -0700 |
| commit | eb79d4a2f34b34c49cd2d69efac22d9bc8ac27cb (patch) | |
| tree | b1670c890b60d5ae02fa49f180bb831826edf1d8 /node/Topology.cpp | |
| parent | 57e29857cf79019af03f6a3dfe0bf6fd36e2fab2 (diff) | |
| download | infinitytier-eb79d4a2f34b34c49cd2d69efac22d9bc8ac27cb.tar.gz infinitytier-eb79d4a2f34b34c49cd2d69efac22d9bc8ac27cb.zip | |
Wire up peer announcement in cluster.
Diffstat (limited to 'node/Topology.cpp')
| -rw-r--r-- | node/Topology.cpp | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/node/Topology.cpp b/node/Topology.cpp index 56ca47c8..88c8856c 100644 --- a/node/Topology.cpp +++ b/node/Topology.cpp @@ -122,18 +122,22 @@ Topology::~Topology() SharedPtr<Peer> Topology::addPeer(const SharedPtr<Peer> &peer) { if (peer->address() == RR->identity.address()) { - TRACE("BUG: addNewPeer() caught and ignored attempt to add peer for self"); + TRACE("BUG: addPeer() caught and ignored attempt to add peer for self"); throw std::logic_error("cannot add peer for self"); } - const uint64_t now = RR->node->now(); - Mutex::Lock _l(_lock); - - SharedPtr<Peer> &p = _peers.set(peer->address(),peer); - p->use(now); - saveIdentity(p->identity()); + SharedPtr<Peer> np; + { + Mutex::Lock _l(_lock); + SharedPtr<Peer> &hp = _peers[peer->address()]; + if (!hp) + hp = peer; + np = hp; + } + np->use(RR->node->now()); + saveIdentity(np->identity()); - return p; + return np; } SharedPtr<Peer> Topology::getPeer(const Address &zta) @@ -143,13 +147,12 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta) return SharedPtr<Peer>(); } - const uint64_t now = RR->node->now(); Mutex::Lock _l(_lock); SharedPtr<Peer> &ap = _peers[zta]; if (ap) { - ap->use(now); + ap->use(RR->node->now()); return ap; } @@ -157,13 +160,13 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta) if (id) { try { ap = SharedPtr<Peer>(new Peer(RR->identity,id)); - ap->use(now); + ap->use(RR->node->now()); return ap; } catch ( ... ) {} // invalid identity? } + // If we get here it means we read an invalid cache identity or had some other error _peers.erase(zta); - return SharedPtr<Peer>(); } |
