package edu.brown.benchmark.simple; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicLong; import java.util.Random; import org.apache.log4j.Logger; import org.voltdb.CatalogContext; import org.voltdb.VoltTable; import org.voltdb.catalog.Table; import edu.brown.api.BenchmarkComponent; import edu.brown.catalog.CatalogUtil; import edu.brown.api.Loader; import edu.brown.logging.LoggerUtil; import edu.brown.logging.LoggerUtil.LoggerBoolean; import edu.brown.utils.ThreadUtil; public class SimpleLoader extends Loader { private static final Logger LOG = Logger.getLogger(SimpleClient.class); private static final LoggerBoolean debug = new LoggerBoolean(true); static { LoggerUtil.attachObserver(LOG, debug); } private final long init_record_count; private int loadthreads = ThreadUtil.availableProcessors(); public static void main(String args[]) throws Exception { if (debug.val) LOG.debug("MAIN: " + SimpleLoader.class.getName()); BenchmarkComponent.main(SimpleLoader.class, args, true); } public SimpleLoader(String[] args) { super(args); if (debug.val) LOG.debug("CONSTRUCTOR: " + SimpleLoader.class.getName()); long size = -1; for (String key : m_extraParams.keySet()) { String value = m_extraParams.get(key); // TODO: Retrieve parameters if (key.equalsIgnoreCase("num_records")) { size = Long.valueOf(value); } // Multi-Threaded Loader else if (key.equalsIgnoreCase("loadthreads")) { this.loadthreads = Integer.valueOf(value); } } // FOR if(size > 0) this.init_record_count = size; else this.init_record_count = 100; // Constant LOG.info("Initializing Simple database with " + init_record_count + " records."); } // UTILS public static final Random rand = new Random(); public static String astring(int minimum_length, int maximum_length) { return randomString(minimum_length, maximum_length, 'A', 26); } // taken from tpcc.RandomGenerator public static String randomString(int minimum_length, int maximum_length, char base, int numCharacters) { int length = (int)number(minimum_length, maximum_length); byte baseByte = (byte) base; byte[] bytes = new byte[length]; for (int i = 0; i < length; ++i) { bytes[i] = (byte) (baseByte + number(0, numCharacters - 1)); } return new String(bytes); } // taken from tpcc.RandomGenerator public static long number(long minimum, long maximum) { assert minimum <= maximum; long value = Math.abs(rand.nextLong()) % (maximum - minimum + 1) + minimum; assert minimum <= value && value <= maximum; return value; } @Override public void load() { if (debug.val) LOG.debug("Starting SimpleLoader"); final CatalogContext catalogContext = this.getCatalogContext(); final Table catalog_tbl = catalogContext.getTableByName("STABLE"); // Constant final AtomicLong total = new AtomicLong(0); // Multi-threaded loader final int rows_per_thread = (int)Math.ceil(init_record_count / (double)this.loadthreads); final List<Runnable> runnables = new ArrayList<Runnable>(); for (int i = 0; i < this.loadthreads; i++) { final int thread_id = i; final int start = rows_per_thread * i; final int stop = start + rows_per_thread; runnables.add(new Runnable() { @Override public void run() { // Create an empty VoltTable handle and then populate it in batches // to be sent to the DBMS VoltTable table = CatalogUtil.getVoltTable(catalog_tbl); Object row[] = new Object[table.getColumnCount()]; for (int i = start; i < stop; i++) { row[0] = i; row[1] = astring(4, 4); // Constants table.addRow(row); // insert this batch of tuples if (table.getRowCount() >= 10) { // BATCH SIZE - Constant loadVoltTable("STABLE", table); // Constant total.addAndGet(table.getRowCount()); table.clearRowData(); if (debug.val) LOG.debug(String.format("[%d] Records Loaded: %6d / %d", thread_id, total.get(), init_record_count)); } } // FOR // load remaining records if (table.getRowCount() > 0) { loadVoltTable("STABLE", table); // Constant total.addAndGet(table.getRowCount()); table.clearRowData(); if (debug.val) LOG.debug(String.format("[%d] Records Loaded: %6d / %d", thread_id, total.get(), init_record_count)); } } }); } // FOR ThreadUtil.runGlobalPool(runnables); if (debug.val) LOG.info("Finished loading " + catalog_tbl.getName()); } }