Skip to content

Commit

Permalink
Multiple IAtomicReference issues fixed
Browse files Browse the repository at this point in the history
1. getAndAlter test was testing alterAndGet method
2. AlterAndGetOperation optimized - sen backup only when (serialized) new value is different from the original value
3. AlterOperation fixed - use serialized values to make a decision whether to persist change - otherwise a change is lost when the function mutates the original object instead of creating a backup
4. GetAndAlterOperation fixed - the same issues as with AlterOperation

Fixes hazelcast#8149
(cherry picked from commit 2ad2e7b)
  • Loading branch information
jerrinot committed May 11, 2016
1 parent 549815d commit e9e27c2
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 11 deletions.
Expand Up @@ -37,12 +37,16 @@ public void run() throws Exception {
IFunction f = nodeEngine.toObject(function);
AtomicReferenceContainer atomicReferenceContainer = getReferenceContainer();

Object input = nodeEngine.toObject(atomicReferenceContainer.get());
Data originalData = atomicReferenceContainer.get();
Object input = nodeEngine.toObject(originalData);
//noinspection unchecked
Object output = f.apply(input);
shouldBackup = true;
backup = nodeEngine.toData(output);
atomicReferenceContainer.set(backup);
Data serializedOutput = nodeEngine.toData(output);
shouldBackup = !isEquals(originalData, serializedOutput);
if (shouldBackup) {
backup = serializedOutput;
atomicReferenceContainer.set(backup);
}
response = output;
}

Expand Down
Expand Up @@ -37,12 +37,14 @@ public void run() throws Exception {
IFunction f = nodeEngine.toObject(function);
AtomicReferenceContainer reference = getReferenceContainer();

Object input = nodeEngine.toObject(reference.get());
Data originalData = reference.get();
Object input = nodeEngine.toObject(originalData);
//noinspection unchecked
Object output = f.apply(input);
shouldBackup = !isEquals(input, output);
Data serializedOutput = nodeEngine.toData(output);
shouldBackup = !isEquals(originalData, serializedOutput);
if (shouldBackup) {
backup = nodeEngine.toData(output);
backup = serializedOutput;
reference.set(backup);
}
}
Expand Down
Expand Up @@ -37,14 +37,15 @@ public void run() throws Exception {
IFunction f = nodeEngine.toObject(function);
AtomicReferenceContainer atomicReferenceContainer = getReferenceContainer();

response = atomicReferenceContainer.get();
Object input = nodeEngine.toObject(atomicReferenceContainer.get());
response = input;
//noinspection unchecked
Object output = f.apply(input);
shouldBackup = !isEquals(input, output);
Data serializedOutput = nodeEngine.toData(output);
shouldBackup = !isEquals(response, serializedOutput);
if (shouldBackup) {
backup = nodeEngine.toData(output);
atomicReferenceContainer.set(backup);
atomicReferenceContainer.set(serializedOutput);
backup = serializedOutput;
}
}

Expand Down
Expand Up @@ -325,12 +325,36 @@ public void testToString() {
public void getAndAlter_when_same_reference() {
BitSet bitSet = new BitSet();
IAtomicReference<BitSet> ref2 = newInstance();

ref2.set(bitSet);
assertEquals(bitSet, ref2.getAndAlter(new FailingFunctionAlter()));

bitSet.set(100);
assertEquals(bitSet, ref2.get());
}

@Test
public void alterAndGet_when_same_reference() {
BitSet bitSet = new BitSet();
IAtomicReference<BitSet> ref2 = newInstance();

ref2.set(bitSet);
bitSet.set(100);

assertEquals(bitSet, ref2.alterAndGet(new FailingFunctionAlter()));
assertEquals(bitSet, ref2.get());
}

@Test
public void alter_when_same_reference() {
BitSet bitSet = new BitSet();
IAtomicReference<BitSet> ref2 = newInstance();
ref2.set(bitSet);
bitSet.set(100);
ref2.alter(new FailingFunctionAlter());
assertEquals(bitSet, ref2.get());
}

private static class FailingFunctionAlter implements IFunction<BitSet, BitSet> {
@Override
public BitSet apply(BitSet input) {
Expand Down

0 comments on commit e9e27c2

Please sign in to comment.