From 7c63866c519835db950fea97b0c7a8cd85f38fae Mon Sep 17 00:00:00 2001 From: zzz Date: Sun, 12 Dec 2010 14:49:30 +0000 Subject: [PATCH] * i2psnark: - Fix end-game deadlock - Fix last-modified check for multifile torrents, causing apparent loss of data after abnormal exit - UI Tweaks --- .../src/org/klomp/snark/PeerCoordinator.java | 14 ++++++++---- .../java/src/org/klomp/snark/Storage.java | 2 +- .../org/klomp/snark/web/I2PSnarkServlet.java | 22 +++++++++++-------- apps/i2psnark/locale/messages_de.po | 12 +++++++--- apps/i2psnark/locale/messages_es.po | 8 +++++-- apps/i2psnark/locale/messages_fr.po | 4 +++- history.txt | 7 ++++++ .../resources/themes/snark/ubergine/snark.css | 8 +++++++ .../resources/themes/snark/vanilla/snark.css | 8 +++++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 10 files changed, 66 insertions(+), 21 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 2a6eb79af..d53ddde5d 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -566,12 +566,13 @@ public class PeerCoordinator implements PeerListener return -1; } + Piece piece = null; + List requested = new ArrayList(); + int wantedSize = END_GAME_THRESHOLD + 1; synchronized(wantedPieces) { - Piece piece = null; if (record) Collections.sort(wantedPieces); // Sort in order of rarest first. - List requested = new ArrayList(); Iterator it = wantedPieces.iterator(); while (piece == null && it.hasNext()) { @@ -588,13 +589,18 @@ public class PeerCoordinator implements PeerListener requested.add(p); } } + if (piece == null) + wantedSize = wantedPieces.size(); + } // synch + // Don't sync the following, deadlock from calling each Peer's isRequesting() + //Only request a piece we've requested before if there's no other choice. if (piece == null) { // AND if there are almost no wanted pieces left (real end game). // If we do end game all the time, we generate lots of extra traffic // when the seeder is super-slow and all the peers are "caught up" - if (wantedPieces.size() > END_GAME_THRESHOLD) + if (wantedSize > END_GAME_THRESHOLD) return -1; // nothing to request and not in end game // let's not all get on the same piece // Even better would be to sort by number of requests @@ -608,6 +614,7 @@ public class PeerCoordinator implements PeerListener // limit number of parallel requests int requestedCount = 0; for (Peer pr : peers) { + // deadlock if synced on wantedPieces if (pr.isRequesting(p.getId())) { if (pr.equals(peer)) { // don't give it to him again @@ -644,7 +651,6 @@ public class PeerCoordinator implements PeerListener piece.setRequested(true); } return piece.getId(); - } } /** diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java index 87aa0d357..17fae5235 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java @@ -514,7 +514,7 @@ public class Storage RAFfile[i] = f; total += lengths[i]; if (useSavedBitField) { - long lm = base.lastModified(); + long lm = f.lastModified(); if (lm <= 0 || lm > savedTime) useSavedBitField = 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 dddb296f4..d74426ee1 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -289,18 +289,21 @@ public class I2PSnarkServlet extends Default { out.write("\"\""); + // Translators: Please keep short or translate as " " out.write(_("ETA")); } out.write("\n"); out.write("\"\""); + // Translators: Please keep short or translate as " " out.write(_("RX")); out.write("\n"); if (_manager.util().connected() && !snarks.isEmpty()) { out.write("\"\""); + // Translators: Please keep short or translate as " " out.write(_("TX")); } out.write("\n"); @@ -310,6 +313,7 @@ public class I2PSnarkServlet extends Default { out.write("\" alt=\""); out.write(_("RX")); out.write(" \">"); + // Translators: Please keep short or translate as " " out.write(_("Rate")); } out.write("\n"); @@ -1007,39 +1011,39 @@ public class I2PSnarkServlet extends Default { out.write(""); if (remaining > 0) { if (peer.isInteresting() && !peer.isChoked()) { - out.write(""); - out.write(formatSize(peer.getDownloadRate()) + "ps"); + out.write(""); + out.write(formatSize(peer.getDownloadRate()) + "ps"); } else { - out.write(""); - out.write(formatSize(peer.getDownloadRate()) + "ps"); + out.write(formatSize(peer.getDownloadRate()) + "ps"); } } out.write("\n\t"); out.write(""); if (pct != 100.0) { if (peer.isInterested() && !peer.isChoking()) { - out.write(""); - out.write(formatSize(peer.getUploadRate()) + "ps"); + out.write(""); + out.write(formatSize(peer.getUploadRate()) + "ps"); } else { - out.write(""); - out.write(formatSize(peer.getUploadRate()) + "ps"); + out.write(formatSize(peer.getUploadRate()) + "ps"); } } out.write("\n\t"); out.write(""); out.write("\n\t"); if (showDebug) - out.write("" + peer.getSocket() + ""); + out.write("" + peer.getSocket() + ""); } } } diff --git a/apps/i2psnark/locale/messages_de.po b/apps/i2psnark/locale/messages_de.po index 6d35ca347..253dc3482 100644 --- a/apps/i2psnark/locale/messages_de.po +++ b/apps/i2psnark/locale/messages_de.po @@ -277,16 +277,20 @@ msgid "Downloaded" msgstr "heruntergeladen" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:295 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "heruntergeladen" msgid "RX" -msgstr "heruntergeladen" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:298 msgid "Uploaded" msgstr "hochgeladen" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:300 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "hochgeladen" msgid "TX" -msgstr "hochgeladen" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:303 msgid "Down Rate" @@ -294,8 +298,10 @@ msgstr "eingehend" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "Übertragung" msgid "Rate" -msgstr "Übertragung" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Up Rate" diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po index 9beb85636..555c70fe8 100644 --- a/apps/i2psnark/locale/messages_es.po +++ b/apps/i2psnark/locale/messages_es.po @@ -269,8 +269,10 @@ msgstr "tiempo restante de descarga" #. space here would look better but nbsp is too big and thinsp breaks #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:290 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "Completado en" msgid "ETA" -msgstr "Completado en" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:293 msgid "Downloaded" @@ -294,8 +296,10 @@ msgstr "Tasa de descarga" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:305 #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:310 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "Tasa de transferencia" msgid "Rate" -msgstr "Tasa de transferencia" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:308 msgid "Up Rate" diff --git a/apps/i2psnark/locale/messages_fr.po b/apps/i2psnark/locale/messages_fr.po index b37eeee6b..2831fb0cf 100644 --- a/apps/i2psnark/locale/messages_fr.po +++ b/apps/i2psnark/locale/messages_fr.po @@ -268,8 +268,10 @@ msgid "Estimated Download Time" msgstr "Temps estimé de téléchargement" #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:278 +# NOTE: purposely left blank to leave more room in the table header +#msgstr "Temps restant" msgid "ETA" -msgstr "Temps restant" +msgstr " " #: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:281 msgid "Downloaded" diff --git a/history.txt b/history.txt index 9450ccca9..1f1c17e74 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,10 @@ +2010-12-12 zzz + * i2psnark: + - Fix end-game deadlock + - Fix last-modified check for multifile torrents, causing + apparent loss of data after abnormal exit + - Tweaks + 2010-12-11 zzz * Build: Fix 'ant distclean poupdate' again * I2CP: Change a log error to a warning (ticket #353) diff --git a/installer/resources/themes/snark/ubergine/snark.css b/installer/resources/themes/snark/ubergine/snark.css index 95b529f19..56124cb6d 100644 --- a/installer/resources/themes/snark/ubergine/snark.css +++ b/installer/resources/themes/snark/ubergine/snark.css @@ -361,6 +361,14 @@ td:first-child { color: #dd7 !important; } +.choked { + color: #f00000 !important; +} + +.unchoked { + color: #00f000 !important; +} + .thumb { max-height: 64px; max-width: 96px; diff --git a/installer/resources/themes/snark/vanilla/snark.css b/installer/resources/themes/snark/vanilla/snark.css index 8d31ca991..da428ef9d 100644 --- a/installer/resources/themes/snark/vanilla/snark.css +++ b/installer/resources/themes/snark/vanilla/snark.css @@ -365,6 +365,14 @@ td:first-child { color: #505 !important; } +.choked { + color: #a00000 !important; +} + +.unchoked { + color: #008000 !important; +} + .thumb { max-height: 64px; max-width: 96px; diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index eafd4d23d..c0b61daa2 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 36; + public final static long BUILD = 37; /** for example "-test" */ public final static String EXTRA = "-rc";