public void registerInsert( final SendableRequest req, boolean persistent, boolean regmeOnly, ObjectContainer container) { if (!isInsertScheduler) throw new IllegalArgumentException("Adding a SendableInsert to a request scheduler!!"); if (persistent) { if (regmeOnly) { long bootID = 0; boolean queueFull = jobRunner.getQueueSize(NativeThread.NORM_PRIORITY) >= QUEUE_THRESHOLD; if (!queueFull) bootID = this.node.bootID; final RegisterMe regme = new RegisterMe(req, req.getPriorityClass(container), schedCore, null, bootID); container.store(regme); if (logMINOR) Logger.minor(this, "Added insert RegisterMe: " + regme); if (!queueFull) { try { jobRunner.queue( new DBJob() { @Override public boolean run(ObjectContainer container, ClientContext context) { container.delete(regme); if (req.isCancelled(container)) { if (logMINOR) Logger.minor(this, "Request already cancelled"); return false; } if (container.ext().isActive(req)) Logger.error(this, "ALREADY ACTIVE: " + req + " in delayed insert register"); container.activate(req, 1); registerInsert(req, true, false, container); container.deactivate(req, 1); return true; } @Override public String toString() { return "registerInsert"; } }, NativeThread.NORM_PRIORITY, false); } catch (DatabaseDisabledException e) { // Impossible, we are already on the database thread. } } else { schedCore.rerunRegisterMeRunner(jobRunner); } container.deactivate(req, 1); return; } schedCore.innerRegister(req, random, container, clientContext, null); starter.wakeUp(); } else { schedTransient.innerRegister(req, random, null, clientContext, null); starter.wakeUp(); } }
@Override public synchronized void succeeded(final BaseSendableGet succeeded, boolean persistent) { if (persistent) { try { jobRunner.queue( new DBJob() { @Override public boolean run(ObjectContainer container, ClientContext context) { if (container.ext().isActive(succeeded)) Logger.error(this, "ALREADY ACTIVE in succeeded(): " + succeeded); container.activate(succeeded, 1); schedCore.succeeded(succeeded, container); container.deactivate(succeeded, 1); return false; } @Override public String toString() { return "BaseSendableGet succeeded"; } }, TRIP_PENDING_PRIORITY, false); } catch (DatabaseDisabledException e) { Logger.error( this, "succeeded() on a persistent request but database disabled", new Exception("error")); } // Boost the priority so the PersistentChosenRequest gets deleted reasonably quickly. } else schedTransient.succeeded(succeeded, null); }
@Override public void callFailure( final SendableInsert insert, final LowLevelPutException e, int prio, boolean persistent) { if (!persistent) { insert.onFailure(e, null, null, clientContext); } else { try { jobRunner.queue( new DBJob() { @Override public boolean run(ObjectContainer container, ClientContext context) { if (container.ext().isActive(insert)) Logger.error(this, "ALREADY ACTIVE: " + insert + " in callFailure(insert)"); container.activate(insert, 1); insert.onFailure(e, null, container, context); container.deactivate(insert, 1); return false; } @Override public String toString() { return "SendableInsert onFailure"; } }, prio, false); } catch (DatabaseDisabledException e1) { Logger.error( this, "callFailure() on a persistent request but database disabled", new Exception("error")); } } }
public void queueFillRequestStarterQueue(boolean force) { if (System.currentTimeMillis() < nextQueueFillRequestStarterQueue && !force) return; if (starterQueueLength() > MAX_STARTER_QUEUE_SIZE / 2) return; try { jobRunner.queue(requestStarterQueueFiller, NativeThread.MAX_PRIORITY, true); } catch (DatabaseDisabledException e) { // Ok, do what we can moveKeysFromCooldownQueue(transientCooldownQueue, false, null); } }
public void tripPendingKey(final KeyBlock block) { if (logMINOR) Logger.minor(this, "tripPendingKey(" + block.getKey() + ")"); if (offeredKeys != null) { offeredKeys.remove(block.getKey()); } final Key key = block.getKey(); if (schedTransient.anyProbablyWantKey(key, clientContext)) { this.clientContext.mainExecutor.execute( new PrioRunnable() { @Override public void run() { schedTransient.tripPendingKey(key, block, null, clientContext); } @Override public int getPriority() { return TRIP_PENDING_PRIORITY; } }, "Trip pending key (transient)"); } if (schedCore == null) return; if (schedCore.anyProbablyWantKey(key, clientContext)) { try { jobRunner.queue( new DBJob() { @Override public boolean run(ObjectContainer container, ClientContext context) { if (logMINOR) Logger.minor(this, "tripPendingKey for " + key); if (schedCore.tripPendingKey(key, block, container, clientContext)) context.jobRunner.setCommitSoon(); return false; } @Override public String toString() { return "tripPendingKey"; } }, TRIP_PENDING_PRIORITY, false); } catch (DatabaseDisabledException e) { // Nothing to do } } else schedCore.countNegative(); }