dschneider-pivotal commented on a change in pull request #7448:
URL: https://github.com/apache/geode/pull/7448#discussion_r830149463



##########
File path: 
geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
##########
@@ -2109,24 +2109,26 @@ int entryCount(Set<Integer> buckets, boolean estimate) {
   @Override
   public int getRegionSize() {
     synchronized (getSizeGuard()) {
-      int result = getRegionMap().size();
-      // if this is a client with no tombstones then we subtract the number
-      // of entries being affected by register-interest refresh
-      if (imageState.isClient() && !getConcurrencyChecksEnabled()) {
-        int destroyedEntriesCount = imageState.getDestroyedEntriesCount();
-        if (result < destroyedEntriesCount) {
-          logger.error("Incorrect region size: mapSize={}, 
destroyedEntriesCount={}.", result,
-              destroyedEntriesCount);
+      synchronized (tombstoneCount) {
+        int result = getRegionMap().size();
+        // if this is a client with no tombstones then we subtract the number
+        // of entries being affected by register-interest refresh
+        if (imageState.isClient() && !getConcurrencyChecksEnabled()) {
+          int destroyedEntriesCount = imageState.getDestroyedEntriesCount();
+          if (result < destroyedEntriesCount) {
+            logger.error("Incorrect region size: mapSize={}, 
destroyedEntriesCount={}.", result,
+                destroyedEntriesCount);
+          }
+          return result - destroyedEntriesCount;

Review comment:
       since we know returning a negative number can cause problems and is not 
meaningful, I think we should return 0  after logging instead of returning a 
negative number

##########
File path: 
geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
##########
@@ -2109,24 +2109,26 @@ int entryCount(Set<Integer> buckets, boolean estimate) {
   @Override
   public int getRegionSize() {
     synchronized (getSizeGuard()) {
-      int result = getRegionMap().size();
-      // if this is a client with no tombstones then we subtract the number
-      // of entries being affected by register-interest refresh
-      if (imageState.isClient() && !getConcurrencyChecksEnabled()) {
-        int destroyedEntriesCount = imageState.getDestroyedEntriesCount();
-        if (result < destroyedEntriesCount) {
-          logger.error("Incorrect region size: mapSize={}, 
destroyedEntriesCount={}.", result,
-              destroyedEntriesCount);
+      synchronized (tombstoneCount) {

Review comment:
       I think synchronizing on an atomic is an "odd" thing to do and is worth 
you adding a comment here to explain the race it prevents. I think it would 
even be worth having the comment refer to your new 
regionSizeShouldAlwaysBePositive test

##########
File path: 
geode-core/src/main/java/org/apache/geode/internal/cache/LocalRegion.java
##########
@@ -2109,24 +2109,26 @@ int entryCount(Set<Integer> buckets, boolean estimate) {
   @Override
   public int getRegionSize() {
     synchronized (getSizeGuard()) {
-      int result = getRegionMap().size();
-      // if this is a client with no tombstones then we subtract the number
-      // of entries being affected by register-interest refresh
-      if (imageState.isClient() && !getConcurrencyChecksEnabled()) {
-        int destroyedEntriesCount = imageState.getDestroyedEntriesCount();
-        if (result < destroyedEntriesCount) {
-          logger.error("Incorrect region size: mapSize={}, 
destroyedEntriesCount={}.", result,
-              destroyedEntriesCount);
+      synchronized (tombstoneCount) {
+        int result = getRegionMap().size();
+        // if this is a client with no tombstones then we subtract the number
+        // of entries being affected by register-interest refresh
+        if (imageState.isClient() && !getConcurrencyChecksEnabled()) {
+          int destroyedEntriesCount = imageState.getDestroyedEntriesCount();
+          if (result < destroyedEntriesCount) {
+            logger.error("Incorrect region size: mapSize={}, 
destroyedEntriesCount={}.", result,
+                destroyedEntriesCount);
+          }
+          return result - destroyedEntriesCount;
         }
-        return result - destroyedEntriesCount;
-      }
 
-      int tombstoneNumber = tombstoneCount.get();
-      if (result < tombstoneNumber) {
-        logger.error("Incorrect region size: mapSize={}, tombstoneCount={}.", 
result,
-            tombstoneNumber);
+        int tombstoneNumber = tombstoneCount.get();
+        if (result < tombstoneNumber) {
+          logger.error("Incorrect region size: mapSize={}, 
tombstoneCount={}.", result,
+              tombstoneNumber);

Review comment:
       return 0 here also




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@geode.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org


Reply via email to