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)

Reply via email to