// Write-lock & delete 'k'. Will fail if 'k' is locked by anybody other than 'job_key' public static void delete(Key k, Key job_key) { if (k == null) return; Value val = DKV.get(k); if (val == null) return; // Or just nothing there to delete if (!val.isLockable()) UKV.remove(k); // Simple things being deleted else ((Lockable) val.get()).delete(job_key, 0.0f); // Lockable being deleted }
@Override public void lcompute() { // Optional: cancel all jobs // for (Job job : Job.all()) { // job.cancel(); // Job.waitUntilJobEnded(job.self()); // } final Set<Key> keySet = H2O.globalKeySet(null); for (Key key : keySet) { if (!key.home()) continue; // only unlock local keys final Value val = DKV.get(key); if (val == null) continue; if (val.rawPOJO() == null) continue; // need to have a POJO to be locked if (!val.isLockable()) continue; final Object obj = val.rawPOJO(); assert (obj instanceof Lockable<?>); final Lockable<?> lockable = (Lockable<?>) (obj); final Key[] lockers = ((Lockable) obj)._lockers; if (lockers != null) { // check that none of the locking jobs is still running for (Key locker : lockers) { if (locker != null && locker.type() == Key.JOB) { final Job job = UKV.get(locker); if (job != null && job.isRunning()) throw new UnsupportedOperationException( "Cannot unlock all keys since locking jobs are still running."); } } lockable.unlock_all(); Log.info("Unlocked key '" + key + "' from " + lockers.length + " lockers."); } } Log.info("All keys are now unlocked."); tryComplete(); }
// ----------- // Atomically get a read-lock, preventing future deletes or updates public static void read_lock(Key k, Key job_key) { Value val = DKV.get(k); if (val.isLockable()) ((Lockable) val.get()).read_lock(job_key); // Lockable being locked }