protected int getPeerCacheLimit() { synchronized (this) { if (activated.size() < announcers.size()) { return (0); } } if (SystemTime.getMonotonousTime() - create_time < 15 * 1000) { return (0); } TRTrackerAnnouncer active = getBestActive(); if (active != null && provider != null && active.getStatus() == TRTrackerAnnouncerResponse.ST_ONLINE) { if (provider.getMaxNewConnectionsAllowed() > 0 && provider.getPendingConnectionCount() == 0) { return (5); } else { return (0); } } return (10); }
protected void checkActivation(boolean force) { synchronized (this) { int next_check_delay; if (destroyed || stopped || announcers.size() <= activated.size()) { return; } if (provider == null) { next_check_delay = ACT_CHECK_INIT_DELAY; } else { boolean activate = force; boolean seeding = provider.getRemaining() == 0; if (seeding && activated.size() > 0) { // when seeding we only activate on tracker fail or major lack of connections // as normally we rely on downloaders rotating and finding us int connected = provider.getConnectedConnectionCount(); if (connected < 1) { activate = SystemTime.getMonotonousTime() - last_activation_time >= 60 * 1000; next_check_delay = ACT_CHECK_SEEDING_SHORT_DELAY; } else if (connected < 3) { next_check_delay = ACT_CHECK_SEEDING_LONG_DELAY; } else { next_check_delay = 0; } } else { int allowed = provider.getMaxNewConnectionsAllowed(); int pending = provider.getPendingConnectionCount(); int connected = provider.getConnectedConnectionCount(); int online = 0; for (TRTrackerAnnouncerHelper a : activated) { TRTrackerAnnouncerResponse response = a.getLastResponse(); if (response != null && response.getStatus() == TRTrackerAnnouncerResponse.ST_ONLINE) { online++; } } /* System.out.println( "checkActivation: announcers=" + announcers.size() + ", active=" + activated.size() + ", online=" + online + ", allowed=" + allowed + ", pending=" + pending + ", connected=" + connected + ", seeding=" + seeding ); */ if (online == 0) { activate = true; // no trackers online, start next and recheck soon next_check_delay = ACT_CHECK_INIT_DELAY; } else { int potential = connected + pending; if (potential < 10) { // minimal connectivity activate = true; next_check_delay = ACT_CHECK_INIT_DELAY; } else if (allowed >= 5 && pending < 3 * allowed / 4) { // not enough to fulfill our needs activate = true; next_check_delay = ACT_CHECK_INTERIM_DELAY; } else { // things look good, recheck in a bit next_check_delay = ACT_CHECK_IDLE_DELAY; } } } if (activate) { for (TRTrackerAnnouncerHelper a : announcers) { if (!activated.contains(a)) { if (Logger.isEnabled()) { Logger.log( new LogEvent( getTorrent(), LOGID, "Activating " + getString(a.getAnnounceSets()))); } activated.add(a); last_activation_time = SystemTime.getMonotonousTime(); if (complete) { a.complete(true); } else { a.update(false); } break; } } } } if (next_check_delay > 0) { setupActivationCheck(next_check_delay); } } }