|
@@ -146,26 +146,30 @@ SharedPtr<Peer> Topology::getPeer(const Address &zta)
|
|
|
return SharedPtr<Peer>();
|
|
|
}
|
|
|
|
|
|
- Mutex::Lock _l(_lock);
|
|
|
-
|
|
|
- SharedPtr<Peer> &ap = _peers[zta];
|
|
|
-
|
|
|
- if (ap) {
|
|
|
- ap->use(RR->node->now());
|
|
|
- return ap;
|
|
|
+ {
|
|
|
+ Mutex::Lock _l(_lock);
|
|
|
+ const SharedPtr<Peer> *const ap = _peers.get(zta);
|
|
|
+ if (ap) {
|
|
|
+ (*ap)->use(RR->node->now());
|
|
|
+ return *ap;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- Identity id(_getIdentity(zta));
|
|
|
- if (id) {
|
|
|
- try {
|
|
|
- ap = SharedPtr<Peer>(new Peer(RR->identity,id));
|
|
|
- ap->use(RR->node->now());
|
|
|
- return ap;
|
|
|
- } catch ( ... ) {} // invalid identity?
|
|
|
- }
|
|
|
+ try {
|
|
|
+ Identity id(_getIdentity(zta));
|
|
|
+ if (id) {
|
|
|
+ SharedPtr<Peer> np(new Peer(RR->identity,id));
|
|
|
+ {
|
|
|
+ Mutex::Lock _l(_lock);
|
|
|
+ SharedPtr<Peer> &ap = _peers[zta];
|
|
|
+ if (!ap)
|
|
|
+ ap.swap(np);
|
|
|
+ ap->use(RR->node->now());
|
|
|
+ return ap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch ( ... ) {} // invalid identity on disk?
|
|
|
|
|
|
- // If we get here it means we read an invalid cache identity or had some other error
|
|
|
- _peers.erase(zta);
|
|
|
return SharedPtr<Peer>();
|
|
|
}
|
|
|
|