package org.mapdb; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.mapdb.volume.Volume; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Random; import java.util.concurrent.atomic.AtomicLong; import static org.junit.Assert.*; @RunWith(Parameterized.class) public class WALTruncate { final int commitNum; final int cutPointSeed; public WALTruncate(int commitNum, int cutPointSeed) { this.commitNum = commitNum; this.cutPointSeed = cutPointSeed; } @Parameterized.Parameters public static List<Object[]> params() throws IOException { List ret = new ArrayList(); int inc = TT.shortTest()?200:20; for(int commitNum=1;commitNum<1000;commitNum+=inc){ for(int cutPointSeed=0;cutPointSeed<600;cutPointSeed+=inc){ ret.add(new Object[]{commitNum, cutPointSeed}); } } return ret; } @Test public void test(){ File f = TT.tempFile(); WriteAheadLog wal = new WriteAheadLog(f.getPath()); for(int i=0;i<commitNum;i++){ for(int j=0;j<6;j++){ wal.walPutLong(111L, i); } wal.commit(); } int cutPoint = new Random(cutPointSeed).nextInt((int) wal.curVol.length()); wal.curVol.sync(); wal.curVol.clear(cutPoint, wal.curVol.length()); File f2 = wal.curVol.getFile(); wal.close(); wal = new WriteAheadLog(f.getPath()); final AtomicLong i = new AtomicLong(); final AtomicLong c = new AtomicLong(); wal.open(new WriteAheadLog.WALReplay() { @Override public void beforeReplayStart() { } @Override public void afterReplayFinished() { } @Override public void writeLong(long offset, long value) { assertEquals(111L, offset); assertEquals(i.get(), value); assertTrue(c.getAndIncrement()<6); } @Override public void writeRecord(long recid, long walId, Volume vol, long volOffset, int length) { fail(); } @Override public void writeByteArray(long offset, long walId, Volume vol, long volOffset, int length) { fail(); } @Override public void commit() { assertEquals(6, c.get()); c.set(0); i.incrementAndGet(); } @Override public void rollback() { fail(); } @Override public void writeTombstone(long recid) { fail(); } @Override public void writePreallocate(long recid) { fail(); } }); assertEquals(0,c.get()); f.delete(); f2.delete(); } }