This sounds like https://issues.apache.org/jira/browse/CURATOR-108 - Curator 
2.5.0 added a new method, initialize(), to work around this issue. Please try 
that and let me know.

-Jordan


From: Purshotam Shah [email protected]
Reply: [email protected] [email protected]
Date: June 24, 2014 at 8:20:18 PM
To: [email protected] [email protected]
Subject:  DistributedAtomicLong fails in multithread env.  

We are using DistributedAtomicLong to use job sequenceID in ZK.

We noticed that getZKId in multithread env fails. value.preValue() and 
value.postValue() value = 0 and succeeded = false.

If we synchronized the function it works fine, but I don't think it's a right 
approach.

Other approach is to retry multiple time, but how many times. We need to make 
sure that getZKId return sequence.

What is the best approach?


    DistributedAtomicLong atomicIdGenerator;
    PromotedToLock.Builder lockBuilder = PromotedToLock.builder()
                    
.lockPath(getPromotedLock()).retryPolicy(ZKUtils.getRetryPloicy())
                    .timeout(Service.lockTimeout, TimeUnit.MILLISECONDS);
     atomicIdGenerator = new DistributedAtomicLong(zk.getClient(), 
ZK_SEQUENCE_PATH, ZKUtils.getRetryPloicy(),
                    lockBuilder.build());

    private  long getZKId( ) {
        if (atomicIdGenerator == null) {
            throw new RuntimeException("Sequence generator can't be null. Path 
: " + ZK_SEQUENCE_PATH);
        }
        AtomicValue<Long> value = null;
        try {
            value = atomicIdGenerator.increment();
        }
        catch (Exception e) {
            throw new RuntimeException("Exception incrementing UID for session 
", e);
        }
        finally {
            if (value != null && value.succeeded()) {
                return value.preValue();
            }
            else {
                throw new RuntimeException("Exception incrementing UID for 
session ");
            }
        }

    }

Reply via email to