private void testStopWhileCommitting() throws Exception { String fileName = getBaseDir() + "/testStopWhileCommitting.h3"; FileUtils.delete(fileName); Random r = new Random(0); for (int i = 0; i < 10; ) { MVStore s; TransactionStore ts; Transaction tx; TransactionMap<Integer, String> m; s = MVStore.open(fileName); ts = new TransactionStore(s); tx = ts.begin(); s.setReuseSpace(false); m = tx.openMap("test"); final String value = "x" + i; for (int j = 0; j < 1000; j++) { m.put(j, value); } final AtomicInteger state = new AtomicInteger(); final MVStore store = s; final MVMap<Integer, String> other = s.openMap("other"); Task task = new Task() { @Override public void call() throws Exception { for (int i = 0; !stop; i++) { state.set(i); other.put(i, value); store.commit(); } } }; task.execute(); // wait for the task to start while (state.get() < 1) { Thread.yield(); } // commit while writing in the task tx.commit(); // wait for the task to stop task.get(); store.close(); s = MVStore.open(fileName); // roll back a bit, until we have some undo log entries assertTrue(s.hasMap("undoLog")); for (int back = 0; back < 100; back++) { int minus = r.nextInt(10); s.rollbackTo(Math.max(0, s.getCurrentVersion() - minus)); MVMap<?, ?> undo = s.openMap("undoLog"); if (undo.size() > 0) { break; } } ts = new TransactionStore(s); List<Transaction> list = ts.getOpenTransactions(); if (list.size() != 0) { tx = list.get(0); if (tx.getStatus() == Transaction.STATUS_COMMITTING) { i++; } } s.close(); FileUtils.delete(fileName); assertFalse(FileUtils.exists(fileName)); } }
private void testTwoPhaseCommit() { String fileName = getBaseDir() + "/testTwoPhaseCommit.h3"; FileUtils.delete(fileName); MVStore s; TransactionStore ts; Transaction tx; Transaction txOld; TransactionMap<String, String> m; List<Transaction> list; s = MVStore.open(fileName); ts = new TransactionStore(s); tx = ts.begin(); assertEquals(null, tx.getName()); tx.setName("first transaction"); assertEquals("first transaction", tx.getName()); assertEquals(0, tx.getId()); assertEquals(Transaction.STATUS_OPEN, tx.getStatus()); m = tx.openMap("test"); m.put("1", "Hello"); list = ts.getOpenTransactions(); assertEquals(1, list.size()); txOld = list.get(0); assertTrue(tx.getId() == txOld.getId()); s.commit(); ts.close(); s.close(); s = MVStore.open(fileName); ts = new TransactionStore(s); tx = ts.begin(); assertEquals(1, tx.getId()); m = tx.openMap("test"); assertEquals(null, m.get("1")); m.put("2", "Hello"); list = ts.getOpenTransactions(); assertEquals(2, list.size()); txOld = list.get(0); assertEquals(0, txOld.getId()); assertEquals(Transaction.STATUS_OPEN, txOld.getStatus()); assertEquals("first transaction", txOld.getName()); txOld.prepare(); assertEquals(Transaction.STATUS_PREPARED, txOld.getStatus()); s.commit(); s.close(); s = MVStore.open(fileName); ts = new TransactionStore(s); tx = ts.begin(); m = tx.openMap("test"); // TransactionStore was not closed, so we lost some ids assertEquals(65, tx.getId()); list = ts.getOpenTransactions(); assertEquals(2, list.size()); txOld = list.get(1); assertEquals(1, txOld.getId()); assertEquals(Transaction.STATUS_OPEN, txOld.getStatus()); assertEquals(null, txOld.getName()); txOld.rollback(); txOld = list.get(0); assertEquals(0, txOld.getId()); assertEquals(Transaction.STATUS_PREPARED, txOld.getStatus()); assertEquals("first transaction", txOld.getName()); txOld.commit(); assertEquals("Hello", m.get("1")); s.close(); FileUtils.delete(fileName); }