Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Issue 2050483002: [Cronet] Coalesce small buffers into single QUIC packet in GRPC on iOS. (Closed)

Created:
4 years, 6 months ago by mef
Modified:
4 years, 6 months ago
Reviewers:
kapishnikov, xunjieli
CC:
chromium-reviews, cbentzel+watch_chromium.org
Base URL:
https://chromium.googlesource.com/chromium/src.git@master
Target Ref:
refs/pending/heads/master
Project:
chromium
Visibility:
Public.

Description

[Cronet] Coalesce small buffers into single QUIC packet in GRPC on iOS. Added 'disable_auto_flush' and 'delay_request_headers_until_flush' to cronet_c_for_grpc API. BUG=601972 Committed: https://crrev.com/62d0ba2a00cd3eeca6afa9edc572829a711410b8 Cr-Commit-Position: refs/heads/master@{#400009}

Patch Set 1 #

Patch Set 2 : Added tests and made them pass. #

Patch Set 3 : Add more tests. #

Patch Set 4 : A little test cleanup. #

Total comments: 27

Patch Set 5 : Sync #

Patch Set 6 : Address Helen's comments, play with gn. #

Patch Set 7 : Change condition. #

Patch Set 8 : Merge SendFlushingWriteData and FlushDataOnNetworkThread. #

Total comments: 30

Patch Set 9 : Address comments. #

Patch Set 10 : Remove flushing_write_data_. #

Total comments: 21

Patch Set 11 : Reintroduce flushing_write_data. #

Total comments: 7

Patch Set 12 : Sync #

Patch Set 13 : Address Helen's comments. #

Total comments: 2
Unified diffs Side-by-side diffs Delta from patch set Stats (+460 lines, -88 lines) Patch
M components/cronet/ios/BUILD.gn View 1 2 3 4 5 6 7 5 chunks +19 lines, -5 lines 0 comments Download
M components/cronet/ios/cronet_bidirectional_stream.h View 1 2 3 4 5 6 7 8 9 10 7 chunks +65 lines, -4 lines 0 comments Download
M components/cronet/ios/cronet_bidirectional_stream.cc View 1 2 3 4 5 6 7 8 9 10 11 12 7 chunks +105 lines, -18 lines 2 comments Download
M components/cronet/ios/cronet_c_for_grpc.h View 1 2 3 4 5 6 7 8 9 10 6 chunks +43 lines, -13 lines 0 comments Download
M components/cronet/ios/cronet_c_for_grpc.cc View 1 2 3 4 5 6 7 8 9 10 2 chunks +24 lines, -7 lines 0 comments Download
M components/cronet/ios/test/cronet_bidirectional_stream_test.mm View 1 2 3 4 5 6 7 8 9 10 20 chunks +204 lines, -41 lines 0 comments Download

Messages

