in curator-recipes/src/main/java/org/apache/curator/framework/recipes/locks/InterProcessSemaphoreV2.java [241:293]
public Collection<Lease> acquire(int qty, long time, TimeUnit unit) throws Exception {
long startMs = System.currentTimeMillis();
boolean hasWait = (unit != null);
long waitMs = hasWait ? TimeUnit.MILLISECONDS.convert(time, unit) : 0;
Preconditions.checkArgument(qty > 0, "qty cannot be 0");
ImmutableList.Builder<Lease> builder = ImmutableList.builder();
boolean success = false;
try {
while (qty-- > 0) {
int retryCount = 0;
long startMillis = System.currentTimeMillis();
boolean isDone = false;
while (!isDone) {
switch (internalAcquire1Lease(builder, startMs, hasWait, waitMs)) {
case CONTINUE: {
isDone = true;
break;
}
case RETURN_NULL: {
return null;
}
case RETRY_DUE_TO_MISSING_NODE: {
// gets thrown by internalAcquire1Lease when it can't find the lock node
// this can happen when the session expires, etc. So, if the retry allows, just try it all
// again
if (!client.getZookeeperClient()
.getRetryPolicy()
.allowRetry(
retryCount++,
System.currentTimeMillis() - startMillis,
RetryLoop.getDefaultRetrySleeper())) {
throw new KeeperException.NoNodeException(
"Sequential path not found - possible session loss");
}
// try again
break;
}
}
}
}
success = true;
} finally {
if (!success) {
returnAll(builder.build());
}
}
return builder.build();
}