GEODE-6973: The pdxRegion.size() should be called outside of TX context to avoid messaging. (#4233)
Co-authored-by: Anil <agingade@pivotal.io>
Co-authored-by: Xiaojian Zhou <gzhou@pivotal.io>
Co-authored-by: Donal Evans <doevans@pivotal.io>
diff --git a/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java b/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
index f25be75..5f78f64 100644
--- a/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
+++ b/geode-core/src/main/java/org/apache/geode/pdx/internal/PeerTypeRegistration.java
@@ -359,7 +359,7 @@
}
lock();
try {
- if (reverseMap.shouldReloadFromRegion(getIdToType())) {
+ if (shouldReload()) {
buildReverseMapsFromRegion();
}
reverseMap.flushPendingReverseMap();
@@ -629,6 +629,17 @@
}
}
+ boolean shouldReload() {
+ boolean shouldReload = false;
+ TXStateProxy currentState = suspendTX();
+ try {
+ shouldReload = reverseMap.shouldReloadFromRegion(getIdToType());
+ } finally {
+ resumeTX(currentState);
+ }
+ return shouldReload;
+ }
+
@Override
public int defineEnum(final EnumInfo newInfo) {
statistics.enumDefined();
@@ -639,7 +650,7 @@
}
lock();
try {
- if (reverseMap.shouldReloadFromRegion(getIdToType())) {
+ if (shouldReload()) {
buildReverseMapsFromRegion();
}
reverseMap.flushPendingReverseMap();
diff --git a/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java b/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
index b58b7ad..9729841 100644
--- a/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
+++ b/geode-core/src/test/java/org/apache/geode/pdx/internal/PeerTypeRegistrationTest.java
@@ -48,6 +48,7 @@
import org.apache.geode.internal.cache.DiskStoreImpl;
import org.apache.geode.internal.cache.InternalCache;
import org.apache.geode.internal.cache.TXManagerImpl;
+import org.apache.geode.internal.cache.TXStateProxy;
import org.apache.geode.internal.statistics.StatisticsManager;
import org.apache.geode.pdx.PdxInitializationException;
@@ -87,6 +88,20 @@
}
@Test
+ public void shouldReloadFromRegionWillNotInvokeInTX() {
+ TXStateProxy txStateProxy = mock(TXStateProxy.class);
+ when(txStateProxy.getTxMgr()).thenReturn(txManager);
+ when(txManager.internalSuspend()).thenReturn(txStateProxy);
+
+ PeerTypeRegistration peerTypeRegistration = new PeerTypeRegistration(internalCache);
+ peerTypeRegistration.initialize();
+ peerTypeRegistration.shouldReload();
+
+ verify(txManager, times(1)).internalSuspend();
+ verify(txManager, times(1)).internalResume(txStateProxy);
+ }
+
+ @Test
public void getLocalSizeReturnsValueAfterInitialized() {
when(region.size()).thenReturn(1);
PeerTypeRegistration peerTypeRegistration = new PeerTypeRegistration(internalCache);