[ https://issues.apache.org/jira/browse/GEODE-2694?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15965147#comment-15965147 ]
Eric Shu commented on GEODE-2694: --------------------------------- There are two places that entry will be destroyed when recovered_from_disk bit is set to true. After processing a full gii, all entries with the recovered_from_disk bit set to true will be destroyed, possibly try to remove the unfinished operations. final void finishInitializeOwner(LocalRegion drs, GIIStatus giiStatus) { if (isReadyForRecovery()) { // this.scheduleCompaction(); if (GIIStatus.didFullGII(giiStatus)) { --> destroyRemainingRecoveredEntries(drs); } else if (GIIStatus.didDeltaGII(giiStatus)) { // TODO: not sure if we should destroy old tombstones for deltaGII } else if (getRegionVersionVector() != null) { destroyOldTomstones(drs); } releaseRecoveryData(); } and here in InitialImageOperation.getFromOne // review unfinished keys and remove untouched entries if (this.region.getDataPolicy().withPersistence() && keysOfUnfinishedOps != null && !keysOfUnfinishedOps.isEmpty()) { final DiskRegion dr = this.region.getDiskRegion(); assert dr != null; for (Object key : keysOfUnfinishedOps) { RegionEntry re = this.entries.getEntry(key); if (re == null) { continue; } if (logger.isTraceEnabled(LogMarker.GII)) { logger.trace(LogMarker.GII, "Processing unfinished operation:entry={}", re); } DiskEntry de = (DiskEntry) re; synchronized (de) { DiskId id = de.getDiskId(); if (id != null && EntryBits.isRecoveredFromDisk(id.getUserBits())) { this.region.destroyRecoveredEntry(key); if (isDebugEnabled) { logger.debug("Deleted unfinished keys:key={}", key); } } } The bit set in dr.testIsRecoveredAndClear is clearly needed during finishing gii. During full gii, we could rewrite the entry to disk -- the optimization in the following could be thought as the entry was rewritten to disk as they have the same version tag. // If the received entry and what we have in the cache // actually are equal, keep don't put the received // entry into the cache (this avoids writing a record to disk) if (entriesEqual) { continue; } Will add unit tests to verify the RECOVERED_FROM_DISK bit after GII. > RECOVERED_FROM_DISK bit is cleared during gii, but should be restored if the > recovered entry and gii entry has the same version tag > ----------------------------------------------------------------------------------------------------------------------------------- > > Key: GEODE-2694 > URL: https://issues.apache.org/jira/browse/GEODE-2694 > Project: Geode > Issue Type: Bug > Components: regions > Reporter: Eric Shu > > Currently for all gii entries, product clears the RECOVERED_FROM_DISK bit for > DiskEntry. However, if entry comes from gii has the same version as recovered > entry, the RECOVERED_FROM_DISK bit should be restored but does not. > {noformat} > synchronized (re) { // fixes bug 41409 > if (dr.testIsRecoveredAndClear(re)) { > wasRecovered = true; > if (tmpValue == null) { > tmpValue = entry.isLocalInvalid() ? Token.LOCAL_INVALID : > Token.INVALID; > } > // Compare the version stamps, and if they are equal > // we can skip adding the entry we receive as part of GII. > VersionStamp stamp = re.getVersionStamp(); > boolean entriesEqual = stamp != null && > stamp.asVersionTag().equals(tag); > // If the received entry and what we have in the cache > // actually are equal, keep don't put the received > // entry into the cache (this avoids writing a record to disk) > if (entriesEqual) { > continue; > } > {noformat} -- This message was sent by Atlassian JIRA (v6.3.15#6346)