package org.ethereum.datasource; import org.ethereum.crypto.HashUtil; import org.ethereum.db.SlowHashMapDb; import org.ethereum.db.StateSource; import org.ethereum.util.ByteUtil; import org.ethereum.util.Utils; import org.junit.Ignore; import org.junit.Test; import java.util.Arrays; import java.util.Map; import static java.lang.Math.max; import static org.ethereum.crypto.HashUtil.sha3; import static org.ethereum.util.ByteUtil.intToBytes; import static org.ethereum.util.ByteUtil.intsToBytes; import static org.spongycastle.util.encoders.Hex.decode; /** * Created by Anton Nashatyrev on 19.01.2017. */ public class AsyncWriteCacheTest { volatile boolean flushing; @Test public void simpleTest1() { final SlowHashMapDb<String> db = new SlowHashMapDb<String>().withDelay(100); AsyncWriteCache<byte[], String> cache = new AsyncWriteCache<byte[], String>(db) { @Override protected WriteCache<byte[], String> createCache(Source<byte[], String> source) { return new WriteCache.BytesKey<String>(source, WriteCache.CacheType.SIMPLE) { @Override public boolean flush() { flushing = true; System.out.println("Flushing started"); boolean ret = super.flush(); System.out.println("Flushing complete"); flushing = false; return ret; } }; } }; cache.put(decode("1111"), "1111"); cache.flush(); assert cache.get(decode("1111")) == "1111"; while (!flushing); System.out.println("get"); assert cache.get(decode("1111")) == "1111"; System.out.println("put"); cache.put(decode("2222"), "2222"); System.out.println("get"); assert flushing; while (flushing) { assert cache.get(decode("2222")) == "2222"; assert cache.get(decode("1111")) == "1111"; } assert cache.get(decode("2222")) == "2222"; assert cache.get(decode("1111")) == "1111"; cache.put(decode("1111"), "1112"); cache.flush(); assert cache.get(decode("1111")) == "1112"; assert cache.get(decode("2222")) == "2222"; while (!flushing); System.out.println("Second flush"); cache.flush(); System.out.println("Second flush complete"); assert cache.get(decode("1111")) == "1112"; assert cache.get(decode("2222")) == "2222"; System.out.println("put"); cache.put(decode("3333"), "3333"); assert cache.get(decode("1111")) == "1112"; assert cache.get(decode("2222")) == "2222"; assert cache.get(decode("3333")) == "3333"; System.out.println("Second flush"); cache.flush(); System.out.println("Second flush complete"); assert cache.get(decode("1111")) == "1112"; assert cache.get(decode("2222")) == "2222"; assert cache.get(decode("3333")) == "3333"; assert db.get(decode("1111")) == "1112"; assert db.get(decode("2222")) == "2222"; assert db.get(decode("3333")) == "3333"; } @Ignore @Test public void highLoadTest1() throws InterruptedException { final SlowHashMapDb<byte[]> db = new SlowHashMapDb<byte[]>() { @Override public void updateBatch(Map<byte[], byte[]> rows) { Utils.sleep(10000); super.updateBatch(rows); } }; StateSource stateSource = new StateSource(db, false); stateSource.getReadCache().withMaxCapacity(1); stateSource.put(sha3(intToBytes(1)), intToBytes(1)); stateSource.put(sha3(intToBytes(2)), intToBytes(2)); System.out.println("Flush..."); stateSource.flush(); System.out.println("Flush!"); Thread.sleep(100); System.out.println("Get..."); byte[] bytes1 = stateSource.get(sha3(intToBytes(1))); System.out.println("Get!: " + bytes1); byte[] bytes2 = stateSource.get(sha3(intToBytes(2))); System.out.println("Get!: " + bytes2); // int cnt = 0; // while(true) { // for (int i = 0; i < 1000; i++) { // stateSource.put(sha3(intToBytes(cnt)), intToBytes(cnt)); // cnt++; // } // // stateSource.getWriteCache().flush(); // //// for (int i = 0; i < 200; i++) { //// stateSource.put(sha3(intToBytes(cnt)), intToBytes(cnt)); //// cnt++; //// } // // Thread.sleep(800); // // for (int i = max(0, cnt - 1000); i < cnt; i++) { // // byte[] bytes = stateSource.get(sha3(intToBytes(i))); // assert Arrays.equals(bytes, intToBytes(i)); // } // System.err.println("Iteration done"); // } // // } }