Uh oh!
There was an error while loading. Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork 635
HDDS-5851. [Ozone-Streaming] Define a PutBlock/maxBuffer fixed boundary for streaming writes.#2866
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Uh oh!
There was an error while loading. Please reload this page.
Changes from all commits
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading. Please reload this page.
Jump to
Uh oh!
There was an error while loading. Please reload this page.
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -54,6 +54,21 @@ public class OzoneClientConfig { | ||
| tags = ConfigTag.CLIENT) | ||
| private int streamBufferSize = 4 * 1024 * 1024; | ||
| @Config(key = "datastream.max.buffer.size", | ||
| defaultValue = "4MB", | ||
| type = ConfigType.SIZE, | ||
| description = "The maximum size of the ByteBuffer " | ||
| + "(used via ratis streaming)", | ||
| tags = ConfigTag.CLIENT) | ||
| private int dataStreamMaxBufferSize = 4 * 1024 * 1024; | ||
| @Config(key = "datastream.buffer.flush.size", | ||
| defaultValue = "16MB", | ||
| type = ConfigType.SIZE, | ||
| description = "The boundary at which putBlock is executed", | ||
| tags = ConfigTag.CLIENT) | ||
| private long dataStreamBufferFlushSize = 16 * 1024 * 1024; | ||
| @Config(key = "stream.buffer.increment", | ||
bshashikant marked this conversation as resolved.
Uh oh!There was an error while loading. Please reload this page. | ||
| defaultValue = "0B", | ||
| type = ConfigType.SIZE, | ||
| @@ -168,6 +183,14 @@ public void setStreamBufferSize(int streamBufferSize) { | ||
| this.streamBufferSize = streamBufferSize; | ||
| } | ||
| public int getDataStreamMaxBufferSize() { | ||
| return dataStreamMaxBufferSize; | ||
| } | ||
| public void setDataStreamMaxBufferSize(int dataStreamMaxBufferSize) { | ||
| this.dataStreamMaxBufferSize = dataStreamMaxBufferSize; | ||
| } | ||
| public boolean isStreamBufferFlushDelay() { | ||
| return streamBufferFlushDelay; | ||
| } | ||
| @@ -227,4 +250,12 @@ public void setChecksumVerify(boolean checksumVerify) { | ||
| public int getBufferIncrement() { | ||
| return bufferIncrement; | ||
| } | ||
| public long getDataStreamBufferFlushSize() { | ||
| return dataStreamBufferFlushSize; | ||
| } | ||
| public void setDataStreamBufferFlushSize(long dataStreamBufferFlushSize) { | ||
| this.dataStreamBufferFlushSize = dataStreamBufferFlushSize; | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -257,13 +257,30 @@ public void write(ByteBuffer b, int off, int len) throws IOException { | ||
| if (len == 0) { | ||
| return; | ||
| } | ||
| int curLen = len; | ||
| // set limit on the number of bytes that a ByteBuffer(StreamBuffer) can hold | ||
| int maxBufferLen = config.getDataStreamMaxBufferSize(); | ||
| while (curLen > 0) { | ||
| int writeLen = Math.min(curLen, maxBufferLen); | ||
| final StreamBuffer buf = new StreamBuffer(b, off, writeLen); | ||
| off += writeLen; | ||
| bufferList.add(buf); | ||
| writeChunkToContainer(buf.duplicate()); | ||
| curLen -= writeLen; | ||
| writtenDataLength += writeLen; | ||
| doFlushIfNeeded(); | ||
| } | ||
| } | ||
| final StreamBuffer buf = new StreamBuffer(b, off, len); | ||
| bufferList.add(buf); | ||
| writeChunkToContainer(buf.duplicate()); | ||
| writtenDataLength += len; | ||
| private void doFlushIfNeeded() throws IOException { | ||
| Preconditions.checkArgument(config.getDataStreamBufferFlushSize() > config | ||
| .getDataStreamMaxBufferSize()); | ||
| long boundary = config.getDataStreamBufferFlushSize() / config | ||
| .getDataStreamMaxBufferSize(); | ||
| if (bufferList.size() % boundary == 0) { | ||
| updateFlushLength(); | ||
| executePutBlock(false, false); | ||
Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did we need add updateFlushLength(), waitOnFlushFutures() and watchForCommit(false) here? Just as what we did in handleFlush. Currently we only releaseBuffers after watchForCommit. ContributorAuthor There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks @captainzmc for the comment. The plan here is to execute a putBlock at 32MB and not block the client right away by waiting for the flush futures and calling watchForCommit. We will introduce another boundary say at 64MB to check whether atleast 32MB is flushed and committed to all datanodes i.e watchForCommit() and waitForFlushFutures() will occur at 64mb. (I will add this is in a different patch after this PR) Member There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thanks for explaining, make sense. | ||
| } | ||
| } | ||
| private void updateFlushLength() { | ||
Uh oh!
There was an error while loading. Please reload this page.