/* This code is part of Freenet. It is distributed under the GNU General * Public License, version 2 (or at your option any later version). See * http://www.gnu.org/ for further details of the GPL. */ package freenet.node; import static java.util.concurrent.TimeUnit.MINUTES; import freenet.client.async.ChosenBlock; import freenet.client.async.ClientContext; import freenet.client.async.ClientRequestSelector; import freenet.keys.Key; public interface RequestScheduler { /** * Tell the scheduler that a request from a specific RandomGrabArray succeeded. * Definition of "succeeded" will vary, but the point is most schedulers will run another * request from the parentGrabArray in the near future on the theory that if one works, * another may also work. * @param get The request we ran, which must be deleted. * @param persistent * */ public void succeeded(BaseSendableGet get, boolean persistent); /** Once a key has been requested a few times, don't request it again for 30 minutes. * To do so would be pointless given ULPRs, and just waste bandwidth. */ public static final long COOLDOWN_PERIOD = MINUTES.toMillis(30); /** The number of times a key can be requested before triggering the cooldown period. * Note: If you don't want your requests to be subject to cooldown (e.g. in fproxy), make * your max retry count less than this (and more than -1). */ public static final int COOLDOWN_RETRIES = 3; public long countQueuedRequests(); public KeysFetchingLocally fetchingKeys(); public void removeFetchingKey(Key key); public void callFailure(SendableGet get, LowLevelGetException e, int prio, boolean persistent); public void callFailure(SendableInsert insert, LowLevelPutException exception, int prio, boolean persistent); public ClientContext getContext(); public boolean addToFetching(Key key); public ChosenBlock grabRequest(); public void removeRunningRequest(SendableRequest request); /** * This only works for persistent requests, because transient requests are not * selected on a SendableRequest level, they are selected on a {SendableRequest, token} level. */ public abstract boolean isRunningOrQueuedPersistentRequest(SendableRequest request); /** * Check whether a key is already being fetched. If it is, optionally remember who is * asking so we can wake them up (on the cooldown queue) when the key fetch completes. * @param key * @param getterWaiting * @param persistent * @return */ public boolean hasFetchingKey(Key key, BaseSendableGet getterWaiting, boolean persistent); public boolean addRunningInsert(SendableInsert insert, SendableRequestItemKey token); public void removeRunningInsert(SendableInsert insert, SendableRequestItemKey token); public void wakeStarter(); /* FIXME SECURITY When/if introduce tunneling or similar mechanism for starting requests * at a distance this will need to be reconsidered. See the comments on the caller in * RequestHandler (onAbort() handler). */ public boolean wantKey(Key key); public ClientRequestSelector getSelector(); }