You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by es...@apache.org on 2019/01/09 21:25:28 UTC

[geode] branch develop updated: GEODE-6260: Do not cleanup non-dirty entries in transactional set operation (#3060)

This is an automated email from the ASF dual-hosted git repository.

eshu11 pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 8a9d999  GEODE-6260: Do not cleanup non-dirty entries in transactional set operation (#3060)
8a9d999 is described below

commit 8a9d999dc8451a2310459cd657639808a9599f50
Author: pivotal-eshu <es...@pivotal.io>
AuthorDate: Wed Jan 9 13:25:18 2019 -0800

    GEODE-6260: Do not cleanup non-dirty entries in transactional set operation (#3060)
---
 .../java/org/apache/geode/internal/cache/TXState.java  |  7 +++++++
 .../org/apache/geode/internal/cache/TXStateTest.java   | 18 ++++++++++++++++++
 2 files changed, 25 insertions(+)

diff --git a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
index d074857..3474a2d 100644
--- a/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
+++ b/geode-core/src/main/java/org/apache/geode/internal/cache/TXState.java
@@ -1540,6 +1540,13 @@ public class TXState implements TXStateInterface {
         txr = txWriteRegion(internalRegion, keyInfo);
       }
       result = dataReg.createReadEntry(txr, keyInfo, createIfAbsent);
+      if (result == null) {
+        // createReadEntry will only returns null if createIfAbsent is false.
+        // CreateIfAbsent will only be false when this method is called by set operations.
+        // In that case we do not want the TXState to have a TXEntryState.
+        assert !createIfAbsent;
+        return result;
+      }
     }
 
     if (result != null) {
diff --git a/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java b/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
index d65c361..2727ec9 100644
--- a/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
+++ b/geode-core/src/test/java/org/apache/geode/internal/cache/TXStateTest.java
@@ -179,4 +179,22 @@ public class TXStateTest {
     assertThat(txState.getOriginatingMember()).isSameAs(txStateProxy.getOnBehalfOfClientMember());
   }
 
+  @Test
+  public void txReadEntryDoesNotCleanupNonDirtyEntriesIfRegionCreateReadEntryReturnsNull() {
+    TXState txState = spy(new TXState(txStateProxy, true));
+    KeyInfo keyInfo = mock(KeyInfo.class);
+    Object key = new Object();
+    InternalRegion internalRegion = mock(InternalRegion.class);
+    InternalRegion dataRegion = mock(InternalRegion.class);
+    TXRegionState txRegionState = mock(TXRegionState.class);
+    when(internalRegion.getDataRegionForWrite(keyInfo)).thenReturn(dataRegion);
+    when(txState.txReadRegion(dataRegion)).thenReturn(txRegionState);
+    when(keyInfo.getKey()).thenReturn(key);
+    when(txRegionState.readEntry(key)).thenReturn(null);
+    when(dataRegion.createReadEntry(txRegionState, keyInfo, false)).thenReturn(null);
+
+    assertThat(txState.txReadEntry(keyInfo, internalRegion, true, null, false)).isNull();
+    verify(txRegionState, never()).cleanupNonDirtyEntries(dataRegion);
+  }
+
 }