Преглед на файлове

When we reset within scope, erase the other entries for that scope so we won't keep resetting the same scope repeatedly.

Adam Ierymenko преди 10 години
родител
ревизия
40f312a827
променени са 1 файла, в които са добавени 11 реда и са изтрити 1 реда
  1. 11 1
      node/SelfAwareness.cpp

+ 11 - 1
node/SelfAwareness.cpp

@@ -105,6 +105,14 @@ void SelfAwareness::iam(const Address &reporter,const InetAddress &reporterPhysi
 		entry.ts = now;
 		TRACE("learned physical address %s for scope %u as seen from %s(%s) (replaced %s, resetting all in scope)",myPhysicalAddress.toString().c_str(),(unsigned int)scope,reporter.toString().c_str(),reporterPhysicalAddress.toString().c_str(),entry.mySurface.toString().c_str());
 
+		// Erase all entries (other than this one) for this scope to prevent thrashing
+		// Note: we should probably not use 'entry' after this
+		for(std::map< PhySurfaceKey,PhySurfaceEntry >::iterator p(_phy.begin());p!=_phy.end();) {
+			if ((p->first.reporter != reporter)&&(p->first.scope == scope))
+				_phy.erase(p++);
+			else ++p;
+		}
+
 		_ResetWithinScope rset(RR,now,(InetAddress::IpScope)scope);
 		RR->topology->eachPeer<_ResetWithinScope &>(rset);
 
@@ -124,7 +132,9 @@ void SelfAwareness::iam(const Address &reporter,const InetAddress &reporterPhysi
 				}
 			}
 		}
-	} else entry.ts = now;
+	} else {
+		entry.ts = now;
+	}
 }
 
 void SelfAwareness::clean(uint64_t now)