Total messages: 33 (5 generated)
mef
PTAL.
4 years, 6 months ago (2016-06-09 16:16:17 UTC) #3
xunjieli
Sorry for the delay. I was trying to fix something else. https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): ...
4 years, 6 months ago (2016-06-10 16:30:50 UTC) #4
mef
Thanks! https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode136 components/cronet/ios/cronet_bidirectional_stream.cc:136: if (!request_headers_sent) { On 2016/06/10 16:30:49, xunjieli wrote: ...
4 years, 6 months ago (2016-06-10 18:36:37 UTC) #5
xunjieli
https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode136 components/cronet/ios/cronet_bidirectional_stream.cc:136: if (!request_headers_sent) { On 2016/06/10 18:36:36, mef wrote: > ...
4 years, 6 months ago (2016-06-10 19:00:02 UTC) #6
xunjieli
https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode313 components/cronet/ios/cronet_bidirectional_stream.cc:313: if (write_state_ != WAITING_FOR_FLUSH) { On 2016/06/10 19:00:01, xunjieli ...
4 years, 6 months ago (2016-06-10 19:04:38 UTC) #7
mef
https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode306 components/cronet/ios/cronet_bidirectional_stream.cc:306: if (!sending_write_data_) On 2016/06/10 19:00:01, xunjieli wrote: > Can ...
4 years, 6 months ago (2016-06-10 19:11:28 UTC) #8
mef
Thanks, PTAL. https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/60001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode313 components/cronet/ios/cronet_bidirectional_stream.cc:313: if (write_state_ != WAITING_FOR_FLUSH) { On 2016/06/10 ...
4 years, 6 months ago (2016-06-10 20:03:48 UTC) #9
xunjieli
https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode149 components/cronet/ios/cronet_bidirectional_stream.cc:149: DCHECK_EQ(read_state_, STARTED); nit: the expected state should be the ...
4 years, 6 months ago (2016-06-10 20:31:37 UTC) #10
mef
https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode149 components/cronet/ios/cronet_bidirectional_stream.cc:149: DCHECK_EQ(read_state_, STARTED); On 2016/06/10 20:31:37, xunjieli wrote: > nit: ...
4 years, 6 months ago (2016-06-10 21:15:14 UTC) #11
xunjieli
https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode149 components/cronet/ios/cronet_bidirectional_stream.cc:149: DCHECK_EQ(read_state_, STARTED); On 2016/06/10 21:15:14, mef wrote: > On ...
4 years, 6 months ago (2016-06-10 22:22:09 UTC) #12
kapishnikov
https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/BUILD.gn File components/cronet/ios/BUILD.gn (right): https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/BUILD.gn#newcode56 components/cronet/ios/BUILD.gn:56: ios_framework_bundle("cronet_framework") { Where do we specify such things like ...
4 years, 6 months ago (2016-06-13 21:21:57 UTC) #13
mef
Thanks, PTAL. I think we can get rid of separate flushing_write_data_. https://codereview.chromium.org/2050483002/diff/140001/components/cronet/ios/BUILD.gn File components/cronet/ios/BUILD.gn (right): ...
4 years, 6 months ago (2016-06-14 00:20:38 UTC) #14
xunjieli
https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode204 components/cronet/ios/cronet_bidirectional_stream.cc:204: for (scoped_refptr<net::IOBuffer> buffer : Does const & work here? ...
4 years, 6 months ago (2016-06-14 14:29:35 UTC) #15
kapishnikov
https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode210 components/cronet/ios/cronet_bidirectional_stream.cc:210: if (!pending_write_data_->Empty()) { Can it result in flushing data ...
4 years, 6 months ago (2016-06-14 14:41:59 UTC) #16
kapishnikov
https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode210 components/cronet/ios/cronet_bidirectional_stream.cc:210: if (!pending_write_data_->Empty()) { On 2016/06/14 14:29:34, xunjieli wrote: > ...
4 years, 6 months ago (2016-06-14 14:50:25 UTC) #17
mef
Thanks, PTAL. https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode204 components/cronet/ios/cronet_bidirectional_stream.cc:204: for (scoped_refptr<net::IOBuffer> buffer : On 2016/06/14 14:29:34, ...
4 years, 6 months ago (2016-06-14 19:54:31 UTC) #18
xunjieli
Thanks. I will take a look later today. https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/test/cronet_bidirectional_stream_test.mm File components/cronet/ios/test/cronet_bidirectional_stream_test.mm (right): https://codereview.chromium.org/2050483002/diff/180001/components/cronet/ios/test/cronet_bidirectional_stream_test.mm#newcode243 components/cronet/ios/test/cronet_bidirectional_stream_test.mm:243: test->write_data.pop_front(); ...
4 years, 6 months ago (2016-06-14 19:56:12 UTC) #19
xunjieli
One question on |write_end_of_stream_| below. I just realized I am on network bug triage duty ...
4 years, 6 months ago (2016-06-15 14:07:19 UTC) #20
kapishnikov
https://codereview.chromium.org/2050483002/diff/200001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/200001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode223 components/cronet/ios/cronet_bidirectional_stream.cc:223: if (write_end_of_stream_) On 2016/06/15 14:07:19, xunjieli wrote: > There ...
4 years, 6 months ago (2016-06-15 16:37:26 UTC) #21
mef
Thanks, PTAL. https://codereview.chromium.org/2050483002/diff/200001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/200001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode53 components/cronet/ios/cronet_bidirectional_stream.cc:53: std::back_inserter(target->write_buffer_list)); On 2016/06/15 14:07:19, xunjieli wrote: > ...
4 years, 6 months ago (2016-06-15 19:05:23 UTC) #22
kapishnikov
LGTM
4 years, 6 months ago (2016-06-15 19:53:30 UTC) #23
commit-bot: I haz the power
CQ is trying da patch. Follow status at https://chromium-cq-status.appspot.com/patch-status/2050483002/240001
4 years, 6 months ago (2016-06-15 20:01:57 UTC) #25
commit-bot: I haz the power
Committed patchset #13 (id:240001)
4 years, 6 months ago (2016-06-15 21:03:18 UTC) #27
commit-bot: I haz the power
CQ bit was unchecked
4 years, 6 months ago (2016-06-15 21:03:27 UTC) #28
commit-bot: I haz the power
Patchset 13 (id:??) landed as https://crrev.com/62d0ba2a00cd3eeca6afa9edc572829a711410b8 Cr-Commit-Position: refs/heads/master@{#400009}
4 years, 6 months ago (2016-06-15 21:04:51 UTC) #30
kapishnikov
https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode225 components/cronet/ios/cronet_bidirectional_stream.cc:225: MaybeOnSucceded(); For future CL: I think MaybeOnSucceded() can go ...
4 years, 6 months ago (2016-06-16 16:16:47 UTC) #31
xunjieli
https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/cronet_bidirectional_stream.cc File components/cronet/ios/cronet_bidirectional_stream.cc (right): https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/cronet_bidirectional_stream.cc#newcode336 components/cronet/ios/cronet_bidirectional_stream.cc:336: sending_write_data_->lengths(), write_end_of_stream_); While I was doing the same change ...
4 years, 6 months ago (2016-06-20 15:24:24 UTC) #32
mef
4 years, 6 months ago (2016-06-20 15:31:53 UTC) #33
Message was sent while issue was closed.
On 2016/06/20 15:24:24, xunjieli wrote:
>
https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/...
> File components/cronet/ios/cronet_bidirectional_stream.cc (right):
> 
>
https://codereview.chromium.org/2050483002/diff/240001/components/cronet/ios/...
> components/cronet/ios/cronet_bidirectional_stream.cc:336:
> sending_write_data_->lengths(), write_end_of_stream_);
> While I was doing the same change on Android side, I noticed that there is a
> problem with using |write_end_of_stream_| here. The bug is currently present
in
> both Android and iOS.
> 
> If we have written EndOfStream, but we have non-empty |pending_write_data_|.
We
> can incorrectly set EndOfStream = true for |flushing_write_data_|.
> 
> To reproduce, let's say we have 3 buffers to write. Write all three buffers at
> once just after stream is ready, but only call flush after the second write.
> stream.write(buffer1, /*eos*=/false);
> stream.write(buffer2, /*eos*=/false);
> stream.flush();
> stream.write(buffer3, /*eos*=/true);
> 
> SendFlushingWriteData() for the first flush() can happen after the final
write,
> so |write_end_of_stream_| is true. SendFlushingWriteData() will end up sending
> two buffers with EndOfStream = true. The next time we try to flush the last
> buffer, it will be just no-op because writing is done :(
> 
> I reproduced on Android side, and I am working on a fix.

Good catch!

Powered by Google App Engine
This is Rietveld 408576698