diff options
author | Benoit Foucher <benoit@zeroc.com> | 2017-06-08 14:30:51 +0200 |
---|---|---|
committer | Benoit Foucher <benoit@zeroc.com> | 2017-06-08 14:30:51 +0200 |
commit | dc1e2f82241d2860ae481b8e0d8442e248c7b89c (patch) | |
tree | ab5aafe6bb280e03ee5f0e7c37e2ea3094326178 | |
parent | Fixed bogus C# ami/metrics tests (diff) | |
download | ice-dc1e2f82241d2860ae481b8e0d8442e248c7b89c.tar.bz2 ice-dc1e2f82241d2860ae481b8e0d8442e248c7b89c.tar.xz ice-dc1e2f82241d2860ae481b8e0d8442e248c7b89c.zip |
Fixed ICE-7994 - invocation metrics issue with AMI batch oneway requests
20 files changed, 61 insertions, 85 deletions
diff --git a/cpp/include/Ice/OutgoingAsync.h b/cpp/include/Ice/OutgoingAsync.h index 572515e0324..b115581e4e9 100644 --- a/cpp/include/Ice/OutgoingAsync.h +++ b/cpp/include/Ice/OutgoingAsync.h @@ -139,7 +139,7 @@ protected: bool sentImpl(bool); bool exceptionImpl(const Ice::Exception&); - bool responseImpl(bool); + bool responseImpl(bool, bool); void cancel(const Ice::LocalException&); void checkCanceled(); @@ -229,7 +229,7 @@ protected: void invokeImpl(bool); bool sentImpl(bool); bool exceptionImpl(const Ice::Exception&); - bool responseImpl(bool); + bool responseImpl(bool, bool); virtual void runTimerTask(); diff --git a/cpp/src/Ice/OutgoingAsync.cpp b/cpp/src/Ice/OutgoingAsync.cpp index 0c312b4c6f3..7ccf0536106 100644 --- a/cpp/src/Ice/OutgoingAsync.cpp +++ b/cpp/src/Ice/OutgoingAsync.cpp @@ -332,7 +332,7 @@ OutgoingAsyncBase::exceptionImpl(const Exception& ex) } bool -OutgoingAsyncBase::responseImpl(bool ok) +OutgoingAsyncBase::responseImpl(bool ok, bool invoke) { Lock sync(_m); if(ok) @@ -347,10 +347,9 @@ OutgoingAsyncBase::responseImpl(bool ok) _m.notifyAll(); #endif - bool invoke; try { - invoke = handleResponse(ok); + invoke &= handleResponse(ok); } catch(const Ice::Exception& ex) { @@ -830,13 +829,13 @@ ProxyOutgoingAsyncBase::exceptionImpl(const Exception& ex) } bool -ProxyOutgoingAsyncBase::responseImpl(bool ok) +ProxyOutgoingAsyncBase::responseImpl(bool ok, bool invoke) { if(_proxy->_getReference()->getInvocationTimeout() != -1) { _instance->timer()->cancel(ICE_SHARED_FROM_THIS); } - return OutgoingAsyncBase::responseImpl(ok); + return OutgoingAsyncBase::responseImpl(ok, invoke); } void @@ -1084,7 +1083,7 @@ OutgoingAsync::response() } } - return responseImpl(replyStatus == replyOK); + return responseImpl(replyStatus == replyOK, true); } catch(const Exception& ex) { @@ -1130,8 +1129,8 @@ OutgoingAsync::invoke(const string& operation) { _sentSynchronously = true; _proxy->_getBatchRequestQueue()->finishBatchRequest(&_os, _proxy, operation); - responseImpl(true); - return; // Don't call sent/completed callback for batch AMI requests + responseImpl(true, false); // Don't call sent/completed callback for batch AMI requests + return; } // diff --git a/cpp/src/Ice/Proxy.cpp b/cpp/src/Ice/Proxy.cpp index ea668c25017..d24fcc1c4b2 100644 --- a/cpp/src/Ice/Proxy.cpp +++ b/cpp/src/Ice/Proxy.cpp @@ -124,7 +124,7 @@ AsyncStatus ProxyGetConnection::invokeRemote(const ConnectionIPtr& connection, bool, bool) { _cachedConnection = connection; - if(responseImpl(true)) + if(responseImpl(true, true)) { invokeResponseAsync(); } @@ -134,7 +134,7 @@ ProxyGetConnection::invokeRemote(const ConnectionIPtr& connection, bool, bool) AsyncStatus ProxyGetConnection::invokeCollocated(CollocatedRequestHandler*) { - if(responseImpl(true)) + if(responseImpl(true, true)) { invokeResponseAsync(); } diff --git a/cpp/test/Ice/ami/AllTests.cpp b/cpp/test/Ice/ami/AllTests.cpp index 035cc5249d6..cdafe75816c 100644 --- a/cpp/test/Ice/ami/AllTests.cpp +++ b/cpp/test/Ice/ami/AllTests.cpp @@ -1838,7 +1838,7 @@ allTests(const Ice::CommunicatorPtr& communicator, bool collocated) { test(p->opBatchCount() == 0); auto b1 = p->ice_batchOneway(); - b1->opBatch(); + b1->opBatchAsync().get(); b1->opBatch(); auto id = this_thread::get_id(); promise<void> promise; diff --git a/cpp/test/Ice/metrics/AllTests.cpp b/cpp/test/Ice/metrics/AllTests.cpp index 2ed799067ee..43a87962fb5 100644 --- a/cpp/test/Ice/metrics/AllTests.cpp +++ b/cpp/test/Ice/metrics/AllTests.cpp @@ -1406,14 +1406,19 @@ allTests(const Ice::CommunicatorPtr& communicator, const CommunicatorObserverIPt MetricsPrxPtr metricsBatchOneway = metrics->ice_batchOneway(); metricsBatchOneway->op(); - //metricsBatchOneway->end_op(metricsOneway->begin_op()); - //metricsBatchOneway->begin_op(newCallback_Metrics_op(cb, &Callback::response, &Callback::exception)); +#ifdef ICE_CPP11_MAPPING + metricsBatchOneway->opAsync().get(); + metricsBatchOneway->opAsync([cb]() {}, [cb](exception_ptr) {}); +#else + metricsBatchOneway->end_op(metricsBatchOneway->begin_op()); + metricsBatchOneway->begin_op(newCallback_Metrics_op(cb, &Callback::response, &Callback::exception))->waitForCompleted(); +#endif map = toMap(clientMetrics->getMetricsView("View", timestamp)["Invocation"]); test(map.size() == 1); im1 = ICE_DYNAMIC_CAST(IceMX::InvocationMetrics, map["op"]); - test(im1->current == 0 && im1->total == 1 && im1->failures == 0 && im1->retry == 0); + test(im1->current == 0 && im1->total == 3 && im1->failures == 0 && im1->retry == 0); test(im1->remotes.size() == 0); testAttribute(clientMetrics, clientProps, update.get(), "Invocation", "mode", "batch-oneway", diff --git a/csharp/src/Ice/OutgoingAsync.cs b/csharp/src/Ice/OutgoingAsync.cs index ea08c6be130..e3da11537a3 100644 --- a/csharp/src/Ice/OutgoingAsync.cs +++ b/csharp/src/Ice/OutgoingAsync.cs @@ -312,7 +312,7 @@ namespace IceInternal return invoke; } } - protected virtual bool responseImpl(bool userThread, bool ok) + protected virtual bool responseImpl(bool userThread, bool ok, bool invoke) { lock(this) { @@ -323,10 +323,9 @@ namespace IceInternal _cancellationHandler = null; - bool invoke; try { - invoke = _completionCallback.handleResponse(userThread, ok, this); + invoke &= _completionCallback.handleResponse(userThread, ok, this); } catch(Ice.Exception ex) { @@ -632,13 +631,13 @@ namespace IceInternal return base.exceptionImpl(ex); } - protected override bool responseImpl(bool userThread, bool ok) + protected override bool responseImpl(bool userThread, bool ok, bool invoke) { if(proxy_.iceReference().getInvocationTimeout() != -1) { instance_.timer().cancel(this); } - return base.responseImpl(userThread, ok); + return base.responseImpl(userThread, ok, invoke); } public void runTimerTask() @@ -894,7 +893,7 @@ namespace IceInternal } } - return responseImpl(false, replyStatus == ReplyStatus.replyOK); + return responseImpl(false, replyStatus == ReplyStatus.replyOK, true); } catch(Ice.Exception ex) { @@ -943,8 +942,8 @@ namespace IceInternal { sentSynchronously_ = true; proxy_.iceGetBatchRequestQueue().finishBatchRequest(os_, proxy_, operation); - responseImpl(true, true); - return; // Don't call sent/completed callback for batch AMI requests + responseImpl(true, true, false); // Don't call sent/completed callback for batch AMI requests + return; } // @@ -1169,7 +1168,7 @@ namespace IceInternal public override int invokeRemote(Ice.ConnectionI connection, bool compress, bool response) { cachedConnection_ = connection; - if(responseImpl(false, true)) + if(responseImpl(false, true, true)) { invokeResponseAsync(); } @@ -1178,7 +1177,7 @@ namespace IceInternal public override int invokeCollocated(CollocatedRequestHandler handler) { - if(responseImpl(false, true)) + if(responseImpl(false, true, true)) { invokeResponseAsync(); } diff --git a/csharp/test/Ice/metrics/AllTests.cs b/csharp/test/Ice/metrics/AllTests.cs index 3f0be1ab0fc..de3c3515255 100644 --- a/csharp/test/Ice/metrics/AllTests.cs +++ b/csharp/test/Ice/metrics/AllTests.cs @@ -1131,14 +1131,14 @@ public class AllTests : TestCommon.AllTests MetricsPrx metricsBatchOneway = (MetricsPrx)metrics.ice_batchOneway(); metricsBatchOneway.op(); - //metricsBatchOneway.end_op(metricsBatchOneway.begin_op()); - //metricsBatchOneway.begin_op().whenCompleted(cb.response, cb.exception).waitForSent(); + metricsBatchOneway.end_op(metricsBatchOneway.begin_op()); + metricsBatchOneway.begin_op().whenCompleted(cb.response, cb.exception); map = toMap(clientMetrics.getMetricsView("View", out timestamp)["Invocation"]); test(map.Count == 1); im1 = (IceMX.InvocationMetrics)map["op"]; - test(im1.current == 0 && im1.total == 1 && im1.failures == 0 && im1.retry == 0); + test(im1.current == 0 && im1.total == 3 && im1.failures == 0 && im1.retry == 0); test(im1.remotes.Length == 0); testAttribute(clientMetrics, clientProps, update, "Invocation", "mode", "batch-oneway", diff --git a/java-compat/src/Ice/src/main/java/IceInternal/AsyncResultI.java b/java-compat/src/Ice/src/main/java/IceInternal/AsyncResultI.java index b0369089d66..3cc9c9c45d3 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/AsyncResultI.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/AsyncResultI.java @@ -328,7 +328,7 @@ public class AsyncResultI implements AsyncResult } } - protected boolean finished(boolean ok) + protected boolean finished(boolean ok, boolean invoke) { synchronized(this) { @@ -338,7 +338,8 @@ public class AsyncResultI implements AsyncResult _state |= StateOK; } _cancellationHandler = null; - if(_callback == null) + invoke &= _callback != null; + if(!invoke) { if(_observer != null) { @@ -347,7 +348,7 @@ public class AsyncResultI implements AsyncResult } } this.notifyAll(); - return _callback != null; + return invoke; } } diff --git a/java-compat/src/Ice/src/main/java/IceInternal/OutgoingAsync.java b/java-compat/src/Ice/src/main/java/IceInternal/OutgoingAsync.java index be1eaef7a8f..d2470858ada 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/OutgoingAsync.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/OutgoingAsync.java @@ -170,7 +170,7 @@ public class OutgoingAsync extends ProxyOutgoingAsyncBase // _sentSynchronously = true; _proxy._getBatchRequestQueue().finishBatchRequest(_os, _proxy, getOperation()); - finished(true); + finished(true, false); } else { @@ -333,7 +333,7 @@ public class OutgoingAsync extends ProxyOutgoingAsyncBase } } - return finished(replyStatus == ReplyStatus.replyOK); + return finished(replyStatus == ReplyStatus.replyOK, true); } catch(Ice.Exception ex) { diff --git a/java-compat/src/Ice/src/main/java/IceInternal/ProxyGetConnection.java b/java-compat/src/Ice/src/main/java/IceInternal/ProxyGetConnection.java index c918107e4ca..74919c5ddb5 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/ProxyGetConnection.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/ProxyGetConnection.java @@ -35,7 +35,7 @@ public class ProxyGetConnection extends ProxyOutgoingAsyncBase throws RetryException { _cachedConnection = connection; - if(finished(true)) + if(finished(true, true)) { invokeCompletedAsync(); } @@ -45,7 +45,7 @@ public class ProxyGetConnection extends ProxyOutgoingAsyncBase @Override public int invokeCollocated(CollocatedRequestHandler handler) { - if(finished(true)) + if(finished(true, true)) { invokeCompletedAsync(); } diff --git a/java-compat/src/Ice/src/main/java/IceInternal/ProxyOutgoingAsyncBase.java b/java-compat/src/Ice/src/main/java/IceInternal/ProxyOutgoingAsyncBase.java index 507c8aea68f..68308f97184 100644 --- a/java-compat/src/Ice/src/main/java/IceInternal/ProxyOutgoingAsyncBase.java +++ b/java-compat/src/Ice/src/main/java/IceInternal/ProxyOutgoingAsyncBase.java @@ -291,14 +291,14 @@ public abstract class ProxyOutgoingAsyncBase extends OutgoingAsyncBase } @Override - protected boolean finished(boolean ok) + protected boolean finished(boolean ok, boolean invoke) { if(_future != null) { _future.cancel(false); _future = null; } - return super.finished(ok); + return super.finished(ok, invoke); } protected int handleException(Ice.Exception exc) diff --git a/java-compat/test/src/main/java/test/Ice/metrics/AllTests.java b/java-compat/test/src/main/java/test/Ice/metrics/AllTests.java index 171dea9389c..619ba3f330e 100644 --- a/java-compat/test/src/main/java/test/Ice/metrics/AllTests.java +++ b/java-compat/test/src/main/java/test/Ice/metrics/AllTests.java @@ -1196,13 +1196,15 @@ public class AllTests MetricsPrx metricsBatchOneway = (MetricsPrx)metrics.ice_batchOneway(); metricsBatchOneway.op(); metricsBatchOneway.end_op(metricsBatchOneway.begin_op()); - //metricsBatchOneway.begin_op(cb).waitForSent(); + metricsBatchOneway.begin_op(cb); map = toMap(clientMetrics.getMetricsView("View", timestamp).get("Invocation")); test(map.size() == 1); im1 = (IceMX.InvocationMetrics)map.get("op"); - test(im1.current == 0 && im1.total == 2 && im1.failures == 0 && im1.retry == 0); + out.print(im1.current); + out.print(im1.total); + test(im1.current == 0 && im1.total == 3 && im1.failures == 0 && im1.retry == 0); test(im1.remotes.length == 0); testAttribute(clientMetrics, clientProps, update, "Invocation", "mode", "batch-oneway", diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorFlushBatch.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorFlushBatch.java index 566d9dd5b70..dbffde1de31 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorFlushBatch.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/CommunicatorFlushBatch.java @@ -45,12 +45,6 @@ public class CommunicatorFlushBatch extends InvocationFutureI<Void> } @Override - protected boolean needCallback() - { - return false; - } - - @Override protected void markCompleted() { assert(false); @@ -68,7 +62,6 @@ public class CommunicatorFlushBatch extends InvocationFutureI<Void> return false; } - // TODO: MJN: This is missing a test. @Override public boolean completed(com.zeroc.Ice.Exception ex) { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/InvocationFutureI.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/InvocationFutureI.java index 0d444f50816..2315ae131c4 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/InvocationFutureI.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/InvocationFutureI.java @@ -223,11 +223,6 @@ public abstract class InvocationFutureI<T> extends com.zeroc.Ice.InvocationFutur } } - protected boolean needCallback() - { - return !_synchronous; // No callbacks for synchronous or batch invocations - } - abstract protected void markCompleted(); public final void invokeCompleted() @@ -342,14 +337,14 @@ public abstract class InvocationFutureI<T> extends com.zeroc.Ice.InvocationFutur cacheMessageBuffers(); } - boolean invoke = !alreadySent && (_sentFuture != null || done && needCallback()); + boolean invoke = (!alreadySent && _sentFuture != null || done) && !_synchronous; if(!invoke && done && _observer != null) { _observer.detach(); _observer = null; }; - if(done && !needCallback()) + if(!invoke && done) { markCompleted(); return false; @@ -362,7 +357,7 @@ public abstract class InvocationFutureI<T> extends com.zeroc.Ice.InvocationFutur } } - protected boolean finished(boolean ok) + protected boolean finished(boolean ok, boolean invoke) { synchronized(this) { @@ -373,7 +368,7 @@ public abstract class InvocationFutureI<T> extends com.zeroc.Ice.InvocationFutur } _cancellationHandler = null; - boolean invoke = needCallback(); + invoke &= !_synchronous; if(!invoke && _observer != null) { _observer.detach(); @@ -412,7 +407,7 @@ public abstract class InvocationFutureI<T> extends com.zeroc.Ice.InvocationFutur _observer.failed(ex.ice_id()); } - boolean invoke = needCallback(); + boolean invoke = !_synchronous; if(!invoke && _observer != null) { _observer.detach(); diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/OutgoingAsync.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/OutgoingAsync.java index 91fc3d3a6f9..f5e580e56f5 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/OutgoingAsync.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/OutgoingAsync.java @@ -87,7 +87,7 @@ public class OutgoingAsync<T> extends ProxyOutgoingAsyncBaseI<T> // _sentSynchronously = true; _proxy._getBatchRequestQueue().finishBatchRequest(_os, _proxy, _operation); - finished(true); + finished(true, false); } else { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyFlushBatch.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyFlushBatch.java index a5bc5281797..cb3348f2daf 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyFlushBatch.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyFlushBatch.java @@ -20,12 +20,6 @@ public class ProxyFlushBatch extends ProxyOutgoingAsyncBaseI<Void> } @Override - protected boolean needCallback() - { - return !_synchronous; - } - - @Override public boolean completed(com.zeroc.Ice.InputStream is) { assert(false); diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyGetConnection.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyGetConnection.java index 22f9544fdea..44921e2e183 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyGetConnection.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyGetConnection.java @@ -18,12 +18,6 @@ public class ProxyGetConnection extends ProxyOutgoingAsyncBaseI<com.zeroc.Ice.Co } @Override - protected boolean needCallback() - { - return !_synchronous; - } - - @Override protected void markCompleted() { complete(_cachedConnection); @@ -41,7 +35,7 @@ public class ProxyGetConnection extends ProxyOutgoingAsyncBaseI<com.zeroc.Ice.Co throws RetryException { _cachedConnection = connection; - if(finished(true)) + if(finished(true, true)) { invokeCompletedAsync(); } @@ -51,7 +45,7 @@ public class ProxyGetConnection extends ProxyOutgoingAsyncBaseI<com.zeroc.Ice.Co @Override public int invokeCollocated(CollocatedRequestHandler handler) { - if(finished(true)) + if(finished(true, true)) { invokeCompletedAsync(); } diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyIceInvoke.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyIceInvoke.java index 6e17d0bbcaf..88778e268a7 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyIceInvoke.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyIceInvoke.java @@ -43,7 +43,7 @@ public class ProxyIceInvoke extends ProxyOutgoingAsyncBaseI<com.zeroc.Ice.Object // _sentSynchronously = true; _proxy._getBatchRequestQueue().finishBatchRequest(_os, _proxy, _operation); - finished(true); + finished(true, false); } else { diff --git a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyOutgoingAsyncBaseI.java b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyOutgoingAsyncBaseI.java index 5adb9a3a86c..97bb7467005 100644 --- a/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyOutgoingAsyncBaseI.java +++ b/java/src/Ice/src/main/java/com/zeroc/IceInternal/ProxyOutgoingAsyncBaseI.java @@ -171,7 +171,7 @@ public abstract class ProxyOutgoingAsyncBaseI<T> extends OutgoingAsyncBaseI<T> i } } - return finished(replyStatus == ReplyStatus.replyOK); + return finished(replyStatus == ReplyStatus.replyOK, true); } catch(com.zeroc.Ice.Exception ex) { @@ -292,12 +292,6 @@ public abstract class ProxyOutgoingAsyncBaseI<T> extends OutgoingAsyncBaseI<T> i _proxyMode = _proxy._getReference().getMode(); } - @Override - protected boolean needCallback() - { - return !_synchronous && !isBatch(); // No callbacks for synchronous or batch invocations - } - protected void invokeImpl(boolean userThread) { try @@ -417,14 +411,14 @@ public abstract class ProxyOutgoingAsyncBaseI<T> extends OutgoingAsyncBaseI<T> i } @Override - protected boolean finished(boolean ok) + protected boolean finished(boolean ok, boolean invoke) { if(_timerFuture != null) { _timerFuture.cancel(false); _timerFuture = null; } - return super.finished(ok); + return super.finished(ok, invoke); } protected int handleException(com.zeroc.Ice.Exception exc) diff --git a/java/test/src/main/java/test/Ice/metrics/AllTests.java b/java/test/src/main/java/test/Ice/metrics/AllTests.java index f0eb80ef5b3..67481fdfb4c 100644 --- a/java/test/src/main/java/test/Ice/metrics/AllTests.java +++ b/java/test/src/main/java/test/Ice/metrics/AllTests.java @@ -1161,14 +1161,14 @@ public class AllTests MetricsPrx metricsBatchOneway = metrics.ice_batchOneway(); metricsBatchOneway.op(); - metricsBatchOneway.opAsync(); - //metricsBatchOneway.opAsync().waitForSent(); + metricsBatchOneway.opAsync().join(); + metricsBatchOneway.opAsync().whenComplete((response, ex) -> {}); map = toMap(clientMetrics.getMetricsView("View").returnValue.get("Invocation")); test(map.size() == 1); im1 = (InvocationMetrics)map.get("op"); - test(im1.current == 0 && im1.total == 2 && im1.failures == 0 && im1.retry == 0); + test(im1.current == 0 && im1.total == 3 && im1.failures == 0 && im1.retry == 0); test(im1.remotes.length == 0); testAttribute(clientMetrics, clientProps, "Invocation", "mode", "batch-oneway", |