use of org.zalando.nakadi.exceptions.runtime.OperationInterruptedException in project nakadi by zalando.
the class AbstractZkSubscriptionClient method resetCursors.
@Override
public final void resetCursors(final List<SubscriptionCursorWithoutToken> cursors, final long timeout) throws OperationTimeoutException, ZookeeperException, OperationInterruptedException, RequestInProgressException {
ZkSubscription<List<String>> sessionsListener = null;
boolean resetWasAlreadyInitiated = false;
try {
// close subscription connections
getCurator().create().withMode(CreateMode.EPHEMERAL).forPath(resetCursorPath);
final AtomicBoolean sessionsChanged = new AtomicBoolean(true);
sessionsListener = subscribeForSessionListChanges(() -> {
sessionsChanged.set(true);
synchronized (sessionsChanged) {
sessionsChanged.notifyAll();
}
});
final long finishAt = System.currentTimeMillis() + timeout;
while (finishAt > System.currentTimeMillis()) {
if (sessionsChanged.compareAndSet(true, false)) {
if (sessionsListener.getData().isEmpty()) {
forceCommitOffsets(cursors);
return;
}
}
synchronized (sessionsChanged) {
sessionsChanged.wait(100);
}
}
} catch (final InterruptedException e) {
Thread.currentThread().interrupt();
throw new OperationInterruptedException("Resetting cursors is interrupted", e);
} catch (final KeeperException.NodeExistsException e) {
resetWasAlreadyInitiated = true;
throw new RequestInProgressException("Cursors reset is already in progress for provided subscription", e);
} catch (final KeeperException.NoNodeException e) {
throw new UnableProcessException("Impossible to reset cursors for subscription", e);
} catch (final Exception e) {
getLog().error(e.getMessage(), e);
throw new ZookeeperException("Unexpected problem occurred when resetting cursors", e);
} finally {
if (sessionsListener != null) {
sessionsListener.close();
}
try {
if (!resetWasAlreadyInitiated) {
getCurator().delete().guaranteed().forPath(resetCursorPath);
}
} catch (final Exception e) {
getLog().error(e.getMessage(), e);
}
}
throw new OperationTimeoutException("Timeout resetting cursors");
}
Aggregations