Ivan Rakov created IGNITE-10048:
-----------------------------------
Summary: Bounded iteration in standalone WAL iterator with
compaction enabled may skip records
Key: IGNITE-10048
URL: https://issues.apache.org/jira/browse/IGNITE-10048
Project: Ignite
Issue Type: Improvement
Reporter: Ivan Rakov
Fix For: 2.8
Bounded iteration with non-zero start/end offsets may skip some records in
intermediate segments. Reproducer (wal compaction should be enabled):
{noformat}
/**
*
*/
public void testBoundedIterationOverSeveralSegments() throws Exception {
walCompactionEnabled = true;
IgniteEx ig = (IgniteEx)startGrid();
String archiveWalDir = getArchiveWalDirPath(ig);
ig.cluster().active(true);
IgniteCache<Object, Object> cache = ig.getOrCreateCache(
new CacheConfiguration<>().setName("c-n").setAffinity(new
RendezvousAffinityFunction(false, 32)));
IgniteCacheDatabaseSharedManager sharedMgr =
ig.context().cache().context().database();
IgniteWriteAheadLogManager walMgr =
ig.context().cache().context().wal();
WALPointer fromPtr = null;
int recordsCnt = WAL_SEGMENT_SIZE / 8 /* record size */ * 5;
for (int i = 0; i < recordsCnt; i++) {
WALPointer ptr = walMgr.log(new PartitionDestroyRecord(i, i));
if (i == 100)
fromPtr = ptr;
}
assertNotNull(fromPtr);
cache.put(1, 1);
forceCheckpoint();
// Generate WAL segments for filling WAL archive folder.
for (int i = 0; i < 2 *
ig.configuration().getDataStorageConfiguration().getWalSegments(); i++) {
sharedMgr.checkpointReadLock();
try {
walMgr.log(new SnapshotRecord(i, false),
RolloverType.NEXT_SEGMENT);
}
finally {
sharedMgr.checkpointReadUnlock();
}
}
cache.put(2, 2);
forceCheckpoint();
U.sleep(5000);
stopGrid();
WALIterator it = new IgniteWalIteratorFactory(log)
.iterator(new
IteratorParametersBuilder().from((FileWALPointer)fromPtr).filesOrDirs(archiveWalDir));
TreeSet<Integer> foundCounters = new TreeSet<>();
it.forEach(x -> {
WALRecord rec = x.get2();
if (rec instanceof PartitionDestroyRecord)
foundCounters.add(((WalRecordCacheGroupAware)rec).groupId());
});
assertEquals(new Integer(100), foundCounters.first());
assertEquals(new Integer(recordsCnt - 1), foundCounters.last());
assertEquals(recordsCnt - 100, foundCounters.size());
}
{noformat}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)