public ClientKeyBlock getBlock(
     ObjectContainer container, ClientContext context, boolean calledByCB) {
   try {
     synchronized (this) {
       if (finished) return null;
     }
     if (persistent) container.store(this);
     return encode(container, context, calledByCB);
   } catch (InsertException e) {
     if (persistent) container.activate(cb, 1);
     cb.onFailure(e, this, container, context);
     if (persistent && !calledByCB) container.deactivate(cb, 1);
     return null;
   } catch (Throwable t) {
     if (persistent) container.activate(cb, 1);
     Logger.error(this, "Caught " + t, t);
     cb.onFailure(
         new InsertException(InsertException.INTERNAL_ERROR, t, null), this, container, context);
     if (persistent && !calledByCB) container.deactivate(cb, 1);
     return null;
   }
 }
 private void fail(
     InsertException e, boolean forceFatal, ObjectContainer container, ClientContext context) {
   synchronized (this) {
     if (finished) return;
     finished = true;
   }
   if (persistent) container.store(this);
   if (e.isFatal() || forceFatal) parent.fatallyFailedBlock(container, context);
   else parent.failedBlock(container, context);
   unregister(container, context, getPriorityClass(container));
   if (freeData) {
     if (persistent) container.activate(sourceData, 1);
     sourceData.free();
     if (persistent) sourceData.removeFrom(container);
     sourceData = null;
     if (persistent) container.store(this);
   }
   if (persistent) container.activate(cb, 1);
   cb.onFailure(e, this, container, context);
 }
 public void cancel(ObjectContainer container, ClientContext context) {
   synchronized (this) {
     if (finished) return;
     finished = true;
   }
   boolean wasActive = true;
   if (persistent) {
     container.store(this);
     wasActive = container.ext().isActive(cb);
     if (!wasActive) container.activate(cb, 1);
     container.activate(sourceData, 1);
   }
   if (freeData) {
     sourceData.free();
     if (persistent) sourceData.removeFrom(container);
     sourceData = null;
     if (persistent) container.store(this);
   }
   super.unregister(container, context, getPriorityClass(container));
   cb.onFailure(new InsertException(InsertException.CANCELLED), this, container, context);
   if (!wasActive) container.deactivate(cb, 1);
 }