internal void ExecuteWithVirtualNetworkLoadBalancing <TArgA, TArgB>(Func <TArgA, TArgB, string, Task> method, TArgA arg1, TArgB arg2) { if (_loadBalancer == null) { method.Invoke(arg1, arg2, null).Wait(); } else { int numRetries = _loadBalancer.GetNumAvailableEndpoints(); LoadBalancingHelper.Execute(() => { var endpoint = _loadBalancer.GetEndpoint(); Contract.Assert(endpoint != null, "Load balancer failed to return a worker node endpoint!"); Trace.TraceInformation("\tIssuing request to endpoint " + endpoint); try { method.Invoke(arg1, arg2, endpoint.ToString()).Wait(); _loadBalancer.RecordSuccess(endpoint); } catch (Exception) { _loadBalancer.RecordFailure(endpoint); throw; } }, new RetryOnAllExceptionsPolicy(), new NoOpBackOffScheme(), numRetries: numRetries); } }
internal TResult ExecuteAndGetWithVirtualNetworkLoadBalancing <TArg, TResult>(Func <TArg, string, Task <TResult> > method, TArg arg1) { if (_loadBalancer == null) { return(method.Invoke(arg1, null).Result); } else { TResult result = default(TResult); int numRetries = _loadBalancer.GetNumAvailableEndpoints(); LoadBalancingHelper.Execute(() => { var endpoint = _loadBalancer.GetEndpoint(); Contract.Assert(endpoint != null, "Load balancer failed to return a worker node endpoint!"); Trace.TraceInformation("\tIssuing request to endpoint " + endpoint); try { result = method.Invoke(arg1, endpoint.ToString()).Result; _loadBalancer.RecordSuccess(endpoint); } catch (Exception) { _loadBalancer.RecordFailure(endpoint); throw; } }, new RetryOnAllExceptionsPolicy(), new NoOpBackOffScheme(), numRetries: numRetries); return(result); } }