Changeset ececf54


Ignore:
Timestamp:
Feb 3, 2009 3:15:09 PM (11 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
3b9fec18
Parents:
d236b9b4
Message:

concurrentify shitlist

Files:
2 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/util/ConcurrentHashSet.java

    rd236b9b4 rececf54  
    5151        return _map.keySet().iterator();
    5252    }
     53
     54    public boolean addAll(Collection<? extends E> c) {
     55        boolean rv = false;
     56        for (E e : c)
     57            rv |= _map.put(e, DUMMY) == null;
     58        return rv;
     59    }
    5360}
  • router/java/src/net/i2p/router/Shitlist.java

    rd236b9b4 rececf54  
    1111import java.io.IOException;
    1212import java.io.Writer;
     13import java.util.concurrent.ConcurrentHashMap;
    1314import java.util.ArrayList;
    1415import java.util.Comparator;
     
    2425import net.i2p.data.Hash;
    2526import net.i2p.router.peermanager.PeerProfile;
     27import net.i2p.util.ConcurrentHashSet;
    2628import net.i2p.util.Log;
    2729
     
    3537    private Log _log;
    3638    private RouterContext _context;
    37     private Map _entries;
     39    private Map<Hash, Entry> _entries;
    3840   
    3941    private static class Entry {
     
    4345        String cause;
    4446        /** what transports they were shitlisted for (String), or null for all transports */
    45         Set transports;
     47        Set<String> transports;
    4648    }
    4749   
     
    5557        _context = context;
    5658        _log = context.logManager().getLog(Shitlist.class);
    57         _entries = new HashMap(32);
     59        _entries = new ConcurrentHashMap(8);
    5860        _context.jobQueue().addJob(new Cleanup(_context));
    5961    }
    6062   
    6163    private class Cleanup extends JobImpl {
    62         private List _toUnshitlist;
    6364        public Cleanup(RouterContext ctx) {
    6465            super(ctx);
    65             _toUnshitlist = new ArrayList(4);
    66             getTiming().setStartAfter(_context.clock().now() + SHITLIST_CLEANER_START_DELAY);
     66            getTiming().setStartAfter(ctx.clock().now() + SHITLIST_CLEANER_START_DELAY);
    6767        }
    6868        public String getName() { return "Cleanup shitlist"; }
    6969        public void runJob() {
    70             _toUnshitlist.clear();
    7170            long now = getContext().clock().now();
    72             synchronized (_entries) {
    73                 for (Iterator iter = _entries.keySet().iterator(); iter.hasNext(); ) {
    74                     Hash peer = (Hash)iter.next();
    75                     Entry entry = (Entry)_entries.get(peer);
    76                     if (entry.expireOn <= now) {
    77                         iter.remove();
    78                         _toUnshitlist.add(peer);
    79                     }
     71            for (Iterator iter = _entries.entrySet().iterator(); iter.hasNext(); ) {
     72                Map.Entry<Hash, Entry> e = (Map.Entry) iter.next();
     73                if (e.getValue().expireOn <= now) {
     74                    iter.remove();
     75                    Hash peer = e.getKey();
     76                    PeerProfile prof = _context.profileOrganizer().getProfile(peer);
     77                    if (prof != null)
     78                        prof.unshitlist();
     79                    _context.messageHistory().unshitlist(peer);
     80                    if (_log.shouldLog(Log.INFO))
     81                        _log.info("Unshitlisting router (expired) " + peer.toBase64());
    8082                }
    81             }
    82             for (int i = 0; i < _toUnshitlist.size(); i++) {
    83                 Hash peer = (Hash)_toUnshitlist.get(i);
    84                 PeerProfile prof = _context.profileOrganizer().getProfile(peer);
    85                 if (prof != null)
    86                     prof.unshitlist();
    87                 _context.messageHistory().unshitlist(peer);
    88                 if (_log.shouldLog(Log.INFO))
    89                     _log.info("Unshitlisting router (expired) " + peer.toBase64());
    9083            }
    9184           
     
    9588   
    9689    public int getRouterCount() {
    97         synchronized (_entries) {
    98             return _entries.size();
    99         }
     90        return _entries.size();
    10091    }
    10192   
     
    144135        e.transports = null;
    145136        if (transport != null) {
    146             e.transports = new HashSet(1);
     137            e.transports = new ConcurrentHashSet(1);
    147138            e.transports.add(transport);
    148139        }
    149140       
    150         synchronized (_entries) {
    151             Entry old = (Entry)_entries.get(peer);
     141            Entry old = _entries.get(peer);
    152142            if (old != null) {
    153143                wasAlready = true;
     
    167157            }
    168158            _entries.put(peer, e);
    169         }
    170159       
    171160        if (transport == null) {
     
    191180                      + (transport != null ? "/" + transport : ""));
    192181        boolean fully = false;
    193         Entry e;
    194         synchronized (_entries) {
    195             e = (Entry)_entries.remove(peer);
    196             if ( (e == null) || (e.transports == null) || (transport == null) || (e.transports.size() <= 1) ) {
    197                 // fully unshitlisted
     182
     183        Entry e = _entries.remove(peer);
     184        if ( (e == null) || (e.transports == null) || (transport == null) || (e.transports.size() <= 1) ) {
     185            // fully unshitlisted
     186            fully = true;
     187        } else {
     188            e.transports.remove(transport);
     189            if (e.transports.size() <= 0)
    198190                fully = true;
    199             } else {
    200                 e.transports.remove(transport);
    201                 if (e.transports.size() <= 0)
    202                     fully = true;
    203                 else
    204                     _entries.put(peer, e);
    205             }
    206         }
     191            else
     192                _entries.put(peer, e);
     193        }
     194
    207195        if (fully) {
    208196            if (realUnshitlist) {
     
    222210        boolean rv = false;
    223211        boolean unshitlist = false;
    224         synchronized (_entries) {
    225             Entry entry = (Entry)_entries.get(peer);
    226             if (entry == null) {
    227                 rv = false;
    228             } else {
    229                 if (entry.expireOn <= _context.clock().now()) {
    230                     _entries.remove(peer);
    231                     unshitlist = true;
    232                     rv = false;
    233                 } else {
    234                     if (entry.transports == null) {
    235                         rv = true;
    236                     } else if (entry.transports.contains(transport)) {
    237                         rv = true;
    238                     } else {
    239                         rv = false;
    240                     }
    241                 }
    242             }
     212
     213        Entry entry = _entries.get(peer);
     214        if (entry == null) {
     215            rv = false;
     216        } else if (entry.expireOn <= _context.clock().now()) {
     217            _entries.remove(peer);
     218            unshitlist = true;
     219            rv = false;
     220        } else if (entry.transports == null) {
     221            rv = true;
     222        } else {
     223            rv = entry.transports.contains(transport);
    243224        }
    244225       
     
    256237   
    257238    public boolean isShitlistedForever(Hash peer) {
    258         Entry entry;
    259         synchronized (_entries) {
    260             entry = (Entry)_entries.get(peer);
    261         }
     239        Entry entry = _entries.get(peer);
    262240        return entry != null && entry.expireOn > _context.clock().now() + SHITLIST_DURATION_MAX;
    263241    }
     
    272250        StringBuffer buf = new StringBuffer(1024);
    273251        buf.append("<h2>Shitlist</h2>");
    274         Map entries = new TreeMap(new HashComparator());
    275        
    276         synchronized (_entries) {
    277             entries.putAll(_entries);
    278         }
     252        Map<Hash, Entry> entries = new TreeMap(new HashComparator());
     253       
     254        entries.putAll(_entries);
     255
    279256        buf.append("<ul>");
    280257       
    281         for (Iterator iter = entries.entrySet().iterator(); iter.hasNext(); ) {
    282             Map.Entry mentry = (Map.Entry)iter.next();
    283             Hash key = (Hash)mentry.getKey();
    284             Entry entry = (Entry)mentry.getValue();
     258        for (Map.Entry<Hash, Entry> e : entries.entrySet()) {
     259            Hash key = e.getKey();
     260            Entry entry = e.getValue();
    285261            buf.append("<li><b>").append(key.toBase64()).append("</b>");
    286262            buf.append(" (<a href=\"netdb.jsp?r=").append(key.toBase64().substring(0, 6)).append("\">netdb</a>)");
Note: See TracChangeset for help on using the changeset viewer.