Changeset 4a65fd4f


Ignore:
Timestamp:
Dec 19, 2005 1:34:52 PM (15 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
3989638f
Parents:
d525c49
git-author:
jrandom <jrandom> (12/19/05 13:34:52)
git-committer:
zzz <zzz@…> (12/19/05 13:34:52)
Message:

2005-12-19 jrandom

  • I2PSnark logging, disconnect old inactive peers rather than new ones, memory usage reduction, better OOM handling, and a shared connection acceptor.
  • Cleaned up the Syndie blog page and the resulting filters (viewing a blog from the blog page shows threads started by the selected author, not those that they merely participate in)
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • apps/i2psnark/java/src/org/klomp/snark/ConnectionAcceptor.java

    rd525c49 r4a65fd4f  
    2828import net.i2p.client.streaming.I2PSocket;
    2929import net.i2p.util.I2PThread;
     30import net.i2p.util.Log;
    3031
    3132/**
     
    3435public class ConnectionAcceptor implements Runnable
    3536{
     37  private static final ConnectionAcceptor _instance = new ConnectionAcceptor();
     38  public static final ConnectionAcceptor instance() { return _instance; }
     39  private Log _log = new Log(ConnectionAcceptor.class);
    3640  private I2PServerSocket serverSocket;
    37   private final PeerAcceptor peeracceptor;
     41  private PeerAcceptor peeracceptor;
    3842  private Thread thread;
    3943
     
    4145  private boolean socketChanged;
    4246
     47  private ConnectionAcceptor() {}
     48 
     49  public synchronized void startAccepting(PeerCoordinatorSet set, I2PServerSocket socket) {
     50    if (serverSocket != socket) {
     51      if ( (peeracceptor == null) || (peeracceptor.coordinators != set) )
     52        peeracceptor = new PeerAcceptor(set);
     53      serverSocket = socket;
     54      stop = false;
     55      socketChanged = true;
     56      if (thread == null) {
     57          thread = new I2PThread(this, "I2PSnark acceptor");
     58          thread.setDaemon(true);
     59          thread.start();
     60      }
     61    }
     62  }
     63 
    4364  public ConnectionAcceptor(I2PServerSocket serverSocket,
    4465                            PeerAcceptor peeracceptor)
     
    5677  public void halt()
    5778  {
     79    if (true) throw new RuntimeException("wtf");
    5880    stop = true;
    5981
     
    130152      }
    131153    catch (I2PException ignored) { }
     154   
     155    throw new RuntimeException("wtf");
    132156  }
    133157 
     
    141165              InputStream in = _socket.getInputStream();
    142166              OutputStream out = _socket.getOutputStream();
    143               BufferedInputStream bis = new BufferedInputStream(in);
    144               BufferedOutputStream bos = new BufferedOutputStream(out);
    145167
    146               peeracceptor.connection(_socket, bis, bos);
     168              if (true) {
     169                  in = new BufferedInputStream(in);
     170                  out = new BufferedOutputStream(out);
     171              }
     172              if (_log.shouldLog(Log.DEBUG))
     173                  _log.debug("Handling socket from " + _socket.getPeerDestination().calculateHash().toBase64());
     174              peeracceptor.connection(_socket, in, out);
    147175          } catch (IOException ioe) {
     176              if (_log.shouldLog(Log.DEBUG))
     177                  _log.debug("Error handling connection from " + _socket.getPeerDestination().calculateHash().toBase64(), ioe);
    148178              try { _socket.close(); } catch (IOException ignored) { }
    149179          }
  • apps/i2psnark/java/src/org/klomp/snark/Message.java

    rd525c49 r4a65fd4f  
    2323import java.io.DataOutputStream;
    2424import java.io.IOException;
     25
     26import net.i2p.util.SimpleTimer;
    2527
    2628// Used to queue outgoing connections
     
    5557  int len;
    5658
     59  SimpleTimer.TimedEvent expireEvent;
     60 
    5761  /** Utility method for sending a message through a DataStream. */
    5862  void sendMessage(DataOutputStream dos) throws IOException
  • apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java

    rd525c49 r4a65fd4f  
    444444    _log.debug(buf.toString());
    445445    byte[] infoBytes = BEncoder.bencode(info);
    446     _log.debug("info bencoded: [" + Base64.encode(infoBytes, true) + "]");
     446    //_log.debug("info bencoded: [" + Base64.encode(infoBytes, true) + "]");
    447447    try
    448448      {
  • apps/i2psnark/java/src/org/klomp/snark/Peer.java

    rd525c49 r4a65fd4f  
    2929
    3030import net.i2p.client.streaming.I2PSocket;
     31import net.i2p.data.DataHelper;
    3132import net.i2p.util.Log;
    3233
     
    4950  PeerState state;
    5051
     52  private I2PSocket sock;
     53 
    5154  private boolean deregister = true;
     55  private static long __id;
     56  private long _id;
    5257
    5358  /**
     
    6166    this.my_id = my_id;
    6267    this.metainfo = metainfo;
    63     _log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating"));
     68    _id = ++__id;
     69    //_log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating"));
    6470  }
    6571
     
    7379   * @exception IOException when an error occurred during the handshake.
    7480   */
    75   public Peer(final I2PSocket sock, BufferedInputStream bis,
    76               BufferedOutputStream bos, byte[] my_id, MetaInfo metainfo)
     81  public Peer(final I2PSocket sock, InputStream in, OutputStream out, byte[] my_id, MetaInfo metainfo)
    7782    throws IOException
    7883  {
    7984    this.my_id = my_id;
    8085    this.metainfo = metainfo;
    81 
    82     byte[] id  = handshake(bis, bos);
     86    this.sock = sock;
     87
     88    byte[] id  = handshake(in, out);
    8389    this.peerID = new PeerID(id, sock.getPeerDestination());
    84     _log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating"));
     90    _id = ++__id;
     91    _log.debug("Creating a new peer with " + peerID.getAddress().calculateHash().toBase64(), new Exception("creating " + _id));
    8592  }
    8693
     
    98105  public String toString()
    99106  {
    100     return peerID.toString();
     107    return peerID.toString() + _id;
    101108  }
    102109
     
    156163        if (din == null)
    157164          {
    158             I2PSocket sock = I2PSnarkUtil.instance().connect(peerID);
    159             BufferedInputStream bis
    160               = new BufferedInputStream(sock.getInputStream());
    161             BufferedOutputStream bos
    162               = new BufferedOutputStream(sock.getOutputStream());
    163             byte [] id = handshake(bis, bos);
     165            sock = I2PSnarkUtil.instance().connect(peerID);
     166            if ((sock == null) || (sock.isClosed())) {
     167                throw new IOException("Unable to reach " + peerID);
     168            }
     169            InputStream in = new BufferedInputStream(sock.getInputStream());
     170            OutputStream out = sock.getOutputStream(); //new BufferedOutputStream(sock.getOutputStream());
     171            if (true)
     172                out = new BufferedOutputStream(out);
     173            //BufferedInputStream bis
     174            //  = new BufferedInputStream(sock.getInputStream());
     175            //BufferedOutputStream bos
     176            //  = new BufferedOutputStream(sock.getOutputStream());
     177            byte [] id = handshake(in, out); //handshake(bis, bos);
    164178            byte [] expected_id = peerID.getID();
    165179            if (!Arrays.equals(expected_id, id))
     
    190204        // Ignore, probably just the other side closing the connection.
    191205        // Or refusing the connection, timing out, etc.
     206        if (_log.shouldLog(Log.DEBUG))
     207            _log.debug(this.toString(), eofe);
    192208      }
    193209    catch(Throwable t)
    194210      {
    195         Snark.debug(this + ": " + t, Snark.ERROR);
    196         t.printStackTrace();
     211        _log.error(this + ": " + t.getMessage(), t);
     212        if (t instanceof OutOfMemoryError)
     213            throw (OutOfMemoryError)t;
    197214      }
    198215    finally
     
    206223   * reported by the other side.
    207224   */
    208   private byte[] handshake(BufferedInputStream bis, BufferedOutputStream bos)
     225  private byte[] handshake(InputStream in, OutputStream out) //BufferedInputStream bis, BufferedOutputStream bos)
    209226    throws IOException
    210227  {
    211     din = new DataInputStream(bis);
    212     dout = new DataOutputStream(bos);
     228    din = new DataInputStream(in);
     229    dout = new DataOutputStream(out);
    213230   
    214231    // Handshake write - header
     
    229246    if (b != 19)
    230247      throw new IOException("Handshake failure, expected 19, got "
    231                             + (b & 0xff));
     248                            + (b & 0xff) + " on " + sock);
    232249   
    233250    byte[] bs = new byte[19];
     
    288305          pl.disconnected(this);
    289306      }
     307    I2PSocket csock = sock;
     308    sock = null;
     309    if ( (csock != null) && (!csock.isClosed()) ) {
     310        try {
     311            csock.close();
     312        } catch (IOException ioe) {
     313            _log.warn("Error disconnecting " + toString(), ioe);
     314        }
     315    }
    290316  }
    291317
     
    394420      }
    395421  }
     422 
     423  public long getInactiveTime() {
     424      PeerState s = state;
     425      if (s != null) {
     426          PeerConnectionOut out = s.out;
     427          if (out != null)
     428            return System.currentTimeMillis() - out.lastSent;
     429          else
     430            return -1; //"state, no out";
     431      } else {
     432          return -1; //"no state";
     433      }
     434  }
    396435}
  • apps/i2psnark/java/src/org/klomp/snark/PeerAcceptor.java

    rd525c49 r4a65fd4f  
    2828import net.i2p.data.Base64;
    2929import net.i2p.data.DataHelper;
     30import net.i2p.util.Log;
    3031
    3132/**
     
    3738public class PeerAcceptor
    3839{
     40  private static final Log _log = new Log(PeerAcceptor.class);
    3941  private final PeerCoordinator coordinator;
    40   private final PeerCoordinatorSet coordinators;
     42  final PeerCoordinatorSet coordinators;
    4143
    4244  public PeerAcceptor(PeerCoordinator coordinator)
     
    5254  }
    5355
    54   private static final int LOOKAHEAD_SIZE = "19".length() +
    55                                             "BitTorrent protocol".length() +
    56                                             8 + // blank, reserved
    57                                             20; // infohash
    58 
    5956  public void connection(I2PSocket socket,
    60                          BufferedInputStream bis, BufferedOutputStream bos)
     57                         InputStream in, OutputStream out)
    6158    throws IOException
    6259  {
     
    6663    // ahead the first $LOOKAHEAD_SIZE bytes to figure out which infohash they want to
    6764    // talk about, and we can just look for that in our list of active torrents.
    68     bis.mark(LOOKAHEAD_SIZE);
    69     byte peerInfoHash[] = readHash(bis);
    70     bis.reset();
     65    byte peerInfoHash[] = null;
     66    try {
     67      peerInfoHash = readHash(in);
     68      _log.info("infohash read from " + socket.getPeerDestination().calculateHash().toBase64()
     69                + ": " + Base64.encode(peerInfoHash));
     70    } catch (IOException ioe) {
     71        _log.info("Unable to read the infohash from " + socket.getPeerDestination().calculateHash().toBase64());
     72        throw ioe;
     73    }
     74    in = new SequenceInputStream(new ByteArrayInputStream(peerInfoHash), in);
    7175    if (coordinator != null) {
    7276        // single torrent capability
     
    7579            if (coordinator.needPeers())
    7680              {
    77                 Peer peer = new Peer(socket, bis, bos, coordinator.getID(),
     81                Peer peer = new Peer(socket, in, out, coordinator.getID(),
    7882                                     coordinator.getMetaInfo());
    7983                coordinator.addPeer(peer);
     
    9599                if (cur.needPeers())
    96100                  {
    97                     Peer peer = new Peer(socket, bis, bos, cur.getID(),
     101                    Peer peer = new Peer(socket, in, out, cur.getID(),
    98102                                         cur.getMetaInfo());
    99103                    cur.addPeer(peer);
     
    102106                else
    103107                  {
     108                    if (_log.shouldLog(Log.DEBUG))
     109                      _log.debug("Rejecting new peer for " + cur.snark.torrent);
    104110                    socket.close();
    105111                    return;
     
    112118    }
    113119  }
     120
     121  private static final int LOOKAHEAD_SIZE = "19".length() +
     122                                            "BitTorrent protocol".length() +
     123                                            8 + // blank, reserved
     124                                            20; // infohash
    114125
    115126  /**
  • apps/i2psnark/java/src/org/klomp/snark/PeerConnectionIn.java

    rd525c49 r4a65fd4f  
    170170      {
    171171        // Ignore, probably the other side closed connection.
     172        if (_log.shouldLog(Log.INFO))
     173            _log.info("IOError talking with " + peer, ioe);
    172174      }
    173175    catch (Throwable t)
    174176      {
    175         I2PSnarkUtil.instance().debug(peer.toString(), Snark.ERROR, t);
     177        _log.error("Error talking with " + peer, t);
    176178        if (t instanceof OutOfMemoryError)
    177179            throw (OutOfMemoryError)t;
  • apps/i2psnark/java/src/org/klomp/snark/PeerConnectionOut.java

    rd525c49 r4a65fd4f  
    4343  private static long __id = 0;
    4444  private long _id;
     45 
     46  long lastSent;
    4547
    4648  public PeerConnectionOut(Peer peer, DataOutputStream dout)
     
    5052    _id = ++__id;
    5153
     54    lastSent = System.currentTimeMillis();
    5255    quit = false;
    5356    thread = new I2PThread(this, "Snark sender " + _id);
     
    7477                      {
    7578                        // Make sure everything will reach the other side.
    76                         // i2p flushes passively, no need to force it
    77                         // ... maybe not though
    7879                        dout.flush();
    7980                       
     
    104105                        if (nm.type == Message.PIECE)
    105106                          {
    106                             if (state.choking)
     107                            if (state.choking) {
    107108                              it.remove();
     109                              SimpleTimer.getInstance().removeEvent(nm.expireEvent);
     110                            }
    108111                            nm = null;
    109112                          }
     
    111114                          {
    112115                            it.remove();
     116                            SimpleTimer.getInstance().removeEvent(nm.expireEvent);
    113117                            nm = null;
    114118                          }
     
    117121                          {
    118122                            m = nm;
     123                            SimpleTimer.getInstance().removeEvent(nm.expireEvent);
    119124                            it.remove();
    120125                          }
    121126                      }
    122                     if (m == null && sendQueue.size() > 0)
     127                    if (m == null && sendQueue.size() > 0) {
    123128                      m = (Message)sendQueue.remove(0);
     129                      SimpleTimer.getInstance().removeEvent(m.expireEvent);
     130                    }
    124131                  }
    125132              }
    126133            if (m != null)
    127134              {
    128                 if (Snark.debug >= Snark.ALL)
    129                   Snark.debug("Send " + peer + ": " + m, Snark.ALL);
    130135                if (_log.shouldLog(Log.DEBUG))
    131136                    _log.debug("Send " + peer + ": " + m + " on " + peer.metainfo.getName());
    132137                m.sendMessage(dout);
     138                lastSent = System.currentTimeMillis();
    133139
    134140                // Remove all piece messages after sending a choke message.
     
    147153      {
    148154        // Ignore, probably other side closed connection.
     155        if (_log.shouldLog(Log.INFO))
     156            _log.info("IOError sending to " + peer, ioe);
    149157      }
    150158    catch (Throwable t)
    151159      {
    152         I2PSnarkUtil.instance().debug(peer.toString(), Snark.ERROR, t);
     160        _log.error("Error sending to " + peer, t);
    153161        if (t instanceof OutOfMemoryError)
    154162            throw (OutOfMemoryError)t;
     
    165173    synchronized(sendQueue)
    166174      {
    167         if (quit == true)
    168           return;
     175        //if (quit == true)
     176        //  return;
    169177       
    170178        quit = true;
     
    190198  }
    191199 
    192   /** remove messages not sent in 30s */
    193   private static final int SEND_TIMEOUT = 30*1000;
     200  /** remove messages not sent in 2m */
     201  private static final int SEND_TIMEOUT = 120*1000;
    194202  private class RemoveTooSlow implements SimpleTimer.TimedEvent {
    195203      private Message _m;
    196204      public RemoveTooSlow(Message m) {
    197205          _m = m;
     206          m.expireEvent = RemoveTooSlow.this;
    198207      }
    199208     
  • apps/i2psnark/java/src/org/klomp/snark/PeerCoordinator.java

    rd525c49 r4a65fd4f  
    187187      }
    188188
    189     synchronized(peers)
    190       {
    191         if (peerIDInList(peer.getPeerID(), peers))
    192           {
    193             if (Snark.debug >= Snark.INFO)
    194               Snark.debug("Already connected to: " + peer, Snark.INFO);
     189    Peer toDisconnect = null;
     190    synchronized(peers)
     191      {
     192        Peer old = peerIDInList(peer.getPeerID(), peers);
     193        if ( (old != null) && (old.getInactiveTime() > 2*60*1000) ) {
     194            // idle for 2 minutes, kill the old con
     195            peers.remove(old);
     196            toDisconnect = old;
     197            old = null;
     198        }
     199        if (old != null)
     200          {
     201            if (_log.shouldLog(Log.WARN))
     202              _log.warn("Already connected to: " + peer + ": " + old + ", inactive for " + old.getInactiveTime());
    195203            peer.disconnect(false); // Don't deregister this connection/peer.
    196204          }
    197205        else
    198206          {
    199             if (Snark.debug >= Snark.INFO)
    200               Snark.debug("New connection to peer: " + peer, Snark.INFO);
    201 
    202             _log.info("New connection to peer " + peer + " for " + metainfo.getName());
     207            if (_log.shouldLog(Log.INFO))
     208              _log.info("New connection to peer: " + peer + " for " + metainfo.getName());
     209
    203210            // Add it to the beginning of the list.
    204211            // And try to optimistically make it a uploader.
     
    211218          }
    212219      }
    213   }
    214 
    215   private static boolean peerIDInList(PeerID pid, List peers)
     220    if (toDisconnect != null) {
     221        toDisconnect.disconnect(false);
     222        removePeerFromPieces(toDisconnect);
     223    }
     224  }
     225
     226  private static Peer peerIDInList(PeerID pid, List peers)
    216227  {
    217228    Iterator it = peers.iterator();
    218     while (it.hasNext())
    219       if (pid.sameID(((Peer)it.next()).getPeerID()))
    220         return true;
    221     return false;
     229    while (it.hasNext()) {
     230      Peer cur = (Peer)it.next();
     231      if (pid.sameID(cur.getPeerID()))
     232        return cur;
     233    }
     234    return null;
    222235  }
    223236
     
    254267      }
    255268    else
    256       if (Snark.debug >= Snark.INFO)
     269      if (_log.shouldLog(Log.DEBUG)) {
    257270        if (peer.isConnected())
    258           Snark.debug("Add peer already connected: " + peer, Snark.INFO);
     271          _log.info("Add peer already connected: " + peer);
    259272        else
    260           Snark.debug("MAX_CONNECTIONS = " + MAX_CONNECTIONS
    261                       + " not accepting extra peer: " + peer, Snark.INFO);
     273          _log.info("MAX_CONNECTIONS = " + MAX_CONNECTIONS
     274                    + " not accepting extra peer: " + peer);
     275      }
    262276  }
    263277
     
    289303      {
    290304        Peer peer = (Peer)interested.remove(0);
    291         if (Snark.debug >= Snark.INFO)
    292           Snark.debug("Unchoke: " + peer, Snark.INFO);
     305        if (_log.shouldLog(Log.DEBUG))
     306          _log.debug("Unchoke: " + peer);
    293307        peer.setChoking(false);
    294308        uploaders++;
     
    449463        if (!wantedPieces.contains(p))
    450464          {
    451             if (Snark.debug >= Snark.INFO)
    452               Snark.debug(peer + " piece " + piece + " no longer needed",
    453                           Snark.INFO);
    454 
    455465            _log.info("Got unwanted piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName());
    456466           
     
    464474            if (storage.putPiece(piece, bs))
    465475              {
    466                 if (Snark.debug >= Snark.INFO)
    467                   Snark.debug("Recv p" + piece + " " + peer, Snark.INFO);
    468476                _log.info("Got valid piece " + piece + "/" + metainfo.getPieces() +" from " + peer + " for " + metainfo.getName());
    469477              }
     
    472480                // Oops. We didn't actually download this then... :(
    473481                downloaded -= metainfo.getPieceLength(piece);
    474                 if (Snark.debug >= Snark.NOTICE)
    475                   Snark.debug("Got BAD piece " + piece + " from " + peer,
    476                               Snark.NOTICE);
    477482                _log.warn("Got BAD piece " + piece + "/" + metainfo.getPieces() + " from " + peer + " for " + metainfo.getName());
    478483                return false; // No need to announce BAD piece to peers.
     
    505510  public void gotChoke(Peer peer, boolean choke)
    506511  {
    507     if (Snark.debug >= Snark.INFO)
    508       Snark.debug("Got choke(" + choke + "): " + peer, Snark.INFO);
     512    if (_log.shouldLog(Log.INFO))
     513      _log.info("Got choke(" + choke + "): " + peer);
    509514
    510515    if (listener != null)
     
    524529                    uploaders++;
    525530                    peer.setChoking(false);
    526                     if (Snark.debug >= Snark.INFO)
    527                       Snark.debug("Unchoke: " + peer, Snark.INFO);
     531                    if (_log.shouldLog(Log.INFO))
     532                        _log.info("Unchoke: " + peer);
    528533                  }
    529534              }
     
    538543  {
    539544    if (_log.shouldLog(Log.INFO))
    540         _log.info("Disconnected " + peer);
     545        _log.info("Disconnected " + peer, new Exception("Disconnected by"));
    541546   
    542547    synchronized(peers)
  • apps/i2psnark/java/src/org/klomp/snark/PeerState.java

    rd525c49 r4a65fd4f  
    2727import java.util.HashSet;
    2828
     29import net.i2p.util.Log;
     30
    2931class PeerState
    3032{
     33  private Log _log = new Log(PeerState.class);
    3134  final Peer peer;
    3235  final PeerListener listener;
     
    6063  private boolean resend = false;
    6164
    62   private final static int MAX_PIPELINE = 5;
     65  private final static int MAX_PIPELINE = 1;
    6366  private final static int PARTSIZE = 64*1024; // default was 16K, i2p-bt uses 64KB
    6467
     
    7881  void keepAliveMessage()
    7982  {
    80     if (Snark.debug >= Snark.DEBUG)
    81       Snark.debug(peer + " rcv alive", Snark.DEBUG);
     83    if (_log.shouldLog(Log.DEBUG))
     84        _log.debug(peer + " rcv alive");
    8285    /* XXX - ignored */
    8386  }
     
    8588  void chokeMessage(boolean choke)
    8689  {
    87     if (Snark.debug >= Snark.DEBUG)
    88       Snark.debug(peer + " rcv " + (choke ? "" : "un") + "choked",
    89                   Snark.DEBUG);
     90    if (_log.shouldLog(Log.DEBUG))
     91        _log.debug(peer + " rcv " + (choke ? "" : "un") + "choked");
    9092
    9193    choked = choke;
     
    101103  void interestedMessage(boolean interest)
    102104  {
    103     if (Snark.debug >= Snark.DEBUG)
    104       Snark.debug(peer + " rcv " + (interest ? "" : "un")
    105                   + "interested", Snark.DEBUG);
     105    if (_log.shouldLog(Log.DEBUG))
     106      _log.debug(peer + " rcv " + (interest ? "" : "un")
     107                 + "interested");
    106108    interested = interest;
    107109    listener.gotInterest(peer, interest);
     
    110112  void haveMessage(int piece)
    111113  {
    112     if (Snark.debug >= Snark.DEBUG)
    113       Snark.debug(peer + " rcv have(" + piece + ")", Snark.DEBUG);
     114    if (_log.shouldLog(Log.DEBUG))
     115      _log.debug(peer + " rcv have(" + piece + ")");
    114116    // Sanity check
    115117    if (piece < 0 || piece >= metainfo.getPieces())
    116118      {
    117119        // XXX disconnect?
    118         if (Snark.debug >= Snark.INFO)
    119           Snark.debug("Got strange 'have: " + piece + "' message from " + peer,
    120                       + Snark.INFO);
     120        if (_log.shouldLog(Log.WARN))
     121            _log.warn("Got strange 'have: " + piece + "' message from " + peer);
    121122        return;
    122123      }
     
    139140    synchronized(this)
    140141      {
    141         if (Snark.debug >= Snark.DEBUG)
    142           Snark.debug(peer + " rcv bitfield", Snark.DEBUG);
     142        if (_log.shouldLog(Log.DEBUG))
     143          _log.debug(peer + " rcv bitfield");
    143144        if (bitfield != null)
    144145          {
    145146            // XXX - Be liberal in what you except?
    146             if (Snark.debug >= Snark.INFO)
    147               Snark.debug("Got unexpected bitfield message from " + peer,
    148                           Snark.INFO);
     147            if (_log.shouldLog(Log.WARN))
     148              _log.warn("Got unexpected bitfield message from " + peer);
    149149            return;
    150150          }
     
    158158  void requestMessage(int piece, int begin, int length)
    159159  {
    160     if (Snark.debug >= Snark.DEBUG)
    161       Snark.debug(peer + " rcv request("
    162                   + piece + ", " + begin + ", " + length + ") ",
    163                   Snark.DEBUG);
     160    if (_log.shouldLog(Log.DEBUG))
     161      _log.debug(peer + " rcv request("
     162                  + piece + ", " + begin + ", " + length + ") ");
    164163    if (choking)
    165164      {
    166         if (Snark.debug >= Snark.INFO)
    167           Snark.debug("Request received, but choking " + peer, Snark.INFO);
     165        if (_log.shouldLog(Log.INFO))
     166          _log.info("Request received, but choking " + peer);
    168167        return;
    169168      }
     
    178177      {
    179178        // XXX - Protocol error -> disconnect?
    180         if (Snark.debug >= Snark.INFO)
    181           Snark.debug("Got strange 'request: " + piece
     179        if (_log.shouldLog(Log.WARN))
     180          _log.warn("Got strange 'request: " + piece
    182181                      + ", " + begin
    183182                      + ", " + length
    184                       + "' message from " + peer,
    185                       Snark.INFO);
     183                      + "' message from " + peer);
    186184        return;
    187185      }
     
    191189      {
    192190        // XXX - Protocol error-> diconnect?
    193         if (Snark.debug >= Snark.INFO)
    194           Snark.debug("Got request for unknown piece: " + piece, Snark.INFO);
     191        if (_log.shouldLog(Log.WARN))
     192          _log.warn("Got request for unknown piece: " + piece);
    195193        return;
    196194      }
     
    200198      {
    201199        // XXX - Protocol error-> disconnect?
    202         if (Snark.debug >= Snark.INFO)
    203           Snark.debug("Got out of range 'request: " + piece
     200        if (_log.shouldLog(Log.WARN))
     201          _log.warn("Got out of range 'request: " + piece
    204202                      + ", " + begin
    205203                      + ", " + length
    206                       + "' message from " + peer,
    207                       Snark.INFO);
     204                      + "' message from " + peer);
    208205        return;
    209206      }
    210207
    211     if (Snark.debug >= Snark.DEBUG)
    212       Snark.debug("Sending (" + piece + ", " + begin + ", "
    213                   + length + ")" + " to " + peer, Snark.DEBUG);
     208    if (_log.shouldLog(Log.INFO))
     209      _log.info("Sending (" + piece + ", " + begin + ", "
     210                + length + ")" + " to " + peer);
    214211    out.sendPiece(piece, begin, length, pieceBytes);
    215 
    216     // Tell about last subpiece delivery.
    217     if (begin + length == pieceBytes.length)
    218       if (Snark.debug >= Snark.DEBUG)
    219         Snark.debug("Send p" + piece + " " + peer,
    220                     Snark.DEBUG);
    221212  }
    222213
     
    246237        if (listener.gotPiece(peer, req.piece, req.bs))
    247238          {
    248             if (Snark.debug >= Snark.DEBUG)
    249               Snark.debug("Got " + req.piece + ": " + peer, Snark.DEBUG);
     239            if (_log.shouldLog(Log.DEBUG))
     240              _log.debug("Got " + req.piece + ": " + peer);
    250241          }
    251242        else
    252243          {
    253             if (Snark.debug >= Snark.DEBUG)
    254               Snark.debug("Got BAD " + req.piece + " from " + peer,
    255                           Snark.DEBUG);
     244            if (_log.shouldLog(Log.WARN))
     245              _log.warn("Got BAD " + req.piece + " from " + peer);
    256246            // XXX ARGH What now !?!
    257247            downloaded = 0;
     
    276266  Request getOutstandingRequest(int piece, int begin, int length)
    277267  {
    278     if (Snark.debug >= Snark.DEBUG)
    279       Snark.debug("getChunk("
     268    if (_log.shouldLog(Log.DEBUG))
     269      _log.debug("getChunk("
    280270                  + piece + "," + begin + "," + length + ") "
    281                   + peer, Snark.DEBUG);
     271                  + peer);
    282272
    283273    int r = getFirstOutstandingRequest(piece);
     
    286276    if (r == -1)
    287277      {
    288         if (Snark.debug >= Snark.INFO)
    289           Snark.debug("Unrequested 'piece: " + piece + ", "
     278        if (_log.shouldLog(Log.INFO))
     279          _log.info("Unrequested 'piece: " + piece + ", "
    290280                      + begin + ", " + length + "' received from "
    291                       + peer,
    292                       Snark.INFO);
     281                      + peer);
    293282        downloaded = 0; // XXX - punishment?
    294283        return null;
     
    310299        if (req.piece != piece || req.off != begin || req.len != length)
    311300          {
    312             if (Snark.debug >= Snark.INFO)
    313               Snark.debug("Unrequested or unneeded 'piece: "
     301            if (_log.shouldLog(Log.INFO))
     302              _log.info("Unrequested or unneeded 'piece: "
    314303                          + piece + ", "
    315304                          + begin + ", "
    316305                          + length + "' received from "
    317                           + peer,
    318                           Snark.INFO);
     306                          + peer);
    319307            downloaded = 0; // XXX - punishment?
    320308            return null;
     
    324312        if (r != 0)
    325313          {
    326             if (Snark.debug >= Snark.INFO)
    327               System.err.print("Some requests dropped, got " + req
    328                                + ", wanted:");
     314            if (_log.shouldLog(Log.WARN))
     315              _log.warn("Some requests dropped, got " + req
     316                               + ", wanted for peer: " + peer);
    329317            for (int i = 0; i < r; i++)
    330318              {
     
    339327                  out.sendRequest(dropReq);
    340328                */
    341                 if (Snark.debug >= Snark.INFO)
    342                   System.err.print(" " + dropReq);
     329                if (_log.shouldLog(Log.WARN))
     330                  _log.warn("dropped " + dropReq + " with peer " + peer);
    343331              }
    344             if (Snark.debug >= Snark.INFO)
    345               System.err.println(" " + peer);
    346332          }
    347333        outstandingRequests.remove(0);
     
    357343  void cancelMessage(int piece, int begin, int length)
    358344  {
    359     if (Snark.debug >= Snark.DEBUG)
    360       Snark.debug("Got cancel message ("
    361                   + piece + ", " + begin + ", " + length + ")",
    362                   Snark.DEBUG);
     345    if (_log.shouldLog(Log.DEBUG))
     346      _log.debug("Got cancel message ("
     347                  + piece + ", " + begin + ", " + length + ")");
    363348    out.cancelRequest(piece, begin, length);
    364349  }
     
    366351  void unknownMessage(int type, byte[] bs)
    367352  {
    368     if (Snark.debug >= Snark.WARNING)
    369       Snark.debug("Warning: Ignoring unknown message type: " + type
    370                   + " length: " + bs.length, Snark.WARNING);
     353    if (_log.shouldLog(Log.WARN))
     354      _log.warn("Warning: Ignoring unknown message type: " + type
     355                  + " length: " + bs.length);
    371356  }
    372357
    373358  void havePiece(int piece)
    374359  {
    375     if (Snark.debug >= Snark.DEBUG)
    376       Snark.debug("Tell " + peer + " havePiece(" + piece + ")", Snark.DEBUG);
     360    if (_log.shouldLog(Log.DEBUG))
     361      _log.debug("Tell " + peer + " havePiece(" + piece + ")");
    377362
    378363    synchronized(this)
     
    475460      }
    476461
    477     if (Snark.debug >= Snark.DEBUG)
    478       Snark.debug(peer + " requests " + outstandingRequests, Snark.DEBUG);
     462    if (_log.shouldLog(Log.DEBUG))
     463      _log.debug(peer + " requests " + outstandingRequests);
    479464  }
    480465
     
    487472      {
    488473        int nextPiece = listener.wantPiece(peer, bitfield);
    489         if (Snark.debug >= Snark.DEBUG)
    490           Snark.debug(peer + " want piece " + nextPiece, Snark.DEBUG);
     474        if (_log.shouldLog(Log.DEBUG))
     475          _log.debug(peer + " want piece " + nextPiece);
    491476        synchronized(this)
    492477          {
     
    513498  synchronized void setInteresting(boolean interest)
    514499  {
    515     if (Snark.debug >= Snark.DEBUG)
    516       Snark.debug(peer + " setInteresting(" + interest + ")", Snark.DEBUG);
     500    if (_log.shouldLog(Log.DEBUG))
     501      _log.debug(peer + " setInteresting(" + interest + ")");
    517502
    518503    if (interest != interesting)
     
    528513  synchronized void setChoking(boolean choke)
    529514  {
    530     if (Snark.debug >= Snark.DEBUG)
    531       Snark.debug(peer + " setChoking(" + choke + ")", Snark.DEBUG);
     515    if (_log.shouldLog(Log.DEBUG))
     516      _log.debug(peer + " setChoking(" + choke + ")");
    532517
    533518    if (choking != choke)
  • apps/i2psnark/java/src/org/klomp/snark/Snark.java

    rd525c49 r4a65fd4f  
    373373    PeerCoordinatorSet set = PeerCoordinatorSet.instance();
    374374    set.add(coordinator);
    375     PeerAcceptor peeracceptor = new PeerAcceptor(set); //coordinator);
    376     ConnectionAcceptor acceptor = new ConnectionAcceptor(serversocket,
    377                                                          peeracceptor);
    378 
     375    ConnectionAcceptor acceptor = ConnectionAcceptor.instance();
     376    acceptor.startAccepting(set, serversocket);
     377   
    379378    trackerclient = new TrackerClient(meta, coordinator);
    380379    if (start)
  • apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java

    rd525c49 r4a65fd4f  
    463463        else if (bytes < 5*1024*1024)
    464464            return (bytes/1024) + "KB";
    465         else if (bytes < 5*1024*1024*1024)
     465        else if (bytes < 5*1024*1024*1024l)
    466466            return (bytes/(1024*1024)) + "MB";
    467467        else
  • apps/streaming/java/src/net/i2p/client/streaming/I2PSocketFull.java

    rd525c49 r4a65fd4f  
    110110        _listener = null;
    111111    }
     112    public String toString() {
     113        Connection c = _connection;
     114        if (c == null)
     115            return super.toString();
     116        else
     117            return c.toString();
     118    }
    112119}
  • apps/syndie/java/src/net/i2p/syndie/data/ArchiveIndex.java

    rd525c49 r4a65fd4f  
    292292                    continue;
    293293            }
     294           
    294295            if ( (tag != null) && (tag.trim().length() > 0) ) {
    295296                if (!tag.equals(summary.tag)) {
     
    316317            for (int j = 0; j < summary.entries.size(); j++) {
    317318                EntrySummary entry = (EntrySummary)summary.entries.get(j);
    318                 if (entry.entry.getEntryId() < lowestEntryId)
     319                if (entry.entry.getEntryId() < lowestEntryId) {
     320                    long daysAgo1 = entry.entry.getEntryId() / (24*60*60*1000l);
     321                    long daysAgo2 = lowestEntryId / (24*60*60*1000l);
    319322                    continue;
    320                 String k = (Long.MAX_VALUE-entry.entry.getEntryId()) + "-" + entry.entry.getKeyHash().toBase64();
    321                 ordered.put(k, entry.entry);
    322                 //System.err.println("Including match: " + k);
     323                } else {                   
     324                  String k = (Long.MAX_VALUE-entry.entry.getEntryId()) + "-" + entry.entry.getKeyHash().toBase64();
     325                  ordered.put(k, entry.entry);
     326                }
    323327            }
    324328        }
    325329        for (Iterator iter = ordered.values().iterator(); iter.hasNext(); ) {
    326330            BlogURI entry = (BlogURI)iter.next();
    327             if (entry.getEntryId() < lowestEntryId)
     331            if (entry.getEntryId() < lowestEntryId) {
    328332                continue;
     333            }
    329334            if (!out.contains(entry))
    330335                out.add(entry);
  • apps/syndie/java/src/net/i2p/syndie/web/BaseServlet.java

    rd525c49 r4a65fd4f  
    680680            String name = (String) iter.next();
    681681            PetName pn = db.getByName(name);
    682             if ("syndieblog".equals(pn.getProtocol())) {
     682            if ("syndieblog".equals(pn.getProtocol()) && pn.isMember(FilteredThreadIndex.GROUP_FAVORITE)) {
    683683                if ( (author != null) && (author.equals(pn.getLocation())) )
    684684                    out.write("<option value=\"" + pn.getLocation() + "\" selected=\"true\">Threads " + name + " posted in</option>\n");
     
    11521152".postReplyOptions {\n" +
    11531153"       background-color: #BBBBFF;\n" +
     1154"}\n" +
     1155".syndieBlogFavorites {\n" +
     1156"                   float: left;\n" +
     1157"                   margin: 5px 0px 0 0;\n" +
     1158"       display: inline;\n" +
     1159"}\n" +
     1160".syndieBlogList {\n" +
     1161"                   float: right;\n" +
     1162"                   margin: 5px 0px 0 0;\n" +
     1163"       display: inline;\n" +
    11541164"}\n";
    11551165
  • apps/syndie/java/src/net/i2p/syndie/web/ViewBlogsServlet.java

    rd525c49 r4a65fd4f  
    2020 */
    2121public class ViewBlogsServlet extends BaseServlet {
    22     private static final int MAX_AUTHORS_AT_ONCE = 100;
     22    private static final int MAX_AUTHORS_AT_ONCE = 20;
    2323    private static final int MAX_TAGS = 50;
     24   
     25    /** renders the posts from the last 3 days */
     26    private String getViewBlogLink(Hash blog, long lastPost) {
     27        long dayBegin = BlogManager.instance().getDayBegin();
     28        int daysAgo = 2;
     29        if ( (lastPost > 0) && (dayBegin - 3*24*60*6081000 > lastPost) ) // last post was old 3 days ago
     30            daysAgo = (int)((dayBegin - lastPost + 24*60*60*1000-1)/(24*60*60*1000));
     31        daysAgo++;
     32        return getControlTarget() + "?" + ThreadedHTMLRenderer.PARAM_AUTHOR + '=' + blog.toBase64()
     33               + '&' + ThreadedHTMLRenderer.PARAM_THREAD_AUTHOR + "=true&daysBack=" + daysAgo;
     34    }
     35   
     36    private String getPostDate(long when) {
     37        String age = null;
     38        long dayBegin = BlogManager.instance().getDayBegin();
     39        long postId = when;
     40        if (postId >= dayBegin) {
     41            age = "today";
     42        } else if (postId >= dayBegin - 24*60*60*1000) {
     43            age = "yesterday";
     44        } else {
     45            int daysAgo = (int)((dayBegin - postId + 24*60*60*1000-1)/(24*60*60*1000));
     46            age = daysAgo + " days ago";
     47        }
     48        return age;
     49    }
    2450   
    2551    protected void renderServletDetails(User user, HttpServletRequest req, PrintWriter out, ThreadIndex index,
     
    3662        TreeSet tags = new TreeSet();
    3763        List writtenAuthors = new ArrayList();
    38         out.write("<tr><td colspan=\"3\"><b>Blogs:</b></td></tr>\n");
    39         out.write("<tr><td colspan=\"3\">");
     64       
     65       
     66        out.write("<tr><td colspan=\"3\" valign=\"top\" align=\"left\"><span class=\"syndieBlogFavorites\">");
     67        if ( (user != null) && (user.getAuthenticated()) ) {
     68            out.write("<b>Favorite blogs:</b><br />\n");
     69            out.write("<a href=\"" + getViewBlogLink(user.getBlog(), user.getLastMetaEntry())
     70                      + "\" title=\"View your blog\">Your blog</a><br />\n");
     71           
     72            PetNameDB db = user.getPetNameDB();
     73            for (Iterator iter = orderedRoots.iterator(); iter.hasNext() && writtenAuthors.size() < MAX_AUTHORS_AT_ONCE; ) {
     74                BlogURI uri= (BlogURI)iter.next();
     75                if (writtenAuthors.contains(uri.getKeyHash())) {
     76                    // skip
     77                } else {
     78                    PetName pn = db.getByLocation(uri.getKeyHash().toBase64());
     79                    if (pn != null) {
     80                        if (pn.isMember(FilteredThreadIndex.GROUP_FAVORITE)) {
     81                            out.write("<a href=\"" + getViewBlogLink(uri.getKeyHash(), uri.getEntryId())
     82                                      + "\" title=\"View " + HTMLRenderer.sanitizeTagParam(pn.getName()) +"'s blog\">");
     83                            out.write(HTMLRenderer.sanitizeString(pn.getName(), 32));
     84                            out.write("</a> (" + getPostDate(uri.getEntryId()) + ")<br />\n");
     85                            writtenAuthors.add(uri.getKeyHash());
     86                        } else if (pn.isMember(FilteredThreadIndex.GROUP_IGNORE)) {
     87                            // ignore 'em
     88                            writtenAuthors.add(uri.getKeyHash());
     89                        } else {
     90                            // bookmarked, but not a favorite... leave them for later
     91                        }
     92                    } else {
     93                        // not bookmarked, leave them for later
     94                    }
     95                }
     96            }
     97        }
     98        out.write("</span>\n");
     99   
     100        // now for the non-bookmarked people
     101        out.write("<span class=\"syndieBlogList\">");
     102        out.write("<b>Most recently updated blogs:</b><br />\n");
    40103        for (Iterator iter = orderedRoots.iterator(); iter.hasNext() && writtenAuthors.size() < MAX_AUTHORS_AT_ONCE; ) {
    41104            BlogURI uri= (BlogURI)iter.next();
     
    68131                }
    69132               
    70                 out.write("<a href=\"" + getControlTarget() + "?"
    71                           + ThreadedHTMLRenderer.PARAM_AUTHOR + '=' + uri.getKeyHash().toBase64()
    72                           + "&" + ThreadedHTMLRenderer.PARAM_THREAD_AUTHOR + "=true&"
    73                           + "\" title=\"Posts by " + trim(HTMLRenderer.sanitizeTagParam(name), 32)
    74                           + ", last post " + age + "\">");
     133                out.write("<a href=\"" + getViewBlogLink(uri.getKeyHash(), uri.getEntryId())
     134                          + "\" title=\"View " + trim(HTMLRenderer.sanitizeTagParam(name), 32)
     135                          + "'s blog\">");
    75136                out.write(HTMLRenderer.sanitizeString(desc, 32));
    76                 out.write("</a> \n");
     137                out.write("</a> (" + getPostDate(uri.getEntryId()) + ")<br />\n");
    77138                writtenAuthors.add(uri.getKeyHash());
    78139            }
    79140        }
    80         out.write("</td></tr>\n");
    81141       
     142        out.write("</span>\n");
     143        /*
    82144        out.write("<tr><td colspan=\"3\"><b>Topics:</b></td></tr>\n");
    83145        out.write("<tr><td colspan=\"3\">");
     
    89151            out.write("</a> ");
    90152        }
     153         */
    91154        out.write("</td></tr>\n");
    92155    }
  • apps/syndie/java/src/net/i2p/syndie/web/ViewThreadedServlet.java

    rd525c49 r4a65fd4f  
    5555        String post = req.getParameter(ThreadedHTMLRenderer.PARAM_VIEW_POST);
    5656        String thread = req.getParameter(ThreadedHTMLRenderer.PARAM_VIEW_THREAD);
    57        
     57        boolean threadAuthorOnly = Boolean.valueOf(req.getParameter(ThreadedHTMLRenderer.PARAM_THREAD_AUTHOR) + "").booleanValue();
     58       
     59        long dayBegin = BlogManager.instance().getDayBegin();
     60        String daysStr = req.getParameter(ThreadedHTMLRenderer.PARAM_DAYS_BACK);
     61        int days = 1;
     62        try {
     63            if (daysStr != null)
     64                days = Integer.parseInt(daysStr);
     65        } catch (NumberFormatException nfe) {
     66            days = 1;
     67        }
     68        dayBegin -= (days-1) * 24*60*60*1000l;
     69
    5870        if ( (author != null) && empty(post) && empty(thread) ) {
    59             long dayBegin = BlogManager.instance().getDayBegin();
    60             String daysStr = req.getParameter(ThreadedHTMLRenderer.PARAM_DAYS_BACK);
    61             int days = 1;
    62             try {
    63                 if (daysStr != null)
    64                     days = Integer.parseInt(daysStr);
    65             } catch (NumberFormatException nfe) {
    66                 days = 1;
    67             }
    68             dayBegin -= (days-1) * 24*60*60*1000;
    69            
    7071            ArchiveIndex aindex = archive.getIndex();
    7172            PetNameDB db = user.getPetNameDB();
     
    9293                    loc.setData(key);
    9394                    aindex.selectMatchesOrderByEntryId(rv, loc, tags, dayBegin);
     95                } else {
     96                }
     97            }
     98           
     99            // how inefficient can we get?
     100            if (threadAuthorOnly && (rv.size() > 0)) {
     101                // lets filter out any posts that are not roots
     102                for (int i = 0; i < rv.size(); i++) {
     103                    BlogURI curURI = (BlogURI)rv.get(i);
     104                    ThreadNode node = index.getNode(curURI);
     105                    if ( (node != null) && (node.getParent() == null) ) {
     106                        // ok, its a root
     107                    } else {
     108                        rv.remove(i);
     109                        i--;
     110                    }
    94111                }
    95112            }
     
    136153            }
    137154        }
     155       
    138156        return rv;
    139157    }
  • history.txt

    rd525c49 r4a65fd4f  
    1 $Id: history.txt,v 1.362 2005/12/17 04:22:07 jrandom Exp $
     1$Id: history.txt,v 1.363 2005/12/18 00:39:54 jrandom Exp $
     2
     32005-12-19  jrandom
     4    * I2PSnark logging, disconnect old inactive peers rather than new ones,
     5      memory usage reduction, better OOM handling, and a shared connection
     6      acceptor.
     7    * Cleaned up the Syndie blog page and the resulting filters (viewing a
     8      blog from the blog page shows threads started by the selected author,
     9      not those that they merely participate in)
    210
    3112005-12-18  jrandom
  • router/java/src/net/i2p/router/RouterVersion.java

    rd525c49 r4a65fd4f  
    1616 */
    1717public class RouterVersion {
    18     public final static String ID = "$Revision: 1.311 $ $Date: 2005/12/14 04:32:51 $";
     18    public final static String ID = "$Revision: 1.312 $ $Date: 2005/12/16 22:47:03 $";
    1919    public final static String VERSION = "0.6.1.7";
    20     public final static long BUILD = 5;
     20    public final static long BUILD = 6;
    2121    public static void main(String args[]) {
    2222        System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
Note: See TracChangeset for help on using the changeset viewer.