From ba37839adfad52f012d25cbef65aba744073fdd9 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Sun, 14 Oct 2012 20:05:04 +0000
Subject: [PATCH] fixes while rechecking storage

---
 .../java/src/org/klomp/snark/PeerCoordinator.java      | 10 +++++++++-
 apps/i2psnark/java/src/org/klomp/snark/Storage.java    |  2 ++
 .../java/src/org/klomp/snark/web/I2PSnarkServlet.java  |  2 +-
 3 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
index 8ffde7363b..f882967592 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java
@@ -377,7 +377,10 @@ class PeerCoordinator implements PeerListener
   public boolean needOutboundPeers() {
         //return wantedBytes != 0 && needPeers();
         // minus one to make it a little easier for new peers to get in on large swarms
-        return wantedBytes != 0 && !halted && peers.size() < getMaxConnections() - 1;
+        return wantedBytes != 0 &&
+               !halted &&
+               peers.size() < getMaxConnections() - 1 &&
+               (storage == null || !storage.isChecking());
   }
   
   /**
@@ -945,6 +948,8 @@ class PeerCoordinator implements PeerListener
   {
     if (metainfo == null || storage == null)
         return true;
+    if (storage.isChecking())
+        return true;
     int piece = pp.getPiece();
     if (halted) {
       _log.info("Got while-halted piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName());
@@ -968,6 +973,7 @@ class PeerCoordinator implements PeerListener
         
         try
           {
+            // this takes forever if complete, as it rechecks
             if (storage.putPiece(pp))
               {
                 if (_log.shouldLog(Log.INFO))
@@ -1173,6 +1179,8 @@ class PeerCoordinator implements PeerListener
   public PartialPiece getPartialPiece(Peer peer, BitField havePieces) {
       if (metainfo == null)
           return null;
+      if (storage != null && storage.isChecking())
+          return null;
       synchronized(wantedPieces) {
           // sorts by remaining bytes, least first
           Collections.sort(partialPieces);
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index 21e006f5e4..90f6f4b555 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -982,6 +982,8 @@ public class Storage
 
   /**
    * Put the piece in the Storage if it is correct.
+   * Warning - takes a LONG time if complete as it does the recheck here.
+   * TODO thread the recheck?
    *
    * @return true if the piece was correct (sha metainfo hash
    * matches), otherwise false.
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 7283b14be1..d926ee2d43 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -1153,7 +1153,7 @@ public class I2PSnarkServlet extends DefaultServlet {
             out.write("</a>");
 
         out.write("<td align=\"right\" class=\"snarkTorrentETA " + rowClass + "\">");
-        if(isRunning && remainingSeconds > 0)
+        if(isRunning && remainingSeconds > 0 && !snark.isChecking())
             out.write(DataHelper.formatDuration2(Math.max(remainingSeconds, 10) * 1000)); // (eta 6h)
         out.write("</td>\n\t");
         out.write("<td align=\"right\" class=\"snarkTorrentDownloaded " + rowClass + "\">");
-- 
GitLab