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