private void unlockWithRetry(HiveLock hiveLock, String parent) throws LockException { int tryNum = 0; do { try { tryNum++; if (tryNum > 1) { Thread.sleep(sleepTime); } unlockPrimitive(hiveLock, parent, curatorFramework); break; } catch (Exception e) { if (tryNum >= numRetriesForUnLock) { String name = ((ZooKeeperHiveLock)hiveLock).getPath(); throw new LockException("Node " + name + " can not be deleted after " + numRetriesForUnLock + " attempts.", e); } } } while (tryNum < numRetriesForUnLock); return; }
@Override public boolean equals(Object o) { if (!(o instanceof ZooKeeperHiveLock)) { return false; } ZooKeeperHiveLock zLock = (ZooKeeperHiveLock)o; return path.equals(zLock.getPath()) && obj.equals(zLock.getHiveLockObject()) && mode == zLock.getHiveLockMode(); }
private void unlockWithRetry(HiveLock hiveLock, String parent) throws LockException { int tryNum = 0; do { try { tryNum++; if (tryNum > 1) { Thread.sleep(sleepTime); } unlockPrimitive(hiveLock, parent, curatorFramework); break; } catch (Exception e) { if (tryNum >= numRetriesForUnLock) { String name = ((ZooKeeperHiveLock)hiveLock).getPath(); LOG.error("Node " + name + " can not be deleted after " + numRetriesForUnLock + " attempts."); throw new LockException(e); } } } while (tryNum < numRetriesForUnLock); return; }
@Override public boolean equals(Object o) { if (!(o instanceof ZooKeeperHiveLock)) { return false; } ZooKeeperHiveLock zLock = (ZooKeeperHiveLock)o; return path.equals(zLock.getPath()) && obj.equals(zLock.getHiveLockObject()) && mode == zLock.getHiveLockMode(); }
@Override public boolean equals(Object o) { if (!(o instanceof ZooKeeperHiveLock)) { return false; } ZooKeeperHiveLock zLock = (ZooKeeperHiveLock)o; return path.equals(zLock.getPath()) && obj.equals(zLock.getHiveLockObject()) && mode == zLock.getHiveLockMode(); } }
private void unlockWithRetry(HiveLock hiveLock, String parent) throws LockException { int tryNum = 0; do { try { tryNum++; if (tryNum > 1) { Thread.sleep(sleepTime); } unlockPrimitive(hiveLock, parent, curatorFramework); break; } catch (Exception e) { if (tryNum >= numRetriesForUnLock) { String name = ((ZooKeeperHiveLock)hiveLock).getPath(); LOG.error("Node " + name + " can not be deleted after " + numRetriesForUnLock + " attempts."); throw new LockException(e); } } } while (tryNum < numRetriesForUnLock); return; }
private static void unlock(HiveConf conf, ZooKeeper zkpClient, HiveLock hiveLock, String parent) throws LockException { ZooKeeperHiveLock zLock = (ZooKeeperHiveLock)hiveLock; try { zkpClient.delete(zLock.getPath(), -1); // Delete the parent node if all the children have been deleted HiveLockObject obj = zLock.getHiveLockObject(); String name = getLastObjectName(parent, obj); List<String> children = zkpClient.getChildren(name, false); if ((children == null) || (children.isEmpty())) { zkpClient.delete(name, -1); } } catch (Exception e) { LOG.error("Failed to release ZooKeeper lock: " + e); throw new LockException(e); } }
@VisibleForTesting static void unlockPrimitive(HiveLock hiveLock, String parent, CuratorFramework curatorFramework) throws LockException { ZooKeeperHiveLock zLock = (ZooKeeperHiveLock)hiveLock; HiveLockObject obj = zLock.getHiveLockObject(); String name = getLastObjectName(parent, obj); try { curatorFramework.delete().forPath(zLock.getPath()); // Delete the parent node if all the children have been deleted List<String> children = curatorFramework.getChildren().forPath(name); if (children == null || children.isEmpty()) { curatorFramework.delete().forPath(name); } } catch (KeeperException.NoNodeException nne) { //can happen in retrying deleting the zLock after exceptions like InterruptedException //or in a race condition where parent has already been deleted by other process when it //is to be deleted. Both cases should not raise error LOG.debug("Node " + zLock.getPath() + " or its parent has already been deleted."); } catch (KeeperException.NotEmptyException nee) { //can happen in a race condition where another process adds a zLock under this parent //just before it is about to be deleted. It should not be a problem since this parent //can eventually be deleted by the process which hold its last child zLock LOG.debug("Node " + name + " to be deleted is not empty."); } catch (Exception e) { //exceptions including InterruptException and other KeeperException LOG.error("Failed to release ZooKeeper lock: ", e); throw new LockException(e); } }