Skip to content

Commit

Permalink
Moved Http2 OutputQueueRecord into separate class.
Browse files Browse the repository at this point in the history
  • Loading branch information
MattGill98 committed Feb 6, 2019
1 parent 84a2385 commit 688ee7c
Show file tree
Hide file tree
Showing 2 changed files with 99 additions and 97 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
package org.glassfish.grizzly.http2;

import java.util.List;

import org.glassfish.grizzly.Buffer;
import org.glassfish.grizzly.CompletionHandler;
import org.glassfish.grizzly.WriteResult;
import org.glassfish.grizzly.asyncqueue.AsyncQueueRecord;
import org.glassfish.grizzly.http2.frames.DataFrame;
import org.glassfish.grizzly.http2.frames.Http2Frame;
import org.glassfish.grizzly.http2.utils.ChunkedCompletionHandler;

public class Http2OutputQueueRecord extends AsyncQueueRecord<WriteResult> {

private final int streamId;

private ChunkedCompletionHandler chunkedCompletionHandler;
private final CompletionHandler<WriteResult> originalCompletionHandler;
private Buffer buffer;
private final boolean isLast;

private final boolean isZeroSizeData;

Http2OutputQueueRecord(final int streamId, final Buffer buffer,
final CompletionHandler<WriteResult> completionHandler, final boolean isLast) {
super(null, null, null);

this.streamId = streamId;
this.buffer = buffer;
this.isZeroSizeData = !buffer.hasRemaining();
this.originalCompletionHandler = completionHandler;
this.isLast = isLast;
}

@Override
public void notifyFailure(final Throwable e) {
final CompletionHandler<WriteResult> chLocal = getCompletionHandler();
if (chLocal != null) {
chLocal.failed(e);
}
}

@Override
public void recycle() {
}

@Override
public WriteResult getCurrentResult() {
return null;
}

CompletionHandler<WriteResult> getCompletionHandler() {
return chunkedCompletionHandler != null ? chunkedCompletionHandler : originalCompletionHandler;
}

boolean isZeroSizeData() {
return isZeroSizeData;
}

boolean isFinished() {
return buffer == null;
}

int serializeTo(final List<Http2Frame> frames, final int maxDataSize) {

final int recordSize = buffer.remaining();

if (recordSize <= maxDataSize) {
final DataFrame dataFrame = DataFrame.builder().streamId(streamId).data(buffer).endStream(isLast).build();

frames.add(dataFrame);

buffer = null;

return recordSize;
} else {
if (originalCompletionHandler != null && chunkedCompletionHandler == null) {
chunkedCompletionHandler = new ChunkedCompletionHandler(originalCompletionHandler);
}

if (chunkedCompletionHandler != null) {
chunkedCompletionHandler.incChunks();
}

final Buffer remainder = buffer.split(buffer.position() + maxDataSize);

final DataFrame dataFrame = DataFrame.builder().streamId(streamId).data(buffer).endStream(false).build();

frames.add(dataFrame);

buffer = remainder;

return maxDataSize;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public class Http2SessionOutputSink {
private static final int MAX_OUTPUT_QUEUE_SIZE = 65536;

// async output queue
private final TaskQueue<Http2SessionOutputSink.OutputQueueRecord> outputQueue =
private final TaskQueue<Http2OutputQueueRecord> outputQueue =
TaskQueue.createTaskQueue(new TaskQueue.MutableMaxQueueSize() {

@Override
Expand Down Expand Up @@ -182,7 +182,7 @@ protected void writeDataDownStream(final Http2Stream stream,
data = messageCloner.clone(http2Session.getConnection(), data);
}

final Http2SessionOutputSink.OutputQueueRecord record = new Http2SessionOutputSink.OutputQueueRecord(
final Http2OutputQueueRecord record = new Http2OutputQueueRecord(
stream.getId(), data,
completionHandler, isLast);

Expand Down Expand Up @@ -227,7 +227,7 @@ private void flushOutputQueue() {
while (availWindowSize > bytesToTransfer &&
queueSize > queueSizeToFree) {

final Http2SessionOutputSink.OutputQueueRecord record = outputQueue.poll();
final Http2OutputQueueRecord record = outputQueue.poll();

if (record == null) {
// keep this warning for now
Expand Down Expand Up @@ -315,98 +315,4 @@ public void close() {
outputQueue.onClose();
}

private static class OutputQueueRecord extends AsyncQueueRecord<WriteResult> {
private final int streamId;

private ChunkedCompletionHandler chunkedCompletionHandler;
private final CompletionHandler<WriteResult> originalCompletionHandler;
private Buffer buffer;
private final boolean isLast;

private final boolean isZeroSizeData;

public OutputQueueRecord(final int streamId,
final Buffer buffer,
final CompletionHandler<WriteResult> completionHandler,
final boolean isLast) {
super(null, null, null);

this.streamId = streamId;
this.buffer = buffer;
this.isZeroSizeData = !buffer.hasRemaining();
this.originalCompletionHandler = completionHandler;
this.isLast = isLast;
}

public CompletionHandler<WriteResult> getCompletionHandler() {
return chunkedCompletionHandler != null ?
chunkedCompletionHandler :
originalCompletionHandler;
}

@Override
public void notifyFailure(final Throwable e) {
final CompletionHandler<WriteResult> chLocal = getCompletionHandler();
if (chLocal != null) {
chLocal.failed(e);
}
}

@Override
public void recycle() {
}

@Override
public WriteResult getCurrentResult() {
return null;
}

private boolean isZeroSizeData() {
return isZeroSizeData;
}

private boolean isFinished() {
return buffer == null;
}

private int serializeTo(final List<Http2Frame> frames,
final int maxDataSize) {

final int recordSize = buffer.remaining();

if (recordSize <= maxDataSize) {
final DataFrame dataFrame = DataFrame.builder()
.streamId(streamId)
.data(buffer).endStream(isLast)
.build();

frames.add(dataFrame);

buffer = null;

return recordSize;
} else {
if (originalCompletionHandler != null && chunkedCompletionHandler == null) {
chunkedCompletionHandler = new ChunkedCompletionHandler(originalCompletionHandler);
}

if (chunkedCompletionHandler != null) {
chunkedCompletionHandler.incChunks();
}

final Buffer remainder = buffer.split(buffer.position() + maxDataSize);

final DataFrame dataFrame = DataFrame.builder()
.streamId(streamId)
.data(buffer).endStream(false)
.build();

frames.add(dataFrame);

buffer = remainder;

return maxDataSize;
}
}
}
}

0 comments on commit 688ee7c

Please sign in to comment.