public boolean containsKey(long key) { return get(key) != null; }
void removeConsumer(final long consumerId) { consumers.remove(consumerId); }
public CompletableFuture<MessageIdData> sendGetLastMessageId(ByteBuf request, long requestId) { CompletableFuture<MessageIdData> future = new CompletableFuture<>(); pendingGetLastMessageIdRequests.put(requestId, future); ctx.writeAndFlush(request).addListener(writeFuture -> { if (!writeFuture.isSuccess()) { log.warn("{} Failed to send GetLastMessageId request to broker: {}", ctx.channel(), writeFuture.cause().getMessage()); pendingGetLastMessageIdRequests.remove(requestId); future.completeExceptionally(writeFuture.cause()); } }); return future; }
@Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); log.info("{} Disconnected", ctx.channel()); if (!connectionFuture.isDone()) { connectionFuture.completeExceptionally(new PulsarClientException("Connection already closed")); } PulsarClientException e = new PulsarClientException( "Disconnected from server at " + ctx.channel().remoteAddress()); // Fail out all the pending ops pendingRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingLookupRequests.forEach((key, future) -> future.completeExceptionally(e)); waitingLookupRequests.forEach(pair -> pair.getRight().getRight().completeExceptionally(e)); pendingGetLastMessageIdRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingGetTopicsRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingGetSchemaRequests.forEach((key, future) -> future.completeExceptionally(e)); // Notify all attached producers/consumers so they have a chance to reconnect producers.forEach((id, producer) -> producer.connectionClosed(this)); consumers.forEach((id, consumer) -> consumer.connectionClosed(this)); pendingRequests.clear(); pendingLookupRequests.clear(); waitingLookupRequests.clear(); pendingGetLastMessageIdRequests.clear(); pendingGetTopicsRequests.clear(); producers.clear(); consumers.clear(); timeoutTask.cancel(true); }
CompletableFuture<ReadHandle> getLedgerHandle(long ledgerId) { CompletableFuture<ReadHandle> ledgerHandle = ledgerCache.get(ledgerId); if (ledgerHandle != null) { return ledgerHandle; return ledgerCache.computeIfAbsent(ledgerId, lid -> { mbean.endDataLedgerOpenOp(); if (ex != null) { ledgerCache.remove(ledgerId, promise); promise.completeExceptionally(createManagedLedgerException(ex)); } else {
final long requestId = closeProducer.getRequestId(); CompletableFuture<Producer> producerFuture = producers.get(producerId); if (producerFuture == null) { log.warn("[{}] Producer {} was not registered on the connection", remoteAddress, producerId); remoteAddress); ctx.writeAndFlush(Commands.newSuccess(requestId)); producers.remove(producerId, producerFuture); });
CompletableFuture<Producer> existingProducerFuture = producers.putIfAbsent(producerId, producerFuture); producers.remove(producerId, producerFuture); return; producers.remove(producerId, producerFuture); return null; }); producers.remove(producerId, producerFuture); }); }).exceptionally(exception -> { BrokerServiceException.getClientErrorCode(cause), cause.getMessage())); producers.remove(producerId, producerFuture);
public CompletableFuture<LookupDataResult> newLookup(ByteBuf request, long requestId) { CompletableFuture<LookupDataResult> future = new CompletableFuture<>(); if (pendingLookupRequestSemaphore.tryAcquire()) { addPendingLookupRequests(requestId, future); ctx.writeAndFlush(request).addListener(writeFuture -> { if (!writeFuture.isSuccess()) { log.warn("{} Failed to send request {} to broker: {}", ctx.channel(), requestId, writeFuture.cause().getMessage()); getAndRemovePendingLookupRequest(requestId); future.completeExceptionally(writeFuture.cause()); } }); } else { if (log.isDebugEnabled()) { log.debug("{} Failed to add lookup-request into pending queue", requestId); } if (!waitingLookupRequests.offer(Pair.of(requestId, Pair.of(request, future)))) { if (log.isDebugEnabled()) { log.debug("{} Failed to add lookup-request into waiting queue", requestId); } future.completeExceptionally(new PulsarClientException.TooManyRequestsException(String.format( "Requests number out of config: There are {%s} lookup requests outstanding and {%s} requests pending.", pendingLookupRequests.size(), waitingLookupRequests.size()))); } } return future; }
public ServerCnx(PulsarService pulsar) { super(pulsar.getBrokerService().getKeepAliveIntervalSeconds(), TimeUnit.SECONDS); this.service = pulsar.getBrokerService(); this.schemaService = pulsar.getSchemaRegistryService(); this.state = State.Start; // This maps are not heavily contended since most accesses are within the cnx thread this.producers = new ConcurrentLongHashMap<>(8, 1); this.consumers = new ConcurrentLongHashMap<>(8, 1); this.replicatorPrefix = service.pulsar().getConfiguration().getReplicatorPrefix(); this.MaxNonPersistentPendingMessages = service.pulsar().getConfiguration() .getMaxConcurrentNonPersistentMessagePerConnection(); this.proxyRoles = service.pulsar().getConfiguration().getProxyRoles(); this.authenticateOriginalAuthData = service.pulsar().getConfiguration().authenticateOriginalAuthData(); this.schemaValidationEnforced = pulsar.getConfiguration().isSchemaValidationEnforced(); }
public CompletableFuture<Optional<SchemaInfo>> sendGetSchema(ByteBuf request, long requestId) { CompletableFuture<Optional<SchemaInfo>> future = new CompletableFuture<>(); pendingGetSchemaRequests.put(requestId, future); ctx.writeAndFlush(request).addListener(writeFuture -> { if (!writeFuture.isSuccess()) { log.warn("{} Failed to send GetSchema request to broker: {}", ctx.channel(), writeFuture.cause().getMessage()); pendingGetLastMessageIdRequests.remove(requestId); future.completeExceptionally(writeFuture.cause()); } }); return future; }
CompletableFuture<ReadHandle> getLedgerHandle(long ledgerId) { CompletableFuture<ReadHandle> ledgerHandle = ledgerCache.get(ledgerId); if (ledgerHandle != null) { return ledgerHandle; return ledgerCache.computeIfAbsent(ledgerId, lid -> { mbean.endDataLedgerOpenOp(); if (ex != null) { ledgerCache.remove(ledgerId, promise); promise.completeExceptionally(createManagedLedgerException(ex)); } else {
long consumerId = closeConsumer.getConsumerId(); CompletableFuture<Consumer> consumerFuture = consumers.get(consumerId); if (consumerFuture == null) { log.warn("[{}] Consumer was not registered on the connection: {}", consumerId, remoteAddress); try { consumer.close(); consumers.remove(consumerId, consumerFuture); ctx.writeAndFlush(Commands.newSuccess(requestId)); log.info("[{}] Closed consumer {}", remoteAddress, consumer);
CompletableFuture<Consumer> existingConsumerFuture = consumers.putIfAbsent(consumerId, consumerFuture); remoteAddress, consumer, e.getMessage()); consumers.remove(consumerId, consumerFuture); exception.getCause().getMessage())); consumers.remove(consumerId, consumerFuture);
@Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { super.channelInactive(ctx); log.info("{} Disconnected", ctx.channel()); if (!connectionFuture.isDone()) { connectionFuture.completeExceptionally(new PulsarClientException("Connection already closed")); } PulsarClientException e = new PulsarClientException( "Disconnected from server at " + ctx.channel().remoteAddress()); // Fail out all the pending ops pendingRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingLookupRequests.forEach((key, future) -> future.completeExceptionally(e)); waitingLookupRequests.forEach(pair -> pair.getRight().getRight().completeExceptionally(e)); pendingGetLastMessageIdRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingGetTopicsRequests.forEach((key, future) -> future.completeExceptionally(e)); pendingGetSchemaRequests.forEach((key, future) -> future.completeExceptionally(e)); // Notify all attached producers/consumers so they have a chance to reconnect producers.forEach((id, producer) -> producer.connectionClosed(this)); consumers.forEach((id, consumer) -> consumer.connectionClosed(this)); pendingRequests.clear(); pendingLookupRequests.clear(); waitingLookupRequests.clear(); pendingGetLastMessageIdRequests.clear(); pendingGetTopicsRequests.clear(); producers.clear(); consumers.clear(); }
public CompletableFuture<LookupDataResult> newLookup(ByteBuf request, long requestId) { CompletableFuture<LookupDataResult> future = new CompletableFuture<>(); if (pendingLookupRequestSemaphore.tryAcquire()) { addPendingLookupRequests(requestId, future); ctx.writeAndFlush(request).addListener(writeFuture -> { if (!writeFuture.isSuccess()) { log.warn("{} Failed to send request {} to broker: {}", ctx.channel(), requestId, writeFuture.cause().getMessage()); getAndRemovePendingLookupRequest(requestId); future.completeExceptionally(writeFuture.cause()); } }); } else { if (log.isDebugEnabled()) { log.debug("{} Failed to add lookup-request into pending queue", requestId); } if (!waitingLookupRequests.offer(Pair.of(requestId, Pair.of(request, future)))) { if (log.isDebugEnabled()) { log.debug("{} Failed to add lookup-request into waiting queue", requestId); } future.completeExceptionally(new PulsarClientException.TooManyRequestsException(String.format( "Requests number out of config: There are {%s} lookup requests outstanding and {%s} requests pending.", pendingLookupRequests.size(), waitingLookupRequests.size()))); } } return future; }
@Override protected void handleActiveConsumerChange(CommandActiveConsumerChange change) { checkArgument(state == State.Ready); if (log.isDebugEnabled()) { log.debug("{} Received a consumer group change message from the server : {}", ctx.channel(), change); } ConsumerImpl<?> consumer = consumers.get(change.getConsumerId()); if (consumer != null) { consumer.activeConsumerChanged(change.getIsActive()); } }
void removeProducer(final long producerId) { producers.remove(producerId); }
public CompletableFuture<List<String>> newGetTopicsOfNamespace(ByteBuf request, long requestId) { CompletableFuture<List<String>> future = new CompletableFuture<>(); pendingGetTopicsRequests.put(requestId, future); ctx.writeAndFlush(request).addListener(writeFuture -> { if (!writeFuture.isSuccess()) { log.warn("{} Failed to send request {} to broker: {}", ctx.channel(), requestId, writeFuture.cause().getMessage()); pendingGetTopicsRequests.remove(requestId); future.completeExceptionally(writeFuture.cause()); } }); return future; }