code: @Override public final void compute2( ) {
      assert _key.home() : "Atomic on wrong node; SELF="+H2O.SELF+
        ", key_home="+_key.home_node()+", key_is_home="+_key.home()+", class="+getClass();
      Futures fs = new Futures(); // Must block on all invalidates eventually
      Value val1 = DKV.get(_key);
      while( true ) {
        // Run users' function.  This is supposed to read-only from val1 and
        // return new val2 to atomically install.
        Value val2 = atomic(val1);
        if( val2 == null ) break; // ABORT: they gave up
        assert val1 != val2;      // No returning the same Value
        // Attempt atomic update
        Value res = DKV.DputIfMatch(_key,val2,val1,fs);
        if( res == val1 ) {       // Success?
          onSuccess(val1);        // Call user's post-XTN function
          fs.blockForPending();   // Block for any pending invalidates on the atomic update
          break;
        }
        val1 = res;               // Otherwise try again with the current value
      }                           // and retry
      _key = null;                // No need for key no more, don't send it back
      tryComplete();              // Tell F/J this task is done
    }
docs: The (remote) workhorse: