From a916f970b10dd31f0f118bd4fec83eed56c6cadb Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 12 Apr 2010 19:07:53 +0000
Subject: [PATCH]     * i2psnark:      - Concurrent, limit, display, log tweaks

---
 .../org/klomp/snark/ConnectionAcceptor.java   |  3 ++-
 .../src/org/klomp/snark/I2PSnarkUtil.java     | 21 ++++++++-----------
 .../java/src/org/klomp/snark/MetaInfo.java    |  3 ++-
 .../src/org/klomp/snark/PeerAcceptor.java     |  3 ++-
 .../src/org/klomp/snark/PeerConnectionIn.java |  5 +++--
 .../org/klomp/snark/PeerConnectionOut.java    |  3 ++-
 .../src/org/klomp/snark/PeerCoordinator.java  | 12 +++++------
 .../java/src/org/klomp/snark/PeerState.java   |  6 ++++--
 .../src/org/klomp/snark/TrackerClient.java    |  3 ++-
 .../org/klomp/snark/web/I2PSnarkServlet.java  |  2 +-
 10 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
index 2e45749b87..fa29fbb05a 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 
+import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
 import net.i2p.client.streaming.I2PServerSocket;
 import net.i2p.client.streaming.I2PSocket;
@@ -36,7 +37,7 @@ import net.i2p.util.Log;
  */
 public class ConnectionAcceptor implements Runnable
 {
-  private Log _log = new Log(ConnectionAcceptor.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(ConnectionAcceptor.class);
   private I2PServerSocket serverSocket;
   private PeerAcceptor peeracceptor;
   private Thread thread;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 4cea2ae816..9804da5d66 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -4,7 +4,6 @@ import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -23,6 +22,7 @@ import net.i2p.client.streaming.I2PSocketManagerFactory;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
+import net.i2p.util.ConcurrentHashSet;
 import net.i2p.util.EepGet;
 import net.i2p.util.FileUtil;
 import net.i2p.util.Log;
@@ -48,7 +48,7 @@ public class I2PSnarkUtil {
     private Map _opts;
     private I2PSocketManager _manager;
     private boolean _configured;
-    private final Set _shitlist;
+    private final Set<Hash> _shitlist;
     private int _maxUploaders;
     private int _maxUpBW;
     private int _maxConnections;
@@ -67,7 +67,7 @@ public class I2PSnarkUtil {
         _opts = new HashMap();
         setProxy("127.0.0.1", 4444);
         setI2CPConfig("127.0.0.1", 7654, null);
-        _shitlist = new HashSet(64);
+        _shitlist = new ConcurrentHashSet();
         _configured = false;
         _maxUploaders = Snark.MAX_TOTAL_UPLOADERS;
         _maxUpBW = DEFAULT_MAX_UP_BW;
@@ -187,18 +187,15 @@ public class I2PSnarkUtil {
     /** connect to the given destination */
     I2PSocket connect(PeerID peer) throws IOException {
         Hash dest = peer.getAddress().calculateHash();
-        synchronized (_shitlist) {
-            if (_shitlist.contains(dest))
-                throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted");
-        }
+        if (_shitlist.contains(dest))
+            throw new IOException("Not trying to contact " + dest.toBase64() + ", as they are shitlisted");
         try {
             I2PSocket rv = _manager.connect(peer.getAddress());
-            if (rv != null) synchronized (_shitlist) { _shitlist.remove(dest); }
+            if (rv != null)
+                _shitlist.remove(dest);
             return rv;
         } catch (I2PException ie) {
-            synchronized (_shitlist) {
-                _shitlist.add(dest);
-            }
+            _shitlist.add(dest);
             SimpleScheduler.getInstance().addEvent(new Unshitlist(dest), 10*60*1000);
             throw new IOException("Unable to reach the peer " + peer + ": " + ie.getMessage());
         }
@@ -207,7 +204,7 @@ public class I2PSnarkUtil {
     private class Unshitlist implements SimpleTimer.TimedEvent {
         private Hash _dest;
         public Unshitlist(Hash dest) { _dest = dest; }
-        public void timeReached() { synchronized (_shitlist) { _shitlist.remove(_dest); } }
+        public void timeReached() { _shitlist.remove(_dest); }
     }
     
     /**
diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
index 04d5b30c89..f8c8feaede 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
+import net.i2p.I2PAppContext;
 import net.i2p.crypto.SHA1;
 import net.i2p.data.Base64;
 import net.i2p.util.Log;
@@ -47,7 +48,7 @@ import org.klomp.snark.bencode.InvalidBEncodingException;
  */
 public class MetaInfo
 {  
-  private static final Log _log = new Log(MetaInfo.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(MetaInfo.class);
   private final String announce;
   private final byte[] info_hash;
   private final String name;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
index b2015fea28..c869384371 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java
@@ -28,6 +28,7 @@ import java.io.OutputStream;
 import java.io.SequenceInputStream;
 import java.util.Iterator;
 
+import net.i2p.I2PAppContext;
 import net.i2p.client.streaming.I2PSocket;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
@@ -41,7 +42,7 @@ import net.i2p.util.Log;
  */
 public class PeerAcceptor
 {
-  private static final Log _log = new Log(PeerAcceptor.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerAcceptor.class);
   private final PeerCoordinator coordinator;
   final PeerCoordinatorSet coordinators;
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
index 111327e3d5..9acfb60e3c 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java
@@ -23,11 +23,12 @@ package org.klomp.snark;
 import java.io.DataInputStream;
 import java.io.IOException;
 
+import net.i2p.I2PAppContext;
 import net.i2p.util.Log;
 
 class PeerConnectionIn implements Runnable
 {
-  private Log _log = new Log(PeerConnectionIn.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerConnectionIn.class);
   private final Peer peer;
   private final DataInputStream din;
 
@@ -129,7 +130,7 @@ class PeerConnectionIn implements Runnable
                 din.readFully(bitmap);
                 ps.bitfieldMessage(bitmap);
                 if (_log.shouldLog(Log.DEBUG)) 
-                    _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName() + ": size=" + (i-1) + ": " + ps.bitfield);
+                    _log.debug("Received bitmap from " + peer + " on " + peer.metainfo.getName() + ": size=" + (i-1) /* + ": " + ps.bitfield */ );
                 break;
               case 6:
                 piece = din.readInt();
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
index 92ac358a5f..3326a60860 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import net.i2p.I2PAppContext;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleScheduler;
@@ -33,7 +34,7 @@ import net.i2p.util.SimpleTimer;
 
 class PeerConnectionOut implements Runnable
 {
-  private Log _log = new Log(PeerConnectionOut.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerConnectionOut.class);
   private final Peer peer;
   private final DataOutputStream dout;
 
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 67ac95e55a..af567efc34 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -29,6 +29,7 @@ import java.util.List;
 import java.util.Random;
 import java.util.Timer;
 
+import net.i2p.I2PAppContext;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 
@@ -37,7 +38,7 @@ import net.i2p.util.Log;
  */
 public class PeerCoordinator implements PeerListener
 {
-  private final Log _log = new Log(PeerCoordinator.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerCoordinator.class);
   final MetaInfo metainfo;
   final Storage storage;
   final Snark snark;
@@ -241,18 +242,17 @@ public class PeerCoordinator implements PeerListener
   }
   
   /**
-   *  Reduce max if huge pieces to keep from ooming
-   *  Todo: should we only reduce when leeching?
-   *  @return 512K: 16; 1M: 11; 2M: 8
+   *  Reduce max if huge pieces to keep from ooming when leeching
+   *  @return 512K: 16; 1M: 11; 2M: 6
    */
   private int getMaxConnections() {
     int size = metainfo.getPieceLength(0);
     int max = _util.getMaxConnections();
-    if (size <= 512*1024)
+    if (size <= 512*1024 || completed())
       return max;
     if (size <= 1024*1024)
       return (max + max + 2) / 3;
-    return (max + 1) / 2;
+    return (max + 2) / 3;
   }
 
   public boolean halted() { return halted; }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
index 2fa597ce51..d1865a2b97 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java
@@ -24,11 +24,12 @@ import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
+import net.i2p.I2PAppContext;
 import net.i2p.util.Log;
 
 class PeerState
 {
-  private Log _log = new Log(PeerState.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(PeerState.class);
   final Peer peer;
   final PeerListener listener;
   final MetaInfo metainfo;
@@ -159,7 +160,7 @@ class PeerState
         // why did they contact us? (robert)
         // Dump them quick before we send our whole bitmap
         if (_log.shouldLog(Log.WARN))
-            _log.warn("Disconnecting seed that connects to seeds" + peer);
+            _log.warn("Disconnecting seed that connects to seeds: " + peer);
         peer.disconnect(true);
     }
   }
@@ -195,6 +196,7 @@ class PeerState
 
     // Limit total pipelined requests to MAX_PIPELINE bytes
     // to conserve memory and prevent DOS
+    // Todo: limit number of requests also? (robert 64 x 4KB)
     if (out.queuedBytes() + length > MAX_PIPELINE_BYTES)
       {
         if (_log.shouldLog(Log.WARN))
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index cb72f2c1e0..e5d553462f 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -33,6 +33,7 @@ import java.util.List;
 import java.util.Random;
 import java.util.Set;
 
+import net.i2p.I2PAppContext;
 import net.i2p.util.I2PAppThread;
 import net.i2p.util.Log;
 
@@ -44,7 +45,7 @@ import net.i2p.util.Log;
  */
 public class TrackerClient extends I2PAppThread
 {
-  private static final Log _log = new Log(TrackerClient.class);
+  private final Log _log = I2PAppContext.getGlobalContext().logManager().getLog(TrackerClient.class);
   private static final String NO_EVENT = "";
   private static final String STARTED_EVENT = "started";
   private static final String COMPLETED_EVENT = "completed";
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 2a11305131..08075b0d18 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -505,7 +505,7 @@ public class I2PSnarkServlet extends HttpServlet {
             err = snark.coordinator.trackerProblems;
             curPeers = snark.coordinator.getPeerCount();
             stats[4] += curPeers;
-            knownPeers = snark.coordinator.trackerSeenPeers;
+            knownPeers = Math.max(curPeers, snark.coordinator.trackerSeenPeers);
         }
         
         String statusString = _("Unknown");
-- 
GitLab