propagate from branch 'i2p.i2p' (head 915df7d6afddd7473a7db7fd1f499d350611db62)

to branch 'i2p.i2p.zzz.dhtsnark' (head 4c10a9396745b20a517c9822cf1454aca752ea94)
This commit is contained in:
zzz
2011-01-05 21:49:13 +00:00
29 changed files with 121 additions and 109 deletions

View File

@@ -518,6 +518,7 @@ public class Peer implements Comparable
/**
* Are we currently requesting the piece?
* @deprecated deadlocks
* @since 0.8.1
*/
boolean isRequesting(int p) {

View File

@@ -651,10 +651,7 @@ public class PeerCoordinator implements PeerListener
}
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).
@@ -672,22 +669,12 @@ public class PeerCoordinator implements PeerListener
Piece p = it2.next();
if (havePieces.get(p.getId())) {
// 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
requestedCount = MAX_PARALLEL_REQUESTS;
break;
}
if (++requestedCount >= MAX_PARALLEL_REQUESTS)
break;
}
}
if (requestedCount >= MAX_PARALLEL_REQUESTS)
continue;
piece = p;
int requestedCount = p.getRequestCount();
if (requestedCount < MAX_PARALLEL_REQUESTS &&
!p.isRequestedBy(peer)) {
piece = p;
break;
}
}
}
if (piece == null) {
@@ -708,9 +695,10 @@ public class PeerCoordinator implements PeerListener
if (record) {
if (_log.shouldLog(Log.INFO))
_log.info(peer + " is now requesting: piece " + piece + " priority " + piece.getPriority());
piece.setRequested(true);
piece.setRequested(peer, true);
}
return piece.getId();
} // synch
}
/**
@@ -1014,7 +1002,7 @@ public class PeerCoordinator implements PeerListener
}
} // else drop the empty partial piece
// synchs on wantedPieces...
markUnrequestedIfOnlyOne(peer, pp.getPiece());
markUnrequested(peer, pp.getPiece());
}
if (_log.shouldLog(Log.INFO))
_log.info("Partial list size now: " + partialPieces.size());
@@ -1042,7 +1030,7 @@ public class PeerCoordinator implements PeerListener
// this is just a double-check, it should be in there
for(Piece piece : wantedPieces) {
if (piece.getId() == savedPiece) {
piece.setRequested(true);
piece.setRequested(peer, true);
if (_log.shouldLog(Log.INFO)) {
_log.info("Restoring orphaned partial piece " + pp +
" Partial list size now: " + partialPieces.size());
@@ -1121,33 +1109,16 @@ public class PeerCoordinator implements PeerListener
}
}
/** Clear the requested flag for a piece if the peer
** is the only one requesting it
/**
* Clear the requested flag for a piece
*/
private void markUnrequestedIfOnlyOne(Peer peer, int piece)
private void markUnrequested(Peer peer, int piece)
{
// see if anybody else is requesting
for (Peer p : peers) {
if (p.equals(peer))
continue;
if (p.state == null)
continue;
// FIXME don't go into the state
if (p.state.getRequestedPieces().contains(Integer.valueOf(piece))) {
if (_log.shouldLog(Log.DEBUG))
_log.debug("Another peer is requesting piece " + piece);
return;
}
}
// nobody is, so mark unrequested
synchronized(wantedPieces)
{
for (Piece pc : wantedPieces) {
if (pc.getId() == piece) {
pc.setRequested(false);
if (_log.shouldLog(Log.DEBUG))
_log.debug("Removing from request list piece " + piece);
pc.setRequested(peer, false);
return;
}
}

View File

@@ -468,7 +468,7 @@ class PeerState implements DataLoader
/**
* @return all pieces we are currently requesting, or empty Set
*/
synchronized Set<Integer> getRequestedPieces() {
synchronized private Set<Integer> getRequestedPieces() {
Set<Integer> rv = new HashSet(outstandingRequests.size() + 1);
for (Request req : outstandingRequests) {
rv.add(Integer.valueOf(req.piece));
@@ -582,6 +582,7 @@ class PeerState implements DataLoader
/**
* Are we currently requesting the piece?
* @deprecated deadlocks
* @since 0.8.1
*/
synchronized boolean isRequesting(int piece) {

View File

@@ -12,13 +12,15 @@ class Piece implements Comparable {
private int id;
private Set<PeerID> peers;
private boolean requested;
/** @since 0.8.3 */
private Set<PeerID> requests;
/** @since 0.8.1 */
private int priority;
public Piece(int id) {
this.id = id;
this.peers = new ConcurrentHashSet();
this.peers = new ConcurrentHashSet(I2PSnarkUtil.MAX_CONNECTIONS);
this.requests = new ConcurrentHashSet(2);
}
/**
@@ -49,12 +51,36 @@ class Piece implements Comparable {
}
public int getId() { return this.id; }
/** @deprecated unused */
public Set<PeerID> getPeers() { return this.peers; }
public boolean addPeer(Peer peer) { return this.peers.add(peer.getPeerID()); }
public boolean removePeer(Peer peer) { return this.peers.remove(peer.getPeerID()); }
public boolean isRequested() { return this.requested; }
public void setRequested(boolean requested) { this.requested = requested; }
public boolean isRequested() { return !this.requests.isEmpty(); }
/**
* Since 0.8.3, keep track of who is requesting here,
* to avoid deadlocks from querying each peer.
*/
public void setRequested(Peer peer, boolean requested) {
if (requested)
this.requests.add(peer.getPeerID());
else
this.requests.remove(peer.getPeerID());
}
/**
* Is peer requesting this piece?
* @since 0.8.3
*/
public boolean isRequestedBy(Peer peer) {
return this.requests.contains(peer.getPeerID());
}
/**
* How many peers are requesting this piece?
* @since 0.8.3
*/
public int getRequestCount() {
return this.requests.size();
}
/** @return default 0 @since 0.8.1 */
public int getPriority() { return this.priority; }

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: I2P i2psnark\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-19 03:16+0000\n"
"PO-Revision-Date: 2010-12-31 01:09+0100\n"
"PO-Revision-Date: 2011-01-03 00:58+0100\n"
"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -323,7 +323,7 @@ msgstr "Arrancar todos"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:372
msgid "No torrents loaded."
msgstr "No cargado ningún torrent"
msgstr "No está cargado ningún torrent"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:377
msgid "Totals"
@@ -644,7 +644,7 @@ msgstr "Si marcado, los torrents añadidos se iniciarán de forma automática."
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1198
msgid "Theme"
msgstr "tema"
msgstr "Tema"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1211
msgid "Startup delay"
@@ -664,7 +664,7 @@ msgstr "pares"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1244
msgid "Up bandwidth limit"
msgstr "Límite de ancho de banda para la subida"
msgstr "Límite del ancho de banda para la subida"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1247
msgid "Half available bandwidth recommended."
@@ -696,7 +696,7 @@ msgstr "Preferencias de salida"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1286
msgid "I2CP host"
msgstr "Huésped I2CP"
msgstr "Anfitrión I2CP"
#: ../java/src/org/klomp/snark/web/I2PSnarkServlet.java:1291
msgid "I2CP port"

View File

@@ -98,7 +98,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
_clientId = clientId;
this.localPort = localPort;
this.l = l;
this.handlerName = handlerName + _clientId;
this.handlerName = localPort + " #" + _clientId;
_ownDest = true; // == ! shared client
_context = tunnel.getContext();
_context.statManager().createRateStat("i2ptunnel.client.closeBacklog", "How many pending sockets remain when we close one due to backlog?", "I2PTunnel", new long[] { 60*1000, 10*60*1000, 60*60*1000 });

View File

@@ -38,7 +38,7 @@ public class ConfigLoggingHelper extends HelperBase {
sortedLogs.add(prefix);
}
buf.append("<textarea name=\"levels\" rows=\"4\" cols=\"60\" wrap=\"off\">");
buf.append("<textarea name=\"levels\" rows=\"4\" cols=\"60\" wrap=\"off\" spellcheck=\"false\">");
for (Iterator iter = sortedLogs.iterator(); iter.hasNext(); ) {
String prefix = (String)iter.next();
String level = limits.getProperty(prefix);

View File

@@ -14,7 +14,7 @@ public class ConfigReseedHandler extends FormHandler {
@Override
protected void processForm() {
if (_action.equals(_("Save Configuration and Reseed Now"))) {
if (_action.equals(_("Save changes and reseed now"))) {
saveChanges();
boolean reseedInProgress = Boolean.valueOf(System.getProperty("net.i2p.router.web.ReseedHandler.reseedInProgress")).booleanValue();
if (reseedInProgress) {
@@ -26,7 +26,7 @@ public class ConfigReseedHandler extends FormHandler {
}
return;
}
if (_action.equals(_("Save Configuration"))) {
if (_action.equals(_("Save changes"))) {
saveChanges();
return;
}

View File

@@ -31,7 +31,7 @@
<input type="hidden" name="nonce" value="<%=System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce")%>" >
<input type="hidden" name="action" value="blah" >
<h3><%=intl._("Advanced I2P Configuration")%></h3>
<textarea rows="32" cols="60" name="config" wrap="off"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
<textarea rows="32" cols="60" name="config" wrap="off" spellcheck="false"><jsp:getProperty name="advancedhelper" property="settings" /></textarea><br><hr>
<div class="formaction">
<input type="reset" value="<%=intl._("Cancel")%>" >
<input type="submit" name="shouldsave" value="<%=intl._("Save changes")%>" >

View File

@@ -38,7 +38,7 @@
<div class="wideload">
<p><table><tr>
<td class="mediumtags" align="right"><%=intl._("Dest. name, hash, or full key")%>:</td>
<td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off"></textarea></td>
<td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off" spellcheck="false"></textarea></td>
</tr><tr>
<td class="mediumtags" align="right"><%=intl._("Encryption Key")%>:</td>
<td><input type="text" size="55" name="key" ></td>

View File

@@ -44,7 +44,7 @@
<input type="radio" class="optbox" name="mode" value="2" <%=reseedHelper.modeChecked(2) %> >
<%=intl._("Use non-SSL only")%></td></tr>
<tr><td class="mediumtags" align="right"><b><%=intl._("Reseed URLs")%></b></td>
<td><textarea name="reseedURL" wrap="off"><jsp:getProperty name="reseedHelper" property="reseedURL" /></textarea></td></tr>
<td><textarea name="reseedURL" wrap="off" spellcheck="false"><jsp:getProperty name="reseedHelper" property="reseedURL" /></textarea></td></tr>
<tr><td class="mediumtags" align="right"><b><%=intl._("Enable HTTP proxy (not used for SSL)")%></b></td>
<td><input type="checkbox" class="optbox" name="enable" value="true" <jsp:getProperty name="reseedHelper" property="enable" /> ></td></tr>
<tr><td class="mediumtags" align="right"><b><%=intl._("HTTP Proxy Host")%>:</b></td>
@@ -54,6 +54,6 @@
</table></div>
<hr><div class="formaction">
<input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
<input type="submit" name="action" value="<%=intl._("Save Configuration and Reseed Now")%>" />
<input type="submit" name="action" value="<%=intl._("Save Configuration")%>" />
<input type="submit" name="action" value="<%=intl._("Save changes and reseed now")%>" />
<input type="submit" name="action" value="<%=intl._("Save changes")%>" />
</div></form></div></div></body></html>

View File

@@ -50,9 +50,9 @@
</tr><tr><td class= "mediumtags" align="right"><b><%=intl._("eepProxy port")%>:</b></td>
<td><input type="text" size="4" name="proxyPort" value="<jsp:getProperty name="updatehelper" property="proxyPort" />" /></td>
</tr><tr><td class= "mediumtags" align="right"><b><%=intl._("Update URLs")%>:</b></td>
<td><textarea name="updateURL" wrap="off"><jsp:getProperty name="updatehelper" property="updateURL" /></textarea></td>
<td><textarea name="updateURL" wrap="off" spellcheck="false"><jsp:getProperty name="updatehelper" property="updateURL" /></textarea></td>
</tr><tr><td class= "mediumtags" align="right"><b><%=intl._("Trusted keys")%>:</b></td>
<td><textarea name="trustedKeys" wrap="off"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea></td>
<td><textarea name="trustedKeys" wrap="off" spellcheck="false"><jsp:getProperty name="updatehelper" property="trustedKeys" /></textarea></td>
</tr><tr><td class= "mediumtags" align="right"><b><%=intl._("Update with unsigned development builds?")%></b></td>
<td><jsp:getProperty name="updatehelper" property="updateUnsigned" /></td>
</tr><tr><td class= "mediumtags" align="right"><b><%=intl._("Unsigned Build URL")%>:</b></td>

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: I2P routerconsole\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-28 00:08+0000\n"
"PO-Revision-Date: 2010-12-31 02:47+0100\n"
"PO-Revision-Date: 2011-01-01 21:19+0100\n"
"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
"Language-Team: echelon <echelon@mail.i2p>, Sperreingang <sperrbezirk@mail.i2p>\n"
"MIME-Version: 1.0\n"
@@ -2683,7 +2683,7 @@ msgstr "NTCP und SSU mit Hilfsrouter"
#: ../java/src/net/i2p/router/web/NewsFetcher.java:93
#, java-format
msgid "News last updated {0} ago."
msgstr "Zeit seit letzter Aktualisierung der Nachrichten: {0}"
msgstr "Zeit seit letzter Aktualisierung der Nachrichten: {0};"
#: ../java/src/net/i2p/router/web/NewsFetcher.java:99
#, java-format

View File

@@ -9,7 +9,7 @@ msgstr ""
"Project-Id-Version: I2P routerconsole\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-12-28 00:08+0000\n"
"PO-Revision-Date: 2010-12-31 03:12+0100\n"
"PO-Revision-Date: 2011-01-03 01:13+0100\n"
"Last-Translator: mixxy <m1xxy@mail.i2p>\n"
"Language-Team: foo <foo@bar>\n"
"MIME-Version: 1.0\n"
@@ -119,13 +119,13 @@ msgstr "rechazando túneles: límite alcanzado"
#. always leave at least 4KBps free when allowing
#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:301
msgid "Rejecting tunnels: Bandwidth limit"
msgstr "rechazando túneles: límite de ancho de banda"
msgstr "rechazando túneles: límite del ancho de banda"
#. hard to do {0} from here
#. setTunnelStatus("Rejecting " + ((int)(100.0*probReject)) + "% of tunnels: Bandwidth limit");
#: ../../../router/java/src/net/i2p/router/RouterThrottleImpl.java:371
msgid "Rejecting most tunnels: Bandwidth limit"
msgstr "rechazando la mayor parte de los túneles: límite de ancho de banda"
msgstr "rechazando la mayor parte de los túneles: límite del ancho de banda"
#. hard to do {0} from here
#. setTunnelStatus("Accepting " + (100-(int)(100.0*probReject)) + "% of tunnels");
@@ -1727,7 +1727,7 @@ msgstr "Buscar actualizaciones"
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:235
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:242
msgid "Update"
msgstr "Actualizar"
msgstr "Actualización"
#: ../java/src/net/i2p/router/web/ConfigClientsHelper.java:266
#, java-format
@@ -2412,7 +2412,7 @@ msgstr "Nunca"
#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:90
msgid "Every"
msgstr "Cada"
msgstr "cada"
#: ../java/src/net/i2p/router/web/ConfigUpdateHelper.java:108
msgid "Notify only"
@@ -3247,11 +3247,11 @@ msgstr ""
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:83
msgid "Webserver"
msgstr ""
msgstr "Servidor web"
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:91
msgid "Configure I2P Router"
msgstr "Configura Enrutador I2P"
msgstr "Configura enrutador I2P"
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:93
msgid "I2P Internals"
@@ -3435,7 +3435,7 @@ msgstr "Demora - túnel"
#: ../java/src/net/i2p/router/web/SummaryBarRenderer.java:440
msgid "Backlog"
msgstr "tareas"
msgstr "Peticiones pendientes"
#: ../java/src/net/i2p/router/web/SummaryHelper.java:106
msgid "ERR-Client Manager I2CP Error - check logs"
@@ -3887,7 +3887,7 @@ msgstr "Ancho de Banda"
#: ../java/strings/Strings.java:58
msgid "BandwidthLimiter"
msgstr "Limitador de Ancho de Banda"
msgstr "Limitador del ancho de banda"
#: ../java/strings/Strings.java:59
msgid "ClientMessages"
@@ -4089,7 +4089,7 @@ msgstr ""
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:298
msgid "Bandwidth limiter"
msgstr "Limitador de ancho de banda"
msgstr "Limitador del ancho de banda"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/config_jsp.java:300
msgid "I2P will work best if you configure your rates to match the speed of your internet connection."
@@ -5073,7 +5073,7 @@ msgstr "Actualizando"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:317
msgid "News URL"
msgstr "URL de Noticias"
msgstr "URL de noticias"
#: ../jsp/WEB-INF/classes/net/i2p/router/web/jsp/configupdate_jsp.java:321
msgid "Refresh frequency"

View File

@@ -497,7 +497,7 @@ class MessageOutputStream extends OutputStream {
if (ws.writeFailed())
throw new IOException("Flush available failed");
else if (!ws.writeAccepted())
throw new InterruptedIOException("Flush available timed out");
throw new InterruptedIOException("Flush available timed out (" + _writeTimeout + "ms)");
}
long afterAccept = System.currentTimeMillis();
if ( (afterAccept - afterBuild > 1000) && (_log.shouldLog(Log.DEBUG)) )