bulk api: use `System.nanoTime()` instead of `System.currentTimeMillis()` to compute the estimated took time

In this case we compute elapsed time and `System.nanoTime()` is designed to do just do that.
The absolute timing `System.currentTimeMillis()` provides in not needed and the relative timing `System.nanoTime()` provides is likely to be more accurate.
This commit is contained in:
Martijn van Groningen 2016-03-01 18:45:29 +01:00
parent ea2792e278
commit 82567f1bdf
1 changed files with 8 additions and 8 deletions

View File

@ -61,6 +61,7 @@ import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
/** /**
@ -195,16 +196,15 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
* @see #doExecute(BulkRequest, org.elasticsearch.action.ActionListener) * @see #doExecute(BulkRequest, org.elasticsearch.action.ActionListener)
*/ */
public void executeBulk(final BulkRequest bulkRequest, final ActionListener<BulkResponse> listener) { public void executeBulk(final BulkRequest bulkRequest, final ActionListener<BulkResponse> listener) {
final long startTime = System.currentTimeMillis(); final long startTimeNanos = System.nanoTime();
executeBulk(bulkRequest, startTime, listener, new AtomicArray<>(bulkRequest.requests.size())); executeBulk(bulkRequest, startTimeNanos, listener, new AtomicArray<>(bulkRequest.requests.size()));
} }
private long buildTookInMillis(long startTime) { private long buildTookInMillis(long startTimeNanos) {
// protect ourselves against time going backwards return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startTimeNanos);
return Math.max(1, System.currentTimeMillis() - startTime);
} }
private void executeBulk(final BulkRequest bulkRequest, final long startTime, final ActionListener<BulkResponse> listener, final AtomicArray<BulkItemResponse> responses ) { private void executeBulk(final BulkRequest bulkRequest, final long startTimeNanos, final ActionListener<BulkResponse> listener, final AtomicArray<BulkItemResponse> responses ) {
final ClusterState clusterState = clusterService.state(); final ClusterState clusterState = clusterService.state();
// TODO use timeout to wait here if its blocked... // TODO use timeout to wait here if its blocked...
clusterState.blocks().globalBlockedRaiseException(ClusterBlockLevel.WRITE); clusterState.blocks().globalBlockedRaiseException(ClusterBlockLevel.WRITE);
@ -302,7 +302,7 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
} }
if (requestsByShard.isEmpty()) { if (requestsByShard.isEmpty()) {
listener.onResponse(new BulkResponse(responses.toArray(new BulkItemResponse[responses.length()]), buildTookInMillis(startTime))); listener.onResponse(new BulkResponse(responses.toArray(new BulkItemResponse[responses.length()]), buildTookInMillis(startTimeNanos)));
return; return;
} }
@ -352,7 +352,7 @@ public class TransportBulkAction extends HandledTransportAction<BulkRequest, Bul
} }
private void finishHim() { private void finishHim() {
listener.onResponse(new BulkResponse(responses.toArray(new BulkItemResponse[responses.length()]), buildTookInMillis(startTime))); listener.onResponse(new BulkResponse(responses.toArray(new BulkItemResponse[responses.length()]), buildTookInMillis(startTimeNanos)));
} }
}); });
} }