in curator-framework/src/main/java/org/apache/curator/framework/imps/SetDataBuilderImpl.java [373:416]
private Stat pathInForeground(final String path, final byte[] data) throws Exception {
OperationTrace trace = client.getZookeeperClient().startAdvancedTracer("SetDataBuilderImpl-Foreground");
Stat resultStat = RetryLoop.callWithRetry(client.getZookeeperClient(), new Callable<Stat>() {
@Override
public Stat call() throws Exception {
if (failBeforeNextSetForTesting) {
failBeforeNextSetForTesting = false;
throw new KeeperException.ConnectionLossException();
}
Stat localResultStat = null;
try {
localResultStat = client.getZooKeeper().setData(path, data, version);
} catch (KeeperException.BadVersionException e) {
if (!idempotent) {
throw e;
}
Stat getStat = new Stat();
// inject fault before performing operation
if (failNextIdempotentCheckForTesting) {
failNextIdempotentCheckForTesting = false;
throw new KeeperException.ConnectionLossException();
}
byte[] existingData = client.getZooKeeper().getData(path, false, getStat);
if (idempotentSetMatches(getStat.getVersion(), data, existingData)) {
localResultStat = getStat;
} else {
throw e;
}
}
if (failNextSetForTesting) {
failNextSetForTesting = false;
throw new KeeperException.ConnectionLossException();
}
return localResultStat;
}
});
trace.setRequestBytesLength(data).setPath(path).setStat(resultStat).commit();
return resultStat;
}