@Override
 public WriteStats call() throws Exception {
   statusReporter.numExecutingFlushes.incrementAndGet();
   reportSize();
   long start = System.currentTimeMillis();
   try {
     Timer totalTimer = metricFactory.newTimer();
     totalTimer.startTiming();
     if (LOG.isDebugEnabled())
       SpliceLogUtils.debug(
           LOG,
           "Calling BulkWriteAction: id=%d, initialBulkWritesSize=%d, initialKVPairSize=%d",
           id,
           bulkWrites.numEntries(),
           bulkWrites.numEntries());
     execute(bulkWrites);
     totalTimer.stopTiming();
     if (metricFactory.isActive())
       return new SimpleWriteStats(
           writtenCounter.getTotal(),
           retryCounter.getTotal(),
           thrownErrorsRows.getTotal(),
           retriedRows.getTotal(),
           partialRows.getTotal(),
           partialThrownErrorRows.getTotal(),
           partialRetriedRows.getTotal(),
           partialIgnoredRows.getTotal(),
           partialWrite.getTotal(),
           ignoredRows.getTotal(),
           catchThrownRows.getTotal(),
           catchRetriedRows.getTotal(),
           regionTooBusy.getTotal());
     else return WriteStats.NOOP_WRITE_STATS;
   } finally {
     long timeTakenMs = System.currentTimeMillis() - start;
     long numRecords = bulkWrites.numEntries();
     writeConfiguration.writeComplete(timeTakenMs, numRecords);
     statusReporter.complete(timeTakenMs);
     bulkWrites = null;
   }
 }
 @SuppressFBWarnings(value = "EI_EXPOSE_REP2", justification = "Intentional")
 public BulkWriteAction(
     byte[] tableName,
     BulkWrites writes,
     WriteConfiguration writeConfiguration,
     ActionStatusReporter statusReporter,
     BulkWriterFactory writerFactory,
     PipelineExceptionFactory pipelineExceptionFactory,
     PartitionFactory partitionFactory,
     Clock clock) {
   assert writes != null : "writes passed into BWA are null";
   this.tableName = tableName;
   this.bulkWrites = writes;
   this.writeConfiguration = writeConfiguration;
   this.statusReporter = statusReporter;
   this.writerFactory = writerFactory;
   MetricFactory possibleMetricFactory = writeConfiguration.getMetricFactory();
   this.metricFactory =
       possibleMetricFactory == null ? Metrics.noOpMetricFactory() : possibleMetricFactory;
   this.clock = clock;
   this.rejectedCounter = metricFactory.newCounter();
   this.globalErrorCounter = metricFactory.newCounter();
   this.partialFailureCounter = metricFactory.newCounter();
   this.writtenCounter = metricFactory.newCounter();
   this.retryCounter = metricFactory.newCounter();
   this.writeTimer = metricFactory.newTimer();
   this.pipelineExceptionFactory = pipelineExceptionFactory;
   this.partitionFactory = partitionFactory;
   thrownErrorsRows = metricFactory.newCounter();
   retriedRows = metricFactory.newCounter();
   partialRows = metricFactory.newCounter();
   partialThrownErrorRows = metricFactory.newCounter();
   partialRetriedRows = metricFactory.newCounter();
   partialIgnoredRows = metricFactory.newCounter();
   partialWrite = metricFactory.newCounter();
   ignoredRows = metricFactory.newCounter();
   catchThrownRows = metricFactory.newCounter();
   catchRetriedRows = metricFactory.newCounter();
   regionTooBusy = metricFactory.newCounter();
 }