Author: alanmc
Date: 2008-02-16 19:31:09 -0500 (Sat, 16 Feb 2008)
New Revision: 95941
Modified:
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/SimpleTorrentManager.cs
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/Tracker.cs
Log:
Implemented proper recording of Complete and Incomplete peers and implemented
removal of zombie peers.
Modified:
trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/SimpleTorrentManager.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/SimpleTorrentManager.cs
2008-02-17 00:14:05 UTC (rev 95940)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/SimpleTorrentManager.cs
2008-02-17 00:31:09 UTC (rev 95941)
@@ -163,8 +163,7 @@
Debug.WriteLine(string.Format("Adding: {0}", peer.ClientAddress));
peers.Add(peer.ClientAddress.Address, peer);
- if (peer.HasCompleted)
- System.Threading.Interlocked.Increment(ref complete.number);
+ UpdateCounts();
}
/// <summary>
@@ -214,7 +213,16 @@
response.Add(Tracker.peers, nonCompactResponse);
}
+ public void ClearZombiePeers(DateTime cutoff)
+ {
+ IPAddress[] keys = new IPAddress[peers.Keys.Count];
+ peers.Keys.CopyTo(keys, 0);
+ foreach (IPAddress ip in keys)
+ if (peers[ip].LastAnnounceTime < cutoff)
+ peers.Remove(ip);
+ }
+
/// <summary>
/// Removes the peer from the tracker
/// </summary>
@@ -227,10 +235,26 @@
Debug.WriteLine(string.Format("Removing: {0}",
peer.ClientAddress));
peers.Remove(peer.ClientAddress.Address);
- if (peer.HasCompleted)
- System.Threading.Interlocked.Decrement(ref complete.number);
+ UpdateCounts();
}
+ private void UpdateCounts()
+ {
+ int complete = 0;
+ int incomplete = 0;
+
+ foreach (Peer p in peers.Values)
+ {
+ if (p.HasCompleted)
+ complete++;
+ else
+ incomplete++;
+ }
+
+ this.complete.number = complete;
+ this.incomplete.number = incomplete;
+ }
+
/// <summary>
/// Updates the peer in the tracker database based on the announce
parameters
/// </summary>
@@ -245,25 +269,15 @@
}
Debug.WriteLine(string.Format("Updating: {0}",
peer.ClientAddress));
- switch (par.Event)
- {
- case TorrentEvent.Completed:
- System.Threading.Interlocked.Increment(ref
complete.number);
- System.Threading.Interlocked.Increment(ref
downloaded.number);
- break;
+ peer.Update(par);
- case TorrentEvent.Stopped:
- Remove(peer);
- break;
+ if (par.Event == TorrentEvent.Completed)
+ System.Threading.Interlocked.Increment(ref downloaded.number);
- case TorrentEvent.None:
- case TorrentEvent.Started:
- // Do nothing
- break;
+ else if (par.Event == TorrentEvent.Stopped)
+ Remove(peer);
- }
-
- peer.Update(par);
+ UpdateCounts();
}
#endregion Methods
Modified: trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/Tracker.cs
===================================================================
--- trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/Tracker.cs
2008-02-17 00:14:05 UTC (rev 95940)
+++ trunk/bitsharp/src/MonoTorrent/MonoTorrent.Tracker/Tracker.cs
2008-02-17 00:31:09 UTC (rev 95941)
@@ -180,6 +180,9 @@
// updates it's information or removes it depending on the
context
manager.Update(e);
+ // Clear any peers who haven't announced within the allowed
timespan and may be inactive
+
manager.ClearZombiePeers(DateTime.Now.AddSeconds(-this.IntervalAlgorithm.PeerTimeout));
+
// Fulfill the announce request
manager.GetPeers(e.Response, e.NumberWanted,
e.HasRequestedCompact, e.ClientAddress);
}
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches