flink-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From NicoK <...@git.apache.org>
Subject [GitHub] flink pull request #4509: [FLINK-7406][network] Implement Netty receiver inc...
Date Fri, 29 Sep 2017 16:24:47 GMT
Github user NicoK commented on a diff in the pull request:

    https://github.com/apache/flink/pull/4509#discussion_r141890624
  
    --- Diff: flink-runtime/src/main/java/org/apache/flink/runtime/io/network/partition/consumer/RemoteInputChannel.java
---
    @@ -390,7 +390,63 @@ public BufferProvider getBufferProvider() throws IOException {
     		return inputGate.getBufferProvider();
     	}
     
    -	public void onBuffer(Buffer buffer, int sequenceNumber) {
    +	/**
    +	 * Requests buffer from input channel directly for receiving network data.
    +	 * It should always return an available buffer in credit-based mode.
    +	 *
    +	 * @return The available buffer.
    +	 */
    +	public Buffer requestBuffer() {
    +		synchronized (availableBuffers) {
    +			return availableBuffers.poll();
    +		}
    +	}
    +
    +	/**
    +	 * Receives the backlog from the producer's buffer response. If the number of available
    +	 * buffers is less than the backlog length, it will request floating buffers from the
buffer
    +	 * pool, and then notify unannounced credits to the producer.
    +	 *
    +	 * @param backlog The number of unsent buffers in the producer's sub partition.
    +	 */
    +	private void onSenderBacklog(int backlog) {
    +		int numRequestedBuffers = 0;
    +
    +		synchronized (availableBuffers) {
    +			// Important: the isReleased check should be inside the synchronized block.
    +			if (!isReleased.get()) {
    +				senderBacklog.set(backlog);
    +
    +				while (senderBacklog.get() > availableBuffers.size() && !isWaitingForFloatingBuffers.get())
{
    +					Buffer buffer = null;
    +					try {
    +						buffer = inputGate.getBufferPool().requestBuffer();
    +					} catch (IOException ex) {
    +						ExceptionUtils.rethrow(ex);
    +					}
    +
    +					if (buffer != null) {
    +						availableBuffers.add(buffer);
    +						numRequestedBuffers++;
    +						continue;
    +					}
    +
    +					// If the channel has not got enough buffers, register it as listener to wait for
more floating buffers.
    +					if (inputGate.getBufferProvider().addBufferListener(this)) {
    +						if (!isWaitingForFloatingBuffers.compareAndSet(false, true)) {
    +							throw new IllegalStateException("This channel should not be waiting for floating
buffers.");
    +						}
    --- End diff --
    
    ...instead, here you can actively `break` out of the loop early without having to check
the conditions again


---

Mime
View raw message