public VoltTable[] doWork(SQLStmt select, SQLStmt insert, long cid) { if (select != null) { // use select / insert // Get row for cid and copy to new table. voltQueueSQL(select, cid); VoltTable[] results = voltExecuteSQL(); VoltTable data = results[0]; if (data.getRowCount() != 1) { throw new VoltAbortException("Failed to find cid that should exist: cid=" + cid); } data.advanceRow(); long rcid = data.getLong(0); if (rcid != cid) { throw new VoltAbortException( "Failed to find cid does not match. (" + rcid + ":" + cid + ")"); } long txnid = data.getLong(1); long rowid = data.getLong(2); voltQueueSQL(insert, rcid, txnid, rowid); return voltExecuteSQL(); } else { // use insert into voltQueueSQL(insert, cid); VoltTable[] results = voltExecuteSQL(); VoltTable data = results[0]; int cnt = (int) data.fetchRow(0).getLong(0); if (cnt != 1) { throw new VoltAbortException( "incorrect number of inserted rows=" + cnt + " for cid=" + cid); } return results; } }
public VoltTable[] run( short w_id, byte d_id, double h_amount, short c_w_id, byte c_d_id, byte[] c_last, TimestampType timestamp) throws VoltAbortException { voltQueueSQL(getCustomersByLastName, c_last, c_d_id, c_w_id); final VoltTable customers = voltExecuteSQL()[0]; final int namecnt = customers.getRowCount(); if (namecnt == 0) { String c_lastString = null; try { c_lastString = new String(c_last, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } throw new VoltAbortException( "paymentByCustomerNameC: no customers with last name: " + c_lastString + " in warehouse: " + c_w_id + " and in district " + c_d_id); } final int index = (namecnt - 1) / 2; final VoltTableRow customer = customers.fetchRow(index); final int c_id = (int) customer.getLong(C_ID_IDX); return processPayment(w_id, d_id, c_w_id, c_d_id, c_id, h_amount, customer, timestamp); }
public VoltTable[] getOrderStatus(short w_id, byte d_id, int c_id, VoltTable customer) { voltQueueSQL(getLastOrder, w_id, d_id, c_id); final VoltTable order = voltExecuteSQL()[0]; final long o_id = order.fetchRow(0).getLong(O_ID_IDX); voltQueueSQL(getOrderLines, w_id, o_id, d_id); final VoltTable orderLines = voltExecuteSQL()[0]; return new VoltTable[] {customer, order, orderLines}; }
/** sums the contents of a latency bucket table. */ private long[] latencySummaryHelper(VoltTable vt) { long sums[] = new long[20]; for (int i = 0; i < vt.getRowCount(); i++) { VoltTableRow row = vt.fetchRow(i); // 20 buckets for (int c = 0; c < 20; c++) { // 7 ignored header columns sums[c] += row.getLong(c + 7); } } return sums; }
@Override public void clientCallback(ClientResponse response) throws Exception { // Track the result of the operation (Success, Failure, Payload traffic...) if (response.getStatus() == ClientResponse.SUCCESS) { final VoltTable pairData = response.getResults()[0]; // Cache miss (Key does not exist) if (pairData.getRowCount() == 0) { missedGets.incrementAndGet(); } else { final PayloadProcessor.Pair pair = processor.retrieveFromStore( pairData.fetchRow(0).getString(0), pairData.fetchRow(0).getVarbinary(1)); successfulGets.incrementAndGet(); if (rand < config.multisingleratio) successfulGetsMPT.incrementAndGet(); else successfulGetsMPF.incrementAndGet(); networkGetData.addAndGet(pair.getStoreValueLength()); rawGetData.addAndGet(pair.getRawValueLength()); } } else { failedGets.incrementAndGet(); } }
@Override public void clientCallback(ClientResponse response) throws Exception { // Track the result of the operation (Success, Failure, Payload traffic...) if (response.getStatus() == ClientResponse.SUCCESS) { successfulPuts.incrementAndGet(); if (rand < config.multisingleratio) successfulPutsMPT.incrementAndGet(); else successfulPutsMPF.incrementAndGet(); final VoltTable pairData = response.getResults()[0]; final VoltTableRow tablerow = pairData.fetchRow(0); final long counter = tablerow.getLong(0); hashMap.put(thisPair.Key, counter); } else { failedPuts.incrementAndGet(); } networkPutData.addAndGet(storeValueLength); rawPutData.addAndGet(rawValueLength); }
/** * Queries all the tables present in default database and load them into 'tables' map. * * @param theTables the tables */ @Override protected void openInternal(final Map<Base36, VoltDBTable> theTables) { theTables.clear(); final VoltTable[] results; try { results = backend.client().callProcedure("@SystemCatalog", "TABLES").getResults(); for (final VoltTable node : results) { int count = 0; while (node.advanceRow()) { final VoltTableRow row = node.fetchRow(count++); final String tName = row.getString("TABLE_NAME"); theTables.put(Base36.get(tName.toLowerCase()), new VoltDBTable(this, tName)); } } } catch (final Exception e) { throw new DBException("Error Opening Database: " + theTables, e); } }
public long run(String key, long by, byte increment) { final int now = Shared.init(this, key); voltQueueSQL(check, key, now); VoltTable checkResult = voltExecuteSQL()[1]; if (checkResult.getRowCount() == 0) return VoltType.NULL_BIGINT; try { final byte[] oldRawData = checkResult.fetchRow(0).getVarbinary(1); final long old_value = Long.parseLong(new String(oldRawData, "UTF-8")); long value = old_value + (increment == 1 ? by : -by); if (value < 0l) // Underflow protection: per protocol, this should be an unsigned long... value = 0l; final byte[] newRawData = Long.toString(value).getBytes("UTF-8"); voltQueueSQL(update, newRawData, key); voltExecuteSQL(true); return old_value; } catch (Exception x) { throw new VoltAbortException(x); } }
@Override public void clientCallback(ClientResponse response) throws Exception { if (response.getStatus() == ClientResponse.SUCCESS) { final VoltTable pairData = response.getResults()[0]; if (pairData.getRowCount() != 0) { successfulPutCount.incrementAndGet(); final long hashMapCount = hashMap.get(key); final long dbCount = ByteBuffer.wrap(pairData.fetchRow(0).getVarbinary(1)).getLong(0); if (dbCount < hashMapCount) { missingPutCount.incrementAndGet(); incorrectPutCount.addAndGet(hashMapCount - dbCount); System.out.printf( "ERROR: Key %s: count in db '%d' is less than client expected '%d'\n", key.replaceAll("\\s", ""), dbCount, hashMapCount); } } } else { System.out.print("ERROR: Bad Client response from Volt"); System.exit(1); } }
public VoltTable[] run(short w_id, byte d_id, byte[] c_last) { voltQueueSQL(getCustomersByLastName, w_id, d_id, c_last); VoltTable customers = voltExecuteSQL()[0]; // Get the midpoint customer's id final int namecnt = customers.getRowCount(); final int index = (namecnt - 1) / 2; final VoltTableRow customer = customers.fetchRow(index); final long c_id = customer.getLong(C_ID_IDX); // Build an VoltTable with a single customer row final VoltTable customerResultTable = result_template.clone(1024); customerResultTable.addRow( c_id, customer.getStringAsBytes(1), customer.getStringAsBytes(2), customer.getStringAsBytes(3), customer.getDouble(4)); // Do the rest of the work return getOrderStatus(w_id, d_id, c_id, customerResultTable); }
public long run(String key, byte[] value) { final int now = baseInit(key); voltQueueSQL(check, key, now); VoltTable checkResult = voltExecuteSQL()[1]; if (checkResult.getRowCount() == 0) return Result.NOT_STORED; ByteArrayOutputStream stream = new ByteArrayOutputStream(); try { byte[] old = checkResult.fetchRow(0).getVarbinary(1); stream.write(value, 0, value.length); stream.write(old, 0, old.length); voltQueueSQL(update, stream.toByteArray(), key); voltExecuteSQL(true); return Result.STORED; } catch (Exception x) { throw new VoltAbortException(x); } finally { try { stream.close(); } catch (Exception cx) { } } }
public VoltTable[] run(long rowid, long ignore) { @SuppressWarnings("deprecation") long txid = getVoltPrivateRealTransactionIdDontUseMe(); // Critical for proper determinism: get a cluster-wide consistent Random instance Random rand = new Random(txid); // Check if the record exists first voltQueueSQL(check, rowid); // Grab resultset for possibly existing record VoltTable item = voltExecuteSQL()[0]; // If the record exist perform an update or delete if (item.getRowCount() > 0) { // Randomly decide whether to delete (or update) the record if (rand.nextBoolean()) { voltQueueSQL(delete, rowid); // Export deletion VoltTableRow row = item.fetchRow(0); voltQueueSQL( export, txid, rowid, row.get(1, VoltType.TINYINT), row.get(2, VoltType.TINYINT), row.get(3, VoltType.TINYINT), row.get(4, VoltType.SMALLINT), row.get(5, VoltType.SMALLINT), row.get(6, VoltType.INTEGER), row.get(7, VoltType.INTEGER), row.get(8, VoltType.BIGINT), row.get(9, VoltType.BIGINT), row.get(10, VoltType.TIMESTAMP), row.get(11, VoltType.TIMESTAMP), row.get(12, VoltType.FLOAT), row.get(13, VoltType.FLOAT), row.get(14, VoltType.DECIMAL), row.get(15, VoltType.DECIMAL), row.get(16, VoltType.STRING), row.get(17, VoltType.STRING), row.get(18, VoltType.STRING), row.get(19, VoltType.STRING), row.get(20, VoltType.STRING), row.get(21, VoltType.STRING)); } else { SampleRecord record = new SampleRecord(rowid, rand); voltQueueSQL( update, record.type_null_tinyint, record.type_not_null_tinyint, record.type_null_smallint, record.type_not_null_smallint, record.type_null_integer, record.type_not_null_integer, record.type_null_bigint, record.type_not_null_bigint, record.type_null_timestamp, record.type_not_null_timestamp, record.type_null_float, record.type_not_null_float, record.type_null_decimal, record.type_not_null_decimal, record.type_null_varchar25, record.type_not_null_varchar25, record.type_null_varchar128, record.type_not_null_varchar128, record.type_null_varchar1024, record.type_not_null_varchar1024, rowid); } } else { // Insert a new record SampleRecord record = new SampleRecord(rowid, rand); voltQueueSQL( insert, rowid, record.rowid_group, record.type_null_tinyint, record.type_not_null_tinyint, record.type_null_smallint, record.type_not_null_smallint, record.type_null_integer, record.type_not_null_integer, record.type_null_bigint, record.type_not_null_bigint, record.type_null_timestamp, record.type_not_null_timestamp, record.type_null_float, record.type_not_null_float, record.type_null_decimal, record.type_not_null_decimal, record.type_null_varchar25, record.type_not_null_varchar25, record.type_null_varchar128, record.type_not_null_varchar128, record.type_null_varchar1024, record.type_not_null_varchar1024); } // Execute last SQL batch voltExecuteSQL(true); // Retun to caller return null; }
@Override public void run() { // ratio of upsert for @Load*Table final float upsertratio = 0.50F; // ratio of upsert to an existing table for @Load*Table final float upserthitratio = 0.20F; CopyAndDeleteDataTask cdtask = new CopyAndDeleteDataTask(); cdtask.start(); try { while (m_shouldContinue.get()) { // 1 in 3 gets copied and then deleted after leaving some data byte shouldCopy = (byte) (m_random.nextInt(3) == 0 ? 1 : 0); byte upsertMode = (byte) (m_random.nextFloat() < upsertratio ? 1 : 0); byte upsertHitMode = (byte) ((upsertMode != 0) && (m_random.nextFloat() < upserthitratio) ? 1 : 0); CountDownLatch latch = new CountDownLatch(batchSize); final ArrayList<Long> lcpDelQueue = new ArrayList<Long>(); // try to insert batchSize random rows for (int i = 0; i < batchSize; i++) { m_table.clearRowData(); m_permits.acquire(); long p = Math.abs(r.nextLong()); m_table.addRow(p, p, Calendar.getInstance().getTimeInMillis()); boolean success = false; if (!m_isMP) { Object rpartitionParam = TheHashinator.valueToBytes( m_table.fetchRow(0).get(m_partitionedColumnIndex, VoltType.BIGINT)); if (upsertHitMode != 0) { // for test upsert an existing row, insert it and then upsert same row // again. success = client.callProcedure( new InsertCallback(latch, p, shouldCopy), m_procName, rpartitionParam, m_tableName, (byte) 1, m_table); } success = client.callProcedure( new InsertCallback(latch, p, shouldCopy), m_procName, rpartitionParam, m_tableName, (byte) 1, m_table); } else { if (upsertHitMode != 0) { success = client.callProcedure( new InsertCallback(latch, p, shouldCopy), m_procName, m_tableName, (byte) 1, m_table); } success = client.callProcedure( new InsertCallback(latch, p, shouldCopy), m_procName, m_tableName, (byte) 1, m_table); } // Ad if successfully queued but remove if proc fails. if (success) { if (shouldCopy != 0) { lcpDelQueue.add(p); } else { onlyDelQueue.add(p); } } } // Wait for all @Load{SP|MP}Done latch.await(); cpDelQueue.addAll(lcpDelQueue); long nextRowCount = 0; try { nextRowCount = TxnId2Utils.getRowCount(client, m_tableName); } catch (Exception e) { hardStop("getrowcount exception", e); } // if no progress, throttle a bit if (nextRowCount == currentRowCount.get()) { Thread.sleep(1000); } if (onlyDelQueue.size() > 0 && m_shouldContinue.get()) { List<Long> workList = new ArrayList<Long>(); onlyDelQueue.drainTo(workList); CountDownLatch odlatch = new CountDownLatch(workList.size()); for (Long lcid : workList) { client.callProcedure(new DeleteCallback(odlatch, 1), m_onlydelprocName, lcid); } odlatch.await(); } } // Any accumulated in p/mp tables are left behind. } catch (Exception e) { // on exception, log and end the thread, but don't kill the process log.error( "LoadTableLoader failed a procedure call for table " + m_tableName + " and the thread will now stop.", e); } finally { cdtask.shutdown(); try { cdtask.join(); } catch (InterruptedException ex) { log.error("CopyDelete Task was stopped.", ex); } } }
public VoltTable[] run(long zip) throws VoltAbortException { Date timestamp = new Date(); // create a District, Warehouse, and 4 Customers (multiple, since we // want to test for correct behavior of paymentByCustomerName. final double initialYTD = 15241.45; voltQueueSQL( insertDistrict, 7L, 3L, "A District", "Street Addy", "meh", "westerfield", "BA", "99999", .0825, initialYTD, 21L); // check that a district was inserted long resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); voltQueueSQL( insertWarehouse, 3L, "EZ Street WHouse", "Headquarters", "77 Mass. Ave.", "Cambridge", "AZ", "12938", .1234, initialYTD); // check that a warehouse was inserted resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); final double initialBalance = 15.75; voltQueueSQL( insertCustomer, C_ID, D_ID, W_ID, "I", "Be", "lastname", "Place", "Place2", "BiggerPlace", "AL", "91083", "(193) 099 - 9082", new Date(), "BC", 19298943.12, .13, initialBalance, initialYTD, 0L, 15L, "Some History"); // check that a customer was inserted resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); voltQueueSQL( insertCustomer, C_ID + 1, D_ID, W_ID, "We", "Represent", "Customer", "Random Department", "Place2", "BiggerPlace", "AL", "13908", "(913) 909 - 0928", new Date(), "GC", 19298943.12, .13, initialBalance, initialYTD, 1L, 15L, "Some History"); // check that a customer was inserted resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); voltQueueSQL( insertCustomer, C_ID + 2, D_ID, W_ID, "Who", "Is", "Customer", "Receiving", "450 Mass F.X.", "BiggerPlace", "CI", "91083", "(541) 931 - 0928", new Date(), "GC", 19899324.21, .13, initialBalance, initialYTD, 2L, 15L, "Some History"); // check that a customer was inserted resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); voltQueueSQL( insertCustomer, C_ID + 3, D_ID, W_ID, "ICanBe", "", "Customer", "street", "place", "BiggerPlace", "MA", "91083", "(913) 909 - 0928", new Date(), "GC", 19298943.12, .13, initialBalance, initialYTD, 3L, 15L, "Some History"); // check that a customer was inserted resultsl = voltExecuteSQL()[0].asScalarLong(); assert (resultsl == 1); // long d_id, long w_id, double h_amount, String c_last, long c_w_id, // long c_d_id final double paymentAmount = 500.25; // VoltTable[] results = client.callProcedure("paymentByCustomerName", W_ID, // D_ID, paymentAmount, W_ID, D_ID, "Customer", new Date()); // assertEquals(3, results.length); // being proc voltQueueSQL(getCustomersByLastName, "Customer", D_ID, W_ID); final VoltTable customers = voltExecuteSQL()[0]; final int namecnt = customers.getRowCount(); if (namecnt == 0) { throw new VoltAbortException( "no customers with last name: " + "Customer" + " in warehouse: " + W_ID + " and in district " + D_ID); } try { System.out.println("PAYMENT FOUND CUSTOMERS: " + customers.toString()); } catch (Exception e) { e.printStackTrace(); } final int index = (namecnt - 1) / 2; final VoltTableRow customer = customers.fetchRow(index); final long c_id = customer.getLong(C_ID_IDX); voltQueueSQL(getWarehouse, W_ID); voltQueueSQL(getDistrict, W_ID, D_ID); final VoltTable[] results = voltExecuteSQL(); final VoltTable warehouse = results[0]; final VoltTable district = results[1]; try { System.out.println("WAREHOUSE PRE: " + warehouse.toString()); } catch (Exception e) { e.printStackTrace(); } voltQueueSQL(getWarehouses); VoltTable warehouses = voltExecuteSQL()[0]; try { System.out.println("WAREHOUSE PRE: " + warehouses.toString()); } catch (Exception e) { e.printStackTrace(); } voltQueueSQL(updateWarehouseBalance, paymentAmount, W_ID); voltQueueSQL(updateDistrictBalance, paymentAmount, W_ID, D_ID); voltExecuteSQL(); voltQueueSQL(getWarehouses); warehouses = voltExecuteSQL()[0]; try { System.out.println("WAREHOUSE PRE: " + warehouses.toString()); } catch (Exception e) { e.printStackTrace(); } // do stuff to extract district and warehouse info. // customer info final byte[] c_first = customer.getStringAsBytes(C_FIRST_IDX); final byte[] c_middle = customer.getStringAsBytes(C_MIDDLE_IDX); final byte[] c_last = customer.getStringAsBytes(C_LAST_IDX); final byte[] c_street_1 = customer.getStringAsBytes(C_STREET_1_IDX); final byte[] c_street_2 = customer.getStringAsBytes(C_STREET_2_IDX); final byte[] c_city = customer.getStringAsBytes(C_CITY_IDX); final byte[] c_state = customer.getStringAsBytes(C_STATE_IDX); final byte[] c_zip = customer.getStringAsBytes(C_ZIP_IDX); final byte[] c_phone = customer.getStringAsBytes(C_PHONE_IDX); final TimestampType c_since = customer.getTimestampAsTimestamp(C_SINCE_IDX); final byte[] c_credit = customer.getStringAsBytes(C_CREDIT_IDX); final double c_credit_lim = customer.getDouble(C_CREDIT_LIM_IDX); final double c_discount = customer.getDouble(C_DISCOUNT_IDX); final double c_balance = customer.getDouble(C_BALANCE_IDX) - paymentAmount; final double c_ytd_payment = customer.getDouble(C_YTD_PAYMENT_IDX) + paymentAmount; final long c_payment_cnt = customer.getLong(C_PAYMENT_CNT_IDX) + 1; byte[] c_data; if (Arrays.equals(c_credit, Constants.BAD_CREDIT_BYTES)) { c_data = customer.getStringAsBytes(C_DATA_IDX); byte[] newData = (c_id + " " + D_ID + " " + W_ID + " " + D_ID + " " + W_ID + " " + paymentAmount + "|") .getBytes(); int newLength = newData.length + c_data.length; if (newLength > Constants.MAX_C_DATA) { newLength = Constants.MAX_C_DATA; } ByteBuilder builder = new ByteBuilder(newLength); int minLength = newLength; if (newData.length < minLength) minLength = newData.length; builder.append(newData, 0, minLength); int remaining = newLength - minLength; builder.append(c_data, 0, remaining); c_data = builder.array(); voltQueueSQL( updateBCCustomer, c_balance, c_ytd_payment, c_payment_cnt, c_data, W_ID, D_ID, c_id); } else { c_data = new byte[0]; voltQueueSQL(updateGCCustomer, c_balance, c_ytd_payment, c_payment_cnt, W_ID, D_ID, c_id); } // Concatenate w_name, four spaces, d_name byte[] w_name = warehouse.fetchRow(0).getStringAsBytes(W_NAME_IDX); final byte[] FOUR_SPACES = {' ', ' ', ' ', ' '}; byte[] d_name = district.fetchRow(0).getStringAsBytes(D_NAME_IDX); ByteBuilder builder = new ByteBuilder(w_name.length + FOUR_SPACES.length + d_name.length); builder.append(w_name); builder.append(FOUR_SPACES); builder.append(d_name); byte[] h_data = builder.array(); // Create the history record voltQueueSQL(insertHistory, c_id, D_ID, W_ID, D_ID, W_ID, timestamp, paymentAmount, h_data); voltExecuteSQL(); // TPC-C 2.5.3.3: Must display the following fields: // W_ID, D_ID, C_ID, C_D_ID, C_W_ID, W_STREET_1, W_STREET_2, W_CITY, W_STATE, W_ZIP, // D_STREET_1, D_STREET_2, D_CITY, D_STATE, D_ZIP, C_FIRST, C_MIDDLE, C_LAST, C_STREET_1, // C_STREET_2, C_CITY, C_STATE, C_ZIP, C_PHONE, C_SINCE, C_CREDIT, C_CREDIT_LIM, // C_DISCOUNT, C_BALANCE, the first 200 characters of C_DATA (only if C_CREDIT = "BC"), // H_AMOUNT, and H_DATE. // Return the entire warehouse and district tuples. The client provided: // w_id, d_id, c_d_id, c_w_id, h_amount, h_data. // Build a table for the rest final VoltTable misc = misc_template.clone(8192); misc.addRow( c_id, c_first, c_middle, c_last, c_street_1, c_street_2, c_city, c_state, c_zip, c_phone, c_since, c_credit, c_credit_lim, c_discount, c_balance, c_data); // Hand back all the warehouse, district, and customer data VoltTable[] resultsX = new VoltTable[] {warehouse, district, misc}; // resume test code // check that the middle "Customer" was returned assert ((C_ID + 1) == (resultsX[2].fetchRow(0).getLong("c_id"))); assert ("".equals(resultsX[2].fetchRow(0).getString("c_data"))); // Verify that both warehouse, district and customer were updated // correctly // VoltTable[] allTables = client.callProcedure("SelectAll"); voltQueueSQL(getWarehouses); warehouses = voltExecuteSQL()[0]; try { System.out.println("WAREHOUSE POST: " + warehouses.toString()); } catch (Exception e) { e.printStackTrace(); } assert (1 == warehouses.getRowCount()); double amt1 = initialYTD + paymentAmount; double amt2 = warehouses.fetchRow(0).getDouble("W_YTD"); assert (amt1 == amt2); voltQueueSQL(getDistricts); VoltTable districts = voltExecuteSQL()[0]; assert (1 == districts.getRowCount()); assert ((initialYTD + paymentAmount) == districts.fetchRow(0).getDouble("D_YTD")); voltQueueSQL(getCustomers); VoltTable customersX = voltExecuteSQL()[0]; assert (4 == customersX.getRowCount()); assert ((C_ID + 1) == customersX.fetchRow(1).getLong("C_ID")); assert ((initialBalance - paymentAmount) == customersX.fetchRow(1).getDouble("C_BALANCE")); assert ((initialYTD + paymentAmount) == customersX.fetchRow(1).getDouble("C_YTD_PAYMENT")); assert (2 == customersX.fetchRow(1).getLong("C_PAYMENT_CNT")); return null; }