private CompletableFuture<SegmentRead> sendRequestOverConnection(WireCommands.ReadSegment request, ClientConnection c) { CompletableFuture<WireCommands.SegmentRead> result = new CompletableFuture<>(); if (closed.get()) { result.completeExceptionally(new ConnectionClosedException()); return result; } synchronized (lock) { outstandingRequests.put(request.getOffset(), result); } log.trace("Sending read request {}", request); c.sendAsync(request, cfe -> { if (cfe != null) { log.error("Error while sending request {}", request, cfe); synchronized (lock) { outstandingRequests.remove(request.getOffset()); } result.completeExceptionally(cfe); } }); return result; }
@Override public void readSegment(ReadSegment readSegment) { Timer timer = new Timer(); final String segment = readSegment.getSegment(); final String operation = "readSegment"; if (!verifyToken(segment, readSegment.getOffset(), readSegment.getDelegationToken(), operation)) { return; } final int readSize = min(MAX_READ_SIZE, max(TYPE_PLUS_LENGTH_SIZE, readSegment.getSuggestedLength())); long trace = LoggerHelpers.traceEnter(log, operation, readSegment); segmentStore.read(segment, readSegment.getOffset(), readSize, TIMEOUT) .thenAccept(readResult -> { LoggerHelpers.traceLeave(log, operation, trace, readResult); handleReadResult(readSegment, readResult); readStreamSegment.reportSuccessEvent(timer.getElapsed()); }) .exceptionally(ex -> handleException(readSegment.getOffset(), segment, operation, wrapCancellationException(ex))); }
String segment = request.getSegment(); ArrayList<ReadResultEntryContents> cachedEntries = new ArrayList<>(); ReadResultEntry nonCachedEntry = collectCachedEntries(request.getOffset(), result, cachedEntries); final String operation = "readSegment"; SegmentRead reply = new SegmentRead(segment, request.getOffset(), atTail, endOfSegment, data); connection.send(reply); dynamicLogger.incCounterValue(globalMetricName(SEGMENT_READ_BYTES), reply.getData().array().length);