@Override
 public ClientKey getKey(Object token, ObjectContainer container) {
   if (persistent) {
     container.activate(this, 1);
     container.activate(segment, 1);
   }
   synchronized (segment) {
     if (cancelled) {
       if (logMINOR)
         Logger.minor(this, "Segment is finishing when getting key " + token + " on " + this);
       return null;
     }
     ClientKey key = segment.getBlockKey(((MySendableRequestItem) token).x, container);
     if (key == null) {
       if (segment.isFinished(container)) {
         Logger.error(this, "Segment finished but didn't tell us! " + this);
       } else if (segment.isFinishing(container)) {
         Logger.error(this, "Segment finishing but didn't tell us! " + this);
       } else {
         Logger.error(
             this,
             "Segment not finishing yet still returns null for getKey()!: "
                 + token
                 + " for "
                 + this,
             new Exception("debug"));
       }
     }
     return key;
   }
 }
 @Override
 public boolean hasValidKeys(
     KeysFetchingLocally keys, ObjectContainer container, ClientContext context) {
   if (persistent) {
     container.activate(this, 1);
     container.activate(blockNums, 1);
     container.activate(segment, 1);
   }
   boolean hasSet = false;
   boolean retval = false;
   synchronized (segment) {
     for (int i = 0; i < 10; i++) {
       Integer ret;
       int x;
       if (blockNums.isEmpty()) {
         break;
       }
       x = context.random.nextInt(blockNums.size());
       ret = blockNums.get(x);
       int block = ret;
       Key key = segment.getBlockNodeKey(block, container);
       if (key == null) {
         if (segment.isFinishing(container) || segment.isFinished(container)) return false;
         if (segment.haveBlock(block, container))
           Logger.error(
               this,
               "Already have block "
                   + ret
                   + " but was in blockNums on "
                   + this
                   + " in hasValidKeys");
         else
           Logger.error(
               this, "Key is null for block " + ret + " for " + this + " in hasValidKeys");
         blockNums.remove(x);
         if (persistent) {
           container.delete(ret);
           if (!hasSet) {
             hasSet = true;
             container.store(blockNums);
           }
         }
         continue;
       }
       if (keys.hasKey(key)) {
         continue;
       }
       retval = true;
       break;
     }
   }
   if (persistent) {
     container.deactivate(blockNums, 5);
     container.deactivate(segment, 1);
   }
   return retval;
 }
 private SendableRequestItem getRandomBlockNum(
     KeysFetchingLocally keys, ClientContext context, ObjectContainer container) {
   if (persistent) {
     container.activate(this, 1);
     container.activate(blockNums, 1);
     container.activate(segment, 1);
   }
   logMINOR = Logger.shouldLog(Logger.MINOR, this);
   synchronized (segment) {
     if (blockNums.isEmpty()) {
       if (logMINOR) Logger.minor(this, "No blocks to remove");
       return null;
     }
     for (int i = 0; i < 10; i++) {
       Integer ret;
       int x;
       if (blockNums.size() == 0) return null;
       x = context.random.nextInt(blockNums.size());
       ret = blockNums.get(x);
       int num = ret;
       Key key = segment.getBlockNodeKey(num, container);
       if (key == null) {
         if (segment.isFinishing(container) || segment.isFinished(container)) return null;
         if (segment.haveBlock(num, container))
           Logger.error(this, "Already have block " + ret + " but was in blockNums on " + this);
         else Logger.error(this, "Key is null for block " + ret + " for " + this);
         continue;
       }
       if (keys.hasKey(key)) {
         continue;
       }
       if (logMINOR)
         Logger.minor(
             this,
             "Removing block "
                 + x
                 + " of "
                 + (blockNums.size() + 1)
                 + " : "
                 + ret
                 + " on "
                 + this);
       return new MySendableRequestItem(num);
     }
     return null;
   }
 }
 public boolean isEmpty(ObjectContainer container) {
   if (persistent) container.activate(segment, 1);
   return segment.isFinishing(container);
 }