You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@geode.apache.org by "ASF GitHub Bot (Jira)" <ji...@apache.org> on 2021/01/07 18:18:00 UTC

[jira] [Commented] (GEODE-8278) Gateway sender queues using heap memory way above configured value after server restart

    [ https://issues.apache.org/jira/browse/GEODE-8278?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17260699#comment-17260699 ] 

ASF GitHub Bot commented on GEODE-8278:
---------------------------------------

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



##########
File path: geode-core/src/main/java/org/apache/geode/internal/cache/AbstractRegionMap.java
##########
@@ -838,11 +838,11 @@ public boolean initialImagePut(final Object key, final long lastModified, Object
                 if (result) {
                   if (oldIsTombstone) {
                     owner.unscheduleTombstone(oldRe);
-                    if (newValue != Token.TOMBSTONE) {

Review comment:
       I agree with Alberto. I don't see any reason to do call lruEntryUpdate/lruEntryCreate if the next thing we are going to do is call lruEntryDestroy. But it does seem like this code should make sure to call one of lruEntry(Create/Update/Destroy). So I would change it to be:
   `                if (result) {
                     if (oldIsTombstone) {
                       owner.unscheduleTombstone(oldRe);
                     }
                     if (newValue == Token.TOMBSTONE) {
                       if (!oldIsDestroyedOrRemoved) {
                         owner.updateSizeOnRemove(key, oldSize);
                       }
                       owner.scheduleTombstone(oldRe, entryVersion);
                       lruEntryDestroy(oldRe);
                     } else {
                       int newSize = owner.calculateRegionEntryValueSize(oldRe);
                       if (!oldIsTombstone) {
                         owner.updateSizeOnPut(key, oldSize, newSize);
                         lruEntryUpdate(oldRe);
                       } else {
                         owner.updateSizeOnCreate(key, newSize);
                         lruEntryCreate(oldRe);
                       }
                       EntryLogger.logInitialImagePut(_getOwnerObject(), key, newValue);
                     }
                   }
   `




----------------------------------------------------------------
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.

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


> Gateway sender queues using heap memory way above configured value after server restart
> ---------------------------------------------------------------------------------------
>
>                 Key: GEODE-8278
>                 URL: https://issues.apache.org/jira/browse/GEODE-8278
>             Project: Geode
>          Issue Type: Bug
>          Components: eviction
>            Reporter: Alberto Gomez
>            Assignee: Alberto Gomez
>            Priority: Major
>              Labels: pull-request-available
>
> In a Geode system with the following characteristics:
>  * WAN replication
>  * partition redundant regions
>  * overflow configured for the gateway senders queues by means of persistence and maximum queue memory set.
>  * gateway receivers stopped in one site (B)
>  * Operations sent to the site that does not have the gateway receivers stopped (A)
> When operations are sent to site A, the gateway sender queues start to grow as expected and the heap memory consumed by the queues does not grow indefinitely given that there is overflow to disk when the limit is reached.
> But, if a server is restarted, the restarted server will show a much higher heap memory used than the memory used by this server before it was restarted or by the other servers.
> This can even provoke that the server cannot be restarted if the heap memory it requires is above the limit configured.
> According to the memory analyzer the entries taking up the memory are subclasses of ```VMThinDiskLRURegionEntryHeap```.
> The number of instances of this type are the same in the restarted server than in the not restarted servers but on the restarted server they take much more memory. The reason seems to be that the ```value``` member attribute of the instances, in the case of the restarted server contains ```VMCachedDeserializable``` objects while in the case of the not restarted server the attribute contains either ```null``` or ```GatewaySenderEventImpl``` objects that use much less memory than the ```VMCachedDeserializable``` ones.
>  If redundancy is not configured for the region then the problem is not manifested, i.e. the heap memory used by the restarted server is similar to the one prior to the restart.
> If the node not restarted is restarted then the previously restarted node seems to release the extra memory (my guess is that it is processing the other process queue).
> Also, if traffic is sent again to the Geode cluster, then it seems eviction kicks in and after some short time, the memory of the restarted server goes down to the level it had before it had been restarted.
> As a summary, the problem seems to be that if a server does GII (getInitialImage) from another server, eviction does not occur for gateway sender queue entries.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)