eolivelli commented on a change in pull request #10257: URL: https://github.com/apache/pulsar/pull/10257#discussion_r615565480
########## File path: pulsar-broker/src/main/java/org/apache/pulsar/broker/transaction/buffer/impl/TransactionBufferHandlerImpl.java ########## @@ -18,53 +18,68 @@ */ package org.apache.pulsar.broker.transaction.buffer.impl; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import io.netty.buffer.ByteBuf; import io.netty.util.HashedWheelTimer; import io.netty.util.Recycler; import io.netty.util.ReferenceCountUtil; import io.netty.util.Timeout; import io.netty.util.TimerTask; -import java.net.InetSocketAddress; -import java.net.URI; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentSkipListMap; +import java.util.concurrent.ExecutionException; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicLong; import lombok.extern.slf4j.Slf4j; -import org.apache.pulsar.broker.namespace.NamespaceService; +import org.apache.pulsar.client.api.PulsarClient; +import org.apache.pulsar.client.api.PulsarClientException; import org.apache.pulsar.client.api.transaction.TransactionBufferClientException; import org.apache.pulsar.client.api.transaction.TxnID; import org.apache.pulsar.client.impl.ClientCnx; -import org.apache.pulsar.client.impl.ConnectionPool; +import org.apache.pulsar.client.impl.PulsarClientImpl; import org.apache.pulsar.client.impl.transaction.TransactionBufferHandler; import org.apache.pulsar.common.api.proto.CommandEndTxnOnPartitionResponse; import org.apache.pulsar.common.api.proto.CommandEndTxnOnSubscriptionResponse; import org.apache.pulsar.common.api.proto.ServerError; import org.apache.pulsar.common.api.proto.TxnAction; -import org.apache.pulsar.common.naming.TopicName; import org.apache.pulsar.common.protocol.Commands; -import org.apache.pulsar.common.util.FutureUtil; @Slf4j public class TransactionBufferHandlerImpl implements TransactionBufferHandler, TimerTask { private final ConcurrentSkipListMap<Long, OpRequestSend> pendingRequests; - private final ConnectionPool connectionPool; - private final NamespaceService namespaceService; private final AtomicLong requestIdGenerator = new AtomicLong(); private final long operationTimeoutInMills; private Timeout requestTimeout; private final HashedWheelTimer timer; private final Semaphore semaphore; private final boolean blockIfReachMaxPendingOps; + private final PulsarClient pulsarClient; - public TransactionBufferHandlerImpl(ConnectionPool connectionPool, NamespaceService namespaceService, + private final LoadingCache<String, CompletableFuture<ClientCnx>> cache = CacheBuilder.newBuilder() + .maximumSize(100000) + .expireAfterAccess(30, TimeUnit.MINUTES) + .build(new CacheLoader<String, CompletableFuture<ClientCnx>>() { + @Override + public CompletableFuture<ClientCnx> load(String topic) { + CompletableFuture<ClientCnx> siFuture = getClientCnx(topic); + siFuture.whenComplete((si, cause) -> { + if (null != cause) { + cache.asMap().remove(topic, siFuture); Review comment: it may happen that when we execute "whenComplete" are still inside the execution of this loader, for instance if getClientCnx returns a completed CompletableFuture and so probably we will encounter some bad error. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org