package edu.brown.hstore.specexec.checkers; import java.util.Collection; import org.apache.commons.collections15.CollectionUtils; import org.junit.Before; import org.voltdb.catalog.Procedure; import org.voltdb.catalog.Table; import edu.brown.BaseTestCase; import edu.brown.catalog.CatalogUtil; import edu.brown.hstore.HStoreSite; import edu.brown.hstore.MockHStoreSite; import edu.brown.hstore.conf.HStoreConf; import edu.brown.hstore.specexec.checkers.TableConflictChecker; import edu.brown.hstore.txns.LocalTransaction; import edu.brown.utils.PartitionSet; import edu.brown.utils.ProjectType; public class TestTableConflictChecker extends BaseTestCase { private static final int NUM_PARTITIONS = 10; private static final int BASE_PARTITION = 1; private HStoreSite hstore_site; private TableConflictChecker checker; private long nextTxnId = 1000; @Before public void setUp() throws Exception { super.setUp(ProjectType.TM1); this.addPartitions(NUM_PARTITIONS); this.hstore_site = new MockHStoreSite(0, catalogContext, HStoreConf.singleton()); this.checker = new TableConflictChecker(catalogContext); } // ---------------------------------------------------------------------------------- // HELPER METHODS // ---------------------------------------------------------------------------------- private LocalTransaction createTransaction(Procedure catalog_proc) throws Exception { PartitionSet partitions = new PartitionSet(BASE_PARTITION); LocalTransaction ts = new LocalTransaction(this.hstore_site); ts.testInit(this.nextTxnId++, BASE_PARTITION, partitions, catalog_proc, new Object[catalog_proc.getParameters().size()]); return (ts); } // ---------------------------------------------------------------------------------- // TESTS // ---------------------------------------------------------------------------------- /** * testAllProcedures */ public void testAllProcedures() throws Exception { for (Procedure proc0 : catalogContext.getRegularProcedures()) { LocalTransaction txn0 = this.createTransaction(proc0); Collection<Table> tables0 = CatalogUtil.getReferencedTables(proc0); for (Table tbl : tables0) { if (proc0.getReadonly()) { txn0.markTableRead(BASE_PARTITION, tbl); } else { txn0.markTableWritten(BASE_PARTITION, tbl); } } // FOR System.err.println(proc0.getName() + " -> " + tables0); for (Procedure proc1 : catalogContext.getRegularProcedures()) { LocalTransaction txn1 = this.createTransaction(proc1); Collection<Table> tables1 = CatalogUtil.getReferencedTables(proc1); for (Table tbl : tables1) { if (proc1.getReadonly()) { txn1.markTableRead(BASE_PARTITION, tbl); } else { txn1.markTableWritten(BASE_PARTITION, tbl); } } // FOR // XXX: This test is not really useful because we're not actually // trying to guess whether there is a conflict. We're just throwing // everything at the TableConflictChecker to make sure that there aren't // any unexpected problems. Collection<Table> intersection = CollectionUtils.intersection(tables0, tables1); boolean expected = (intersection.isEmpty() == false); boolean result = this.checker.hasConflictBefore(txn0, txn1, BASE_PARTITION); System.err.printf(" %s\n", intersection); System.err.printf(" %s -> %s {%s}\n\n", proc1.getName(), tables1, result); // assertEquals(proc0+"->"+proc1, expected, result); } // FOR System.err.println(); } // FOR } }