private Stat pathInForeground()

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;
    }