diff --git a/apps/i2psnark/java/src/org/klomp/snark/Peer.java b/apps/i2psnark/java/src/org/klomp/snark/Peer.java index dd98e5dd92..bda2c28fd6 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Peer.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Peer.java @@ -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) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java index 7852840ccb..d01f1ef2e8 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java @@ -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; } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 6989f1ea65..aadc5cba25 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -468,7 +468,7 @@ class PeerState implements DataLoader /** * @return all pieces we are currently requesting, or empty Set */ - synchronized Set getRequestedPieces() { + synchronized private Set getRequestedPieces() { Set 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) { diff --git a/apps/i2psnark/java/src/org/klomp/snark/Piece.java b/apps/i2psnark/java/src/org/klomp/snark/Piece.java index 68b2ddfd43..f44cdda7df 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/Piece.java +++ b/apps/i2psnark/java/src/org/klomp/snark/Piece.java @@ -12,13 +12,15 @@ class Piece implements Comparable { private int id; private Set peers; - private boolean requested; + /** @since 0.8.3 */ + private Set 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 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; } diff --git a/apps/i2psnark/locale/messages_es.po b/apps/i2psnark/locale/messages_es.po index c56c95c06e..cf863e521c 100644 --- a/apps/i2psnark/locale/messages_es.po +++ b/apps/i2psnark/locale/messages_es.po @@ -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 \n" "Language-Team: foo \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" diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index a98551b8c5..ae723661c6 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -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 }); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java index 7bd4e45462..6b86caeb22 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java @@ -38,7 +38,7 @@ public class ConfigLoggingHelper extends HelperBase { sortedLogs.add(prefix); } - buf.append("

+

" > " > diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index b260f843a4..7438f55806 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -38,7 +38,7 @@

- + diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 0829112e9d..593e410d37 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -44,7 +44,7 @@ > <%=intl._("Use non-SSL only")%> - + @@ -54,6 +54,6 @@
<%=intl._("Dest. name, hash, or full key")%>:
<%=intl._("Encryption Key")%>:
<%=intl._("Reseed URLs")%>
<%=intl._("Enable HTTP proxy (not used for SSL)")%> >
<%=intl._("HTTP Proxy Host")%>:


" /> -" /> -" /> +" /> +" />
diff --git a/apps/routerconsole/jsp/configupdate.jsp b/apps/routerconsole/jsp/configupdate.jsp index 1930614218..47b8b93108 100644 --- a/apps/routerconsole/jsp/configupdate.jsp +++ b/apps/routerconsole/jsp/configupdate.jsp @@ -50,9 +50,9 @@ <%=intl._("eepProxy port")%>: " /> <%=intl._("Update URLs")%>: - + <%=intl._("Trusted keys")%>: - + <%=intl._("Update with unsigned development builds?")%> <%=intl._("Unsigned Build URL")%>: diff --git a/apps/routerconsole/locale/messages_de.po b/apps/routerconsole/locale/messages_de.po index ddd4c2393f..4c323cd8e5 100644 --- a/apps/routerconsole/locale/messages_de.po +++ b/apps/routerconsole/locale/messages_de.po @@ -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 \n" "Language-Team: echelon , Sperreingang \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 diff --git a/apps/routerconsole/locale/messages_es.po b/apps/routerconsole/locale/messages_es.po index 33a6aecb14..77de2b2d41 100644 --- a/apps/routerconsole/locale/messages_es.po +++ b/apps/routerconsole/locale/messages_es.po @@ -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 \n" "Language-Team: foo \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" diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java index e614356806..71c9ebce9f 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java @@ -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)) ) diff --git a/build.xml b/build.xml index 7f6ee43b4f..9c8fa4c4f3 100644 --- a/build.xml +++ b/build.xml @@ -763,9 +763,9 @@ - + - + @@ -779,15 +779,16 @@ - - + + - + + diff --git a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java b/core/java/src/net/i2p/client/BWLimitsMessageHandler.java index be00d3ffff..34fa81ec8e 100644 --- a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java +++ b/core/java/src/net/i2p/client/BWLimitsMessageHandler.java @@ -22,6 +22,6 @@ class BWLimitsMessageHandler extends HandlerImpl { if (_log.shouldLog(Log.DEBUG)) _log.debug("Handle message " + message); BandwidthLimitsMessage msg = (BandwidthLimitsMessage) message; - ((I2PSimpleSession)session).bwReceived(msg.getLimits()); + session.bwReceived(msg.getLimits()); } } diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java index fdf63697df..43ca162838 100644 --- a/core/java/src/net/i2p/crypto/TrustedUpdate.java +++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java @@ -182,14 +182,6 @@ JXQAnA28vDmMMMH/WPbC5ixmJeGGNUiR * @return true if successful */ public boolean addKey(String key, String name) { - String oldName = _trustedKeys.get(key); - // already there? - if (name.equals(oldName)) - return true; - if (oldName != null && !oldName.equals("")) { - _log.error("Key for " + name + " already stored for different name " + oldName + " : " + key); - return false; - } SigningPublicKey signingPublicKey = new SigningPublicKey(); try { // fromBase64() will throw a DFE if length is not right @@ -198,6 +190,14 @@ JXQAnA28vDmMMMH/WPbC5ixmJeGGNUiR _log.error("Invalid signing key for " + name + " : " + key, dfe); return false; } + String oldName = _trustedKeys.get(signingPublicKey); + // already there? + if (name.equals(oldName)) + return true; + if (oldName != null && !oldName.equals("")) { + _log.error("Key for " + name + " already stored for different name " + oldName + " : " + key); + return false; + } if ((!name.equals("")) && _trustedKeys.containsValue(name)) { _log.error("Key mismatch for " + name + ", spoof attempt? : " + key); return false; diff --git a/core/java/src/net/i2p/data/SessionTag.java b/core/java/src/net/i2p/data/SessionTag.java index 761305d183..c8179771e1 100644 --- a/core/java/src/net/i2p/data/SessionTag.java +++ b/core/java/src/net/i2p/data/SessionTag.java @@ -10,6 +10,7 @@ package net.i2p.data; */ import net.i2p.util.RandomSource; +import net.i2p.util.SimpleByteCache; /** * 32 bytes, usually of random data. @@ -28,7 +29,7 @@ public class SessionTag extends SimpleDataStructure { public SessionTag(boolean create) { super(); if (create) { - _data = new byte[BYTE_LENGTH]; + _data = SimpleByteCache.acquire(BYTE_LENGTH); RandomSource.getInstance().nextBytes(_data); } } diff --git a/history.txt b/history.txt index 2796a8d010..894223bdd2 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,15 @@ +2011-01-05 zzz + * build.xml: Fix findbugs target + * Fix some miscellaneous findbugs bugs + * i2psnark: Refactor request tracking to prevent possible deadlocks + * OCMOSJ: Fix cache bug + * TrustedUpdate: Fix key store bug + +2011-01-02 zzz + * Console: Disable spellcheck in textareas + * Data Structures: More tweaks + * I2CP: Fix BWLimits Message reply in standard session + 2010-12-31 zzz * Console: - Make themes and history.txt return 403 on error, diff --git a/installer/resources/eepsite.help/help/index_de.html b/installer/resources/eepsite.help/help/index_de.html index dec77ee681..3760830e50 100644 --- a/installer/resources/eepsite.help/help/index_de.html +++ b/installer/resources/eepsite.help/help/index_de.html @@ -29,7 +29,7 @@ ~/.i2p/eepsite/docroot/ (Linux) oder %APPDATA%\I2P\eepsite\docroot\ (Windows) und nachdem Sie den Anweisungen weiter unten gefolgt sind, werden Sie – vertreten durch Ihre Eepseite – von anderen im I2P-Netz und, soweit -verfügbar, über private „Out-Proxys“ weltweit auch im offenen Internet erreichbar sein.

+verfügbar, über private „In-Proxys“ weltweit auch im offenen Internet erreichbar sein.

In I2P werden Eepseiten unter Verwendung eines Schlüssels (key) adressiert. Dieser wird durch eine sehr lange Base64-Zeichenkette1 dargestellt. (Dieser Schlüssel ist analog zur Standard IP-Adresse zu verstehen; man kann ihn sich in der Konfiguration der Eepseite unter I2PTunnel anzeigen lassen.)

diff --git a/installer/resources/initialNews/initialNews_es.xml b/installer/resources/initialNews/initialNews_es.xml index 7fca2669eb..18283c408c 100644 --- a/installer/resources/initialNews/initialNews_es.xml +++ b/installer/resources/initialNews/initialNews_es.xml @@ -5,11 +5,11 @@ ¡Ten todavía paciencia mientras I2P esté arrancando y encontrando otros enrutadores I2P!

-Este es el momento ideal para adaptar tu configuración de ancho de banda en la +Este es el momento ideal para adaptar tu configuración del ancho de banda en la página de configuración.

-En cuanto veas a la izquierda una conexión llamada "shared clients", puedes visitar nuestros FAQ. +En cuanto veas a la izquierda una conexión llamada "clientes diferentes", puedes visitar nuestros FAQ.

¡Conécta tu cliente IRC con el servidor localhost:6668 y ven a saludarnos en los canales diff --git a/installer/resources/readme/readme_es.html b/installer/resources/readme/readme_es.html index 3fe51f222d..b04baaf918 100644 --- a/installer/resources/readme/readme_es.html +++ b/installer/resources/readme/readme_es.html @@ -12,7 +12,7 @@ Svenska

¡Bienvenido a I2P!

-

Si acabas de iniciar I2P, al observar el menú de la izquierda, deberías notar que los números al lado de "Active:" subirán en los próximos minutos y luego verás allí un Destino llamado "shared clients" (si no, ¡mira abajo!)
Apenas aparezca esto, puedes:

+

Si acabas de iniciar I2P, al observar el menú de la izquierda, deberías notar que los números al lado de "Activos:" subirán en los próximos minutos y luego verás allí un Destino llamado "clientes diferentes" (si no, ¡mira abajo!)
Apenas aparezca esto, puedes:

  • visitar páginas I2P ("Eepsites") - En I2P hay páginas web anónimas: Configura tu navegador web para usar el proxy HTTP: 127.0.0.1 puerto 4444, luego visita una página I2P:
    diff --git a/router/java/src/net/i2p/router/JobQueueRunner.java b/router/java/src/net/i2p/router/JobQueueRunner.java index 8b55a8c6ca..ca0ee3f1bc 100644 --- a/router/java/src/net/i2p/router/JobQueueRunner.java +++ b/router/java/src/net/i2p/router/JobQueueRunner.java @@ -161,8 +161,8 @@ class JobQueueRunner implements Runnable { if (_log.shouldLog(Log.CRIT)) _log.log(Log.CRIT, "Error processing job [" + _currentJob.getName() + "] on thread " + _id + ": " + t.getMessage(), t); - if (_log.shouldLog(Log.ERROR)) - _log.error("The above job was enqueued by: ", _currentJob.getAddedBy()); + //if (_log.shouldLog(Log.ERROR)) + // _log.error("The above job was enqueued by: ", _currentJob.getAddedBy()); } } } diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index c10128fe62..a6204817e3 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 = 6; + public final static long BUILD = 8; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java index 5adadaae22..bfa0941993 100644 --- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java +++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java @@ -348,7 +348,7 @@ public class OutboundClientMessageOneShotJob extends JobImpl { } if (_log.shouldLog(Log.INFO)) _log.info(getJobId() + ": Expired from cache - lease for " + _toString); - _leaseCache.remove(_to); + _leaseCache.remove(hashPair()); } } diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java index 9f21962c19..72c59ad839 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java @@ -37,7 +37,6 @@ import net.i2p.util.Log; * */ class FloodOnlySearchJob extends FloodSearchJob { - protected volatile int _lookupsRemaining; private volatile boolean _dead; private long _created; private boolean _shouldProcessDSRM; diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java index a761ef1208..b276737217 100644 --- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java +++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java @@ -135,7 +135,6 @@ public class PumpedTunnelGateway extends TunnelGateway { if (_log.shouldLog(Log.DEBUG)) _log.debug("Time to add " + queueBuf.size() + " messages to " + toString() + ": " + (complete-startAdd) + " delayed? " + delayedFlush + " remaining: " + remaining - + " prepare: " + (beforeLock-startAdd) + " add: " + (afterAdded-beforeLock) + " preprocess: " + (afterPreprocess-afterAdded) + " expire: " + (afterExpire-afterPreprocess) diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java index 874c2aebce..7a79f927c6 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java +++ b/router/java/src/net/i2p/router/tunnel/pool/BuildRequestor.java @@ -127,8 +127,8 @@ class BuildRequestor { TunnelBuildMessage msg = createTunnelBuildMessage(ctx, pool, cfg, pairedTunnel, exec); long createTime = System.currentTimeMillis()-beforeCreate; if (msg == null) { - if (log.shouldLog(Log.ERROR)) - log.error("Tunnel build failed, as we couldn't create the tunnel build message for " + cfg); + if (log.shouldLog(Log.WARN)) + log.warn("Tunnel build failed, as we couldn't create the tunnel build message for " + cfg); exec.buildComplete(cfg, pool); return; } @@ -202,6 +202,7 @@ class BuildRequestor { * If the tunnel is short enough, and everybody in the tunnel, and the * OBEP or IBGW for the paired tunnel, all support the new variable-sized tunnel build message, * then use that, otherwise the old 8-entry version. + * @return null on error */ private static TunnelBuildMessage createTunnelBuildMessage(RouterContext ctx, TunnelPool pool, PooledTunnelCreatorConfig cfg, TunnelInfo pairedTunnel, BuildExecutor exec) { Log log = ctx.logManager().getLog(BuildRequestor.class); @@ -275,8 +276,8 @@ class BuildRequestor { Hash peer = cfg.getPeer(hop); RouterInfo peerInfo = ctx.netDb().lookupRouterInfoLocally(peer); if (peerInfo == null) { - if (log.shouldLog(Log.ERROR)) - log.error("Peer selected for hop " + i + "/" + hop + " was not found locally: " + if (log.shouldLog(Log.WARN)) + log.warn("Peer selected for hop " + i + "/" + hop + " was not found locally: " + peer.toBase64() + " for " + cfg); return null; } else {