/* This file is part of VoltDB. * Copyright (C) 2008-2010 VoltDB L.L.C. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. */ package org.voltdb; import java.util.HashSet; import junit.framework.TestCase; public class TestTransactionIdManager extends TestCase { private TransactionIdManager tim; @Override public void setUp() { tim = new TransactionIdManager(VoltDB.INITIATOR_SITE_ID); } public void testGetNextUniqueId() { long numIds = 100000; long numBusyWork = 0; HashSet<Long> generatedIds = new HashSet<Long>(); long start = System.nanoTime(); for (int ii = 0; ii < numIds; ii++) { Long id = tim.getNextUniqueTransactionId(); assertEquals( false, generatedIds.contains(id)); generatedIds.add(id); //make some busy work for (int zz = 0; zz < numBusyWork; zz++) { long foo1 = zz; Long foo2 = foo1; long foo3 = foo2; Long foo4 = foo3; foo4++; } } generatedIds.clear(); long end = System.nanoTime(); double nanosPerId = (end - start) / numIds; System.out.println("Finished in " + (end - start) + " nanoseconds with " + nanosPerId + " nanoseconds per generated id"); } /** make a good faith effort to wrap the intra-ms counter bits. */ public void testSpinForNextUniqueId() { long lastid = 0; long id = 0; long iters = TransactionIdManager.COUNTER_MAX_VALUE * 3; for (int i = 0; i < iters; ++i) { id = tim.getNextUniqueTransactionId(); assertTrue(id > lastid); lastid = id; } } public void testSiteIdFromTransactionId() { long siteid = TransactionIdManager.getInitiatorIdFromTransactionId(tim.getNextUniqueTransactionId()); assertEquals(siteid, VoltDB.INITIATOR_SITE_ID); TransactionIdManager tim2 = new TransactionIdManager(5); siteid = TransactionIdManager.getInitiatorIdFromTransactionId(tim2.getNextUniqueTransactionId()); assertEquals(5, siteid); siteid = TransactionIdManager.getInitiatorIdFromTransactionId(tim2.getNextUniqueTransactionId()); assertEquals(5, siteid); } public void testLastTxnId() { for (int i = 0; i < 1000; i++) { Long id = tim.getNextUniqueTransactionId(); assertNotNull(id); assertEquals(id, tim.getLastTxnId()); Long id2 = tim.getNextUniqueTransactionId(); assertNotNull(id2); assertEquals(id2, tim.getLastTxnId()); assertTrue(id2 > id); } } public void testTimestampFromId() { long then = System.currentTimeMillis(); long tid = tim.getNextUniqueTransactionId(); long now = System.currentTimeMillis(); assertTrue(then <= TransactionIdManager.getDateFromTransactionId(tid).getTime()); assertTrue(now >= TransactionIdManager.getDateFromTransactionId(tid).getTime()); } public void testInAndOut() { long ts1 = 1267732596224L; //long ts1 = TransactionIdManager.VOLT_EPOCH; long seq1 = 2; long init1 = 6; long txnId1 = TransactionIdManager.makeIdFromComponents(ts1, seq1, init1); System.out.printf("%20d : %s\n", txnId1, TransactionIdManager.toBitString(txnId1)); assertEquals(ts1, TransactionIdManager.getTimestampFromTransactionId(txnId1)); assertEquals(seq1, TransactionIdManager.getSequenceNumberFromTransactionId(txnId1)); assertEquals(init1, TransactionIdManager.getInitiatorIdFromTransactionId(txnId1)); long ts2 = 1267732596224L; //long ts2 = TransactionIdManager.VOLT_EPOCH + 1; long seq2 = 4; long init2 = 6; long txnId2 = TransactionIdManager.makeIdFromComponents(ts2, seq2, init2); System.out.printf("%20d : %s\n", txnId2, TransactionIdManager.toBitString(txnId2)); assertEquals(ts2, TransactionIdManager.getTimestampFromTransactionId(txnId2)); assertEquals(seq2, TransactionIdManager.getSequenceNumberFromTransactionId(txnId2)); assertEquals(init2, TransactionIdManager.getInitiatorIdFromTransactionId(txnId2)); assertTrue(txnId2 > txnId1); System.out.printf("%d > %d\n", txnId1, txnId2); } }