@Override public boolean addRunningInsert(SendableInsert insert, SendableRequestItemKey token) { return selector.addRunningInsert(token); }
/** * @return True unless the key was already present. */ @Override public boolean addToFetching(Key key) { return selector.addToFetching(key); }
/** * Called by RequestStarter to find a request to run. */ @Override public ChosenBlock grabRequest() { short fuzz = -1; if(PRIORITY_SOFT.equals(choosenPriorityScheduler)) fuzz = -1; else if(PRIORITY_HARD.equals(choosenPriorityScheduler)) fuzz = 0; return selector.chooseRequest(fuzz, random, offeredKeys, starter, isRTScheduler, clientContext); }
InsertContext context = baseContext.clone(); context.maxInsertRetries = 2; ClientRequestSelector keys = new ClientRequestSelector(true, false, false, null); SplitFileInserterStorage storage = new SplitFileInserterStorage(data, size, cb, null, new ClientMetadata(), false, null, smallRAFFactory, false, context, BlockInsert chosen = segment.chooseBlock(); assertTrue(chosen != null); keys.addRunningInsert(chosen); assertFalse(chosenBlocks[chosen.blockNumber]); chosenBlocks[chosen.blockNumber] = true; assertTrue(chosen == null); for(int i=0;i<segment.totalBlockCount;i++) keys.removeRunningInsert(new BlockInsert(segment, i)); keys.addRunningInsert(chosen); assertTrue(chosen != null); assertFalse(chosenBlocks[chosen.blockNumber]);
@Override public void removeRunningInsert(SendableInsert insert, SendableRequestItemKey token) { selector.removeRunningInsert(token); // Must remove here, because blocks selection and therefore creates cooldown cache entries. insert.clearWakeupTime(clientContext); }
long now = System.currentTimeMillis(); for(int i=0;i<5;i++) { SelectorReturn r = chooseRequestInner(fuzz, random, offeredKeys, starter, realTime, context, now); SendableRequest req = r.req; if(req == null) { throw e; ChosenBlock block = maybeMakeChosenRequest(req, context, now); if(block != null) return block;
public ClientRequestScheduler(boolean forInserts, boolean forSSKs, boolean forRT, RandomSource random, RequestStarter starter, Node node, NodeClientCore core, String name, ClientContext context) { this.isInsertScheduler = forInserts; this.isSSKScheduler = forSSKs; this.isRTScheduler = forRT; schedTransient = new KeyListenerTracker(forInserts, forSSKs, forRT, random, this, null, false); this.datastoreChecker = core.storeChecker; this.starter = starter; this.random = random; this.node = node; this.clientContext = context; selector = new ClientRequestSelector(forInserts, forSSKs, forRT, this); this.name = name; this.choosenPriorityScheduler = PRIORITY_HARD; // Will be reset later. if(!forInserts) { offeredKeys = new OfferedKeysList(core, random, (short)0, forSSKs, forRT); } else { offeredKeys = null; } jobRunner = clientContext.jobRunner; }
return new SelectorReturn(offeredKeys); long l = choosePriority(fuzz, random, context, now); if(l > Integer.MAX_VALUE) { if(logMINOR) Logger.minor(this, "No priority available for the next "+TimeUtil.formatTime(l - now)); Logger.error(this, "Could not find client grabber for client "+req.getClient()+" from "+chosenTracker); innerRegister(req, context, null); continue;
@Override public long countQueuedRequests() { return selector.countQueuedRequests(clientContext); }
@Override public boolean hasFetchingKey(Key key, BaseSendableGet getterWaiting, boolean persistent) { return selector.hasKey(key, null); }
/** * @param req * @param container * @param maybeActive Array of requests, can be null, which are being registered * in this group. These will be ignored for purposes of checking whether stuff * is activated when it shouldn't be. It is perfectly okay to have req be a * member of maybeActive. * * FIXME: Either get rid of the debugging code and therefore get rid of maybeActive, * or make req a SendableRequest[] and register them all at once. */ void innerRegister(SendableRequest req, ClientContext context, SendableRequest[] maybeActive) { if(isInsertScheduler && req instanceof BaseSendableGet) throw new IllegalArgumentException("Adding a SendableGet to an insert scheduler!!"); if((!isInsertScheduler) && req instanceof SendableInsert) throw new IllegalArgumentException("Adding a SendableInsert to a request scheduler!!"); if(isInsertScheduler != req.isInsert()) throw new IllegalArgumentException("Request isInsert="+req.isInsert()+" but my isInsertScheduler="+isInsertScheduler+"!!"); short prio = req.getPriorityClass(); if(logMINOR) Logger.minor(this, "Still registering "+req+" at prio "+prio+" for "+req.getClientRequest()+" ssk="+this.isSSKScheduler+" insert="+this.isInsertScheduler); addToGrabArray(prio, req.getClient(), req.getSchedulerGroup(), req, context); if(logMINOR) Logger.minor(this, "Registered "+req+" on prioclass="+prio); }