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();
  }