diff --git a/src/main/java/com/oltpbenchmark/DBWorkload.java b/src/main/java/com/oltpbenchmark/DBWorkload.java index 7427f2c64..b31a06793 100644 --- a/src/main/java/com/oltpbenchmark/DBWorkload.java +++ b/src/main/java/com/oltpbenchmark/DBWorkload.java @@ -782,6 +782,8 @@ private static void writeHistograms(Results r) { sb.append(StringUtil.bold("Unknown Status Transactions:")).append("\n").append(r.getUnknown()).append("\n\n"); + sb.append(StringUtil.bold("Zero Rows Transactions:")).append("\n").append(r.getZeroRows()).append("\n\n"); + if (!r.getAbortMessages().isEmpty()) { sb.append("\n\n").append(StringUtil.bold("User Aborts:")).append("\n").append(r.getAbortMessages()); } diff --git a/src/main/java/com/oltpbenchmark/Results.java b/src/main/java/com/oltpbenchmark/Results.java index 913ae22b7..91fc4ff85 100644 --- a/src/main/java/com/oltpbenchmark/Results.java +++ b/src/main/java/com/oltpbenchmark/Results.java @@ -39,6 +39,7 @@ public final class Results { private final Histogram retry = new Histogram<>(false); private final Histogram error = new Histogram<>(false); private final Histogram retryDifferent = new Histogram<>(false); + private final Histogram zeroRows = new Histogram<>(true); private final Map> abortMessages = new HashMap<>(); private final FeaturebenchAdditionalResults featurebenchAdditionalResults = new FeaturebenchAdditionalResults(); @@ -84,6 +85,10 @@ public Histogram getRetryDifferent() { return retryDifferent; } + public Histogram getZeroRows() { + return zeroRows; + } + public FeaturebenchAdditionalResults getFeaturebenchAdditionalResults() { return featurebenchAdditionalResults; } diff --git a/src/main/java/com/oltpbenchmark/ThreadBench.java b/src/main/java/com/oltpbenchmark/ThreadBench.java index 299257ad2..568902fec 100644 --- a/src/main/java/com/oltpbenchmark/ThreadBench.java +++ b/src/main/java/com/oltpbenchmark/ThreadBench.java @@ -328,6 +328,7 @@ private Results runRateLimitedMultiPhase() { results.getAbort().putAll(txnTypes, 0); results.getError().putAll(txnTypes, 0); results.getRetryDifferent().putAll(txnTypes, 0); + results.getZeroRows().putAll(txnTypes, 0); for (Worker w : workers) { results.getUnknown().putHistogram(w.getTransactionUnknownHistogram()); @@ -336,6 +337,7 @@ private Results runRateLimitedMultiPhase() { results.getAbort().putHistogram(w.getTransactionAbortHistogram()); results.getError().putHistogram(w.getTransactionErrorHistogram()); results.getRetryDifferent().putHistogram(w.getTransactionRetryDifferentHistogram()); + results.getZeroRows().putHistogram(w.getTransactionZeroRowsHistogram()); results.getFeaturebenchAdditionalResults().setJsonResultsList(w.featurebenchAdditionalResults.getJsonResultsList()); } diff --git a/src/main/java/com/oltpbenchmark/api/Worker.java b/src/main/java/com/oltpbenchmark/api/Worker.java index 13d72e73b..9a620ea63 100644 --- a/src/main/java/com/oltpbenchmark/api/Worker.java +++ b/src/main/java/com/oltpbenchmark/api/Worker.java @@ -56,6 +56,7 @@ public abstract class Worker implements Runnable { private final Histogram txnAbort = new Histogram<>(); private final Histogram txnRetry = new Histogram<>(); private final Histogram txnErrors = new Histogram<>(); + private final Histogram txnZeroRows = new Histogram<>(); private final Histogram txtRetryDifferent = new Histogram<>(); protected Connection conn = null; private WorkloadState workloadState; @@ -171,6 +172,9 @@ public final Histogram getTransactionRetryDifferentHistogram() return (this.txtRetryDifferent); } + public final Histogram getTransactionZeroRowsHistogram() { + return (this.txnZeroRows); + } /** * Stop executing the current statement. */ @@ -452,7 +456,7 @@ protected final void doWork(DatabaseType databaseType, TransactionType transacti conn.rollback(); if (isRetryable(ex)) { - LOG.debug(String.format("Retryable SQLException occurred during [%s]... current retry attempt [%d], max retry attempts [%d], sql state [%s], error code [%d].", transactionType, retryCount, maxRetryCount, ex.getSQLState(), ex.getErrorCode()), ex); + LOG.debug(String.format("Retryable SQLException occurred during [%s]... current retry attempt [%d], max retry attempts [%d], sql state [%s], error code [%d].", transactionType, retryCount, maxRetryCount, ex.getSQLState(), ex.getErrorCode())); status = TransactionStatus.RETRY; @@ -482,6 +486,7 @@ protected final void doWork(DatabaseType databaseType, TransactionType transacti case RETRY -> this.txnRetry.put(transactionType); case RETRY_DIFFERENT -> this.txtRetryDifferent.put(transactionType); case ERROR -> this.txnErrors.put(transactionType); + case ZERO_ROWS -> this.txnZeroRows.put(transactionType); } } @@ -516,6 +521,7 @@ private boolean isRetryable(SQLException ex) { // MySQL ER_LOCK_WAIT_TIMEOUT return true; } else if(errorCode > 0 && !sqlState.isEmpty()) { + // Added by Yugabyte to retry on all errors return true; } diff --git a/src/main/java/com/oltpbenchmark/benchmarks/featurebench/FeatureBenchWorker.java b/src/main/java/com/oltpbenchmark/benchmarks/featurebench/FeatureBenchWorker.java index a847b2c44..caec8d075 100644 --- a/src/main/java/com/oltpbenchmark/benchmarks/featurebench/FeatureBenchWorker.java +++ b/src/main/java/com/oltpbenchmark/benchmarks/featurebench/FeatureBenchWorker.java @@ -246,28 +246,19 @@ protected TransactionStatus executeWork(Connection conn, TransactionType txnType List baseUtils = query.getBaseUtils(); int count = query.getCount(); for (int i = 0; i < count; i++) { - for (int j = 0; j < baseUtils.size(); j++) { + for (int j = 0; j < baseUtils.size(); j++) stmt.setObject(j + 1, baseUtils.get(j).get()); - } if (query.isSelectQuery()) { ResultSet rs = stmt.executeQuery(); int countSet = 0; - while (rs.next()) { - countSet++; - } - if (countSet == 0) { - isRetry = true; - } + while (rs.next()) countSet++; + if (countSet == 0) return TransactionStatus.ZERO_ROWS; } else { int updatedRows = stmt.executeUpdate(); - if (updatedRows == 0) { - isRetry = true; - } + if (updatedRows == 0) return TransactionStatus.ZERO_ROWS; } } } - if (isRetry) - return TransactionStatus.RETRY; } catch (ClassNotFoundException | InvocationTargetException | InstantiationException | IllegalAccessException | diff --git a/src/main/java/com/oltpbenchmark/types/TransactionStatus.java b/src/main/java/com/oltpbenchmark/types/TransactionStatus.java index df3745f00..d6ef1d6ab 100644 --- a/src/main/java/com/oltpbenchmark/types/TransactionStatus.java +++ b/src/main/java/com/oltpbenchmark/types/TransactionStatus.java @@ -49,5 +49,10 @@ public enum TransactionStatus { /** * Transaction encountered an error and was not retried */ - ERROR + ERROR, + + /** + * Query returned ZERO_ROWS + */ + ZERO_ROWS } diff --git a/src/main/java/com/oltpbenchmark/util/ResultWriter.java b/src/main/java/com/oltpbenchmark/util/ResultWriter.java index 8209327da..7c048cdae 100644 --- a/src/main/java/com/oltpbenchmark/util/ResultWriter.java +++ b/src/main/java/com/oltpbenchmark/util/ResultWriter.java @@ -253,6 +253,13 @@ public Map writeDetailedSummary(PrintStream os) { Map detailedSummaryMap = new TreeMap<>(); Map metadata = new TreeMap<>(); metadata.put("yaml_version", expConf.getString("yaml_version", "v1.0")); + metadata.put("Completed Transactions", results.getSuccess().getSampleCount()); + metadata.put("Aborted Transactions", results.getAbort().getSampleCount()); + metadata.put("Rejected Transactions (Server Retry)", results.getRetry().getSampleCount()); + metadata.put("Rejected Transactions (Retry Different)", results.getRetryDifferent().getSampleCount()); + metadata.put("Unexpected SQL Errors", results.getError().getSampleCount()); + metadata.put("Unknown Status Transactions", results.getUnknown().getSampleCount()); + metadata.put("Zero Rows Returned", results.getZeroRows().getSampleCount()); detailedSummaryMap.put("metadata", metadata); detailedSummaryMap.put("Summary", summaryMap); detailedSummaryMap.put("queries", results.getFeaturebenchAdditionalResults().getJsonResultsList()); diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index d75b2d38d..dbb79bdf8 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -7,13 +7,24 @@ log4j.appender.A1=org.apache.log4j.ConsoleAppender log4j.appender.A1.layout=org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern=[%-5p] %d [%t] %x %c %M - %m%n +# file appender +log4j.appender.FA=org.apache.log4j.FileAppender +log4j.appender.FA.File=debugLog.out +log4j.appender.FA.Threshold=DEBUG +log4j.appender.FA.Append=false +# Define the layout for file appender +log4j.appender.FA.layout=org.apache.log4j.PatternLayout +log4j.appender.FA.layout.conversionPattern=%d [%t] %x %c %M - %m%n +log4j.category.com.oltpbenchmark.api.Worker=DEBUG, FA +log4j.additivity.com.oltpbenchmark.api.Worker=false + log4j.logger.com.oltpbenchmark=INFO log4j.logger.com.oltpbenchmark.DBWorkload=INFO log4j.logger.com.oltpbenchmark.ThreadBench=INFO log4j.logger.com.oltpbenchmark.DistributionStatistics=INFO log4j.logger.com.oltpbenchmark.api.BenchmarkModule=INFO log4j.logger.com.oltpbenchmark.api.Loader=INFO -log4j.logger.com.oltpbenchmark.api.Worker=INFO +#log4j.logger.com.oltpbenchmark.api.Worker=INFO log4j.logger.com.oltpbenchmark.api.Procedure=INFO log4j.logger.com.oltpbenchmark.catalog.Catalog=INFO log4j.logger.com.oltpbenchmark.util.ThreadUtil=INFO