package org.infinispan.query.affinity; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import org.infinispan.commands.ReplicableCommand; import org.infinispan.remoting.inboundhandler.DeliverOrder; import org.infinispan.remoting.responses.Response; import org.infinispan.remoting.rpc.ResponseMode; import org.infinispan.remoting.rpc.RpcManager; import org.infinispan.remoting.rpc.RpcOptions; import org.infinispan.remoting.rpc.RpcOptionsBuilder; import org.infinispan.remoting.transport.Address; import org.infinispan.remoting.transport.Transport; class TrackingRpcManager implements RpcManager { private final RpcManager delegate; private final RpcCollector rpcCollector; private final String cacheName; TrackingRpcManager(RpcManager delegate, RpcCollector rpcCollector, String cacheName) { this.delegate = delegate; this.rpcCollector = rpcCollector; this.cacheName = cacheName; } @Override public CompletableFuture<Map<Address, Response>> invokeRemotelyAsync(Collection<Address> recipients, ReplicableCommand rpc, RpcOptions options) { rpcCollector.addRPC(new RpcDetail(getAddress(), rpc, cacheName, recipients)); return delegate.invokeRemotelyAsync(recipients, rpc, options); } @Override public Map<Address, Response> invokeRemotely(Collection<Address> recipients, ReplicableCommand rpc, RpcOptions options) { rpcCollector.addRPC(new RpcDetail(getAddress(), rpc, cacheName, recipients)); return delegate.invokeRemotely(recipients, rpc, options); } @Override public Map<Address, Response> invokeRemotely(Map<Address, ReplicableCommand> rpcs, RpcOptions options) { rpcs.entrySet().forEach(e -> rpcCollector.addRPC(new RpcDetail(getAddress(), e.getValue(), cacheName, Collections.singleton(e.getKey())))); return delegate.invokeRemotely(rpcs, options); } @Override public void sendTo(Address destination, ReplicableCommand command, DeliverOrder deliverOrder) { rpcCollector.addRPC(new RpcDetail(getAddress(), command, cacheName, Collections.singletonList(destination))); delegate.sendTo(destination, command, deliverOrder); } @Override public void sendToMany(Collection<Address> destinations, ReplicableCommand command, DeliverOrder deliverOrder) { rpcCollector.addRPC(new RpcDetail(getAddress(), command, cacheName, destinations)); delegate.sendToMany(destinations, command, deliverOrder); } @Override public Transport getTransport() { return delegate.getTransport(); } @Override public List<Address> getMembers() { return delegate.getMembers(); } @Override public Address getAddress() { return delegate.getAddress(); } @Override public int getTopologyId() { return delegate.getTopologyId(); } @Override public RpcOptionsBuilder getRpcOptionsBuilder(ResponseMode responseMode) { return delegate.getRpcOptionsBuilder(responseMode); } @Override public RpcOptionsBuilder getRpcOptionsBuilder(ResponseMode responseMode, DeliverOrder deliverOrder) { return delegate.getRpcOptionsBuilder(responseMode, deliverOrder); } @Override public RpcOptions getDefaultRpcOptions(boolean sync) { return delegate.getDefaultRpcOptions(sync); } @Override public RpcOptions getDefaultRpcOptions(boolean sync, DeliverOrder deliverOrder) { return delegate.getDefaultRpcOptions(sync, deliverOrder); } }