Changeset 8660cf0


Ignore:
Timestamp:
Aug 27, 2005 10:15:35 PM (15 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
e313da25
Parents:
e0bfdff
git-author:
jrandom <jrandom> (08/27/05 22:15:35)
git-committer:
zzz <zzz@…> (08/27/05 22:15:35)
Message:

2005-08-27 jrandom

  • Minor logging and optimization tweaks in the router and SDK
  • Use ISO-8859-1 in the XML files (thanks redzara!)
  • The consolePassword config property can now be used to bypass the router console's nonce checking, allowing CLI restarts
Files:
1 added
20 edited

Legend:

Unmodified
Added
Removed
  • apps/i2ptunnel/jsp/web.xml

    re0bfdff r8660cf0  
    1 <?xml version="1.0" encoding="UTF-8"?>
     1<?xml version="1.0" encoding="ISO-8859-1"?>
    22<!DOCTYPE web-app
    33    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  • apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java

    re0bfdff r8660cf0  
    2121    private String _nonce;
    2222    protected String _action;
     23    protected String _passphrase;
    2324    private List _errors;
    2425    private List _notices;
     
    3334        _valid = true;
    3435        _nonce = null;
     36        _passphrase = null;
    3537    }
    3638   
     
    5254    public void setNonce(String val) { _nonce = val; }
    5355    public void setAction(String val) { _action = val; }
     56    public void setPassphrase(String val) { _passphrase = val; }
    5457   
    5558    /**
     
    120123        if ( ( (nonce == null) || (!_nonce.equals(nonce)) ) &&
    121124             ( (noncePrev == null) || (!_nonce.equals(noncePrev)) ) ) {
    122             addFormError("Invalid nonce, are you being spoofed?");
    123             _valid = false;
     125                 
     126            String expected = _context.getProperty("consolePassword");
     127            if ( (expected != null) && (expected.trim().length() > 0) && (expected.equals(_passphrase)) ) {
     128                // ok
     129            } else {
     130                addFormError("Invalid nonce, are you being spoofed?");
     131                _valid = false;
     132            }
    124133        }
    125134    }
  • apps/routerconsole/jsp/web.xml

    re0bfdff r8660cf0  
    1 <?xml version="1.0" encoding="UTF-8"?>
     1<?xml version="1.0" encoding="ISO-8859-1"?>
    22<!DOCTYPE web-app
    33    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  • apps/syndie/java/src/net/i2p/syndie/BlogManager.java

    re0bfdff r8660cf0  
    2121    private File _cacheDir;
    2222    private File _tempDir;
     23    private File _rootDir;
    2324    private Archive _archive;
    2425   
     
    2627        TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
    2728        String rootDir = I2PAppContext.getGlobalContext().getProperty("syndie.rootDir");
    28         if (rootDir == null)
    29             rootDir = System.getProperty("user.home");
    30         rootDir = rootDir + File.separatorChar + ".syndie";
     29        if (false) {
     30            if (rootDir == null)
     31                rootDir = System.getProperty("user.home");
     32            rootDir = rootDir + File.separatorChar + ".syndie";
     33        } else {
     34            if (rootDir == null)
     35                rootDir = "./syndie";
     36        }
    3137        _instance = new BlogManager(I2PAppContext.getGlobalContext(), rootDir);
    3238    }
     
    3541    public BlogManager(I2PAppContext ctx, String rootDir) {
    3642        _context = ctx;
    37         File root = new File(rootDir);
    38         root.mkdirs();
    39         _blogKeyDir = new File(root, "blogkeys");
    40         _privKeyDir = new File(root, "privkeys");
     43        _rootDir = new File(rootDir);
     44        _rootDir.mkdirs();
     45        readConfig();
     46        _blogKeyDir = new File(_rootDir, "blogkeys");
     47        _privKeyDir = new File(_rootDir, "privkeys");
    4148        String archiveDir = _context.getProperty("syndie.archiveDir");
    4249        if (archiveDir != null)
    4350            _archiveDir = new File(archiveDir);
    4451        else
    45             _archiveDir = new File(root, "archive");
    46         _userDir = new File(root, "users");
    47         _cacheDir = new File(root, "cache");
    48         _tempDir = new File(root, "temp");
     52            _archiveDir = new File(_rootDir, "archive");
     53        _userDir = new File(_rootDir, "users");
     54        _cacheDir = new File(_rootDir, "cache");
     55        _tempDir = new File(_rootDir, "temp");
    4956        _blogKeyDir.mkdirs();
    5057        _privKeyDir.mkdirs();
     
    5562        _archive = new Archive(ctx, _archiveDir.getAbsolutePath(), _cacheDir.getAbsolutePath());
    5663        _archive.regenerateIndex();
     64    }
     65   
     66    private void readConfig() {
     67        File config = new File(_rootDir, "syndie.config");
     68        if (config.exists()) {
     69            try {
     70                Properties p = new Properties();
     71                DataHelper.loadProps(p, config);
     72                for (Iterator iter = p.keySet().iterator(); iter.hasNext(); ) {
     73                    String key = (String)iter.next();
     74                    System.setProperty(key, p.getProperty(key));
     75                }
     76            } catch (IOException ioe) {
     77                ioe.printStackTrace();
     78            }
     79        }
     80    }
     81   
     82    public void writeConfig() {
     83        File config = new File(_rootDir, "syndie.config");
     84        FileOutputStream out = null;
     85        try {
     86            out = new FileOutputStream(config);
     87            for (Iterator iter = _context.getPropertyNames().iterator(); iter.hasNext(); ) {
     88                String name = (String)iter.next();
     89                if (name.startsWith("syndie."))
     90                    out.write((name + '=' + _context.getProperty(name) + '\n').getBytes());
     91            }
     92        } catch (IOException ioe) {
     93            ioe.printStackTrace();
     94        } finally {
     95            if (out != null) try { out.close(); } catch (IOException ioe) {}
     96        }
    5797    }
    5898   
  • apps/syndie/java/src/net/i2p/syndie/sml/HTMLRenderer.java

    re0bfdff r8660cf0  
    262262     */
    263263    public void receiveBlog(String name, String hash, String tag, long entryId, List locations, String description) {
     264        if (!continueBody()) { return; }
     265        if (hash == null) return;
     266       
     267        System.out.println("Receiving the blog: " + name + "/" + hash + "/" + tag + "/" + entryId +"/" + locations + ": "+ description);
     268        byte blogData[] = Base64.decode(hash);
     269        if ( (blogData == null) || (blogData.length != Hash.HASH_LENGTH) )
     270            return;
     271   
    264272        Blog b = new Blog();
    265273        b.name = name;
     
    271279            _blogs.add(b);
    272280   
    273         if (!continueBody()) { return; }
    274         if (hash == null) return;
    275        
    276         System.out.println("Receiving the blog: " + name + "/" + hash + "/" + tag + "/" + entryId +"/" + locations + ": "+ description);
    277         byte blogData[] = Base64.decode(hash);
    278         if ( (blogData == null) || (blogData.length != Hash.HASH_LENGTH) )
    279             return;
    280281        Hash blog = new Hash(blogData);
    281282        if (entryId > 0) {
     
    307308        }
    308309        if ( (locations != null) && (locations.size() > 0) ) {
    309             _bodyBuffer.append(" <select name=\"archiveLocation\">");
     310            _bodyBuffer.append(" Archives: ");
    310311            for (int i = 0; i < locations.size(); i++) {
    311312                SafeURL surl = (SafeURL)locations.get(i);
    312                 _bodyBuffer.append("<option value=\"").append(Base64.encode(surl.toString())).append("\">");
    313                 _bodyBuffer.append(sanitizeString(surl.toString())).append("</option>\n");
    314             }
    315             _bodyBuffer.append("</select>");
     313                if (_user.getAuthenticated() && _user.getAllowAccessRemote())
     314                    _bodyBuffer.append("<a href=\"").append(getArchiveURL(blog, surl)).append("\">").append(sanitizeString(surl.toString())).append("</a> ");
     315                else
     316                    _bodyBuffer.append(sanitizeString(surl.toString())).append(' ');
     317            }
    316318        }
    317319        _bodyBuffer.append("] ");
     
    657659        if (!unsafe) return str;
    658660       
    659         str = str.replace('<', '_');
    660         str = str.replace('>', '-');
     661        str = str.replace('<', '_'); // this should be &lt;
     662        str = str.replace('>', '-'); // this should be &gt;
    661663        if (!allowNL) {
    662664            str = str.replace('\n', ' ');
     
    669671    public static final String sanitizeURL(String str) { return Base64.encode(str); }
    670672    public static final String sanitizeTagParam(String str) {
     673        str = str.replace('&', '_'); // this should be &amp;
    671674        if (str.indexOf('\"') < 0)
    672675            return sanitizeString(str);
     
    754757        return buf.toString();
    755758    }
     759    public static String getArchiveURL(Hash blog, SafeURL archiveLocation) {
     760        return "remote.jsp?"
     761               //+ "action=Continue..." // should this be the case?
     762               + "&schema=" + sanitizeTagParam(archiveLocation.getSchema())
     763               + "&location=" + sanitizeTagParam(archiveLocation.getLocation());
     764    }
    756765}
  • apps/syndie/java/src/net/i2p/syndie/web/ArchiveServlet.java

    re0bfdff r8660cf0  
    2525        } else if (path.endsWith(Archive.INDEX_FILE)) {
    2626            renderSummary(resp);
     27        } else if (path.endsWith("export.zip")) {
     28            ExportServlet.export(req, resp);
    2729        } else {
    2830            String blog = getBlog(path);
  • apps/syndie/java/src/net/i2p/syndie/web/RemoteArchiveBean.java

    re0bfdff r8660cf0  
    44import java.text.*;
    55import java.util.*;
     6import java.util.zip.*;
    67import net.i2p.I2PAppContext;
    78import net.i2p.data.*;
     
    109110    }
    110111   
     112    public void fetchSelectedBulk(User user, Map parameters) {
     113        String entries[] = ArchiveViewerBean.getStrings(parameters, "entry");
     114        String action = ArchiveViewerBean.getString(parameters, "action");
     115        if ("Fetch all new entries".equals(action)) {
     116            ArchiveIndex localIndex = BlogManager.instance().getArchive().getIndex();
     117            List uris = new ArrayList();
     118            List matches = new ArrayList();
     119            for (Iterator iter = _remoteIndex.getUniqueBlogs().iterator(); iter.hasNext(); ) {
     120                Hash blog = (Hash)iter.next();
     121                _remoteIndex.selectMatchesOrderByEntryId(matches, blog, null);
     122                for (int i = 0; i < matches.size(); i++) {
     123                    BlogURI uri = (BlogURI)matches.get(i);
     124                    if (!localIndex.getEntryIsKnown(uri))
     125                        uris.add(uri);
     126                }
     127                matches.clear();
     128            }
     129            entries = new String[uris.size()];
     130            for (int i = 0; i < uris.size(); i++)
     131                entries[i] = ((BlogURI)uris.get(i)).toString();
     132        }
     133        if ( (entries == null) || (entries.length <= 0) ) return;
     134        StringBuffer url = new StringBuffer(512);
     135        url.append(buildExportURL());
     136        Set meta = new HashSet();
     137        for (int i = 0; i < entries.length; i++) {
     138            BlogURI uri = new BlogURI(entries[i]);
     139            if (uri.getEntryId() >= 0) {
     140                url.append("entry=").append(uri.toString()).append('&');
     141                meta.add(uri.getKeyHash());
     142                _statusMessages.add("Scheduling blog post fetching for " + HTMLRenderer.sanitizeString(entries[i]));
     143            }
     144        }
     145        for (Iterator iter = meta.iterator(); iter.hasNext(); ) {
     146            Hash blog = (Hash)iter.next();
     147            url.append("meta=").append(blog.toBase64()).append('&');
     148            _statusMessages.add("Scheduling blog metadata fetching for " + blog.toBase64());
     149        }
     150        List urls = new ArrayList(1);
     151        urls.add(url.toString());
     152        List tmpFiles = new ArrayList(1);
     153        try {
     154            File tmp = File.createTempFile("fetchBulk", ".zip", BlogManager.instance().getTempDir());
     155            tmpFiles.add(tmp);
     156            fetch(urls, tmpFiles, user, new BulkFetchListener(tmp));
     157        } catch (IOException ioe) {
     158            _statusMessages.add("Internal error creating temporary file to fetch " + HTMLRenderer.sanitizeString(url.toString()) + ": " + ioe.getMessage());
     159        }
     160    }
     161   
     162    private String buildExportURL() {
     163        String loc = _remoteLocation.trim();
     164        int root = loc.lastIndexOf('/');
     165        return loc.substring(0, root + 1) + "export.zip?";
     166    }
     167   
    111168    private String buildEntryURL(BlogURI uri) {
    112169        String loc = _remoteLocation.trim();
     
    301358    }
    302359   
     360    /**
     361     * Receive the status of a fetch for the zip containing blogs and metadata (as generated by
     362     * the ExportServlet)
     363     */
     364    private class BulkFetchListener implements EepGet.StatusListener {
     365        private File _tmp;
     366        public BulkFetchListener(File tmp) {
     367            _tmp = tmp;
     368        }
     369        public void attemptFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt, int numRetries, Exception cause) {
     370            _statusMessages.add("Attempt " + currentAttempt + " failed after " + bytesTransferred + (cause != null ? cause.getMessage() : ""));
     371        }
     372       
     373        public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {}
     374        public void transferComplete(long alreadyTransferred, long bytesTransferred, long bytesRemaining, String url, String outputFile) {
     375            _statusMessages.add("Fetch of " + HTMLRenderer.sanitizeString(url.substring(0, url.indexOf('?'))) + " successful, importing the data");
     376            File file = new File(outputFile);
     377            ZipInputStream zi = null;
     378            try {
     379                zi = new ZipInputStream(new FileInputStream(file));
     380               
     381                while (true) {
     382                    ZipEntry entry = zi.getNextEntry();
     383                    if (entry == null)
     384                        break;
     385
     386                    ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
     387                    byte buf[] = new byte[1024];
     388                    int read = -1;
     389                    while ( (read = zi.read(buf)) != -1)
     390                        out.write(buf, 0, read);
     391
     392                    if (entry.getName().startsWith("meta")) {
     393                        BlogInfo i = new BlogInfo();
     394                        i.load(new ByteArrayInputStream(out.toByteArray()));
     395                        boolean ok = BlogManager.instance().getArchive().storeBlogInfo(i);
     396                        if (ok) {
     397                            _statusMessages.add("Blog info for " + HTMLRenderer.sanitizeString(i.getProperty(BlogInfo.NAME)) + " imported");
     398                        } else {
     399                            _statusMessages.add("Blog info at " + HTMLRenderer.sanitizeString(url) + " was corrupt / invalid / forged");
     400                        }
     401                    } else if (entry.getName().startsWith("entry")) {
     402                        EntryContainer c = new EntryContainer();
     403                        c.load(new ByteArrayInputStream(out.toByteArray()));
     404                        BlogURI uri = c.getURI();
     405                        if ( (uri == null) || (uri.getKeyHash() == null) ) {
     406                            _statusMessages.add("Blog post " + HTMLRenderer.sanitizeString(entry.getName()) + " was corrupt - no URI");
     407                            continue;
     408                        }
     409                        Archive a = BlogManager.instance().getArchive();
     410                        BlogInfo info = a.getBlogInfo(uri);
     411                        if (info == null) {
     412                            _statusMessages.add("Blog post " + HTMLRenderer.sanitizeString(entry.getName()) + " cannot be imported, as we don't have their blog metadata");
     413                            continue;
     414                        }
     415                        boolean ok = a.storeEntry(c);
     416                        if (!ok) {
     417                            _statusMessages.add("Blog post " + uri.toString() + " has an invalid signature");
     418                            continue;
     419                        } else {
     420                            _statusMessages.add("Blog post " + uri.toString() + " imported");
     421                        }
     422                    }
     423                }       
     424               
     425                BlogManager.instance().getArchive().regenerateIndex();
     426            } catch (IOException ioe) {
     427                ioe.printStackTrace();
     428                _statusMessages.add("Error importing from " + HTMLRenderer.sanitizeString(url) + ": " + ioe.getMessage());
     429            } finally {
     430                if (zi != null) try { zi.close(); } catch (IOException ioe) {}
     431                file.delete();
     432            }
     433        }
     434        public void transferFailed(String url, long bytesTransferred, long bytesRemaining, int currentAttempt) {
     435            _statusMessages.add("Fetch of " + HTMLRenderer.sanitizeString(url) + " failed after " + bytesTransferred);
     436            _tmp.delete();
     437        }
     438    }
    303439   
    304440    public void postSelectedEntries(User user, Map parameters) {
     
    367503        for (Iterator iter = remoteBlogs.iterator(); iter.hasNext(); ) {
    368504            Hash blog = (Hash)iter.next();
    369             buf = new StringBuffer(1024);
     505            buf.setLength(0);
    370506            int shownEntries = 0;
    371507            buf.append("<tr><td colspan=\"5\" align=\"left\" valign=\"top\">\n");
     
    404540                buf.append("</tr>\n");
    405541            }
     542            if (shownEntries > 0) {
     543                out.write(buf.toString());
     544                buf.setLength(0);
     545            }
     546            int remote = shownEntries;
    406547           
    407548            // now for posts in known blogs that we have and they don't
     
    430571            }
    431572           
    432             if (shownEntries > 0) // skip blogs we have already syndicated
     573            if (shownEntries > remote) // skip blogs we have already syndicated
    433574                out.write(buf.toString());
    434575        }
     
    478619            out.write("<input type=\"submit\" name=\"action\" value=\"Post selected entries\" /> \n");
    479620        }
     621        out.write("<hr />\n");
    480622    }
    481623    private final SimpleDateFormat _dateFormat = new SimpleDateFormat("yyyy/MM/dd", Locale.UK);
  • apps/syndie/jsp/remote.jsp

    re0bfdff r8660cf0  
    2020} else { %>Import from:
    2121<select name="schema">
    22  <option value="web">I2P/TOR/Freenet</option>
    23  <option value="mnet">MNet</option>
    24  <option value="feedspace">Feedspace</option>
    25  <option value="usenet">Usenet</option>
     22 <option value="web" <%=("web".equals(request.getParameter("schema")) ? "selected=\"true\"" : "")%>>I2P/TOR/Freenet</option>
     23 <option value="mnet" <%=("mnet".equals(request.getParameter("schema")) ? "selected=\"true\"" : "")%>>MNet</option>
     24 <option value="feedspace" <%=("feedspace".equals(request.getParameter("schema")) ? "selected=\"true\"" : "")%>>Feedspace</option>
     25 <option value="usenet" <%=("usenet".equals(request.getParameter("schema")) ? "selected=\"true\"" : "")%>>Usenet</option>
    2626</select>
    2727Proxy <input type="text" size="10" name="proxyhost" value="localhost" />:<input type="text" size="4" name="proxyport" value="4444" />
    28 <input name="location" size="40" /> <input type="submit" name="action" value="Continue..." /><br />
     28<input name="location" size="40" value="<%=(request.getParameter("location") != null ? request.getParameter("location") : "")%>" />
     29<input type="submit" name="action" value="Continue..." /><br />
    2930<%
    3031  String action = request.getParameter("action");
     
    3435    remote.fetchMetadata(user, request.getParameterMap());
    3536  } else if ("Fetch selected entries".equals(action)) {
    36     remote.fetchSelectedEntries(user, request.getParameterMap());
     37    //remote.fetchSelectedEntries(user, request.getParameterMap());
     38    remote.fetchSelectedBulk(user, request.getParameterMap());
    3739  } else if ("Fetch all new entries".equals(action)) {
    38     remote.fetchAllEntries(user, request.getParameterMap());
     40    //remote.fetchAllEntries(user, request.getParameterMap());
     41    remote.fetchSelectedBulk(user, request.getParameterMap());
    3942  } else if ("Post selected entries".equals(action)) {
    4043    remote.postSelectedEntries(user, request.getParameterMap());
  • apps/syndie/jsp/web.xml

    re0bfdff r8660cf0  
    1 <?xml version="1.0" encoding="UTF-8"?>
     1<?xml version="1.0" encoding="ISO-8859-1"?>
    22<!DOCTYPE web-app
    33    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
  • core/java/src/net/i2p/util/LogManager.java

    re0bfdff r8660cf0  
    142142        Log rv = null;
    143143        String scope = Log.getScope(name, cls);
     144        boolean isNew = false;
    144145        synchronized (_logs) {
    145146            rv = (Log)_logs.get(scope);
     
    147148                rv = new Log(this, cls, name);
    148149                _logs.put(scope, rv);
    149             }
    150         }
    151         updateLimit(rv);
     150                isNew = true;
     151            }
     152        }
     153        if (isNew)
     154            updateLimit(rv);
    152155        return rv;
    153156    }
  • history.txt

    re0bfdff r8660cf0  
    1 $Id: history.txt,v 1.229 2005/08/23 16:25:49 jrandom Exp $
     1$Id: history.txt,v 1.230 2005/08/24 17:55:27 jrandom Exp $
     2
     32005-08-27  jrandom
     4    * Minor logging and optimization tweaks in the router and SDK
     5    * Use ISO-8859-1 in the XML files (thanks redzara!)
     6    * The consolePassword config property can now be used to bypass the router
     7      console's nonce checking, allowing CLI restarts
    28
    392005-08-24  jrandom
  • router/java/src/net/i2p/router/RouterVersion.java

    re0bfdff r8660cf0  
    1616 */
    1717public class RouterVersion {
    18     public final static String ID = "$Revision: 1.218 $ $Date: 2005/08/23 16:25:49 $";
     18    public final static String ID = "$Revision: 1.219 $ $Date: 2005/08/24 17:55:26 $";
    1919    public final static String VERSION = "0.6.0.3";
    20     public final static long BUILD = 2;
     20    public final static long BUILD = 3;
    2121    public static void main(String args[]) {
    2222        System.out.println("I2P Router version: " + VERSION);
  • router/java/src/net/i2p/router/client/ClientConnectionRunner.java

    re0bfdff r8660cf0  
    147147    /** current client's sessionId */
    148148    SessionId getSessionId() { return _sessionId; }
    149     void setSessionId(SessionId id) { _sessionId = id; }
     149    void setSessionId(SessionId id) { if (id != null) _sessionId = id; }
    150150    /** data for the current leaseRequest, or null if there is no active leaseSet request */
    151151    LeaseRequestState getLeaseRequest() { return _leaseRequest; }
  • router/java/src/net/i2p/router/message/GarlicMessageReceiver.java

    re0bfdff r8660cf0  
    7272            }
    7373        } else {
    74             if (_log.shouldLog(Log.ERROR))
    75                 _log.error("CloveMessageParser failed to decrypt the message [" + message.getUniqueId()
    76                            + "]");
    7774            if (_log.shouldLog(Log.WARN))
    7875                _log.warn("CloveMessageParser failed to decrypt the message [" + message.getUniqueId()
  • router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java

    re0bfdff r8660cf0  
    1313import java.util.Iterator;
    1414import java.util.Set;
     15import java.util.ArrayList;
     16import java.util.List;
    1517
    1618import net.i2p.I2PAppContext;
     
    2325    private Log _log;
    2426    /** set of Hash objects for the peers in the kbucket */
    25     private Set _entries;
     27    private List _entries;
    2628    /** we center the kbucket set on the given hash, and derive distances from this */
    2729    private Hash _local;
     
    3537        _context = context;
    3638        _log = context.logManager().getLog(KBucketImpl.class);
    37         _entries = new HashSet();
     39        _entries = new ArrayList(64); //new HashSet();
    3840        setLocal(local);
    3941    }
     
    194196        Set entries = new HashSet(64);
    195197        synchronized (_entries) {
    196             entries.addAll(_entries);
     198            for (int i = 0; i < _entries.size(); i++)
     199                entries.add((Hash)_entries.get(i));
    197200        }
    198201        return entries;
     
    201204        Set entries = new HashSet(64);
    202205        synchronized (_entries) {
    203             entries.addAll(_entries);
     206            for (int i = 0; i < _entries.size(); i++)
     207                entries.add((Hash)_entries.get(i));
    204208            entries.removeAll(toIgnoreHashes);
    205209        }
     
    209213    public void getEntries(SelectionCollector collector) {
    210214        synchronized (_entries) {
    211             for (Iterator iter = _entries.iterator(); iter.hasNext(); ) {
    212                 collector.add((Hash)iter.next());
     215            for (int i = 0; i < _entries.size(); i++)
     216                collector.add((Hash)_entries.get(i));
     217        }
     218    }
     219   
     220    public void setEntries(Set entries) {
     221        synchronized (_entries) {
     222            _entries.clear();
     223            for (Iterator iter = entries.iterator(); iter.hasNext(); ) {
     224                Hash entry = (Hash)iter.next();
     225                if (!_entries.contains(entry))
     226                    _entries.add(entry);
    213227            }
    214228        }
    215229    }
    216230   
    217     public void setEntries(Set entries) {
    218         synchronized (_entries) {
    219             _entries.clear();
    220             _entries.addAll(entries);
    221         }
    222     }
    223    
    224231    public int add(Hash peer) {
    225232        synchronized (_entries) {
    226             _entries.add(peer);
     233            if (!_entries.contains(peer))
     234                _entries.add(peer);
    227235            return _entries.size();
    228236        }
  • router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java

    re0bfdff r8660cf0  
    808808
    809809    /** smallest allowed period */
    810     private static final int MIN_PER_PEER_TIMEOUT = 1*1000;
     810    private static final int MIN_PER_PEER_TIMEOUT = 2*1000;
    811811    private static final int MAX_PER_PEER_TIMEOUT = 5*1000;
    812812   
  • router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java

    re0bfdff r8660cf0  
    8585            if (_log.shouldLog(Log.WARN))
    8686                _log.warn("FAILED publishing of the leaseSet for " + _dest.toBase64());
    87             RepublishLeaseSetJob.this.requeue(30*1000);
     87            RepublishLeaseSetJob.this.requeue(getContext().random().nextInt(60*1000));
    8888        }
    8989    }
  • router/java/src/net/i2p/router/networkdb/kademlia/StoreJob.java

    re0bfdff r8660cf0  
    4040    private PeerSelector _peerSelector;
    4141
    42     private final static int PARALLELIZATION = 3; // how many sent at a time
    43     private final static int REDUNDANCY = 6; // we want the data sent to 6 peers
     42    private final static int PARALLELIZATION = 4; // how many sent at a time
     43    private final static int REDUNDANCY = 4; // we want the data sent to 6 peers
    4444    /**
    4545     * additionally send to 1 outlier(s), in case all of the routers chosen in our
     
    7676        getContext().statManager().createRateStat("netDb.storeFailedPeers", "How many peers each netDb must be sent to before failing completely?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
    7777        getContext().statManager().createRateStat("netDb.ackTime", "How long does it take for a peer to ack a netDb store?", "NetworkDatabase", new long[] { 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
     78        getContext().statManager().createRateStat("netDb.replyTimeout", "How long after a netDb send does the timeout expire (when the peer doesn't reply in time)?", "NetworkDatabase", new long[] { 60*1000, 5*60*1000l, 60*60*1000l, 24*60*60*1000l });
    7879        _facade = facade;
    7980        _state = new StoreState(getContext(), key, data, toSkip);
     
    155156                } else {
    156157                    int peerTimeout = _facade.getPeerTimeout(peer);
    157                     //RateStat failing = prof.getDBHistory().getFailedLookupRate();
    158                     //Rate failed = failing.getRate(60*60*1000);
     158                    PeerProfile prof = getContext().profileOrganizer().getProfile(peer);
     159                    RateStat failing = prof.getDBHistory().getFailedLookupRate();
     160                    Rate failed = failing.getRate(60*60*1000);
     161                    long failedCount = failed.getCurrentEventCount()+failed.getLastEventCount();
     162                    if (failedCount > 10) {
     163                        _state.addSkipped(peer);
     164                        continue;
     165                    }
     166                    //
    159167                    //if (failed.getCurrentEventCount() + failed.getLastEventCount() > avg) {
    160168                    //    _state.addSkipped(peer);
     
    251259       
    252260        SendSuccessJob onReply = new SendSuccessJob(getContext(), peer);
    253         FailedJob onFail = new FailedJob(getContext(), peer);
     261        FailedJob onFail = new FailedJob(getContext(), peer, getContext().clock().now());
    254262        StoreMessageSelector selector = new StoreMessageSelector(getContext(), getJobId(), peer, token, expiration);
    255263       
     
    322330    private class FailedJob extends JobImpl {
    323331        private RouterInfo _peer;
    324 
    325         public FailedJob(RouterContext enclosingContext, RouterInfo peer) {
     332        private long _sendOn;
     333
     334        public FailedJob(RouterContext enclosingContext, RouterInfo peer, long sendOn) {
    326335            super(enclosingContext);
    327336            _peer = peer;
     337            _sendOn = sendOn;
    328338        }
    329339        public void runJob() {
     
    333343            _state.replyTimeout(_peer.getIdentity().getHash());
    334344            getContext().profileManager().dbStoreFailed(_peer.getIdentity().getHash());
     345            getContext().statManager().addRateData("netDb.replyTimeout", getContext().clock().now() - _sendOn, 0);
    335346           
    336347            sendNext();
  • router/java/src/net/i2p/router/transport/udp/MessageReceiver.java

    re0bfdff r8660cf0  
    114114            return m;
    115115        } catch (I2NPMessageException ime) {
    116             if (_log.shouldLog(Log.ERROR))
    117                 _log.error("Message invalid: " + state, ime);
     116            if (_log.shouldLog(Log.WARN))
     117                _log.warn("Message invalid: " + state, ime);
    118118            return null;
    119119        } catch (Exception e) {
  • router/java/src/net/i2p/router/tunnel/FragmentHandler.java

    re0bfdff r8660cf0  
    149149        boolean eq = DataHelper.eq(v.getData(), 0, preprocessed, offset + HopProcessor.IV_LENGTH, 4);
    150150        if (!eq) {
    151             if (_log.shouldLog(Log.ERROR))
    152                 _log.error("Corrupt tunnel message - verification fails: \n" + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
     151            if (_log.shouldLog(Log.WARN))
     152                _log.warn("Corrupt tunnel message - verification fails: \n" + Base64.encode(preprocessed, offset+HopProcessor.IV_LENGTH, 4)
    153153                           + "\n" + Base64.encode(v.getData(), 0, 4));
    154154            if (_log.shouldLog(Log.WARN))
Note: See TracChangeset for help on using the changeset viewer.