Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[FLINK-8178][network] Introduce not threadsafe write only BufferBuilder
While Buffer class is used in multithreaded context it requires synchronisation. Previously it was miss-leading and unclear, suggesting that RecordSerializer should take into account synchronisation of the Buffer that's holding. With NotThreadSafe BufferBuilder there is now clear separation between single-threaded writing/creating a BufferBuilder and multithreaded Buffer handling/retaining/recycling. This increases throughput of network stack by factor of 2, because previously method getMemorySegment() was called twice per record and it is a synchronized method on recycleLock, while RecordSerializer is sole owner of the Buffer at this point, so synchronisation is not needed.
- Loading branch information
1 parent
0888bb6
commit c6945c2
Showing
16 changed files
with
352 additions
and
114 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
82 changes: 82 additions & 0 deletions
82
flink-runtime/src/main/java/org/apache/flink/runtime/io/network/buffer/BufferBuilder.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Original file line | Diff line number | Diff line change |
---|---|---|---|
@@ -0,0 +1,82 @@ | |||
/* | |||
* Licensed to the Apache Software Foundation (ASF) under one | |||
* or more contributor license agreements. See the NOTICE file | |||
* distributed with this work for additional information | |||
* regarding copyright ownership. The ASF licenses this file | |||
* to you under the Apache License, Version 2.0 (the | |||
* "License"); you may not use this file except in compliance | |||
* with the License. You may obtain a copy of the License at | |||
* | |||
* http://www.apache.org/licenses/LICENSE-2.0 | |||
* | |||
* Unless required by applicable law or agreed to in writing, software | |||
* distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | |||
* limitations under the License. | |||
*/ | |||
|
|||
package org.apache.flink.runtime.io.network.buffer; | |||
|
|||
import org.apache.flink.core.memory.MemorySegment; | |||
|
|||
import javax.annotation.concurrent.NotThreadSafe; | |||
|
|||
import java.nio.ByteBuffer; | |||
|
|||
import static org.apache.flink.util.Preconditions.checkNotNull; | |||
import static org.apache.flink.util.Preconditions.checkState; | |||
|
|||
/** | |||
* Not thread safe class for filling in the initial content of the {@link Buffer}. Once writing to the builder | |||
* is complete, {@link Buffer} instance can be built and shared across multiple threads. | |||
*/ | |||
@NotThreadSafe | |||
public class BufferBuilder { | |||
private final MemorySegment memorySegment; | |||
|
|||
private final BufferRecycler recycler; | |||
|
|||
private int position = 0; | |||
|
|||
private boolean built = false; | |||
|
|||
public BufferBuilder(MemorySegment memorySegment, BufferRecycler recycler) { | |||
this.memorySegment = checkNotNull(memorySegment); | |||
this.recycler = checkNotNull(recycler); | |||
} | |||
|
|||
/** | |||
* @return number of copied bytes | |||
*/ | |||
public int append(ByteBuffer source) { | |||
checkState(!built); | |||
|
|||
int needed = source.remaining(); | |||
int available = limit() - position; | |||
int toCopy = Math.min(needed, available); | |||
|
|||
memorySegment.put(position, source, toCopy); | |||
position += toCopy; | |||
return toCopy; | |||
} | |||
|
|||
public boolean isFull() { | |||
checkState(position <= limit()); | |||
return position == limit(); | |||
} | |||
|
|||
public Buffer build() { | |||
checkState(!built); | |||
built = true; | |||
return new Buffer(memorySegment, recycler, true, position); | |||
} | |||
|
|||
public boolean isEmpty() { | |||
return position == 0; | |||
} | |||
|
|||
private int limit() { | |||
return memorySegment.size(); | |||
} | |||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.