Merge "veyron/tools/gclogs: Enable test on darwin"
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 6a6d9b8..fdc0afa 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -358,7 +358,7 @@
if err != nil {
return nil, "", err
}
- s := expect.NewSession(nil, handle.Stdout(), time.Second)
+ s := expect.NewSession(nil, handle.Stdout(), 10*time.Second)
s.ExpectVar("PID")
if err := s.Error(); err != nil {
return nil, "", err
diff --git a/runtimes/google/ipc/benchmarks/RESULTS.txt b/runtimes/google/ipc/benchmarks/RESULTS.txt
index 5079f5b..979b2ac 100644
--- a/runtimes/google/ipc/benchmarks/RESULTS.txt
+++ b/runtimes/google/ipc/benchmarks/RESULTS.txt
@@ -1,108 +1,108 @@
-Date: 12/12/2014
+Date: 12/14/2014
Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz, 66114888KB Memory
$ veyron go run veyron/runtimes/google/ipc/benchmarks/bm/main.go \
-test.cpu=1,2 -test.benchtime=5s -histogram
-Benchmark____1B 5000 2083384 ns/op 0.00 MB/s
-Benchmark____1B-2 5000 2079227 ns/op 0.00 MB/s
-Benchmark___10B 5000 2393875 ns/op 0.01 MB/s
-Benchmark___10B-2 5000 2130395 ns/op 0.01 MB/s
-Benchmark__100B 5000 2570157 ns/op 0.08 MB/s
-Benchmark__100B-2 5000 2313091 ns/op 0.09 MB/s
-Benchmark___1KB 5000 2441822 ns/op 0.82 MB/s
-Benchmark___1KB-2 5000 2269425 ns/op 0.88 MB/s
-Benchmark__10KB 5000 2777789 ns/op 7.20 MB/s
-Benchmark__10KB-2 5000 2320824 ns/op 8.62 MB/s
-Benchmark_100KB 2000 5462859 ns/op 36.61 MB/s
-Benchmark_100KB-2 2000 4058566 ns/op 49.28 MB/s
+Benchmark____1B 3000 2260153 ns/op 0.00 MB/s
+Benchmark____1B-2 3000 2362339 ns/op 0.00 MB/s
+Benchmark___10B 3000 2595581 ns/op 0.01 MB/s
+Benchmark___10B-2 3000 2372671 ns/op 0.01 MB/s
+Benchmark__100B 3000 2690733 ns/op 0.07 MB/s
+Benchmark__100B-2 3000 2419120 ns/op 0.08 MB/s
+Benchmark___1KB 3000 2498211 ns/op 0.80 MB/s
+Benchmark___1KB-2 3000 2244818 ns/op 0.89 MB/s
+Benchmark__10KB 3000 2740536 ns/op 7.30 MB/s
+Benchmark__10KB-2 3000 2394824 ns/op 8.35 MB/s
+Benchmark_100KB 2000 5581491 ns/op 35.83 MB/s
+Benchmark_100KB-2 2000 4127286 ns/op 48.46 MB/s
-Benchmark____1_chunk_____1B 2000 5280468 ns/op 0.00 MB/s
-Benchmark____1_chunk_____1B-2 2000 4850675 ns/op 0.00 MB/s
-Benchmark____1_chunk____10B 2000 5334596 ns/op 0.00 MB/s
-Benchmark____1_chunk____10B-2 2000 4867046 ns/op 0.00 MB/s
-Benchmark____1_chunk___100B 2000 5429984 ns/op 0.04 MB/s
-Benchmark____1_chunk___100B-2 2000 4913146 ns/op 0.04 MB/s
-Benchmark____1_chunk____1KB 2000 5193539 ns/op 0.39 MB/s
-Benchmark____1_chunk____1KB-2 2000 4864711 ns/op 0.41 MB/s
-Benchmark____1_chunk___10KB 2000 5472549 ns/op 3.65 MB/s
-Benchmark____1_chunk___10KB-2 2000 4950905 ns/op 4.04 MB/s
-Benchmark____1_chunk__100KB 1000 7896673 ns/op 25.33 MB/s
-Benchmark____1_chunk__100KB-2 2000 5976114 ns/op 33.47 MB/s
-Benchmark___10_chunks____1B 2000 6964499 ns/op 0.00 MB/s
-Benchmark___10_chunks____1B-2 2000 5836079 ns/op 0.00 MB/s
-Benchmark___10_chunks___10B 1000 7468897 ns/op 0.03 MB/s
-Benchmark___10_chunks___10B-2 2000 5896988 ns/op 0.03 MB/s
-Benchmark___10_chunks__100B 2000 7511902 ns/op 0.27 MB/s
-Benchmark___10_chunks__100B-2 2000 5975725 ns/op 0.33 MB/s
-Benchmark___10_chunks___1KB 1000 7678796 ns/op 2.60 MB/s
-Benchmark___10_chunks___1KB-2 2000 6047220 ns/op 3.31 MB/s
-Benchmark___10_chunks__10KB 1000 9913510 ns/op 20.17 MB/s
-Benchmark___10_chunks__10KB-2 2000 7066239 ns/op 28.30 MB/s
-Benchmark___10_chunks_100KB 500 32109490 ns/op 62.29 MB/s
-Benchmark___10_chunks_100KB-2 500 18957196 ns/op 105.50 MB/s
-Benchmark__100_chunks____1B 500 23105522 ns/op 0.01 MB/s
-Benchmark__100_chunks____1B-2 1000 14962218 ns/op 0.01 MB/s
-Benchmark__100_chunks___10B 500 24822827 ns/op 0.08 MB/s
-Benchmark__100_chunks___10B-2 500 15143142 ns/op 0.13 MB/s
-Benchmark__100_chunks__100B 500 25825032 ns/op 0.77 MB/s
-Benchmark__100_chunks__100B-2 500 16276252 ns/op 1.23 MB/s
-Benchmark__100_chunks___1KB 500 29567438 ns/op 6.76 MB/s
-Benchmark__100_chunks___1KB-2 500 18167929 ns/op 11.01 MB/s
-Benchmark__100_chunks__10KB 100 52974498 ns/op 37.75 MB/s
-Benchmark__100_chunks__10KB-2 500 30197012 ns/op 66.23 MB/s
-Benchmark__100_chunks_100KB 50 259344427 ns/op 77.12 MB/s
-Benchmark__100_chunks_100KB-2 100 138213866 ns/op 144.70 MB/s
-Benchmark___1K_chunks____1B 100 140929084 ns/op 0.01 MB/s
-Benchmark___1K_chunks____1B-2 100 105473615 ns/op 0.02 MB/s
-Benchmark___1K_chunks___10B 50 200076160 ns/op 0.10 MB/s
-Benchmark___1K_chunks___10B-2 100 112141677 ns/op 0.18 MB/s
-Benchmark___1K_chunks__100B 50 227795062 ns/op 0.88 MB/s
-Benchmark___1K_chunks__100B-2 100 127584568 ns/op 1.57 MB/s
-Benchmark___1K_chunks___1KB 50 260678247 ns/op 7.67 MB/s
-Benchmark___1K_chunks___1KB-2 100 147406551 ns/op 13.57 MB/s
-Benchmark___1K_chunks__10KB 20 484028853 ns/op 41.32 MB/s
-Benchmark___1K_chunks__10KB-2 50 255874182 ns/op 78.16 MB/s
-Benchmark___1K_chunks_100KB 5 2464952174 ns/op 81.14 MB/s
-Benchmark___1K_chunks_100KB-2 5 1336699604 ns/op 149.62 MB/s
+Benchmark____1_chunk_____1B 3000 2744128 ns/op 0.00 MB/s
+Benchmark____1_chunk_____1B-2 3000 2347418 ns/op 0.00 MB/s
+Benchmark____1_chunk____10B 3000 2857309 ns/op 0.01 MB/s
+Benchmark____1_chunk____10B-2 3000 2363346 ns/op 0.01 MB/s
+Benchmark____1_chunk___100B 3000 2922993 ns/op 0.07 MB/s
+Benchmark____1_chunk___100B-2 3000 2558699 ns/op 0.08 MB/s
+Benchmark____1_chunk____1KB 3000 2646432 ns/op 0.76 MB/s
+Benchmark____1_chunk____1KB-2 3000 2400649 ns/op 0.83 MB/s
+Benchmark____1_chunk___10KB 3000 2954627 ns/op 6.77 MB/s
+Benchmark____1_chunk___10KB-2 3000 2546084 ns/op 7.86 MB/s
+Benchmark____1_chunk__100KB 2000 5517042 ns/op 36.25 MB/s
+Benchmark____1_chunk__100KB-2 2000 4157872 ns/op 48.10 MB/s
+Benchmark___10_chunks____1B 2000 4177247 ns/op 0.00 MB/s
+Benchmark___10_chunks____1B-2 2000 3432532 ns/op 0.01 MB/s
+Benchmark___10_chunks___10B 2000 4664935 ns/op 0.04 MB/s
+Benchmark___10_chunks___10B-2 2000 3548029 ns/op 0.06 MB/s
+Benchmark___10_chunks__100B 2000 4845710 ns/op 0.41 MB/s
+Benchmark___10_chunks__100B-2 2000 3658666 ns/op 0.55 MB/s
+Benchmark___10_chunks___1KB 2000 4971196 ns/op 4.02 MB/s
+Benchmark___10_chunks___1KB-2 2000 3662827 ns/op 5.46 MB/s
+Benchmark___10_chunks__10KB 1000 7533684 ns/op 26.55 MB/s
+Benchmark___10_chunks__10KB-2 2000 4922363 ns/op 40.63 MB/s
+Benchmark___10_chunks_100KB 200 31539312 ns/op 63.41 MB/s
+Benchmark___10_chunks_100KB-2 500 18574440 ns/op 107.67 MB/s
+Benchmark__100_chunks____1B 500 18036549 ns/op 0.01 MB/s
+Benchmark__100_chunks____1B-2 1000 12395699 ns/op 0.02 MB/s
+Benchmark__100_chunks___10B 300 20669375 ns/op 0.10 MB/s
+Benchmark__100_chunks___10B-2 500 12634978 ns/op 0.16 MB/s
+Benchmark__100_chunks__100B 300 23164692 ns/op 0.86 MB/s
+Benchmark__100_chunks__100B-2 500 13821225 ns/op 1.45 MB/s
+Benchmark__100_chunks___1KB 300 26071439 ns/op 7.67 MB/s
+Benchmark__100_chunks___1KB-2 500 15738134 ns/op 12.71 MB/s
+Benchmark__100_chunks__10KB 100 50248311 ns/op 39.80 MB/s
+Benchmark__100_chunks__10KB-2 300 28614761 ns/op 69.89 MB/s
+Benchmark__100_chunks_100KB 30 272889576 ns/op 73.29 MB/s
+Benchmark__100_chunks_100KB-2 50 149680912 ns/op 133.62 MB/s
+Benchmark___1K_chunks____1B 100 111621410 ns/op 0.02 MB/s
+Benchmark___1K_chunks____1B-2 100 103311101 ns/op 0.02 MB/s
+Benchmark___1K_chunks___10B 50 189580683 ns/op 0.11 MB/s
+Benchmark___1K_chunks___10B-2 100 107068429 ns/op 0.19 MB/s
+Benchmark___1K_chunks__100B 30 223128293 ns/op 0.90 MB/s
+Benchmark___1K_chunks__100B-2 50 125690815 ns/op 1.59 MB/s
+Benchmark___1K_chunks___1KB 30 251956982 ns/op 7.94 MB/s
+Benchmark___1K_chunks___1KB-2 50 144214400 ns/op 13.87 MB/s
+Benchmark___1K_chunks__10KB 20 474946063 ns/op 42.11 MB/s
+Benchmark___1K_chunks__10KB-2 30 267531367 ns/op 74.76 MB/s
+Benchmark___1K_chunks_100KB 2 2675372295 ns/op 74.76 MB/s
+Benchmark___1K_chunks_100KB-2 5 1421481350 ns/op 140.70 MB/s
-Benchmark__per_chunk____1B 50000 233075 ns/op 0.01 MB/s
-Benchmark__per_chunk____1B-2 50000 177314 ns/op 0.01 MB/s
-Benchmark__per_chunk___10B 20000 519996 ns/op 0.04 MB/s
-Benchmark__per_chunk___10B-2 50000 338254 ns/op 0.06 MB/s
-Benchmark__per_chunk__100B 10000 573593 ns/op 0.35 MB/s
-Benchmark__per_chunk__100B-2 50000 267646 ns/op 0.75 MB/s
-Benchmark__per_chunk___1KB 20000 514359 ns/op 3.89 MB/s
-Benchmark__per_chunk___1KB-2 50000 275305 ns/op 7.26 MB/s
-Benchmark__per_chunk__10KB 10000 703176 ns/op 28.44 MB/s
-Benchmark__per_chunk__10KB-2 20000 395105 ns/op 50.62 MB/s
-Benchmark__per_chunk_100KB 5000 2834149 ns/op 70.57 MB/s
-Benchmark__per_chunk_100KB-2 10000 1461822 ns/op 136.82 MB/s
+Benchmark__per_chunk____1B 50000 163939 ns/op 0.01 MB/s
+Benchmark__per_chunk____1B-2 50000 118409 ns/op 0.02 MB/s
+Benchmark__per_chunk___10B 20000 321908 ns/op 0.06 MB/s
+Benchmark__per_chunk___10B-2 50000 176818 ns/op 0.11 MB/s
+Benchmark__per_chunk__100B 20000 411514 ns/op 0.49 MB/s
+Benchmark__per_chunk__100B-2 30000 231565 ns/op 0.86 MB/s
+Benchmark__per_chunk___1KB 20000 423999 ns/op 4.72 MB/s
+Benchmark__per_chunk___1KB-2 30000 248721 ns/op 8.04 MB/s
+Benchmark__per_chunk__10KB 10000 631536 ns/op 31.67 MB/s
+Benchmark__per_chunk__10KB-2 20000 346868 ns/op 57.66 MB/s
+Benchmark__per_chunk_100KB 3000 2613430 ns/op 76.53 MB/s
+Benchmark__per_chunk_100KB-2 5000 1369809 ns/op 146.01 MB/s
-Benchmark___10B_mux__100_chunks___10B 500 22049071 ns/op 0.00 MB/s
-Benchmark___10B_mux__100_chunks___10B-2 2000 4734244 ns/op 0.00 MB/s
-Benchmark___10B_mux__100_chunks__100B 500 23746639 ns/op 0.00 MB/s
-Benchmark___10B_mux__100_chunks__100B-2 2000 5501514 ns/op 0.00 MB/s
-Benchmark___10B_mux__100_chunks___1KB 500 25033793 ns/op 0.00 MB/s
-Benchmark___10B_mux__100_chunks___1KB-2 2000 5598670 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks___10B 100 121659148 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks___10B-2 1000 7827224 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks__100B 100 141824661 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks__100B-2 1000 11127970 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks___1KB 100 148589902 ns/op 0.00 MB/s
-Benchmark___10B_mux___1K_chunks___1KB-2 1000 12616916 ns/op 0.00 MB/s
-Benchmark__100B_mux__100_chunks___10B 500 23895451 ns/op 0.01 MB/s
-Benchmark__100B_mux__100_chunks___10B-2 2000 5134742 ns/op 0.04 MB/s
-Benchmark__100B_mux__100_chunks__100B 500 25336809 ns/op 0.01 MB/s
-Benchmark__100B_mux__100_chunks__100B-2 2000 6012040 ns/op 0.03 MB/s
-Benchmark__100B_mux__100_chunks___1KB 500 27144821 ns/op 0.01 MB/s
-Benchmark__100B_mux__100_chunks___1KB-2 2000 6117827 ns/op 0.03 MB/s
-Benchmark__100B_mux___1K_chunks___10B 100 132175574 ns/op 0.00 MB/s
-Benchmark__100B_mux___1K_chunks___10B-2 1000 8590497 ns/op 0.02 MB/s
-Benchmark__100B_mux___1K_chunks__100B 100 145204032 ns/op 0.00 MB/s
-Benchmark__100B_mux___1K_chunks__100B-2 1000 12104363 ns/op 0.02 MB/s
-Benchmark__100B_mux___1K_chunks___1KB 100 150385852 ns/op 0.00 MB/s
-Benchmark__100B_mux___1K_chunks___1KB-2 1000 13867566 ns/op 0.01 MB/s
+Benchmark___10B_mux__100_chunks___10B 500 18817141 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B-2 1000 7104449 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks__100B 300 21167617 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks__100B-2 1000 8372251 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB 300 22817830 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB-2 1000 8831943 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks___10B 100 123136622 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks___10B-2 300 22274569 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks__100B 100 143814971 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks__100B-2 200 34125016 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks___1KB 100 136987808 ns/op 0.00 MB/s
+Benchmark___10B_mux___1K_chunks___1KB-2 200 35831221 ns/op 0.00 MB/s
+Benchmark__100B_mux__100_chunks___10B 500 20748811 ns/op 0.01 MB/s
+Benchmark__100B_mux__100_chunks___10B-2 1000 7604070 ns/op 0.03 MB/s
+Benchmark__100B_mux__100_chunks__100B 300 21922577 ns/op 0.01 MB/s
+Benchmark__100B_mux__100_chunks__100B-2 1000 9164254 ns/op 0.02 MB/s
+Benchmark__100B_mux__100_chunks___1KB 300 23892634 ns/op 0.01 MB/s
+Benchmark__100B_mux__100_chunks___1KB-2 1000 9288578 ns/op 0.02 MB/s
+Benchmark__100B_mux___1K_chunks___10B 100 120357166 ns/op 0.00 MB/s
+Benchmark__100B_mux___1K_chunks___10B-2 300 23110788 ns/op 0.01 MB/s
+Benchmark__100B_mux___1K_chunks__100B 100 146211502 ns/op 0.00 MB/s
+Benchmark__100B_mux___1K_chunks__100B-2 200 36485527 ns/op 0.01 MB/s
+Benchmark__100B_mux___1K_chunks___1KB 100 145242261 ns/op 0.00 MB/s
+Benchmark__100B_mux___1K_chunks___1KB-2 200 37420006 ns/op 0.01 MB/s
% The followings are the full output with histograms.
@@ -110,13 +110,13 @@
================================================================================
Echo RPC
================================================================================
-Benchmark____1B 5000 2083384 ns/op 0.00 MB/s
+Benchmark____1B 3000 2260153 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 3 Avg: 1.40
+Count: 3000 Min: 1 Max: 3 Avg: 1.54
------------------------------------------------------------
-[ 1, 2) 3397 67.9% 67.9% #######
-[ 2, 3) 1201 24.0% 92.0% ##
-[ 3, 4) 402 8.0% 100.0% #
+[ 1, 2) 1754 58.5% 58.5% ######
+[ 2, 3) 864 28.8% 87.3% ###
+[ 3, 4) 382 12.7% 100.0% #
[ 4, 5) 0 0.0% 100.0%
[ 5, 6) 0 0.0% 100.0%
[ 6, 7) 0 0.0% 100.0%
@@ -131,37 +131,100 @@
[ 15, 16) 0 0.0% 100.0%
[ 16, 17) 0 0.0% 100.0%
[ 17, inf) 0 0.0% 100.0%
-Benchmark____1B-2 5000 2079227 ns/op 0.00 MB/s
+Benchmark____1B-2 3000 2362339 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 3 Avg: 1.31
+Count: 3000 Min: 1 Max: 4 Avg: 1.98
------------------------------------------------------------
-[ 1, 2) 4002 80.0% 80.0% ########
-[ 2, 3) 450 9.0% 89.0% #
-[ 3, 4) 548 11.0% 100.0% #
-[ 4, 5) 0 0.0% 100.0%
+[ 1, 2) 608 20.3% 20.3% ##
+[ 2, 3) 1864 62.1% 82.4% ######
+[ 3, 4) 520 17.3% 99.7% ##
+[ 4, 5) 8 0.3% 100.0%
[ 5, 6) 0 0.0% 100.0%
[ 6, 7) 0 0.0% 100.0%
[ 7, 8) 0 0.0% 100.0%
[ 8, 9) 0 0.0% 100.0%
[ 9, 10) 0 0.0% 100.0%
[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 15) 0 0.0% 100.0%
-[ 15, 16) 0 0.0% 100.0%
-[ 16, 17) 0 0.0% 100.0%
-[ 17, inf) 0 0.0% 100.0%
-Benchmark___10B 5000 2393875 ns/op 0.01 MB/s
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 17) 0 0.0% 100.0%
+[ 17, 19) 0 0.0% 100.0%
+[ 19, 21) 0 0.0% 100.0%
+[ 21, 23) 0 0.0% 100.0%
+[ 23, inf) 0 0.0% 100.0%
+Benchmark___10B 3000 2595581 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 6 Avg: 1.77
+Count: 3000 Min: 2 Max: 5 Avg: 2.37
------------------------------------------------------------
-[ 1, 2) 2689 53.8% 53.8% #####
-[ 2, 3) 1646 32.9% 86.7% ###
-[ 3, 4) 39 0.8% 87.5%
-[ 4, 5) 360 7.2% 94.7% #
-[ 5, 6) 265 5.3% 100.0% #
-[ 6, 7) 1 0.0% 100.0%
+[ 2, 3) 2459 82.0% 82.0% ########
+[ 3, 4) 45 1.5% 83.5%
+[ 4, 5) 437 14.6% 98.0% #
+[ 5, 6) 59 2.0% 100.0%
+[ 6, 7) 0 0.0% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 10) 0 0.0% 100.0%
+[ 10, 11) 0 0.0% 100.0%
+[ 11, 12) 0 0.0% 100.0%
+[ 12, 14) 0 0.0% 100.0%
+[ 14, 16) 0 0.0% 100.0%
+[ 16, 18) 0 0.0% 100.0%
+[ 18, 20) 0 0.0% 100.0%
+[ 20, 22) 0 0.0% 100.0%
+[ 22, 24) 0 0.0% 100.0%
+[ 24, inf) 0 0.0% 100.0%
+Benchmark___10B-2 3000 2372671 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 5 Avg: 1.93
+------------------------------------------------------------
+[ 1, 2) 866 28.9% 28.9% ###
+[ 2, 3) 1691 56.4% 85.2% ######
+[ 3, 4) 233 7.8% 93.0% #
+[ 4, 5) 201 6.7% 99.7% #
+[ 5, 6) 9 0.3% 100.0%
+[ 6, 7) 0 0.0% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 17) 0 0.0% 100.0%
+[ 17, 20) 0 0.0% 100.0%
+[ 20, 23) 0 0.0% 100.0%
+[ 23, 26) 0 0.0% 100.0%
+[ 26, 29) 0 0.0% 100.0%
+[ 29, inf) 0 0.0% 100.0%
+Benchmark__100B 3000 2690733 ns/op 0.07 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 2 Max: 7 Avg: 2.48
+------------------------------------------------------------
+[ 2, 3) 2544 84.8% 84.8% ########
+[ 3, 4) 82 2.7% 87.5%
+[ 4, 5) 0 0.0% 87.5%
+[ 5, 6) 146 4.9% 92.4%
+[ 6, 7) 226 7.5% 99.9% #
+[ 7, 8) 2 0.1% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 17) 0 0.0% 100.0%
+[ 17, 20) 0 0.0% 100.0%
+[ 20, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 31) 0 0.0% 100.0%
+[ 31, 35) 0 0.0% 100.0%
+[ 35, inf) 0 0.0% 100.0%
+Benchmark__100B-2 3000 2419120 ns/op 0.08 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 6 Avg: 2.05
+------------------------------------------------------------
+[ 1, 2) 647 21.6% 21.6% ##
+[ 2, 3) 2027 67.6% 89.1% #######
+[ 3, 4) 1 0.0% 89.2%
+[ 4, 5) 184 6.1% 95.3% #
+[ 5, 6) 128 4.3% 99.6%
+[ 6, 7) 13 0.4% 100.0%
[ 7, 8) 0 0.0% 100.0%
[ 8, 10) 0 0.0% 100.0%
[ 10, 12) 0 0.0% 100.0%
@@ -173,14 +236,207 @@
[ 26, 30) 0 0.0% 100.0%
[ 30, 34) 0 0.0% 100.0%
[ 34, inf) 0 0.0% 100.0%
-Benchmark___10B-2 5000 2130395 ns/op 0.01 MB/s
+Benchmark___1KB 3000 2498211 ns/op 0.80 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 5 Avg: 1.34
+Count: 3000 Min: 1 Max: 10 Avg: 1.76
------------------------------------------------------------
-[ 1, 2) 4228 84.6% 84.6% ########
-[ 2, 3) 249 5.0% 89.5%
-[ 3, 4) 110 2.2% 91.7%
-[ 4, 5) 412 8.2% 100.0% #
+[ 1, 2) 2191 73.0% 73.0% #######
+[ 2, 3) 449 15.0% 88.0% #
+[ 3, 4) 75 2.5% 90.5%
+[ 4, 5) 3 0.1% 90.6%
+[ 5, 6) 6 0.2% 90.8%
+[ 6, 8) 240 8.0% 98.8% #
+[ 8, 10) 35 1.2% 100.0%
+[ 10, 12) 1 0.0% 100.0%
+[ 12, 15) 0 0.0% 100.0%
+[ 15, 18) 0 0.0% 100.0%
+[ 18, 22) 0 0.0% 100.0%
+[ 22, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 45) 0 0.0% 100.0%
+[ 45, 54) 0 0.0% 100.0%
+[ 54, inf) 0 0.0% 100.0%
+Benchmark___1KB-2 3000 2244818 ns/op 0.89 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 7 Avg: 1.62
+------------------------------------------------------------
+[ 1, 2) 1949 65.0% 65.0% ######
+[ 2, 3) 795 26.5% 91.5% ###
+[ 3, 4) 0 0.0% 91.5%
+[ 4, 5) 63 2.1% 93.6%
+[ 5, 6) 112 3.7% 97.3%
+[ 6, 7) 72 2.4% 99.7%
+[ 7, 9) 9 0.3% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 18) 0 0.0% 100.0%
+[ 18, 21) 0 0.0% 100.0%
+[ 21, 25) 0 0.0% 100.0%
+[ 25, 29) 0 0.0% 100.0%
+[ 29, 34) 0 0.0% 100.0%
+[ 34, 40) 0 0.0% 100.0%
+[ 40, inf) 0 0.0% 100.0%
+Benchmark__10KB 3000 2740536 ns/op 7.30 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 2 Max: 10 Avg: 2.62
+------------------------------------------------------------
+[ 2, 3) 2652 88.4% 88.4% #########
+[ 3, 4) 72 2.4% 90.8%
+[ 4, 5) 0 0.0% 90.8%
+[ 5, 6) 0 0.0% 90.8%
+[ 6, 7) 0 0.0% 90.8%
+[ 7, 9) 93 3.1% 93.9%
+[ 9, 11) 183 6.1% 100.0% #
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 44) 0 0.0% 100.0%
+[ 44, 52) 0 0.0% 100.0%
+[ 52, inf) 0 0.0% 100.0%
+Benchmark__10KB-2 3000 2394824 ns/op 8.35 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 8 Avg: 1.84
+------------------------------------------------------------
+[ 1, 2) 1531 51.0% 51.0% #####
+[ 2, 3) 1214 40.5% 91.5% ####
+[ 3, 4) 0 0.0% 91.5%
+[ 4, 5) 0 0.0% 91.5%
+[ 5, 6) 83 2.8% 94.3%
+[ 6, 7) 69 2.3% 96.6%
+[ 7, 9) 103 3.4% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 44) 0 0.0% 100.0%
+[ 44, inf) 0 0.0% 100.0%
+Benchmark_100KB 2000 5581491 ns/op 35.83 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 3 Max: 15 Avg: 4.93
+------------------------------------------------------------
+[ 3, 4) 1253 62.7% 62.7% ######
+[ 4, 5) 259 13.0% 75.6% #
+[ 5, 6) 124 6.2% 81.8% #
+[ 6, 7) 1 0.1% 81.9%
+[ 7, 8) 0 0.0% 81.9%
+[ 8, 10) 0 0.0% 81.9%
+[ 10, 12) 84 4.2% 86.1%
+[ 12, 15) 274 13.7% 99.8% #
+[ 15, 18) 5 0.2% 100.0%
+[ 18, 22) 0 0.0% 100.0%
+[ 22, 27) 0 0.0% 100.0%
+[ 27, 33) 0 0.0% 100.0%
+[ 33, 40) 0 0.0% 100.0%
+[ 40, 48) 0 0.0% 100.0%
+[ 48, 58) 0 0.0% 100.0%
+[ 58, 69) 0 0.0% 100.0%
+[ 69, inf) 0 0.0% 100.0%
+Benchmark_100KB-2 2000 4127286 ns/op 48.46 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 2 Max: 10 Avg: 3.78
+------------------------------------------------------------
+[ 2, 3) 373 18.7% 18.7% ##
+[ 3, 4) 1286 64.3% 83.0% ######
+[ 4, 5) 0 0.0% 83.0%
+[ 5, 6) 0 0.0% 83.0%
+[ 6, 7) 0 0.0% 83.0%
+[ 7, 9) 116 5.8% 88.8% #
+[ 9, 11) 225 11.2% 100.0% #
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 44) 0 0.0% 100.0%
+[ 44, 52) 0 0.0% 100.0%
+[ 52, inf) 0 0.0% 100.0%
+
+================================================================================
+Echo streaming RPC
+================================================================================
+Benchmark____1_chunk_____1B 3000 2744128 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 2 Max: 4 Avg: 2.31
+------------------------------------------------------------
+[ 2, 3) 2072 69.1% 69.1% #######
+[ 3, 4) 921 30.7% 99.8% ###
+[ 4, 5) 7 0.2% 100.0%
+[ 5, 6) 0 0.0% 100.0%
+[ 6, 7) 0 0.0% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 10) 0 0.0% 100.0%
+[ 10, 11) 0 0.0% 100.0%
+[ 11, 12) 0 0.0% 100.0%
+[ 12, 13) 0 0.0% 100.0%
+[ 13, 14) 0 0.0% 100.0%
+[ 14, 15) 0 0.0% 100.0%
+[ 15, 16) 0 0.0% 100.0%
+[ 16, 17) 0 0.0% 100.0%
+[ 17, 18) 0 0.0% 100.0%
+[ 18, inf) 0 0.0% 100.0%
+Benchmark____1_chunk_____1B-2 3000 2347418 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 4 Avg: 2.18
+------------------------------------------------------------
+[ 1, 2) 46 1.5% 1.5%
+[ 2, 3) 2381 79.4% 80.9% ########
+[ 3, 4) 567 18.9% 99.8% ##
+[ 4, 5) 6 0.2% 100.0%
+[ 5, 6) 0 0.0% 100.0%
+[ 6, 7) 0 0.0% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 10) 0 0.0% 100.0%
+[ 10, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 17) 0 0.0% 100.0%
+[ 17, 19) 0 0.0% 100.0%
+[ 19, 21) 0 0.0% 100.0%
+[ 21, 23) 0 0.0% 100.0%
+[ 23, inf) 0 0.0% 100.0%
+Benchmark____1_chunk____10B 3000 2857309 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 2 Max: 5 Avg: 2.45
+------------------------------------------------------------
+[ 2, 3) 2387 79.6% 79.6% ########
+[ 3, 4) 88 2.9% 82.5%
+[ 4, 5) 303 10.1% 92.6% #
+[ 5, 6) 222 7.4% 100.0% #
+[ 6, 7) 0 0.0% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 10) 0 0.0% 100.0%
+[ 10, 11) 0 0.0% 100.0%
+[ 11, 12) 0 0.0% 100.0%
+[ 12, 14) 0 0.0% 100.0%
+[ 14, 16) 0 0.0% 100.0%
+[ 16, 18) 0 0.0% 100.0%
+[ 18, 20) 0 0.0% 100.0%
+[ 20, 22) 0 0.0% 100.0%
+[ 22, 24) 0 0.0% 100.0%
+[ 24, inf) 0 0.0% 100.0%
+Benchmark____1_chunk____10B-2 3000 2363346 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 5 Avg: 2.18
+------------------------------------------------------------
+[ 1, 2) 32 1.1% 1.1%
+[ 2, 3) 2535 84.5% 85.6% ########
+[ 3, 4) 293 9.8% 95.3% #
+[ 4, 5) 139 4.6% 100.0%
[ 5, 6) 1 0.0% 100.0%
[ 6, 7) 0 0.0% 100.0%
[ 7, 8) 0 0.0% 100.0%
@@ -194,38 +450,80 @@
[ 23, 26) 0 0.0% 100.0%
[ 26, 29) 0 0.0% 100.0%
[ 29, inf) 0 0.0% 100.0%
-Benchmark__100B 5000 2570157 ns/op 0.08 MB/s
+Benchmark____1_chunk___100B 3000 2922993 ns/op 0.07 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 10 Avg: 2.35
+Count: 3000 Min: 2 Max: 7 Avg: 2.50
------------------------------------------------------------
-[ 1, 2) 627 12.5% 12.5% #
-[ 2, 3) 3834 76.7% 89.2% ########
-[ 3, 4) 95 1.9% 91.1%
-[ 4, 5) 6 0.1% 91.2%
-[ 5, 6) 22 0.4% 91.7%
-[ 6, 8) 254 5.1% 96.8% #
-[ 8, 10) 160 3.2% 100.0%
-[ 10, 12) 2 0.0% 100.0%
-[ 12, 15) 0 0.0% 100.0%
-[ 15, 18) 0 0.0% 100.0%
-[ 18, 22) 0 0.0% 100.0%
-[ 22, 27) 0 0.0% 100.0%
+[ 2, 3) 2527 84.2% 84.2% ########
+[ 3, 4) 106 3.5% 87.8%
+[ 4, 5) 0 0.0% 87.8%
+[ 5, 6) 99 3.3% 91.1%
+[ 6, 7) 255 8.5% 99.6% #
+[ 7, 8) 13 0.4% 100.0%
+[ 8, 9) 0 0.0% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 15) 0 0.0% 100.0%
+[ 15, 17) 0 0.0% 100.0%
+[ 17, 20) 0 0.0% 100.0%
+[ 20, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 31) 0 0.0% 100.0%
+[ 31, 35) 0 0.0% 100.0%
+[ 35, inf) 0 0.0% 100.0%
+Benchmark____1_chunk___100B-2 3000 2558699 ns/op 0.08 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 1 Max: 6 Avg: 2.28
+------------------------------------------------------------
+[ 1, 2) 5 0.2% 0.2%
+[ 2, 3) 2673 89.1% 89.3% #########
+[ 3, 4) 2 0.1% 89.3%
+[ 4, 5) 177 5.9% 95.2% #
+[ 5, 6) 96 3.2% 98.4%
+[ 6, 7) 47 1.6% 100.0%
+[ 7, 8) 0 0.0% 100.0%
+[ 8, 10) 0 0.0% 100.0%
+[ 10, 12) 0 0.0% 100.0%
+[ 12, 14) 0 0.0% 100.0%
+[ 14, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 22) 0 0.0% 100.0%
+[ 22, 26) 0 0.0% 100.0%
+[ 26, 30) 0 0.0% 100.0%
+[ 30, 34) 0 0.0% 100.0%
+[ 34, inf) 0 0.0% 100.0%
+Benchmark____1_chunk____1KB 3000 2646432 ns/op 0.76 MB/s
+Histogram (unit: ms)
+Count: 3000 Min: 2 Max: 10 Avg: 2.49
+------------------------------------------------------------
+[ 2, 3) 2647 88.2% 88.2% #########
+[ 3, 4) 71 2.4% 90.6%
+[ 4, 5) 4 0.1% 90.7%
+[ 5, 6) 0 0.0% 90.7%
+[ 6, 7) 67 2.2% 93.0%
+[ 7, 9) 209 7.0% 99.9% #
+[ 9, 11) 2 0.1% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
[ 27, 32) 0 0.0% 100.0%
[ 32, 38) 0 0.0% 100.0%
-[ 38, 45) 0 0.0% 100.0%
-[ 45, 54) 0 0.0% 100.0%
-[ 54, inf) 0 0.0% 100.0%
-Benchmark__100B-2 5000 2313091 ns/op 0.09 MB/s
+[ 38, 44) 0 0.0% 100.0%
+[ 44, 52) 0 0.0% 100.0%
+[ 52, inf) 0 0.0% 100.0%
+Benchmark____1_chunk____1KB-2 3000 2400649 ns/op 0.83 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 7 Avg: 1.78
+Count: 3000 Min: 1 Max: 7 Avg: 2.01
------------------------------------------------------------
-[ 1, 2) 2417 48.3% 48.3% #####
-[ 2, 3) 2204 44.1% 92.4% ####
-[ 3, 4) 0 0.0% 92.4%
-[ 4, 5) 0 0.0% 92.4%
-[ 5, 6) 229 4.6% 97.0%
-[ 6, 7) 123 2.5% 99.5%
-[ 7, 9) 27 0.5% 100.0%
+[ 1, 2) 864 28.8% 28.8% ###
+[ 2, 3) 1881 62.7% 91.5% ######
+[ 3, 4) 2 0.1% 91.6%
+[ 4, 5) 10 0.3% 91.9%
+[ 5, 6) 127 4.2% 96.1%
+[ 6, 7) 94 3.1% 99.3%
+[ 7, 9) 22 0.7% 100.0%
[ 9, 11) 0 0.0% 100.0%
[ 11, 13) 0 0.0% 100.0%
[ 13, 15) 0 0.0% 100.0%
@@ -236,103 +534,145 @@
[ 29, 34) 0 0.0% 100.0%
[ 34, 40) 0 0.0% 100.0%
[ 40, inf) 0 0.0% 100.0%
-Benchmark___1KB 5000 2441822 ns/op 0.82 MB/s
+Benchmark____1_chunk___10KB 3000 2954627 ns/op 6.77 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 12 Avg: 1.65
+Count: 3000 Min: 2 Max: 10 Avg: 2.65
------------------------------------------------------------
-[ 1, 2) 4546 90.9% 90.9% #########
-[ 2, 3) 52 1.0% 92.0%
-[ 3, 4) 4 0.1% 92.0%
-[ 4, 5) 69 1.4% 93.4%
-[ 5, 6) 0 0.0% 93.4%
-[ 6, 8) 8 0.2% 93.6%
-[ 8, 10) 66 1.3% 94.9%
-[ 10, 13) 255 5.1% 100.0% #
+[ 2, 3) 2621 87.4% 87.4% #########
+[ 3, 4) 93 3.1% 90.5%
+[ 4, 5) 13 0.4% 90.9%
+[ 5, 6) 0 0.0% 90.9%
+[ 6, 7) 0 0.0% 90.9%
+[ 7, 9) 99 3.3% 94.2%
+[ 9, 11) 174 5.8% 100.0% #
+[ 11, 13) 0 0.0% 100.0%
[ 13, 16) 0 0.0% 100.0%
-[ 16, 20) 0 0.0% 100.0%
-[ 20, 24) 0 0.0% 100.0%
-[ 24, 29) 0 0.0% 100.0%
-[ 29, 35) 0 0.0% 100.0%
-[ 35, 42) 0 0.0% 100.0%
-[ 42, 51) 0 0.0% 100.0%
-[ 51, 62) 0 0.0% 100.0%
-[ 62, inf) 0 0.0% 100.0%
-Benchmark___1KB-2 5000 2269425 ns/op 0.88 MB/s
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 44) 0 0.0% 100.0%
+[ 44, 52) 0 0.0% 100.0%
+[ 52, inf) 0 0.0% 100.0%
+Benchmark____1_chunk___10KB-2 3000 2546084 ns/op 7.86 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 9 Avg: 1.61
+Count: 3000 Min: 1 Max: 8 Avg: 2.25
------------------------------------------------------------
-[ 1, 2) 3458 69.2% 69.2% #######
-[ 2, 3) 1248 25.0% 94.1% ##
-[ 3, 4) 1 0.0% 94.1%
-[ 4, 5) 0 0.0% 94.1%
-[ 5, 6) 0 0.0% 94.1%
-[ 6, 8) 183 3.7% 97.8%
-[ 8, 10) 110 2.2% 100.0%
-[ 10, 12) 0 0.0% 100.0%
-[ 12, 15) 0 0.0% 100.0%
-[ 15, 18) 0 0.0% 100.0%
-[ 18, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 31) 0 0.0% 100.0%
-[ 31, 37) 0 0.0% 100.0%
-[ 37, 43) 0 0.0% 100.0%
-[ 43, 51) 0 0.0% 100.0%
-[ 51, inf) 0 0.0% 100.0%
-Benchmark__10KB 5000 2777789 ns/op 7.20 MB/s
+[ 1, 2) 414 13.8% 13.8% #
+[ 2, 3) 2335 77.8% 91.6% ########
+[ 3, 4) 0 0.0% 91.6%
+[ 4, 5) 0 0.0% 91.6%
+[ 5, 6) 37 1.2% 92.9%
+[ 6, 7) 88 2.9% 95.8%
+[ 7, 9) 126 4.2% 100.0%
+[ 9, 11) 0 0.0% 100.0%
+[ 11, 13) 0 0.0% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 27) 0 0.0% 100.0%
+[ 27, 32) 0 0.0% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 44) 0 0.0% 100.0%
+[ 44, inf) 0 0.0% 100.0%
+Benchmark____1_chunk__100KB 2000 5517042 ns/op 36.25 MB/s
Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 16 Avg: 2.15
+Count: 2000 Min: 3 Max: 15 Avg: 4.82
------------------------------------------------------------
-[ 1, 2) 2964 59.3% 59.3% ######
-[ 2, 3) 1640 32.8% 92.1% ###
-[ 3, 4) 3 0.1% 92.1%
-[ 4, 5) 47 0.9% 93.1%
-[ 5, 7) 30 0.6% 93.7%
-[ 7, 9) 0 0.0% 93.7%
-[ 9, 11) 17 0.3% 94.0%
-[ 11, 14) 134 2.7% 96.7%
-[ 14, 18) 165 3.3% 100.0%
-[ 18, 23) 0 0.0% 100.0%
-[ 23, 29) 0 0.0% 100.0%
-[ 29, 36) 0 0.0% 100.0%
-[ 36, 44) 0 0.0% 100.0%
-[ 44, 54) 0 0.0% 100.0%
-[ 54, 66) 0 0.0% 100.0%
-[ 66, 80) 0 0.0% 100.0%
-[ 80, inf) 0 0.0% 100.0%
-Benchmark__10KB-2 5000 2320824 ns/op 8.62 MB/s
-Histogram (unit: ms)
-Count: 5000 Min: 1 Max: 11 Avg: 1.58
-------------------------------------------------------------
-[ 1, 2) 4005 80.1% 80.1% ########
-[ 2, 3) 703 14.1% 94.2% #
-[ 3, 4) 0 0.0% 94.2%
-[ 4, 5) 0 0.0% 94.2%
-[ 5, 6) 0 0.0% 94.2%
-[ 6, 8) 3 0.1% 94.2%
-[ 8, 10) 273 5.5% 99.7% #
-[ 10, 12) 16 0.3% 100.0%
-[ 12, 15) 0 0.0% 100.0%
-[ 15, 18) 0 0.0% 100.0%
+[ 3, 4) 1247 62.4% 62.4% ######
+[ 4, 5) 256 12.8% 75.2% #
+[ 5, 6) 146 7.3% 82.5% #
+[ 6, 7) 0 0.0% 82.5%
+[ 7, 8) 0 0.0% 82.5%
+[ 8, 10) 0 0.0% 82.5%
+[ 10, 12) 132 6.6% 89.1% #
+[ 12, 15) 217 10.9% 99.9% #
+[ 15, 18) 2 0.1% 100.0%
[ 18, 22) 0 0.0% 100.0%
[ 22, 27) 0 0.0% 100.0%
[ 27, 33) 0 0.0% 100.0%
[ 33, 40) 0 0.0% 100.0%
[ 40, 48) 0 0.0% 100.0%
-[ 48, 57) 0 0.0% 100.0%
-[ 57, inf) 0 0.0% 100.0%
-Benchmark_100KB 2000 5462859 ns/op 36.61 MB/s
+[ 48, 58) 0 0.0% 100.0%
+[ 58, 69) 0 0.0% 100.0%
+[ 69, inf) 0 0.0% 100.0%
+Benchmark____1_chunk__100KB-2 2000 4157872 ns/op 48.10 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 3 Max: 19 Avg: 4.80
+Count: 2000 Min: 2 Max: 11 Avg: 3.83
------------------------------------------------------------
-[ 3, 4) 1609 80.5% 80.5% ########
-[ 4, 5) 8 0.4% 80.9%
-[ 5, 6) 51 2.6% 83.4%
-[ 6, 7) 84 4.2% 87.6%
-[ 7, 9) 0 0.0% 87.6%
-[ 9, 11) 0 0.0% 87.6%
-[ 11, 14) 0 0.0% 87.6%
-[ 14, 17) 135 6.8% 94.4% #
-[ 17, 21) 113 5.7% 100.0% #
+[ 2, 3) 159 8.0% 8.0% #
+[ 3, 4) 1495 74.8% 82.7% #######
+[ 4, 5) 11 0.6% 83.2%
+[ 5, 6) 0 0.0% 83.2%
+[ 6, 7) 0 0.0% 83.2%
+[ 7, 9) 167 8.3% 91.6% #
+[ 9, 11) 166 8.3% 99.9% #
+[ 11, 13) 2 0.1% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 28) 0 0.0% 100.0%
+[ 28, 33) 0 0.0% 100.0%
+[ 33, 39) 0 0.0% 100.0%
+[ 39, 46) 0 0.0% 100.0%
+[ 46, 55) 0 0.0% 100.0%
+[ 55, inf) 0 0.0% 100.0%
+Benchmark___10_chunks____1B 2000 4177247 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 2 Max: 17 Avg: 3.75
+------------------------------------------------------------
+[ 2, 3) 49 2.5% 2.5%
+[ 3, 4) 1771 88.6% 91.0% #########
+[ 4, 5) 0 0.0% 91.0%
+[ 5, 6) 2 0.1% 91.1%
+[ 6, 8) 42 2.1% 93.2%
+[ 8, 10) 0 0.0% 93.2%
+[ 10, 12) 33 1.7% 94.9%
+[ 12, 15) 73 3.7% 98.5%
+[ 15, 19) 30 1.5% 100.0%
+[ 19, 24) 0 0.0% 100.0%
+[ 24, 30) 0 0.0% 100.0%
+[ 30, 37) 0 0.0% 100.0%
+[ 37, 45) 0 0.0% 100.0%
+[ 45, 55) 0 0.0% 100.0%
+[ 55, 67) 0 0.0% 100.0%
+[ 67, 81) 0 0.0% 100.0%
+[ 81, inf) 0 0.0% 100.0%
+Benchmark___10_chunks____1B-2 2000 3432532 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 2 Max: 12 Avg: 2.82
+------------------------------------------------------------
+[ 2, 3) 1276 63.8% 63.8% ######
+[ 3, 4) 541 27.1% 90.9% ###
+[ 4, 5) 45 2.2% 93.1%
+[ 5, 6) 0 0.0% 93.1%
+[ 6, 7) 0 0.0% 93.1%
+[ 7, 9) 41 2.1% 95.2%
+[ 9, 11) 68 3.4% 98.6%
+[ 11, 13) 29 1.5% 100.0%
+[ 13, 16) 0 0.0% 100.0%
+[ 16, 19) 0 0.0% 100.0%
+[ 19, 23) 0 0.0% 100.0%
+[ 23, 28) 0 0.0% 100.0%
+[ 28, 34) 0 0.0% 100.0%
+[ 34, 41) 0 0.0% 100.0%
+[ 41, 49) 0 0.0% 100.0%
+[ 49, 58) 0 0.0% 100.0%
+[ 58, inf) 0 0.0% 100.0%
+Benchmark___10_chunks___10B 2000 4664935 ns/op 0.04 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 3 Max: 19 Avg: 3.94
+------------------------------------------------------------
+[ 3, 4) 1739 87.0% 87.0% #########
+[ 4, 5) 94 4.7% 91.7%
+[ 5, 6) 0 0.0% 91.7%
+[ 6, 7) 9 0.5% 92.1%
+[ 7, 9) 26 1.3% 93.4%
+[ 9, 11) 0 0.0% 93.4%
+[ 11, 14) 33 1.7% 95.1%
+[ 14, 17) 63 3.2% 98.2%
+[ 17, 21) 36 1.8% 100.0%
[ 21, 26) 0 0.0% 100.0%
[ 26, 32) 0 0.0% 100.0%
[ 32, 39) 0 0.0% 100.0%
@@ -341,1002 +681,662 @@
[ 59, 72) 0 0.0% 100.0%
[ 72, 88) 0 0.0% 100.0%
[ 88, inf) 0 0.0% 100.0%
-Benchmark_100KB-2 2000 4058566 ns/op 49.28 MB/s
+Benchmark___10_chunks___10B-2 2000 3548029 ns/op 0.06 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 2 Max: 15 Avg: 3.57
+Count: 2000 Min: 2 Max: 14 Avg: 3.02
------------------------------------------------------------
-[ 2, 3) 770 38.5% 38.5% ####
-[ 3, 4) 991 49.6% 88.1% #####
-[ 4, 5) 2 0.1% 88.2%
-[ 5, 6) 0 0.0% 88.2%
-[ 6, 7) 0 0.0% 88.2%
-[ 7, 9) 0 0.0% 88.2%
-[ 9, 11) 89 4.5% 92.6%
-[ 11, 14) 147 7.4% 100.0% #
+[ 2, 3) 971 48.6% 48.6% #####
+[ 3, 4) 835 41.8% 90.3% ####
+[ 4, 5) 67 3.4% 93.7%
+[ 5, 6) 0 0.0% 93.7%
+[ 6, 7) 0 0.0% 93.7%
+[ 7, 9) 16 0.8% 94.5%
+[ 9, 11) 40 2.0% 96.5%
+[ 11, 14) 70 3.5% 100.0%
[ 14, 17) 1 0.1% 100.0%
[ 17, 21) 0 0.0% 100.0%
[ 21, 26) 0 0.0% 100.0%
[ 26, 32) 0 0.0% 100.0%
[ 32, 39) 0 0.0% 100.0%
+[ 39, 47) 0 0.0% 100.0%
+[ 47, 57) 0 0.0% 100.0%
+[ 57, 68) 0 0.0% 100.0%
+[ 68, inf) 0 0.0% 100.0%
+Benchmark___10_chunks__100B 2000 4845710 ns/op 0.41 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 3 Max: 20 Avg: 4.09
+------------------------------------------------------------
+[ 3, 4) 1559 78.0% 78.0% ########
+[ 4, 5) 272 13.6% 91.6% #
+[ 5, 6) 1 0.1% 91.6%
+[ 6, 7) 0 0.0% 91.6%
+[ 7, 9) 43 2.1% 93.8%
+[ 9, 11) 1 0.1% 93.8%
+[ 11, 14) 0 0.0% 93.8%
+[ 14, 17) 44 2.2% 96.0%
+[ 17, 21) 80 4.0% 100.0%
+[ 21, 26) 0 0.0% 100.0%
+[ 26, 32) 0 0.0% 100.0%
+[ 32, 39) 0 0.0% 100.0%
+[ 39, 48) 0 0.0% 100.0%
+[ 48, 59) 0 0.0% 100.0%
+[ 59, 73) 0 0.0% 100.0%
+[ 73, 90) 0 0.0% 100.0%
+[ 90, inf) 0 0.0% 100.0%
+Benchmark___10_chunks__100B-2 2000 3658666 ns/op 0.55 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 2 Max: 14 Avg: 3.26
+------------------------------------------------------------
+[ 2, 3) 567 28.4% 28.4% ###
+[ 3, 4) 1240 62.0% 90.4% ######
+[ 4, 5) 68 3.4% 93.8%
+[ 5, 6) 5 0.2% 94.0%
+[ 6, 7) 0 0.0% 94.0%
+[ 7, 9) 0 0.0% 94.0%
+[ 9, 11) 50 2.5% 96.5%
+[ 11, 14) 62 3.1% 99.6%
+[ 14, 17) 8 0.4% 100.0%
+[ 17, 21) 0 0.0% 100.0%
+[ 21, 26) 0 0.0% 100.0%
+[ 26, 32) 0 0.0% 100.0%
+[ 32, 39) 0 0.0% 100.0%
+[ 39, 47) 0 0.0% 100.0%
+[ 47, 57) 0 0.0% 100.0%
+[ 57, 68) 0 0.0% 100.0%
+[ 68, inf) 0 0.0% 100.0%
+Benchmark___10_chunks___1KB 2000 4971196 ns/op 4.02 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 3 Max: 23 Avg: 4.37
+------------------------------------------------------------
+[ 3, 4) 1222 61.1% 61.1% ######
+[ 4, 5) 620 31.0% 92.1% ###
+[ 5, 6) 0 0.0% 92.1%
+[ 6, 7) 0 0.0% 92.1%
+[ 7, 9) 31 1.6% 93.7%
+[ 9, 11) 1 0.1% 93.7%
+[ 11, 14) 0 0.0% 93.7%
+[ 14, 18) 32 1.6% 95.3%
+[ 18, 22) 90 4.5% 99.8%
+[ 22, 28) 4 0.2% 100.0%
+[ 28, 35) 0 0.0% 100.0%
+[ 35, 43) 0 0.0% 100.0%
+[ 43, 53) 0 0.0% 100.0%
+[ 53, 66) 0 0.0% 100.0%
+[ 66, 82) 0 0.0% 100.0%
+[ 82, 101) 0 0.0% 100.0%
+[101, inf) 0 0.0% 100.0%
+Benchmark___10_chunks___1KB-2 2000 3662827 ns/op 5.46 MB/s
+Histogram (unit: ms)
+Count: 2000 Min: 2 Max: 15 Avg: 3.11
+------------------------------------------------------------
+[ 2, 3) 1012 50.6% 50.6% #####
+[ 3, 4) 794 39.7% 90.3% ####
+[ 4, 5) 67 3.4% 93.7%
+[ 5, 6) 4 0.2% 93.9%
+[ 6, 7) 0 0.0% 93.9%
+[ 7, 9) 0 0.0% 93.9%
+[ 9, 11) 25 1.2% 95.1%
+[ 11, 14) 53 2.7% 97.8%
+[ 14, 17) 45 2.2% 100.0%
+[ 17, 21) 0 0.0% 100.0%
+[ 21, 26) 0 0.0% 100.0%
+[ 26, 32) 0 0.0% 100.0%
+[ 32, 39) 0 0.0% 100.0%
[ 39, 48) 0 0.0% 100.0%
[ 48, 58) 0 0.0% 100.0%
[ 58, 70) 0 0.0% 100.0%
[ 70, inf) 0 0.0% 100.0%
-
-================================================================================
-Echo streaming RPC
-================================================================================
-Benchmark____1_chunk_____1B 2000 5280468 ns/op 0.00 MB/s
+Benchmark___10_chunks__10KB 1000 7533684 ns/op 26.55 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 6 Avg: 4.61
+Count: 1000 Min: 5 Max: 26 Avg: 7.03
------------------------------------------------------------
-[ 4, 5) 912 45.6% 45.6% #####
-[ 5, 6) 953 47.7% 93.2% #####
-[ 6, 7) 135 6.8% 100.0% #
-[ 7, 8) 0 0.0% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 15) 0 0.0% 100.0%
-[ 15, 16) 0 0.0% 100.0%
-[ 16, 17) 0 0.0% 100.0%
-[ 17, 18) 0 0.0% 100.0%
-[ 18, 19) 0 0.0% 100.0%
-[ 19, 20) 0 0.0% 100.0%
-[ 20, inf) 0 0.0% 100.0%
-Benchmark____1_chunk_____1B-2 2000 4850675 ns/op 0.00 MB/s
+[ 5, 6) 831 83.1% 83.1% ########
+[ 6, 7) 4 0.4% 83.5%
+[ 7, 8) 0 0.0% 83.5%
+[ 8, 9) 29 2.9% 86.4%
+[ 9, 11) 18 1.8% 88.2%
+[ 11, 13) 0 0.0% 88.2%
+[ 13, 16) 0 0.0% 88.2%
+[ 16, 20) 39 3.9% 92.1%
+[ 20, 25) 78 7.8% 99.9% #
+[ 25, 31) 1 0.1% 100.0%
+[ 31, 38) 0 0.0% 100.0%
+[ 38, 47) 0 0.0% 100.0%
+[ 47, 58) 0 0.0% 100.0%
+[ 58, 71) 0 0.0% 100.0%
+[ 71, 88) 0 0.0% 100.0%
+[ 88, 108) 0 0.0% 100.0%
+[108, inf) 0 0.0% 100.0%
+Benchmark___10_chunks__10KB-2 2000 4922363 ns/op 40.63 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 6 Avg: 4.26
+Count: 2000 Min: 3 Max: 18 Avg: 4.32
------------------------------------------------------------
-[ 4, 5) 1489 74.5% 74.5% #######
-[ 5, 6) 506 25.3% 99.8% ###
-[ 6, 7) 5 0.2% 100.0%
-[ 7, 8) 0 0.0% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 15) 0 0.0% 100.0%
-[ 15, 16) 0 0.0% 100.0%
-[ 16, 17) 0 0.0% 100.0%
-[ 17, 18) 0 0.0% 100.0%
-[ 18, 19) 0 0.0% 100.0%
-[ 19, 20) 0 0.0% 100.0%
-[ 20, inf) 0 0.0% 100.0%
-Benchmark____1_chunk____10B 2000 5334596 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 7 Avg: 4.69
-------------------------------------------------------------
-[ 4, 5) 1035 51.8% 51.8% #####
-[ 5, 6) 565 28.2% 80.0% ###
-[ 6, 7) 389 19.5% 99.5% ##
-[ 7, 8) 11 0.6% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 22) 0 0.0% 100.0%
-[ 22, 24) 0 0.0% 100.0%
-[ 24, 26) 0 0.0% 100.0%
-[ 26, inf) 0 0.0% 100.0%
-Benchmark____1_chunk____10B-2 2000 4867046 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 6 Avg: 4.21
-------------------------------------------------------------
-[ 4, 5) 1631 81.6% 81.6% ########
-[ 5, 6) 316 15.8% 97.4% ##
-[ 6, 7) 53 2.7% 100.0%
-[ 7, 8) 0 0.0% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 15) 0 0.0% 100.0%
-[ 15, 16) 0 0.0% 100.0%
-[ 16, 17) 0 0.0% 100.0%
-[ 17, 18) 0 0.0% 100.0%
-[ 18, 19) 0 0.0% 100.0%
-[ 19, 20) 0 0.0% 100.0%
-[ 20, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___100B 2000 5429984 ns/op 0.04 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 9 Avg: 5.03
-------------------------------------------------------------
-[ 4, 5) 512 25.6% 25.6% ###
-[ 5, 6) 1166 58.3% 83.9% ######
-[ 6, 7) 79 4.0% 87.9%
-[ 7, 8) 237 11.9% 99.7% #
-[ 8, 9) 5 0.2% 100.0%
-[ 9, 10) 1 0.1% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 13) 0 0.0% 100.0%
-[ 13, 15) 0 0.0% 100.0%
-[ 15, 17) 0 0.0% 100.0%
-[ 17, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 25) 0 0.0% 100.0%
-[ 25, 29) 0 0.0% 100.0%
-[ 29, 33) 0 0.0% 100.0%
-[ 33, 37) 0 0.0% 100.0%
-[ 37, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___100B-2 2000 4913146 ns/op 0.04 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 7 Avg: 4.28
-------------------------------------------------------------
-[ 4, 5) 1694 84.7% 84.7% ########
-[ 5, 6) 54 2.7% 87.4%
-[ 6, 7) 245 12.2% 99.7% #
-[ 7, 8) 7 0.4% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 22) 0 0.0% 100.0%
-[ 22, 24) 0 0.0% 100.0%
-[ 24, 26) 0 0.0% 100.0%
-[ 26, inf) 0 0.0% 100.0%
-Benchmark____1_chunk____1KB 2000 5193539 ns/op 0.39 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 8 Avg: 4.48
-------------------------------------------------------------
-[ 4, 5) 1624 81.2% 81.2% ########
-[ 5, 6) 121 6.1% 87.2% #
-[ 6, 7) 19 1.0% 88.2%
-[ 7, 8) 138 6.9% 95.1% #
-[ 8, 9) 98 4.9% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 23) 0 0.0% 100.0%
-[ 23, 26) 0 0.0% 100.0%
-[ 26, 29) 0 0.0% 100.0%
-[ 29, 32) 0 0.0% 100.0%
-[ 32, inf) 0 0.0% 100.0%
-Benchmark____1_chunk____1KB-2 2000 4864711 ns/op 0.41 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 7 Avg: 4.24
-------------------------------------------------------------
-[ 4, 5) 1762 88.1% 88.1% #########
-[ 5, 6) 4 0.2% 88.3%
-[ 6, 7) 227 11.4% 99.7% #
-[ 7, 8) 7 0.4% 100.0%
-[ 8, 9) 0 0.0% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 13) 0 0.0% 100.0%
-[ 13, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 22) 0 0.0% 100.0%
-[ 22, 24) 0 0.0% 100.0%
-[ 24, 26) 0 0.0% 100.0%
-[ 26, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___10KB 2000 5472549 ns/op 3.65 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 10 Avg: 4.73
-------------------------------------------------------------
-[ 4, 5) 1418 70.9% 70.9% #######
-[ 5, 6) 298 14.9% 85.8% #
-[ 6, 7) 37 1.9% 87.7%
-[ 7, 8) 28 1.4% 89.1%
-[ 8, 9) 101 5.1% 94.1% #
-[ 9, 10) 116 5.8% 99.9% #
-[ 10, 12) 2 0.1% 100.0%
-[ 12, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 21) 0 0.0% 100.0%
-[ 21, 24) 0 0.0% 100.0%
-[ 24, 28) 0 0.0% 100.0%
-[ 28, 32) 0 0.0% 100.0%
-[ 32, 37) 0 0.0% 100.0%
-[ 37, 43) 0 0.0% 100.0%
-[ 43, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___10KB-2 2000 4950905 ns/op 4.04 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 8 Avg: 4.34
-------------------------------------------------------------
-[ 4, 5) 1760 88.0% 88.0% #########
-[ 5, 6) 7 0.4% 88.4%
-[ 6, 7) 25 1.2% 89.6%
-[ 7, 8) 206 10.3% 99.9% #
-[ 8, 9) 2 0.1% 100.0%
-[ 9, 10) 0 0.0% 100.0%
-[ 10, 11) 0 0.0% 100.0%
-[ 11, 12) 0 0.0% 100.0%
-[ 12, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 23) 0 0.0% 100.0%
-[ 23, 26) 0 0.0% 100.0%
-[ 26, 29) 0 0.0% 100.0%
-[ 29, 32) 0 0.0% 100.0%
-[ 32, inf) 0 0.0% 100.0%
-Benchmark____1_chunk__100KB 1000 7896673 ns/op 25.33 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 6 Max: 12 Avg: 7.24
-------------------------------------------------------------
-[ 6, 7) 660 66.0% 66.0% #######
-[ 7, 8) 113 11.3% 77.3% #
-[ 8, 9) 6 0.6% 77.9%
-[ 9, 10) 0 0.0% 77.9%
-[ 10, 11) 43 4.3% 82.2%
-[ 11, 12) 128 12.8% 95.0% #
-[ 12, 14) 50 5.0% 100.0% #
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 20) 0 0.0% 100.0%
-[ 20, 23) 0 0.0% 100.0%
-[ 23, 26) 0 0.0% 100.0%
-[ 26, 30) 0 0.0% 100.0%
-[ 30, 34) 0 0.0% 100.0%
-[ 34, 39) 0 0.0% 100.0%
-[ 39, 45) 0 0.0% 100.0%
-[ 45, inf) 0 0.0% 100.0%
-Benchmark____1_chunk__100KB-2 2000 5976114 ns/op 33.47 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 4 Max: 10 Avg: 5.67
-------------------------------------------------------------
-[ 4, 5) 3 0.2% 0.2%
-[ 5, 6) 1574 78.7% 78.9% ########
-[ 6, 7) 2 0.1% 79.0%
-[ 7, 8) 25 1.2% 80.2%
-[ 8, 9) 296 14.8% 95.0% #
-[ 9, 10) 98 4.9% 99.9%
-[ 10, 12) 2 0.1% 100.0%
-[ 12, 14) 0 0.0% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 18) 0 0.0% 100.0%
-[ 18, 21) 0 0.0% 100.0%
-[ 21, 24) 0 0.0% 100.0%
-[ 24, 28) 0 0.0% 100.0%
-[ 28, 32) 0 0.0% 100.0%
-[ 32, 37) 0 0.0% 100.0%
-[ 37, 43) 0 0.0% 100.0%
-[ 43, inf) 0 0.0% 100.0%
-Benchmark___10_chunks____1B 2000 6964499 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 15 Avg: 6.65
-------------------------------------------------------------
-[ 5, 6) 1 0.1% 0.1%
-[ 6, 7) 1743 87.2% 87.2% #########
-[ 7, 8) 20 1.0% 88.2%
-[ 8, 9) 48 2.4% 90.6%
-[ 9, 10) 3 0.2% 90.8%
-[ 10, 12) 62 3.1% 93.9%
-[ 12, 14) 91 4.5% 98.4%
-[ 14, 16) 32 1.6% 100.0%
-[ 16, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 31) 0 0.0% 100.0%
-[ 31, 37) 0 0.0% 100.0%
-[ 37, 44) 0 0.0% 100.0%
-[ 44, 52) 0 0.0% 100.0%
-[ 52, 61) 0 0.0% 100.0%
-[ 61, inf) 0 0.0% 100.0%
-Benchmark___10_chunks____1B-2 2000 5836079 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 11 Avg: 5.42
-------------------------------------------------------------
-[ 5, 6) 1781 89.1% 89.1% #########
-[ 6, 7) 31 1.6% 90.6%
-[ 7, 8) 1 0.1% 90.7%
-[ 8, 9) 29 1.5% 92.1%
-[ 9, 10) 94 4.7% 96.8%
-[ 10, 11) 49 2.5% 99.2%
-[ 11, 13) 15 0.8% 100.0%
-[ 13, 15) 0 0.0% 100.0%
-[ 15, 17) 0 0.0% 100.0%
-[ 17, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 25) 0 0.0% 100.0%
-[ 25, 29) 0 0.0% 100.0%
-[ 29, 33) 0 0.0% 100.0%
-[ 33, 38) 0 0.0% 100.0%
-[ 38, 44) 0 0.0% 100.0%
-[ 44, inf) 0 0.0% 100.0%
-Benchmark___10_chunks___10B 1000 7468897 ns/op 0.03 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 6 Max: 20 Avg: 6.94
-------------------------------------------------------------
-[ 6, 7) 841 84.1% 84.1% ########
-[ 7, 8) 30 3.0% 87.1%
-[ 8, 9) 2 0.2% 87.3%
-[ 9, 10) 31 3.1% 90.4%
-[ 10, 12) 6 0.6% 91.0%
-[ 12, 14) 29 2.9% 93.9%
-[ 14, 16) 26 2.6% 96.5%
-[ 16, 19) 32 3.2% 99.7%
-[ 19, 23) 3 0.3% 100.0%
-[ 23, 27) 0 0.0% 100.0%
-[ 27, 32) 0 0.0% 100.0%
-[ 32, 38) 0 0.0% 100.0%
+[ 3, 4) 1573 78.7% 78.7% ########
+[ 4, 5) 146 7.3% 86.0% #
+[ 5, 6) 53 2.7% 88.6%
+[ 6, 7) 0 0.0% 88.6%
+[ 7, 9) 0 0.0% 88.6%
+[ 9, 11) 3 0.2% 88.8%
+[ 11, 13) 79 4.0% 92.7%
+[ 13, 16) 107 5.4% 98.1% #
+[ 16, 20) 39 2.0% 100.0%
+[ 20, 25) 0 0.0% 100.0%
+[ 25, 31) 0 0.0% 100.0%
+[ 31, 38) 0 0.0% 100.0%
[ 38, 46) 0 0.0% 100.0%
-[ 46, 55) 0 0.0% 100.0%
-[ 55, 66) 0 0.0% 100.0%
-[ 66, 80) 0 0.0% 100.0%
-[ 80, inf) 0 0.0% 100.0%
-Benchmark___10_chunks___10B-2 2000 5896988 ns/op 0.03 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 13 Avg: 5.45
-------------------------------------------------------------
-[ 5, 6) 1795 89.8% 89.8% #########
-[ 6, 7) 31 1.6% 91.3%
-[ 7, 8) 0 0.0% 91.3%
-[ 8, 9) 7 0.4% 91.7%
-[ 9, 10) 35 1.8% 93.4%
-[ 10, 12) 124 6.2% 99.6% #
-[ 12, 14) 8 0.4% 100.0%
-[ 14, 16) 0 0.0% 100.0%
-[ 16, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 30) 0 0.0% 100.0%
-[ 30, 35) 0 0.0% 100.0%
-[ 35, 41) 0 0.0% 100.0%
-[ 41, 47) 0 0.0% 100.0%
-[ 47, 55) 0 0.0% 100.0%
-[ 55, inf) 0 0.0% 100.0%
-Benchmark___10_chunks__100B 2000 7511902 ns/op 0.27 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 6 Max: 20 Avg: 6.89
-------------------------------------------------------------
-[ 6, 7) 1706 85.3% 85.3% #########
-[ 7, 8) 76 3.8% 89.1%
-[ 8, 9) 3 0.2% 89.2%
-[ 9, 10) 40 2.0% 91.2%
-[ 10, 12) 7 0.4% 91.6%
-[ 12, 14) 43 2.1% 93.8%
-[ 14, 16) 10 0.5% 94.2%
-[ 16, 19) 113 5.7% 99.9% #
-[ 19, 23) 2 0.1% 100.0%
-[ 23, 27) 0 0.0% 100.0%
-[ 27, 32) 0 0.0% 100.0%
-[ 32, 38) 0 0.0% 100.0%
-[ 38, 46) 0 0.0% 100.0%
-[ 46, 55) 0 0.0% 100.0%
-[ 55, 66) 0 0.0% 100.0%
-[ 66, 80) 0 0.0% 100.0%
-[ 80, inf) 0 0.0% 100.0%
-Benchmark___10_chunks__100B-2 2000 5975725 ns/op 0.33 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 14 Avg: 5.52
-------------------------------------------------------------
-[ 5, 6) 1796 89.8% 89.8% #########
-[ 6, 7) 32 1.6% 91.4%
-[ 7, 8) 12 0.6% 92.0%
-[ 8, 9) 0 0.0% 92.0%
-[ 9, 10) 7 0.4% 92.4%
-[ 10, 12) 97 4.9% 97.2%
-[ 12, 14) 55 2.8% 100.0%
-[ 14, 16) 1 0.1% 100.0%
-[ 16, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 31) 0 0.0% 100.0%
-[ 31, 36) 0 0.0% 100.0%
-[ 36, 42) 0 0.0% 100.0%
-[ 42, 49) 0 0.0% 100.0%
-[ 49, 58) 0 0.0% 100.0%
-[ 58, inf) 0 0.0% 100.0%
-Benchmark___10_chunks___1KB 1000 7678796 ns/op 2.60 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 6 Max: 21 Avg: 7.07
-------------------------------------------------------------
-[ 6, 7) 862 86.2% 86.2% #########
-[ 7, 8) 21 2.1% 88.3%
-[ 8, 9) 0 0.0% 88.3%
-[ 9, 10) 7 0.7% 89.0%
-[ 10, 12) 27 2.7% 91.7%
-[ 12, 14) 0 0.0% 91.7%
-[ 14, 16) 23 2.3% 94.0%
-[ 16, 19) 38 3.8% 97.8%
-[ 19, 23) 22 2.2% 100.0%
-[ 23, 28) 0 0.0% 100.0%
-[ 28, 34) 0 0.0% 100.0%
-[ 34, 41) 0 0.0% 100.0%
-[ 41, 49) 0 0.0% 100.0%
-[ 49, 59) 0 0.0% 100.0%
-[ 59, 71) 0 0.0% 100.0%
-[ 71, 85) 0 0.0% 100.0%
-[ 85, inf) 0 0.0% 100.0%
-Benchmark___10_chunks___1KB-2 2000 6047220 ns/op 3.31 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 14 Avg: 5.57
-------------------------------------------------------------
-[ 5, 6) 1775 88.8% 88.8% #########
-[ 6, 7) 43 2.1% 90.9%
-[ 7, 8) 17 0.9% 91.8%
-[ 8, 9) 0 0.0% 91.8%
-[ 9, 10) 2 0.1% 91.9%
-[ 10, 12) 87 4.4% 96.2%
-[ 12, 14) 74 3.7% 99.9%
-[ 14, 16) 2 0.1% 100.0%
-[ 16, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 31) 0 0.0% 100.0%
-[ 31, 36) 0 0.0% 100.0%
-[ 36, 42) 0 0.0% 100.0%
-[ 42, 49) 0 0.0% 100.0%
-[ 49, 58) 0 0.0% 100.0%
-[ 58, inf) 0 0.0% 100.0%
-Benchmark___10_chunks__10KB 1000 9913510 ns/op 20.17 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 8 Max: 22 Avg: 9.63
-------------------------------------------------------------
-[ 8, 9) 808 80.8% 80.8% ########
-[ 9, 10) 2 0.2% 81.0%
-[ 10, 11) 33 3.3% 84.3%
-[ 11, 12) 11 1.1% 85.4%
-[ 12, 14) 0 0.0% 85.4%
-[ 14, 16) 0 0.0% 85.4%
-[ 16, 18) 37 3.7% 89.1%
-[ 18, 21) 95 9.5% 98.6% #
-[ 21, 25) 14 1.4% 100.0%
-[ 25, 29) 0 0.0% 100.0%
-[ 29, 34) 0 0.0% 100.0%
-[ 34, 40) 0 0.0% 100.0%
-[ 40, 48) 0 0.0% 100.0%
-[ 48, 57) 0 0.0% 100.0%
-[ 57, 68) 0 0.0% 100.0%
+[ 46, 56) 0 0.0% 100.0%
+[ 56, 68) 0 0.0% 100.0%
[ 68, 82) 0 0.0% 100.0%
[ 82, inf) 0 0.0% 100.0%
-Benchmark___10_chunks__10KB-2 2000 7066239 ns/op 28.30 MB/s
+Benchmark___10_chunks_100KB 200 31539312 ns/op 63.41 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 5 Max: 15 Avg: 6.56
+Count: 200 Min: 22 Max: 40 Avg: 30.91
------------------------------------------------------------
-[ 5, 6) 710 35.5% 35.5% ####
-[ 6, 7) 971 48.6% 84.1% #####
-[ 7, 8) 34 1.7% 85.8%
-[ 8, 9) 0 0.0% 85.8%
-[ 9, 10) 0 0.0% 85.8%
-[ 10, 12) 56 2.8% 88.6%
-[ 12, 14) 201 10.1% 98.6% #
-[ 14, 16) 28 1.4% 100.0%
-[ 16, 19) 0 0.0% 100.0%
-[ 19, 22) 0 0.0% 100.0%
-[ 22, 26) 0 0.0% 100.0%
-[ 26, 31) 0 0.0% 100.0%
-[ 31, 37) 0 0.0% 100.0%
-[ 37, 44) 0 0.0% 100.0%
-[ 44, 52) 0 0.0% 100.0%
-[ 52, 61) 0 0.0% 100.0%
-[ 61, inf) 0 0.0% 100.0%
-Benchmark___10_chunks_100KB 500 32109490 ns/op 62.29 MB/s
+[ 22, 23) 1 0.5% 0.5%
+[ 23, 24) 1 0.5% 1.0%
+[ 24, 25) 69 34.5% 35.5% ###
+[ 25, 26) 22 11.0% 46.5% #
+[ 26, 28) 7 3.5% 50.0%
+[ 28, 30) 0 0.0% 50.0%
+[ 30, 33) 0 0.0% 50.0%
+[ 33, 36) 0 0.0% 50.0%
+[ 36, 40) 95 47.5% 97.5% #####
+[ 40, 45) 5 2.5% 100.0%
+[ 45, 51) 0 0.0% 100.0%
+[ 51, 59) 0 0.0% 100.0%
+[ 59, 69) 0 0.0% 100.0%
+[ 69, 81) 0 0.0% 100.0%
+[ 81, 95) 0 0.0% 100.0%
+[ 95, 112) 0 0.0% 100.0%
+[112, inf) 0 0.0% 100.0%
+Benchmark___10_chunks_100KB-2 500 18574440 ns/op 107.67 MB/s
Histogram (unit: ms)
-Count: 500 Min: 24 Max: 41 Avg: 31.61
+Count: 500 Min: 12 Max: 27 Avg: 18.10
------------------------------------------------------------
-[ 24, 25) 55 11.0% 11.0% #
-[ 25, 26) 105 21.0% 32.0% ##
-[ 26, 27) 50 10.0% 42.0% #
-[ 27, 28) 10 2.0% 44.0%
-[ 28, 30) 2 0.4% 44.4%
-[ 30, 32) 0 0.0% 44.4%
-[ 32, 35) 23 4.6% 49.0%
-[ 35, 38) 157 31.4% 80.4% ###
-[ 38, 42) 98 19.6% 100.0% ##
-[ 42, 47) 0 0.0% 100.0%
-[ 47, 53) 0 0.0% 100.0%
-[ 53, 60) 0 0.0% 100.0%
-[ 60, 69) 0 0.0% 100.0%
-[ 69, 80) 0 0.0% 100.0%
-[ 80, 94) 0 0.0% 100.0%
-[ 94, 111) 0 0.0% 100.0%
-[111, inf) 0 0.0% 100.0%
-Benchmark___10_chunks_100KB-2 500 18957196 ns/op 105.50 MB/s
+[ 12, 13) 79 15.8% 15.8% ##
+[ 13, 14) 168 33.6% 49.4% ###
+[ 14, 15) 12 2.4% 51.8%
+[ 15, 16) 1 0.2% 52.0%
+[ 16, 18) 0 0.0% 52.0%
+[ 18, 20) 0 0.0% 52.0%
+[ 20, 22) 30 6.0% 58.0% #
+[ 22, 25) 94 18.8% 76.8% ##
+[ 25, 29) 116 23.2% 100.0% ##
+[ 29, 34) 0 0.0% 100.0%
+[ 34, 40) 0 0.0% 100.0%
+[ 40, 47) 0 0.0% 100.0%
+[ 47, 55) 0 0.0% 100.0%
+[ 55, 65) 0 0.0% 100.0%
+[ 65, 77) 0 0.0% 100.0%
+[ 77, 91) 0 0.0% 100.0%
+[ 91, inf) 0 0.0% 100.0%
+Benchmark__100_chunks____1B 500 18036549 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 500 Min: 14 Max: 24 Avg: 18.47
+Count: 500 Min: 14 Max: 41 Avg: 17.44
------------------------------------------------------------
-[ 14, 15) 155 31.0% 31.0% ###
-[ 15, 16) 78 15.6% 46.6% ##
-[ 16, 17) 0 0.0% 46.6%
-[ 17, 18) 0 0.0% 46.6%
-[ 18, 19) 0 0.0% 46.6%
-[ 19, 21) 33 6.6% 53.2% #
-[ 21, 23) 121 24.2% 77.4% ##
-[ 23, 25) 113 22.6% 100.0% ##
-[ 25, 28) 0 0.0% 100.0%
-[ 28, 31) 0 0.0% 100.0%
-[ 31, 35) 0 0.0% 100.0%
-[ 35, 40) 0 0.0% 100.0%
-[ 40, 46) 0 0.0% 100.0%
-[ 46, 53) 0 0.0% 100.0%
-[ 53, 61) 0 0.0% 100.0%
-[ 61, 70) 0 0.0% 100.0%
-[ 70, inf) 0 0.0% 100.0%
-Benchmark__100_chunks____1B 500 23105522 ns/op 0.01 MB/s
+[ 14, 15) 280 56.0% 56.0% ######
+[ 15, 16) 106 21.2% 77.2% ##
+[ 16, 17) 10 2.0% 79.2%
+[ 17, 18) 1 0.2% 79.4%
+[ 18, 20) 6 1.2% 80.6%
+[ 20, 23) 22 4.4% 85.0%
+[ 23, 26) 0 0.0% 85.0%
+[ 26, 30) 16 3.2% 88.2%
+[ 30, 35) 27 5.4% 93.6% #
+[ 35, 42) 32 6.4% 100.0% #
+[ 42, 51) 0 0.0% 100.0%
+[ 51, 62) 0 0.0% 100.0%
+[ 62, 75) 0 0.0% 100.0%
+[ 75, 92) 0 0.0% 100.0%
+[ 92, 113) 0 0.0% 100.0%
+[113, 140) 0 0.0% 100.0%
+[140, inf) 0 0.0% 100.0%
+Benchmark__100_chunks____1B-2 1000 12395699 ns/op 0.02 MB/s
Histogram (unit: ms)
-Count: 500 Min: 16 Max: 40 Avg: 22.54
+Count: 1000 Min: 7 Max: 31 Avg: 11.90
------------------------------------------------------------
-[ 16, 17) 1 0.2% 0.2%
-[ 17, 18) 14 2.8% 3.0%
-[ 18, 19) 47 9.4% 12.4% #
-[ 19, 20) 90 18.0% 30.4% ##
-[ 20, 22) 213 42.6% 73.0% ####
-[ 22, 24) 21 4.2% 77.2%
-[ 24, 27) 20 4.0% 81.2%
-[ 27, 31) 11 2.2% 83.4%
-[ 31, 36) 63 12.6% 96.0% #
-[ 36, 42) 20 4.0% 100.0%
-[ 42, 50) 0 0.0% 100.0%
-[ 50, 60) 0 0.0% 100.0%
-[ 60, 72) 0 0.0% 100.0%
-[ 72, 87) 0 0.0% 100.0%
-[ 87, 106) 0 0.0% 100.0%
-[106, 130) 0 0.0% 100.0%
-[130, inf) 0 0.0% 100.0%
-Benchmark__100_chunks____1B-2 1000 14962218 ns/op 0.01 MB/s
+[ 7, 8) 26 2.6% 2.6%
+[ 8, 9) 14 1.4% 4.0%
+[ 9, 10) 171 17.1% 21.1% ##
+[ 10, 11) 528 52.8% 73.9% #####
+[ 11, 13) 71 7.1% 81.0% #
+[ 13, 15) 23 2.3% 83.3%
+[ 15, 18) 8 0.8% 84.1%
+[ 18, 22) 68 6.8% 90.9% #
+[ 22, 27) 89 8.9% 99.8% #
+[ 27, 33) 2 0.2% 100.0%
+[ 33, 41) 0 0.0% 100.0%
+[ 41, 51) 0 0.0% 100.0%
+[ 51, 63) 0 0.0% 100.0%
+[ 63, 78) 0 0.0% 100.0%
+[ 78, 97) 0 0.0% 100.0%
+[ 97, 121) 0 0.0% 100.0%
+[121, inf) 0 0.0% 100.0%
+Benchmark__100_chunks___10B 300 20669375 ns/op 0.10 MB/s
Histogram (unit: ms)
-Count: 1000 Min: 11 Max: 25 Avg: 14.46
+Count: 300 Min: 17 Max: 39 Avg: 20.31
------------------------------------------------------------
-[ 11, 12) 5 0.5% 0.5%
-[ 12, 13) 376 37.6% 38.1% ####
-[ 13, 14) 375 37.5% 75.6% ####
-[ 14, 15) 39 3.9% 79.5%
-[ 15, 17) 13 1.3% 80.8%
-[ 17, 19) 4 0.4% 81.2%
-[ 19, 21) 26 2.6% 83.8%
-[ 21, 24) 107 10.7% 94.5% #
-[ 24, 28) 55 5.5% 100.0% #
-[ 28, 32) 0 0.0% 100.0%
-[ 32, 37) 0 0.0% 100.0%
-[ 37, 43) 0 0.0% 100.0%
-[ 43, 51) 0 0.0% 100.0%
-[ 51, 60) 0 0.0% 100.0%
-[ 60, 71) 0 0.0% 100.0%
-[ 71, 85) 0 0.0% 100.0%
-[ 85, inf) 0 0.0% 100.0%
-Benchmark__100_chunks___10B 500 24822827 ns/op 0.08 MB/s
+[ 17, 18) 228 76.0% 76.0% ########
+[ 18, 19) 8 2.7% 78.7%
+[ 19, 20) 2 0.7% 79.3%
+[ 20, 21) 0 0.0% 79.3%
+[ 21, 23) 3 1.0% 80.3%
+[ 23, 25) 12 4.0% 84.3%
+[ 25, 28) 0 0.0% 84.3%
+[ 28, 32) 0 0.0% 84.3%
+[ 32, 37) 15 5.0% 89.3% #
+[ 37, 43) 32 10.7% 100.0% #
+[ 43, 50) 0 0.0% 100.0%
+[ 50, 59) 0 0.0% 100.0%
+[ 59, 70) 0 0.0% 100.0%
+[ 70, 84) 0 0.0% 100.0%
+[ 84, 101) 0 0.0% 100.0%
+[101, 122) 0 0.0% 100.0%
+[122, inf) 0 0.0% 100.0%
+Benchmark__100_chunks___10B-2 500 12634978 ns/op 0.16 MB/s
Histogram (unit: ms)
-Count: 500 Min: 20 Max: 41 Avg: 24.42
+Count: 500 Min: 9 Max: 27 Avg: 12.11
------------------------------------------------------------
-[ 20, 21) 61 12.2% 12.2% #
-[ 21, 22) 294 58.8% 71.0% ######
-[ 22, 23) 16 3.2% 74.2%
-[ 23, 24) 4 0.8% 75.0%
-[ 24, 26) 20 4.0% 79.0%
-[ 26, 28) 5 1.0% 80.0%
-[ 28, 31) 7 1.4% 81.4%
-[ 31, 35) 12 2.4% 83.8%
-[ 35, 40) 38 7.6% 91.4% #
-[ 40, 46) 43 8.6% 100.0% #
-[ 46, 53) 0 0.0% 100.0%
+[ 9, 10) 69 13.8% 13.8% #
+[ 10, 11) 287 57.4% 71.2% ######
+[ 11, 12) 47 9.4% 80.6% #
+[ 12, 13) 10 2.0% 82.6%
+[ 13, 15) 8 1.6% 84.2%
+[ 15, 17) 0 0.0% 84.2%
+[ 17, 20) 5 1.0% 85.2%
+[ 20, 23) 28 5.6% 90.8% #
+[ 23, 27) 43 8.6% 99.4% #
+[ 27, 32) 3 0.6% 100.0%
+[ 32, 38) 0 0.0% 100.0%
+[ 38, 46) 0 0.0% 100.0%
+[ 46, 56) 0 0.0% 100.0%
+[ 56, 68) 0 0.0% 100.0%
+[ 68, 82) 0 0.0% 100.0%
+[ 82, 99) 0 0.0% 100.0%
+[ 99, inf) 0 0.0% 100.0%
+Benchmark__100_chunks__100B 300 23164692 ns/op 0.86 MB/s
+Histogram (unit: ms)
+Count: 300 Min: 19 Max: 42 Avg: 22.72
+------------------------------------------------------------
+[ 19, 20) 209 69.7% 69.7% #######
+[ 20, 21) 17 5.7% 75.3% #
+[ 21, 22) 6 2.0% 77.3%
+[ 22, 23) 1 0.3% 77.7%
+[ 23, 25) 1 0.3% 78.0%
+[ 25, 27) 17 5.7% 83.7% #
+[ 27, 30) 0 0.0% 83.7%
+[ 30, 34) 0 0.0% 83.7%
+[ 34, 39) 19 6.3% 90.0% #
+[ 39, 45) 30 10.0% 100.0% #
+[ 45, 53) 0 0.0% 100.0%
[ 53, 62) 0 0.0% 100.0%
-[ 62, 73) 0 0.0% 100.0%
-[ 73, 86) 0 0.0% 100.0%
-[ 86, 103) 0 0.0% 100.0%
-[103, 123) 0 0.0% 100.0%
-[123, inf) 0 0.0% 100.0%
-Benchmark__100_chunks___10B-2 500 15143142 ns/op 0.13 MB/s
+[ 62, 74) 0 0.0% 100.0%
+[ 74, 89) 0 0.0% 100.0%
+[ 89, 107) 0 0.0% 100.0%
+[107, 129) 0 0.0% 100.0%
+[129, inf) 0 0.0% 100.0%
+Benchmark__100_chunks__100B-2 500 13821225 ns/op 1.45 MB/s
Histogram (unit: ms)
-Count: 500 Min: 11 Max: 25 Avg: 14.63
+Count: 500 Min: 10 Max: 29 Avg: 13.29
------------------------------------------------------------
-[ 11, 12) 1 0.2% 0.2%
-[ 12, 13) 126 25.2% 25.4% ###
-[ 13, 14) 238 47.6% 73.0% #####
-[ 14, 15) 35 7.0% 80.0% #
-[ 15, 17) 6 1.2% 81.2%
-[ 17, 19) 0 0.0% 81.2%
-[ 19, 21) 10 2.0% 83.2%
-[ 21, 24) 52 10.4% 93.6% #
-[ 24, 28) 32 6.4% 100.0% #
-[ 28, 32) 0 0.0% 100.0%
-[ 32, 37) 0 0.0% 100.0%
-[ 37, 43) 0 0.0% 100.0%
-[ 43, 51) 0 0.0% 100.0%
-[ 51, 60) 0 0.0% 100.0%
-[ 60, 71) 0 0.0% 100.0%
-[ 71, 85) 0 0.0% 100.0%
-[ 85, inf) 0 0.0% 100.0%
-Benchmark__100_chunks__100B 500 25825032 ns/op 0.77 MB/s
+[ 10, 11) 47 9.4% 9.4% #
+[ 11, 12) 307 61.4% 70.8% ######
+[ 12, 13) 46 9.2% 80.0% #
+[ 13, 14) 9 1.8% 81.8%
+[ 14, 16) 9 1.8% 83.6%
+[ 16, 18) 0 0.0% 83.6%
+[ 18, 21) 5 1.0% 84.6%
+[ 21, 24) 25 5.0% 89.6% #
+[ 24, 28) 49 9.8% 99.4% #
+[ 28, 33) 3 0.6% 100.0%
+[ 33, 40) 0 0.0% 100.0%
+[ 40, 48) 0 0.0% 100.0%
+[ 48, 58) 0 0.0% 100.0%
+[ 58, 70) 0 0.0% 100.0%
+[ 70, 85) 0 0.0% 100.0%
+[ 85, 103) 0 0.0% 100.0%
+[103, inf) 0 0.0% 100.0%
+Benchmark__100_chunks___1KB 300 26071439 ns/op 7.67 MB/s
Histogram (unit: ms)
-Count: 500 Min: 22 Max: 41 Avg: 25.23
+Count: 300 Min: 20 Max: 48 Avg: 25.72
------------------------------------------------------------
-[ 22, 23) 336 67.2% 67.2% #######
-[ 23, 24) 29 5.8% 73.0% #
-[ 24, 25) 9 1.8% 74.8%
-[ 25, 26) 0 0.0% 74.8%
-[ 26, 28) 16 3.2% 78.0%
-[ 28, 30) 14 2.8% 80.8%
-[ 30, 33) 5 1.0% 81.8%
-[ 33, 36) 24 4.8% 86.6%
-[ 36, 40) 63 12.6% 99.2% #
-[ 40, 45) 4 0.8% 100.0%
-[ 45, 52) 0 0.0% 100.0%
-[ 52, 60) 0 0.0% 100.0%
-[ 60, 70) 0 0.0% 100.0%
-[ 70, 82) 0 0.0% 100.0%
-[ 82, 97) 0 0.0% 100.0%
-[ 97, 115) 0 0.0% 100.0%
-[115, inf) 0 0.0% 100.0%
-Benchmark__100_chunks__100B-2 500 16276252 ns/op 1.23 MB/s
+[ 20, 21) 1 0.3% 0.3%
+[ 21, 22) 195 65.0% 65.3% #######
+[ 22, 23) 13 4.3% 69.7%
+[ 23, 24) 5 1.7% 71.3%
+[ 24, 26) 0 0.0% 71.3%
+[ 26, 29) 23 7.7% 79.0% #
+[ 29, 32) 0 0.0% 79.0%
+[ 32, 36) 0 0.0% 79.0%
+[ 36, 41) 23 7.7% 86.7% #
+[ 41, 48) 39 13.0% 99.7% #
+[ 48, 57) 1 0.3% 100.0%
+[ 57, 68) 0 0.0% 100.0%
+[ 68, 82) 0 0.0% 100.0%
+[ 82, 99) 0 0.0% 100.0%
+[ 99, 121) 0 0.0% 100.0%
+[121, 148) 0 0.0% 100.0%
+[148, inf) 0 0.0% 100.0%
+Benchmark__100_chunks___1KB-2 500 15738134 ns/op 12.71 MB/s
Histogram (unit: ms)
-Count: 500 Min: 13 Max: 28 Avg: 15.75
+Count: 500 Min: 11 Max: 30 Avg: 15.24
------------------------------------------------------------
-[ 13, 14) 153 30.6% 30.6% ###
-[ 14, 15) 208 41.6% 72.2% ####
-[ 15, 16) 32 6.4% 78.6% #
-[ 16, 17) 6 1.2% 79.8%
-[ 17, 19) 5 1.0% 80.8%
-[ 19, 21) 3 0.6% 81.4%
-[ 21, 23) 19 3.8% 85.2%
-[ 23, 26) 52 10.4% 95.6% #
-[ 26, 30) 22 4.4% 100.0%
-[ 30, 35) 0 0.0% 100.0%
-[ 35, 41) 0 0.0% 100.0%
-[ 41, 48) 0 0.0% 100.0%
-[ 48, 56) 0 0.0% 100.0%
-[ 56, 66) 0 0.0% 100.0%
-[ 66, 78) 0 0.0% 100.0%
-[ 78, 92) 0 0.0% 100.0%
-[ 92, inf) 0 0.0% 100.0%
-Benchmark__100_chunks___1KB 500 29567438 ns/op 6.76 MB/s
+[ 11, 12) 19 3.8% 3.8%
+[ 12, 13) 253 50.6% 54.4% #####
+[ 13, 14) 97 19.4% 73.8% ##
+[ 14, 15) 11 2.2% 76.0%
+[ 15, 17) 15 3.0% 79.0%
+[ 17, 19) 0 0.0% 79.0%
+[ 19, 22) 3 0.6% 79.6%
+[ 22, 25) 28 5.6% 85.2% #
+[ 25, 29) 61 12.2% 97.4% #
+[ 29, 34) 13 2.6% 100.0%
+[ 34, 41) 0 0.0% 100.0%
+[ 41, 49) 0 0.0% 100.0%
+[ 49, 59) 0 0.0% 100.0%
+[ 59, 71) 0 0.0% 100.0%
+[ 71, 86) 0 0.0% 100.0%
+[ 86, 104) 0 0.0% 100.0%
+[104, inf) 0 0.0% 100.0%
+Benchmark__100_chunks__10KB 100 50248311 ns/op 39.80 MB/s
Histogram (unit: ms)
-Count: 500 Min: 24 Max: 47 Avg: 29.00
+Count: 100 Min: 37 Max: 60 Avg: 49.72
------------------------------------------------------------
-[ 24, 25) 230 46.0% 46.0% #####
-[ 25, 26) 80 16.0% 62.0% ##
-[ 26, 27) 29 5.8% 67.8% #
-[ 27, 28) 3 0.6% 68.4%
-[ 28, 30) 24 4.8% 73.2%
-[ 30, 32) 12 2.4% 75.6%
-[ 32, 35) 1 0.2% 75.8%
-[ 35, 39) 15 3.0% 78.8%
-[ 39, 44) 62 12.4% 91.2% #
-[ 44, 50) 44 8.8% 100.0% #
-[ 50, 58) 0 0.0% 100.0%
-[ 58, 67) 0 0.0% 100.0%
+[ 37, 38) 4 4.0% 4.0%
+[ 38, 39) 7 7.0% 11.0% #
+[ 39, 40) 6 6.0% 17.0% #
+[ 40, 41) 5 5.0% 22.0% #
+[ 41, 43) 18 18.0% 40.0% ##
+[ 43, 45) 0 0.0% 40.0%
+[ 45, 48) 0 0.0% 40.0%
+[ 48, 52) 0 0.0% 40.0%
+[ 52, 57) 24 24.0% 64.0% ##
+[ 57, 63) 36 36.0% 100.0% ####
+[ 63, 71) 0 0.0% 100.0%
+[ 71, 80) 0 0.0% 100.0%
+[ 80, 92) 0 0.0% 100.0%
+[ 92, 107) 0 0.0% 100.0%
+[107, 125) 0 0.0% 100.0%
+[125, 147) 0 0.0% 100.0%
+[147, inf) 0 0.0% 100.0%
+Benchmark__100_chunks__10KB-2 300 28614761 ns/op 69.89 MB/s
+Histogram (unit: ms)
+Count: 300 Min: 19 Max: 38 Avg: 28.11
+------------------------------------------------------------
+[ 19, 20) 7 2.3% 2.3%
+[ 20, 21) 55 18.3% 20.7% ##
+[ 21, 22) 43 14.3% 35.0% #
+[ 22, 23) 9 3.0% 38.0%
+[ 23, 25) 3 1.0% 39.0%
+[ 25, 27) 0 0.0% 39.0%
+[ 27, 30) 3 1.0% 40.0%
+[ 30, 33) 84 28.0% 68.0% ###
+[ 33, 37) 94 31.3% 99.3% ###
+[ 37, 42) 2 0.7% 100.0%
+[ 42, 49) 0 0.0% 100.0%
+[ 49, 57) 0 0.0% 100.0%
+[ 57, 67) 0 0.0% 100.0%
[ 67, 79) 0 0.0% 100.0%
[ 79, 94) 0 0.0% 100.0%
[ 94, 112) 0 0.0% 100.0%
-[112, 134) 0 0.0% 100.0%
-[134, inf) 0 0.0% 100.0%
-Benchmark__100_chunks___1KB-2 500 18167929 ns/op 11.01 MB/s
+[112, inf) 0 0.0% 100.0%
+Benchmark__100_chunks_100KB 30 272889576 ns/op 73.29 MB/s
Histogram (unit: ms)
-Count: 500 Min: 13 Max: 30 Avg: 17.65
+Count: 30 Min: 267 Max: 292 Avg: 272.40
------------------------------------------------------------
-[ 13, 14) 1 0.2% 0.2%
-[ 14, 15) 64 12.8% 13.0% #
-[ 15, 16) 237 47.4% 60.4% #####
-[ 16, 17) 62 12.4% 72.8% #
-[ 17, 19) 12 2.4% 75.2%
-[ 19, 21) 3 0.6% 75.8%
-[ 21, 24) 14 2.8% 78.6%
-[ 24, 27) 67 13.4% 92.0% #
-[ 27, 31) 40 8.0% 100.0% #
-[ 31, 36) 0 0.0% 100.0%
-[ 36, 42) 0 0.0% 100.0%
-[ 42, 49) 0 0.0% 100.0%
-[ 49, 58) 0 0.0% 100.0%
-[ 58, 69) 0 0.0% 100.0%
-[ 69, 83) 0 0.0% 100.0%
-[ 83, 100) 0 0.0% 100.0%
-[100, inf) 0 0.0% 100.0%
-Benchmark__100_chunks__10KB 100 52974498 ns/op 37.75 MB/s
+[267, 268) 3 10.0% 10.0% #
+[268, 269) 8 26.7% 36.7% ###
+[269, 270) 4 13.3% 50.0% #
+[270, 271) 4 13.3% 63.3% #
+[271, 273) 4 13.3% 76.7% #
+[273, 275) 1 3.3% 80.0%
+[275, 278) 1 3.3% 83.3%
+[278, 282) 0 0.0% 83.3%
+[282, 287) 1 3.3% 86.7%
+[287, 293) 4 13.3% 100.0% #
+[293, 301) 0 0.0% 100.0%
+[301, 311) 0 0.0% 100.0%
+[311, 324) 0 0.0% 100.0%
+[324, 340) 0 0.0% 100.0%
+[340, 360) 0 0.0% 100.0%
+[360, 384) 0 0.0% 100.0%
+[384, inf) 0 0.0% 100.0%
+Benchmark__100_chunks_100KB-2 50 149680912 ns/op 133.62 MB/s
Histogram (unit: ms)
-Count: 100 Min: 41 Max: 60 Avg: 52.43
+Count: 50 Min: 138 Max: 158 Avg: 149.14
------------------------------------------------------------
-[ 41, 42) 2 2.0% 2.0%
-[ 42, 43) 0 0.0% 2.0%
-[ 43, 44) 6 6.0% 8.0% #
-[ 44, 45) 26 26.0% 34.0% ###
-[ 45, 47) 0 0.0% 34.0%
-[ 47, 49) 0 0.0% 34.0%
-[ 49, 52) 0 0.0% 34.0%
-[ 52, 55) 0 0.0% 34.0%
-[ 55, 59) 51 51.0% 85.0% #####
-[ 59, 64) 15 15.0% 100.0% ##
-[ 64, 71) 0 0.0% 100.0%
-[ 71, 79) 0 0.0% 100.0%
-[ 79, 89) 0 0.0% 100.0%
-[ 89, 101) 0 0.0% 100.0%
-[101, 116) 0 0.0% 100.0%
-[116, 134) 0 0.0% 100.0%
-[134, inf) 0 0.0% 100.0%
-Benchmark__100_chunks__10KB-2 500 30197012 ns/op 66.23 MB/s
+[138, 139) 2 4.0% 4.0%
+[139, 140) 0 0.0% 4.0%
+[140, 141) 0 0.0% 4.0%
+[141, 142) 2 4.0% 8.0%
+[142, 144) 4 8.0% 16.0% #
+[144, 146) 4 8.0% 24.0% #
+[146, 149) 6 12.0% 36.0% #
+[149, 153) 20 40.0% 76.0% ####
+[153, 157) 11 22.0% 98.0% ##
+[157, 163) 1 2.0% 100.0%
+[163, 170) 0 0.0% 100.0%
+[170, 178) 0 0.0% 100.0%
+[178, 188) 0 0.0% 100.0%
+[188, 201) 0 0.0% 100.0%
+[201, 217) 0 0.0% 100.0%
+[217, 236) 0 0.0% 100.0%
+[236, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks____1B 100 111621410 ns/op 0.02 MB/s
Histogram (unit: ms)
-Count: 500 Min: 22 Max: 49 Avg: 29.68
+Count: 100 Min: 93 Max: 120 Avg: 111.11
------------------------------------------------------------
-[ 22, 23) 65 13.0% 13.0% #
-[ 23, 24) 75 15.0% 28.0% ##
-[ 24, 25) 19 3.8% 31.8%
-[ 25, 26) 0 0.0% 31.8%
-[ 26, 28) 0 0.0% 31.8%
-[ 28, 31) 14 2.8% 34.6%
-[ 31, 34) 278 55.6% 90.2% ######
-[ 34, 38) 35 7.0% 97.2% #
-[ 38, 43) 2 0.4% 97.6%
-[ 43, 50) 12 2.4% 100.0%
-[ 50, 59) 0 0.0% 100.0%
-[ 59, 70) 0 0.0% 100.0%
-[ 70, 83) 0 0.0% 100.0%
-[ 83, 100) 0 0.0% 100.0%
-[100, 121) 0 0.0% 100.0%
-[121, 148) 0 0.0% 100.0%
-[148, inf) 0 0.0% 100.0%
-Benchmark__100_chunks_100KB 50 259344427 ns/op 77.12 MB/s
+[ 93, 94) 1 1.0% 1.0%
+[ 94, 95) 0 0.0% 1.0%
+[ 95, 96) 0 0.0% 1.0%
+[ 96, 97) 0 0.0% 1.0%
+[ 97, 99) 0 0.0% 1.0%
+[ 99, 102) 17 17.0% 18.0% ##
+[102, 105) 12 12.0% 30.0% #
+[105, 109) 1 1.0% 31.0%
+[109, 114) 6 6.0% 37.0% #
+[114, 121) 63 63.0% 100.0% ######
+[121, 130) 0 0.0% 100.0%
+[130, 141) 0 0.0% 100.0%
+[141, 154) 0 0.0% 100.0%
+[154, 171) 0 0.0% 100.0%
+[171, 192) 0 0.0% 100.0%
+[192, 219) 0 0.0% 100.0%
+[219, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks____1B-2 100 103311101 ns/op 0.02 MB/s
Histogram (unit: ms)
-Count: 50 Min: 249 Max: 278 Avg: 258.80
+Count: 100 Min: 62 Max: 168 Avg: 102.82
------------------------------------------------------------
-[249, 250) 1 2.0% 2.0%
-[250, 251) 2 4.0% 6.0%
-[251, 252) 7 14.0% 20.0% #
-[252, 253) 5 10.0% 30.0% #
-[253, 255) 7 14.0% 44.0% #
-[255, 258) 2 4.0% 48.0%
-[258, 261) 7 14.0% 62.0% #
-[261, 265) 6 12.0% 74.0% #
-[265, 271) 8 16.0% 90.0% ##
-[271, 278) 4 8.0% 98.0% #
-[278, 287) 1 2.0% 100.0%
-[287, 298) 0 0.0% 100.0%
-[298, 312) 0 0.0% 100.0%
-[312, 330) 0 0.0% 100.0%
-[330, 353) 0 0.0% 100.0%
-[353, 381) 0 0.0% 100.0%
-[381, inf) 0 0.0% 100.0%
-Benchmark__100_chunks_100KB-2 100 138213866 ns/op 144.70 MB/s
+[ 62, 63) 1 1.0% 1.0%
+[ 63, 64) 0 0.0% 1.0%
+[ 64, 65) 0 0.0% 1.0%
+[ 65, 67) 0 0.0% 1.0%
+[ 67, 70) 0 0.0% 1.0%
+[ 70, 74) 1 1.0% 2.0%
+[ 74, 80) 2 2.0% 4.0%
+[ 80, 88) 2 2.0% 6.0%
+[ 88, 100) 23 23.0% 29.0% ##
+[100, 116) 61 61.0% 90.0% ######
+[116, 138) 9 9.0% 99.0% #
+[138, 168) 0 0.0% 99.0%
+[168, 209) 1 1.0% 100.0%
+[209, 265) 0 0.0% 100.0%
+[265, 342) 0 0.0% 100.0%
+[342, 447) 0 0.0% 100.0%
+[447, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks___10B 50 189580683 ns/op 0.11 MB/s
Histogram (unit: ms)
-Count: 100 Min: 127 Max: 147 Avg: 137.69
+Count: 50 Min: 181 Max: 210 Avg: 189.10
------------------------------------------------------------
-[127, 128) 2 2.0% 2.0%
-[128, 129) 1 1.0% 3.0%
-[129, 130) 4 4.0% 7.0%
-[130, 131) 0 0.0% 7.0%
-[131, 133) 1 1.0% 8.0%
-[133, 135) 4 4.0% 12.0%
-[135, 138) 26 26.0% 38.0% ###
-[138, 142) 56 56.0% 94.0% ######
-[142, 146) 3 3.0% 97.0%
-[146, 152) 3 3.0% 100.0%
-[152, 159) 0 0.0% 100.0%
-[159, 167) 0 0.0% 100.0%
-[167, 177) 0 0.0% 100.0%
-[177, 190) 0 0.0% 100.0%
-[190, 206) 0 0.0% 100.0%
-[206, 225) 0 0.0% 100.0%
-[225, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks____1B 100 140929084 ns/op 0.01 MB/s
+[181, 182) 2 4.0% 4.0%
+[182, 183) 0 0.0% 4.0%
+[183, 184) 1 2.0% 6.0%
+[184, 185) 1 2.0% 8.0%
+[185, 187) 16 32.0% 40.0% ###
+[187, 190) 20 40.0% 80.0% ####
+[190, 193) 2 4.0% 84.0%
+[193, 197) 1 2.0% 86.0%
+[197, 203) 3 6.0% 92.0% #
+[203, 210) 3 6.0% 98.0% #
+[210, 219) 1 2.0% 100.0%
+[219, 230) 0 0.0% 100.0%
+[230, 244) 0 0.0% 100.0%
+[244, 262) 0 0.0% 100.0%
+[262, 285) 0 0.0% 100.0%
+[285, 313) 0 0.0% 100.0%
+[313, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks___10B-2 100 107068429 ns/op 0.19 MB/s
Histogram (unit: ms)
-Count: 100 Min: 121 Max: 159 Avg: 140.44
+Count: 100 Min: 98 Max: 124 Avg: 106.53
------------------------------------------------------------
-[121, 122) 3 3.0% 3.0%
-[122, 123) 6 6.0% 9.0% #
-[123, 124) 1 1.0% 10.0%
-[124, 126) 8 8.0% 18.0% #
-[126, 128) 4 4.0% 22.0%
-[128, 131) 3 3.0% 25.0%
-[131, 135) 4 4.0% 29.0%
-[135, 140) 1 1.0% 30.0%
-[140, 146) 16 16.0% 46.0% ##
-[146, 154) 53 53.0% 99.0% #####
-[154, 165) 1 1.0% 100.0%
-[165, 179) 0 0.0% 100.0%
-[179, 197) 0 0.0% 100.0%
-[197, 220) 0 0.0% 100.0%
-[220, 249) 0 0.0% 100.0%
-[249, 286) 0 0.0% 100.0%
-[286, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks____1B-2 100 105473615 ns/op 0.02 MB/s
+[ 98, 99) 1 1.0% 1.0%
+[ 99, 100) 0 0.0% 1.0%
+[100, 101) 5 5.0% 6.0% #
+[101, 102) 12 12.0% 18.0% #
+[102, 104) 20 20.0% 38.0% ##
+[104, 106) 18 18.0% 56.0% ##
+[106, 109) 23 23.0% 79.0% ##
+[109, 113) 4 4.0% 83.0%
+[113, 118) 7 7.0% 90.0% #
+[118, 125) 10 10.0% 100.0% #
+[125, 133) 0 0.0% 100.0%
+[133, 143) 0 0.0% 100.0%
+[143, 156) 0 0.0% 100.0%
+[156, 172) 0 0.0% 100.0%
+[172, 192) 0 0.0% 100.0%
+[192, 217) 0 0.0% 100.0%
+[217, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks__100B 30 223128293 ns/op 0.90 MB/s
Histogram (unit: ms)
-Count: 100 Min: 73 Max: 120 Avg: 104.93
+Count: 30 Min: 210 Max: 241 Avg: 222.53
------------------------------------------------------------
-[ 73, 74) 1 1.0% 1.0%
-[ 74, 75) 0 0.0% 1.0%
-[ 75, 76) 1 1.0% 2.0%
-[ 76, 78) 1 1.0% 3.0%
-[ 78, 80) 0 0.0% 3.0%
-[ 80, 83) 0 0.0% 3.0%
-[ 83, 87) 4 4.0% 7.0%
-[ 87, 93) 5 5.0% 12.0% #
-[ 93, 100) 10 10.0% 22.0% #
-[100, 110) 52 52.0% 74.0% #####
-[110, 123) 26 26.0% 100.0% ###
-[123, 139) 0 0.0% 100.0%
-[139, 160) 0 0.0% 100.0%
-[160, 188) 0 0.0% 100.0%
-[188, 224) 0 0.0% 100.0%
-[224, 270) 0 0.0% 100.0%
-[270, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks___10B 50 200076160 ns/op 0.10 MB/s
+[210, 211) 1 3.3% 3.3%
+[211, 212) 0 0.0% 3.3%
+[212, 213) 0 0.0% 3.3%
+[213, 214) 0 0.0% 3.3%
+[214, 216) 2 6.7% 10.0% #
+[216, 219) 8 26.7% 36.7% ###
+[219, 222) 8 26.7% 63.3% ###
+[222, 226) 5 16.7% 80.0% ##
+[226, 232) 0 0.0% 80.0%
+[232, 239) 5 16.7% 96.7% ##
+[239, 248) 1 3.3% 100.0%
+[248, 260) 0 0.0% 100.0%
+[260, 275) 0 0.0% 100.0%
+[275, 294) 0 0.0% 100.0%
+[294, 318) 0 0.0% 100.0%
+[318, 348) 0 0.0% 100.0%
+[348, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks__100B-2 50 125690815 ns/op 1.59 MB/s
Histogram (unit: ms)
-Count: 50 Min: 190 Max: 219 Avg: 199.56
+Count: 50 Min: 117 Max: 142 Avg: 125.22
------------------------------------------------------------
-[190, 191) 2 4.0% 4.0%
-[191, 192) 3 6.0% 10.0% #
-[192, 193) 5 10.0% 20.0% #
-[193, 194) 2 4.0% 24.0%
-[194, 196) 8 16.0% 40.0% ##
-[196, 199) 8 16.0% 56.0% ##
-[199, 202) 4 8.0% 64.0% #
-[202, 206) 7 14.0% 78.0% #
-[206, 212) 7 14.0% 92.0% #
-[212, 219) 3 6.0% 98.0% #
-[219, 228) 1 2.0% 100.0%
-[228, 239) 0 0.0% 100.0%
-[239, 253) 0 0.0% 100.0%
-[253, 271) 0 0.0% 100.0%
-[271, 294) 0 0.0% 100.0%
-[294, 322) 0 0.0% 100.0%
-[322, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks___10B-2 100 112141677 ns/op 0.18 MB/s
+[117, 118) 4 8.0% 8.0% #
+[118, 119) 1 2.0% 10.0%
+[119, 120) 1 2.0% 12.0%
+[120, 121) 8 16.0% 28.0% ##
+[121, 123) 9 18.0% 46.0% ##
+[123, 125) 9 18.0% 64.0% ##
+[125, 128) 6 12.0% 76.0% #
+[128, 132) 2 4.0% 80.0%
+[132, 137) 5 10.0% 90.0% #
+[137, 143) 5 10.0% 100.0% #
+[143, 151) 0 0.0% 100.0%
+[151, 161) 0 0.0% 100.0%
+[161, 174) 0 0.0% 100.0%
+[174, 190) 0 0.0% 100.0%
+[190, 210) 0 0.0% 100.0%
+[210, 234) 0 0.0% 100.0%
+[234, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks___1KB 30 251956982 ns/op 7.94 MB/s
Histogram (unit: ms)
-Count: 100 Min: 102 Max: 125 Avg: 111.64
+Count: 30 Min: 238 Max: 266 Avg: 251.50
------------------------------------------------------------
-[102, 103) 1 1.0% 1.0%
-[103, 104) 2 2.0% 3.0%
-[104, 105) 2 2.0% 5.0%
-[105, 106) 9 9.0% 14.0% #
-[106, 108) 13 13.0% 27.0% #
-[108, 110) 22 22.0% 49.0% ##
-[110, 113) 15 15.0% 64.0% ##
-[113, 117) 13 13.0% 77.0% #
-[117, 122) 11 11.0% 88.0% #
-[122, 128) 12 12.0% 100.0% #
-[128, 136) 0 0.0% 100.0%
-[136, 145) 0 0.0% 100.0%
-[145, 157) 0 0.0% 100.0%
-[157, 172) 0 0.0% 100.0%
-[172, 190) 0 0.0% 100.0%
-[190, 212) 0 0.0% 100.0%
-[212, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks__100B 50 227795062 ns/op 0.88 MB/s
+[238, 239) 1 3.3% 3.3%
+[239, 240) 0 0.0% 3.3%
+[240, 241) 1 3.3% 6.7%
+[241, 242) 0 0.0% 6.7%
+[242, 244) 3 10.0% 16.7% #
+[244, 247) 7 23.3% 40.0% ##
+[247, 250) 3 10.0% 50.0% #
+[250, 254) 3 10.0% 60.0% #
+[254, 259) 1 3.3% 63.3%
+[259, 266) 10 33.3% 96.7% ###
+[266, 275) 1 3.3% 100.0%
+[275, 286) 0 0.0% 100.0%
+[286, 300) 0 0.0% 100.0%
+[300, 317) 0 0.0% 100.0%
+[317, 339) 0 0.0% 100.0%
+[339, 366) 0 0.0% 100.0%
+[366, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks___1KB-2 50 144214400 ns/op 13.87 MB/s
Histogram (unit: ms)
-Count: 50 Min: 216 Max: 251 Avg: 227.34
+Count: 50 Min: 130 Max: 158 Avg: 143.70
------------------------------------------------------------
-[216, 217) 1 2.0% 2.0%
-[217, 218) 1 2.0% 4.0%
-[218, 219) 2 4.0% 8.0%
-[219, 221) 4 8.0% 16.0% #
-[221, 223) 7 14.0% 30.0% #
-[223, 226) 12 24.0% 54.0% ##
-[226, 230) 6 12.0% 66.0% #
-[230, 235) 9 18.0% 84.0% ##
-[235, 241) 5 10.0% 94.0% #
-[241, 249) 2 4.0% 98.0%
-[249, 259) 1 2.0% 100.0%
-[259, 272) 0 0.0% 100.0%
-[272, 289) 0 0.0% 100.0%
-[289, 310) 0 0.0% 100.0%
-[310, 337) 0 0.0% 100.0%
-[337, 371) 0 0.0% 100.0%
-[371, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks__100B-2 100 127584568 ns/op 1.57 MB/s
+[130, 131) 1 2.0% 2.0%
+[131, 132) 0 0.0% 2.0%
+[132, 133) 1 2.0% 4.0%
+[133, 134) 6 12.0% 16.0% #
+[134, 136) 6 12.0% 28.0% #
+[136, 139) 4 8.0% 36.0% #
+[139, 142) 6 12.0% 48.0% #
+[142, 146) 1 2.0% 50.0%
+[146, 151) 13 26.0% 76.0% ###
+[151, 158) 9 18.0% 94.0% ##
+[158, 167) 3 6.0% 100.0% #
+[167, 178) 0 0.0% 100.0%
+[178, 192) 0 0.0% 100.0%
+[192, 209) 0 0.0% 100.0%
+[209, 231) 0 0.0% 100.0%
+[231, 258) 0 0.0% 100.0%
+[258, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks__10KB 20 474946063 ns/op 42.11 MB/s
Histogram (unit: ms)
-Count: 100 Min: 117 Max: 143 Avg: 127.04
+Count: 20 Min: 458 Max: 492 Avg: 474.60
------------------------------------------------------------
-[117, 118) 1 1.0% 1.0%
-[118, 119) 1 1.0% 2.0%
-[119, 120) 0 0.0% 2.0%
-[120, 121) 6 6.0% 8.0% #
-[121, 123) 23 23.0% 31.0% ##
-[123, 125) 22 22.0% 53.0% ##
-[125, 128) 10 10.0% 63.0% #
-[128, 132) 7 7.0% 70.0% #
-[132, 137) 20 20.0% 90.0% ##
-[137, 144) 10 10.0% 100.0% #
-[144, 152) 0 0.0% 100.0%
-[152, 162) 0 0.0% 100.0%
-[162, 175) 0 0.0% 100.0%
-[175, 191) 0 0.0% 100.0%
-[191, 211) 0 0.0% 100.0%
-[211, 236) 0 0.0% 100.0%
-[236, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks___1KB 50 260678247 ns/op 7.67 MB/s
+[458, 459) 1 5.0% 5.0% #
+[459, 460) 0 0.0% 5.0%
+[460, 461) 1 5.0% 10.0% #
+[461, 463) 3 15.0% 25.0% ##
+[463, 465) 1 5.0% 30.0% #
+[465, 468) 4 20.0% 50.0% ##
+[468, 472) 0 0.0% 50.0%
+[472, 477) 0 0.0% 50.0%
+[477, 483) 1 5.0% 55.0% #
+[483, 491) 8 40.0% 95.0% ####
+[491, 501) 1 5.0% 100.0% #
+[501, 514) 0 0.0% 100.0%
+[514, 530) 0 0.0% 100.0%
+[530, 551) 0 0.0% 100.0%
+[551, 577) 0 0.0% 100.0%
+[577, 610) 0 0.0% 100.0%
+[610, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks__10KB-2 30 267531367 ns/op 74.76 MB/s
Histogram (unit: ms)
-Count: 50 Min: 243 Max: 291 Avg: 260.18
+Count: 30 Min: 250 Max: 294 Avg: 267.07
------------------------------------------------------------
-[243, 244) 2 4.0% 4.0%
-[244, 245) 0 0.0% 4.0%
-[245, 246) 2 4.0% 8.0%
-[246, 248) 1 2.0% 10.0%
-[248, 250) 5 10.0% 20.0% #
-[250, 253) 5 10.0% 30.0% #
-[253, 257) 5 10.0% 40.0% #
-[257, 263) 7 14.0% 54.0% #
-[263, 270) 17 34.0% 88.0% ###
-[270, 280) 3 6.0% 94.0% #
-[280, 293) 3 6.0% 100.0% #
-[293, 310) 0 0.0% 100.0%
-[310, 332) 0 0.0% 100.0%
-[332, 360) 0 0.0% 100.0%
-[360, 397) 0 0.0% 100.0%
-[397, 444) 0 0.0% 100.0%
-[444, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks___1KB-2 100 147406551 ns/op 13.57 MB/s
-Histogram (unit: ms)
-Count: 100 Min: 134 Max: 160 Avg: 146.88
-------------------------------------------------------------
-[134, 135) 3 3.0% 3.0%
-[135, 136) 1 1.0% 4.0%
-[136, 137) 5 5.0% 9.0% #
-[137, 138) 3 3.0% 12.0%
-[138, 140) 8 8.0% 20.0% #
-[140, 142) 6 6.0% 26.0% #
-[142, 145) 12 12.0% 38.0% #
-[145, 149) 13 13.0% 51.0% #
-[149, 154) 31 31.0% 82.0% ###
-[154, 161) 18 18.0% 100.0% ##
-[161, 169) 0 0.0% 100.0%
-[169, 179) 0 0.0% 100.0%
-[179, 192) 0 0.0% 100.0%
-[192, 208) 0 0.0% 100.0%
-[208, 228) 0 0.0% 100.0%
-[228, 253) 0 0.0% 100.0%
-[253, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks__10KB 20 484028853 ns/op 41.32 MB/s
-Histogram (unit: ms)
-Count: 20 Min: 468 Max: 501 Avg: 483.50
-------------------------------------------------------------
-[468, 469) 1 5.0% 5.0% #
-[469, 470) 1 5.0% 10.0% #
-[470, 471) 0 0.0% 10.0%
-[471, 473) 0 0.0% 10.0%
-[473, 475) 1 5.0% 15.0% #
-[475, 478) 2 10.0% 25.0% #
-[478, 482) 2 10.0% 35.0% #
-[482, 487) 7 35.0% 70.0% ####
-[487, 493) 4 20.0% 90.0% ##
-[493, 501) 1 5.0% 95.0% #
-[501, 511) 1 5.0% 100.0% #
-[511, 523) 0 0.0% 100.0%
-[523, 539) 0 0.0% 100.0%
-[539, 559) 0 0.0% 100.0%
-[559, 585) 0 0.0% 100.0%
-[585, 618) 0 0.0% 100.0%
-[618, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks__10KB-2 50 255874182 ns/op 78.16 MB/s
-Histogram (unit: ms)
-Count: 50 Min: 239 Max: 268 Avg: 255.42
-------------------------------------------------------------
-[239, 240) 1 2.0% 2.0%
-[240, 241) 0 0.0% 2.0%
-[241, 242) 0 0.0% 2.0%
-[242, 243) 1 2.0% 4.0%
-[243, 245) 1 2.0% 6.0%
-[245, 248) 4 8.0% 14.0% #
-[248, 251) 2 4.0% 18.0%
-[251, 255) 5 10.0% 28.0% #
-[255, 261) 29 58.0% 86.0% ######
-[261, 268) 6 12.0% 98.0% #
-[268, 277) 1 2.0% 100.0%
-[277, 288) 0 0.0% 100.0%
-[288, 302) 0 0.0% 100.0%
-[302, 320) 0 0.0% 100.0%
-[320, 343) 0 0.0% 100.0%
-[343, 371) 0 0.0% 100.0%
-[371, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks_100KB 5 2464952174 ns/op 81.14 MB/s
+[250, 251) 1 3.3% 3.3%
+[251, 252) 1 3.3% 6.7%
+[252, 253) 0 0.0% 6.7%
+[253, 255) 0 0.0% 6.7%
+[255, 257) 2 6.7% 13.3% #
+[257, 260) 2 6.7% 20.0% #
+[260, 264) 7 23.3% 43.3% ##
+[264, 269) 3 10.0% 53.3% #
+[269, 276) 8 26.7% 80.0% ###
+[276, 285) 5 16.7% 96.7% ##
+[285, 297) 1 3.3% 100.0%
+[297, 313) 0 0.0% 100.0%
+[313, 333) 0 0.0% 100.0%
+[333, 359) 0 0.0% 100.0%
+[359, 393) 0 0.0% 100.0%
+[393, 437) 0 0.0% 100.0%
+[437, inf) 0 0.0% 100.0%
+Benchmark___1K_chunks_100KB 2 2675372295 ns/op 74.76 MB/s
Histogram (unit: s)
-Count: 5 Min: 2 Max: 2 Avg: 2.00
+Count: 2 Min: 2 Max: 2 Avg: 2.00
------------------------------------------------------------
-[ 2, 3) 5 100.0% 100.0% ##########
+[ 2, 3) 2 100.0% 100.0% ##########
[ 3, 3) 0 0.0% 100.0%
[ 3, 3) 0 0.0% 100.0%
[ 3, 3) 0 0.0% 100.0%
@@ -1353,7 +1353,7 @@
[ 3, 3) 0 0.0% 100.0%
[ 3, 3) 0 0.0% 100.0%
[ 3, inf) 0 0.0% 100.0%
-Benchmark___1K_chunks_100KB-2 5 1336699604 ns/op 149.62 MB/s
+Benchmark___1K_chunks_100KB-2 5 1421481350 ns/op 140.70 MB/s
Histogram (unit: s)
Count: 5 Min: 1 Max: 1 Avg: 1.00
------------------------------------------------------------
@@ -1378,28 +1378,7 @@
================================================================================
Echo streaming RPC (Per chunk)
================================================================================
-Benchmark__per_chunk____1B 50000 233075 ns/op 0.01 MB/s
-Histogram (unit: s)
-Count: 1 Min: 11 Max: 11 Avg: 11.00
-------------------------------------------------------------
-[ 11, 12) 1 100.0% 100.0% ##########
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, 12) 0 0.0% 100.0%
-[ 12, inf) 0 0.0% 100.0%
-Benchmark__per_chunk____1B-2 50000 177314 ns/op 0.01 MB/s
+Benchmark__per_chunk____1B 50000 163939 ns/op 0.01 MB/s
Histogram (unit: s)
Count: 1 Min: 8 Max: 8 Avg: 8.00
------------------------------------------------------------
@@ -1420,49 +1399,7 @@
[ 9, 9) 0 0.0% 100.0%
[ 9, 9) 0 0.0% 100.0%
[ 9, inf) 0 0.0% 100.0%
-Benchmark__per_chunk___10B 20000 519996 ns/op 0.04 MB/s
-Histogram (unit: s)
-Count: 1 Min: 10 Max: 10 Avg: 10.00
-------------------------------------------------------------
-[ 10, 11) 1 100.0% 100.0% ##########
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, inf) 0 0.0% 100.0%
-Benchmark__per_chunk___10B-2 50000 338254 ns/op 0.06 MB/s
-Histogram (unit: s)
-Count: 1 Min: 16 Max: 16 Avg: 16.00
-------------------------------------------------------------
-[ 16, 17) 1 100.0% 100.0% ##########
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, 17) 0 0.0% 100.0%
-[ 17, inf) 0 0.0% 100.0%
-Benchmark__per_chunk__100B 10000 573593 ns/op 0.35 MB/s
+Benchmark__per_chunk____1B-2 50000 118409 ns/op 0.02 MB/s
Histogram (unit: s)
Count: 1 Min: 5 Max: 5 Avg: 5.00
------------------------------------------------------------
@@ -1483,70 +1420,112 @@
[ 6, 6) 0 0.0% 100.0%
[ 6, 6) 0 0.0% 100.0%
[ 6, inf) 0 0.0% 100.0%
-Benchmark__per_chunk__100B-2 50000 267646 ns/op 0.75 MB/s
+Benchmark__per_chunk___10B 20000 321908 ns/op 0.06 MB/s
Histogram (unit: s)
-Count: 1 Min: 13 Max: 13 Avg: 13.00
+Count: 1 Min: 6 Max: 6 Avg: 6.00
------------------------------------------------------------
-[ 13, 14) 1 100.0% 100.0% ##########
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, inf) 0 0.0% 100.0%
-Benchmark__per_chunk___1KB 20000 514359 ns/op 3.89 MB/s
+[ 6, 7) 1 100.0% 100.0% ##########
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, inf) 0 0.0% 100.0%
+Benchmark__per_chunk___10B-2 50000 176818 ns/op 0.11 MB/s
Histogram (unit: s)
-Count: 1 Min: 10 Max: 10 Avg: 10.00
+Count: 1 Min: 8 Max: 8 Avg: 8.00
------------------------------------------------------------
-[ 10, 11) 1 100.0% 100.0% ##########
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, 11) 0 0.0% 100.0%
-[ 11, inf) 0 0.0% 100.0%
-Benchmark__per_chunk___1KB-2 50000 275305 ns/op 7.26 MB/s
+[ 8, 9) 1 100.0% 100.0% ##########
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, inf) 0 0.0% 100.0%
+Benchmark__per_chunk__100B 20000 411514 ns/op 0.49 MB/s
Histogram (unit: s)
-Count: 1 Min: 13 Max: 13 Avg: 13.00
+Count: 1 Min: 8 Max: 8 Avg: 8.00
------------------------------------------------------------
-[ 13, 14) 1 100.0% 100.0% ##########
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, 14) 0 0.0% 100.0%
-[ 14, inf) 0 0.0% 100.0%
-Benchmark__per_chunk__10KB 10000 703176 ns/op 28.44 MB/s
+[ 8, 9) 1 100.0% 100.0% ##########
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, inf) 0 0.0% 100.0%
+Benchmark__per_chunk__100B-2 30000 231565 ns/op 0.86 MB/s
+Histogram (unit: s)
+Count: 1 Min: 6 Max: 6 Avg: 6.00
+------------------------------------------------------------
+[ 6, 7) 1 100.0% 100.0% ##########
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, inf) 0 0.0% 100.0%
+Benchmark__per_chunk___1KB 20000 423999 ns/op 4.72 MB/s
+Histogram (unit: s)
+Count: 1 Min: 8 Max: 8 Avg: 8.00
+------------------------------------------------------------
+[ 8, 9) 1 100.0% 100.0% ##########
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, 9) 0 0.0% 100.0%
+[ 9, inf) 0 0.0% 100.0%
+Benchmark__per_chunk___1KB-2 30000 248721 ns/op 8.04 MB/s
Histogram (unit: s)
Count: 1 Min: 7 Max: 7 Avg: 7.00
------------------------------------------------------------
@@ -1567,7 +1546,49 @@
[ 8, 8) 0 0.0% 100.0%
[ 8, 8) 0 0.0% 100.0%
[ 8, inf) 0 0.0% 100.0%
-Benchmark__per_chunk__10KB-2 20000 395105 ns/op 50.62 MB/s
+Benchmark__per_chunk__10KB 10000 631536 ns/op 31.67 MB/s
+Histogram (unit: s)
+Count: 1 Min: 6 Max: 6 Avg: 6.00
+------------------------------------------------------------
+[ 6, 7) 1 100.0% 100.0% ##########
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, inf) 0 0.0% 100.0%
+Benchmark__per_chunk__10KB-2 20000 346868 ns/op 57.66 MB/s
+Histogram (unit: s)
+Count: 1 Min: 6 Max: 6 Avg: 6.00
+------------------------------------------------------------
+[ 6, 7) 1 100.0% 100.0% ##########
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, inf) 0 0.0% 100.0%
+Benchmark__per_chunk_100KB 3000 2613430 ns/op 76.53 MB/s
Histogram (unit: s)
Count: 1 Min: 7 Max: 7 Avg: 7.00
------------------------------------------------------------
@@ -1588,338 +1609,107 @@
[ 8, 8) 0 0.0% 100.0%
[ 8, 8) 0 0.0% 100.0%
[ 8, inf) 0 0.0% 100.0%
-Benchmark__per_chunk_100KB 5000 2834149 ns/op 70.57 MB/s
+Benchmark__per_chunk_100KB-2 5000 1369809 ns/op 146.01 MB/s
Histogram (unit: s)
-Count: 1 Min: 14 Max: 14 Avg: 14.00
+Count: 1 Min: 6 Max: 6 Avg: 6.00
------------------------------------------------------------
-[ 14, 15) 1 100.0% 100.0% ##########
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, inf) 0 0.0% 100.0%
-Benchmark__per_chunk_100KB-2 10000 1461822 ns/op 136.82 MB/s
-Histogram (unit: s)
-Count: 1 Min: 14 Max: 14 Avg: 14.00
-------------------------------------------------------------
-[ 14, 15) 1 100.0% 100.0% ##########
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, 15) 0 0.0% 100.0%
-[ 15, inf) 0 0.0% 100.0%
+[ 6, 7) 1 100.0% 100.0% ##########
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, 7) 0 0.0% 100.0%
+[ 7, inf) 0 0.0% 100.0%
================================================================================
Echo RPC when multiplexing with Echo streaming RPC
================================================================================
-Benchmark___10B_mux__100_chunks___10B 500 22049071 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B 500 18817141 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 500 Min: 10 Max: 26 Avg: 21.57
+Count: 500 Min: 7 Max: 26 Avg: 18.28
------------------------------------------------------------
-[ 10, 11) 24 4.8% 4.8%
-[ 11, 12) 20 4.0% 8.8%
-[ 12, 13) 0 0.0% 8.8%
-[ 13, 14) 1 0.2% 9.0%
-[ 14, 16) 1 0.2% 9.2%
-[ 16, 18) 44 8.8% 18.0% #
-[ 18, 21) 1 0.2% 18.2%
-[ 21, 24) 255 51.0% 69.2% #####
-[ 24, 28) 154 30.8% 100.0% ###
-[ 28, 33) 0 0.0% 100.0%
-[ 33, 39) 0 0.0% 100.0%
-[ 39, 46) 0 0.0% 100.0%
-[ 46, 55) 0 0.0% 100.0%
-[ 55, 66) 0 0.0% 100.0%
-[ 66, 79) 0 0.0% 100.0%
-[ 79, 95) 0 0.0% 100.0%
-[ 95, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___10B-2 2000 4734244 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 1 Max: 11 Avg: 4.29
-------------------------------------------------------------
-[ 1, 2) 1 0.1% 0.1%
-[ 2, 3) 681 34.1% 34.1% ###
-[ 3, 4) 457 22.9% 57.0% ##
-[ 4, 5) 197 9.9% 66.8% #
-[ 5, 6) 120 6.0% 72.8% #
-[ 6, 8) 188 9.4% 82.2% #
-[ 8, 10) 230 11.5% 93.7% #
-[ 10, 12) 126 6.3% 100.0% #
-[ 12, 15) 0 0.0% 100.0%
-[ 15, 18) 0 0.0% 100.0%
-[ 18, 22) 0 0.0% 100.0%
-[ 22, 27) 0 0.0% 100.0%
-[ 27, 33) 0 0.0% 100.0%
-[ 33, 40) 0 0.0% 100.0%
-[ 40, 48) 0 0.0% 100.0%
-[ 48, 57) 0 0.0% 100.0%
-[ 57, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__100B 500 23746639 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 500 Min: 6 Max: 28 Avg: 23.15
-------------------------------------------------------------
-[ 6, 7) 1 0.2% 0.2%
-[ 7, 8) 0 0.0% 0.2%
-[ 8, 9) 0 0.0% 0.2%
-[ 9, 10) 2 0.4% 0.6%
-[ 10, 12) 33 6.6% 7.2% #
-[ 12, 14) 5 1.0% 8.2%
-[ 14, 17) 8 1.6% 9.8%
-[ 17, 21) 44 8.8% 18.6% #
-[ 21, 26) 308 61.6% 80.2% ######
-[ 26, 32) 99 19.8% 100.0% ##
-[ 32, 39) 0 0.0% 100.0%
-[ 39, 48) 0 0.0% 100.0%
-[ 48, 59) 0 0.0% 100.0%
-[ 59, 73) 0 0.0% 100.0%
-[ 73, 90) 0 0.0% 100.0%
-[ 90, 111) 0 0.0% 100.0%
-[111, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__100B-2 2000 5501514 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 1 Max: 13 Avg: 5.06
-------------------------------------------------------------
-[ 1, 2) 8 0.4% 0.4%
-[ 2, 3) 630 31.5% 31.9% ###
-[ 3, 4) 277 13.9% 45.8% #
-[ 4, 5) 229 11.5% 57.2% #
-[ 5, 6) 147 7.4% 64.5% #
-[ 6, 8) 223 11.2% 75.7% #
-[ 8, 10) 177 8.8% 84.6% #
-[ 10, 13) 291 14.6% 99.1% #
-[ 13, 16) 18 0.9% 100.0%
-[ 16, 20) 0 0.0% 100.0%
-[ 20, 25) 0 0.0% 100.0%
-[ 25, 31) 0 0.0% 100.0%
-[ 31, 38) 0 0.0% 100.0%
-[ 38, 46) 0 0.0% 100.0%
-[ 46, 56) 0 0.0% 100.0%
-[ 56, 67) 0 0.0% 100.0%
-[ 67, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___1KB 500 25033793 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 500 Min: 9 Max: 31 Avg: 24.50
-------------------------------------------------------------
-[ 9, 10) 14 2.8% 2.8%
-[ 10, 11) 10 2.0% 4.8%
-[ 11, 12) 2 0.4% 5.2%
-[ 12, 13) 22 4.4% 9.6%
-[ 13, 15) 4 0.8% 10.4%
-[ 15, 17) 0 0.0% 10.4%
-[ 17, 20) 23 4.6% 15.0%
-[ 20, 24) 30 6.0% 21.0% #
-[ 24, 29) 381 76.2% 97.2% ########
-[ 29, 35) 14 2.8% 100.0%
-[ 35, 42) 0 0.0% 100.0%
-[ 42, 51) 0 0.0% 100.0%
-[ 51, 62) 0 0.0% 100.0%
-[ 62, 76) 0 0.0% 100.0%
-[ 76, 93) 0 0.0% 100.0%
-[ 93, 114) 0 0.0% 100.0%
-[114, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___1KB-2 2000 5598670 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 2000 Min: 1 Max: 15 Avg: 5.11
-------------------------------------------------------------
-[ 1, 2) 318 15.9% 15.9% ##
-[ 2, 3) 460 23.0% 38.9% ##
-[ 3, 4) 186 9.3% 48.2% #
-[ 4, 5) 188 9.4% 57.6% #
-[ 5, 7) 231 11.6% 69.2% #
-[ 7, 9) 175 8.8% 77.9% #
-[ 9, 11) 132 6.6% 84.5% #
-[ 11, 14) 265 13.2% 97.8% #
-[ 14, 18) 45 2.2% 100.0%
-[ 18, 22) 0 0.0% 100.0%
-[ 22, 27) 0 0.0% 100.0%
-[ 27, 33) 0 0.0% 100.0%
-[ 33, 41) 0 0.0% 100.0%
-[ 41, 50) 0 0.0% 100.0%
-[ 50, 61) 0 0.0% 100.0%
-[ 61, 75) 0 0.0% 100.0%
-[ 75, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___10B 100 121659148 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 100 Min: 4 Max: 179 Avg: 121.14
-------------------------------------------------------------
-[ 4, 5) 1 1.0% 1.0%
-[ 5, 6) 0 0.0% 1.0%
-[ 6, 7) 0 0.0% 1.0%
-[ 7, 9) 0 0.0% 1.0%
-[ 9, 12) 0 0.0% 1.0%
-[ 12, 17) 0 0.0% 1.0%
-[ 17, 24) 0 0.0% 1.0%
-[ 24, 35) 1 1.0% 2.0%
-[ 35, 50) 7 7.0% 9.0% #
-[ 50, 72) 15 15.0% 24.0% ##
-[ 72, 103) 13 13.0% 37.0% #
-[103, 147) 22 22.0% 59.0% ##
-[147, 209) 41 41.0% 100.0% ####
-[209, 296) 0 0.0% 100.0%
-[296, 420) 0 0.0% 100.0%
-[420, 595) 0 0.0% 100.0%
-[595, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___10B-2 1000 7827224 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 2 Max: 50 Avg: 7.36
-------------------------------------------------------------
-[ 2, 3) 251 25.1% 25.1% ###
-[ 3, 4) 172 17.2% 42.3% ##
-[ 4, 5) 114 11.4% 53.7% #
-[ 5, 7) 148 14.8% 68.5% #
-[ 7, 9) 107 10.7% 79.2% #
-[ 9, 12) 58 5.8% 85.0% #
-[ 12, 16) 31 3.1% 88.1%
-[ 16, 22) 36 3.6% 91.7%
-[ 22, 29) 35 3.5% 95.2%
-[ 29, 39) 29 2.9% 98.1%
-[ 39, 52) 19 1.9% 100.0%
-[ 52, 69) 0 0.0% 100.0%
-[ 69, 91) 0 0.0% 100.0%
-[ 91, 119) 0 0.0% 100.0%
-[119, 156) 0 0.0% 100.0%
-[156, 203) 0 0.0% 100.0%
-[203, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__100B 100 141824661 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 100 Min: 12 Max: 207 Avg: 141.35
-------------------------------------------------------------
-[ 12, 13) 1 1.0% 1.0%
-[ 13, 14) 0 0.0% 1.0%
-[ 14, 16) 1 1.0% 2.0%
-[ 16, 18) 1 1.0% 3.0%
-[ 18, 22) 0 0.0% 3.0%
-[ 22, 27) 0 0.0% 3.0%
-[ 27, 35) 0 0.0% 3.0%
-[ 35, 46) 1 1.0% 4.0%
-[ 46, 62) 10 10.0% 14.0% #
-[ 62, 85) 16 16.0% 30.0% ##
-[ 85, 118) 0 0.0% 30.0%
-[118, 165) 27 27.0% 57.0% ###
-[165, 232) 43 43.0% 100.0% ####
-[232, 328) 0 0.0% 100.0%
-[328, 465) 0 0.0% 100.0%
-[465, 659) 0 0.0% 100.0%
-[659, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__100B-2 1000 11127970 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 1 Max: 70 Avg: 10.65
-------------------------------------------------------------
-[ 1, 2) 1 0.1% 0.1%
-[ 2, 3) 199 19.9% 20.0% ##
-[ 3, 4) 94 9.4% 29.4% #
-[ 4, 6) 196 19.6% 49.0% ##
-[ 6, 9) 192 19.2% 68.2% ##
-[ 9, 13) 147 14.7% 82.9% #
-[ 13, 18) 45 4.5% 87.4%
-[ 18, 25) 13 1.3% 88.7%
-[ 25, 34) 27 2.7% 91.4%
-[ 34, 46) 20 2.0% 93.4%
-[ 46, 62) 47 4.7% 98.1%
-[ 62, 84) 19 1.9% 100.0%
-[ 84, 113) 0 0.0% 100.0%
-[113, 152) 0 0.0% 100.0%
-[152, 204) 0 0.0% 100.0%
-[204, 272) 0 0.0% 100.0%
-[272, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___1KB 100 148589902 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 100 Min: 8 Max: 262 Avg: 148.08
-------------------------------------------------------------
-[ 8, 9) 1 1.0% 1.0%
-[ 9, 10) 1 1.0% 2.0%
-[ 10, 12) 1 1.0% 3.0%
-[ 12, 15) 0 0.0% 3.0%
-[ 15, 19) 3 3.0% 6.0%
-[ 19, 25) 1 1.0% 7.0%
-[ 25, 34) 1 1.0% 8.0%
-[ 34, 47) 0 0.0% 8.0%
-[ 47, 66) 5 5.0% 13.0% #
-[ 66, 93) 13 13.0% 26.0% #
-[ 93, 133) 16 16.0% 42.0% ##
-[133, 191) 24 24.0% 66.0% ##
-[191, 274) 34 34.0% 100.0% ###
-[274, 395) 0 0.0% 100.0%
-[395, 570) 0 0.0% 100.0%
-[570, 824) 0 0.0% 100.0%
-[824, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___1KB-2 1000 12616916 ns/op 0.00 MB/s
-Histogram (unit: ms)
-Count: 1000 Min: 1 Max: 84 Avg: 12.10
-------------------------------------------------------------
-[ 1, 2) 203 20.3% 20.3% ##
-[ 2, 3) 190 19.0% 39.3% ##
-[ 3, 4) 41 4.1% 43.4%
-[ 4, 6) 115 11.5% 54.9% #
-[ 6, 9) 149 14.9% 69.8% #
-[ 9, 13) 61 6.1% 75.9% #
-[ 13, 18) 63 6.3% 82.2% #
-[ 18, 25) 33 3.3% 85.5%
-[ 25, 35) 32 3.2% 88.7%
-[ 35, 49) 30 3.0% 91.7%
-[ 49, 68) 48 4.8% 96.5%
-[ 68, 93) 35 3.5% 100.0%
-[ 93, 127) 0 0.0% 100.0%
-[127, 173) 0 0.0% 100.0%
-[173, 234) 0 0.0% 100.0%
-[234, 317) 0 0.0% 100.0%
-[317, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks___10B 500 23895451 ns/op 0.01 MB/s
-Histogram (unit: ms)
-Count: 500 Min: 10 Max: 36 Avg: 23.35
-------------------------------------------------------------
-[ 10, 11) 3 0.6% 0.6%
-[ 11, 12) 3 0.6% 1.2%
-[ 12, 13) 17 3.4% 4.6%
-[ 13, 14) 1 0.2% 4.8%
-[ 14, 16) 14 2.8% 7.6%
-[ 16, 18) 10 2.0% 9.6%
-[ 18, 21) 12 2.4% 12.0%
-[ 21, 25) 252 50.4% 62.4% #####
-[ 25, 30) 180 36.0% 98.4% ####
-[ 30, 37) 8 1.6% 100.0%
+[ 7, 8) 41 8.2% 8.2% #
+[ 8, 9) 5 1.0% 9.2%
+[ 9, 10) 1 0.2% 9.4%
+[ 10, 11) 0 0.0% 9.4%
+[ 11, 13) 5 1.0% 10.4%
+[ 13, 15) 0 0.0% 10.4%
+[ 15, 18) 52 10.4% 20.8% #
+[ 18, 21) 329 65.8% 86.6% #######
+[ 21, 25) 66 13.2% 99.8% #
+[ 25, 30) 1 0.2% 100.0%
+[ 30, 37) 0 0.0% 100.0%
[ 37, 45) 0 0.0% 100.0%
[ 45, 55) 0 0.0% 100.0%
-[ 55, 68) 0 0.0% 100.0%
-[ 68, 84) 0 0.0% 100.0%
-[ 84, 104) 0 0.0% 100.0%
-[104, 129) 0 0.0% 100.0%
-[129, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks___10B-2 2000 5134742 ns/op 0.04 MB/s
+[ 55, 67) 0 0.0% 100.0%
+[ 67, 82) 0 0.0% 100.0%
+[ 82, 100) 0 0.0% 100.0%
+[100, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks___10B-2 1000 7104449 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 2 Max: 15 Avg: 4.65
+Count: 1000 Min: 2 Max: 13 Avg: 6.62
------------------------------------------------------------
-[ 2, 3) 710 35.5% 35.5% ####
-[ 3, 4) 328 16.4% 51.9% ##
-[ 4, 5) 190 9.5% 61.4% #
-[ 5, 6) 127 6.4% 67.8% #
-[ 6, 7) 131 6.6% 74.3% #
-[ 7, 9) 242 12.1% 86.4% #
-[ 9, 11) 145 7.2% 93.7% #
-[ 11, 14) 105 5.2% 98.9% #
-[ 14, 17) 22 1.1% 100.0%
+[ 2, 3) 89 8.9% 8.9% #
+[ 3, 4) 110 11.0% 19.9% #
+[ 4, 5) 108 10.8% 30.7% #
+[ 5, 6) 112 11.2% 41.9% #
+[ 6, 7) 77 7.7% 49.6% #
+[ 7, 9) 165 16.5% 66.1% ##
+[ 9, 11) 230 23.0% 89.1% ##
+[ 11, 14) 109 10.9% 100.0% #
+[ 14, 17) 0 0.0% 100.0%
+[ 17, 21) 0 0.0% 100.0%
+[ 21, 25) 0 0.0% 100.0%
+[ 25, 30) 0 0.0% 100.0%
+[ 30, 36) 0 0.0% 100.0%
+[ 36, 43) 0 0.0% 100.0%
+[ 43, 52) 0 0.0% 100.0%
+[ 52, 63) 0 0.0% 100.0%
+[ 63, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__100B 300 21167617 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 300 Min: 6 Max: 26 Avg: 20.68
+------------------------------------------------------------
+[ 6, 7) 13 4.3% 4.3%
+[ 7, 8) 7 2.3% 6.7%
+[ 8, 9) 9 3.0% 9.7%
+[ 9, 10) 0 0.0% 9.7%
+[ 10, 12) 0 0.0% 9.7%
+[ 12, 14) 0 0.0% 9.7%
+[ 14, 17) 0 0.0% 9.7%
+[ 17, 21) 29 9.7% 19.3% #
+[ 21, 25) 237 79.0% 98.3% ########
+[ 25, 31) 5 1.7% 100.0%
+[ 31, 38) 0 0.0% 100.0%
+[ 38, 46) 0 0.0% 100.0%
+[ 46, 56) 0 0.0% 100.0%
+[ 56, 69) 0 0.0% 100.0%
+[ 69, 85) 0 0.0% 100.0%
+[ 85, 104) 0 0.0% 100.0%
+[104, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__100B-2 1000 8372251 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 1000 Min: 2 Max: 15 Avg: 7.88
+------------------------------------------------------------
+[ 2, 3) 67 6.7% 6.7% #
+[ 3, 4) 62 6.2% 12.9% #
+[ 4, 5) 83 8.3% 21.2% #
+[ 5, 6) 85 8.5% 29.7% #
+[ 6, 7) 92 9.2% 38.9% #
+[ 7, 9) 150 15.0% 53.9% ##
+[ 9, 11) 144 14.4% 68.3% #
+[ 11, 14) 307 30.7% 99.0% ###
+[ 14, 17) 10 1.0% 100.0%
[ 17, 21) 0 0.0% 100.0%
[ 21, 26) 0 0.0% 100.0%
[ 26, 32) 0 0.0% 100.0%
@@ -1928,40 +1718,250 @@
[ 48, 58) 0 0.0% 100.0%
[ 58, 70) 0 0.0% 100.0%
[ 70, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks__100B 500 25336809 ns/op 0.01 MB/s
+Benchmark___10B_mux__100_chunks___1KB 300 22817830 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 500 Min: 9 Max: 39 Avg: 24.84
+Count: 300 Min: 6 Max: 28 Avg: 22.30
------------------------------------------------------------
-[ 9, 10) 3 0.6% 0.6%
-[ 10, 11) 22 4.4% 5.0%
-[ 11, 12) 3 0.6% 5.6%
-[ 12, 13) 0 0.0% 5.6%
-[ 13, 15) 3 0.6% 6.2%
-[ 15, 18) 42 8.4% 14.6% #
-[ 18, 21) 10 2.0% 16.6%
-[ 21, 25) 218 43.6% 60.2% ####
-[ 25, 31) 61 12.2% 72.4% #
-[ 31, 38) 137 27.4% 99.8% ###
-[ 38, 47) 1 0.2% 100.0%
-[ 47, 59) 0 0.0% 100.0%
-[ 59, 74) 0 0.0% 100.0%
-[ 74, 93) 0 0.0% 100.0%
-[ 93, 116) 0 0.0% 100.0%
-[116, 145) 0 0.0% 100.0%
-[145, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks__100B-2 2000 6012040 ns/op 0.03 MB/s
+[ 6, 7) 15 5.0% 5.0% #
+[ 7, 8) 4 1.3% 6.3%
+[ 8, 9) 9 3.0% 9.3%
+[ 9, 10) 0 0.0% 9.3%
+[ 10, 12) 0 0.0% 9.3%
+[ 12, 14) 0 0.0% 9.3%
+[ 14, 17) 2 0.7% 10.0%
+[ 17, 21) 24 8.0% 18.0% #
+[ 21, 26) 207 69.0% 87.0% #######
+[ 26, 32) 39 13.0% 100.0% #
+[ 32, 39) 0 0.0% 100.0%
+[ 39, 48) 0 0.0% 100.0%
+[ 48, 59) 0 0.0% 100.0%
+[ 59, 73) 0 0.0% 100.0%
+[ 73, 90) 0 0.0% 100.0%
+[ 90, 111) 0 0.0% 100.0%
+[111, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks___1KB-2 1000 8831943 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 2 Max: 18 Avg: 5.53
+Count: 1000 Min: 1 Max: 17 Avg: 8.35
------------------------------------------------------------
-[ 2, 3) 595 29.8% 29.8% ###
-[ 3, 4) 213 10.7% 40.4% #
-[ 4, 5) 204 10.2% 50.6% #
-[ 5, 6) 168 8.4% 59.0% #
-[ 6, 8) 246 12.3% 71.3% #
-[ 8, 10) 248 12.4% 83.7% #
-[ 10, 13) 224 11.2% 94.9% #
-[ 13, 16) 73 3.7% 98.6%
-[ 16, 20) 29 1.5% 100.0%
+[ 1, 2) 12 1.2% 1.2%
+[ 2, 3) 155 15.5% 16.7% ##
+[ 3, 4) 59 5.9% 22.6% #
+[ 4, 5) 48 4.8% 27.4%
+[ 5, 7) 134 13.4% 40.8% #
+[ 7, 9) 91 9.1% 49.9% #
+[ 9, 12) 132 13.2% 63.1% #
+[ 12, 15) 328 32.8% 95.9% ###
+[ 15, 19) 41 4.1% 100.0%
+[ 19, 24) 0 0.0% 100.0%
+[ 24, 30) 0 0.0% 100.0%
+[ 30, 37) 0 0.0% 100.0%
+[ 37, 46) 0 0.0% 100.0%
+[ 46, 57) 0 0.0% 100.0%
+[ 57, 70) 0 0.0% 100.0%
+[ 70, 86) 0 0.0% 100.0%
+[ 86, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___10B 100 123136622 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 100 Min: 5 Max: 173 Avg: 122.60
+------------------------------------------------------------
+[ 5, 6) 1 1.0% 1.0%
+[ 6, 7) 0 0.0% 1.0%
+[ 7, 8) 0 0.0% 1.0%
+[ 8, 10) 1 1.0% 2.0%
+[ 10, 13) 0 0.0% 2.0%
+[ 13, 18) 1 1.0% 3.0%
+[ 18, 25) 0 0.0% 3.0%
+[ 25, 35) 1 1.0% 4.0%
+[ 35, 50) 2 2.0% 6.0%
+[ 50, 71) 11 11.0% 17.0% #
+[ 71, 101) 22 22.0% 39.0% ##
+[101, 143) 14 14.0% 53.0% #
+[143, 203) 47 47.0% 100.0% #####
+[203, 287) 0 0.0% 100.0%
+[287, 406) 0 0.0% 100.0%
+[406, 574) 0 0.0% 100.0%
+[574, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___10B-2 300 22274569 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 300 Min: 2 Max: 96 Avg: 21.75
+------------------------------------------------------------
+[ 2, 3) 8 2.7% 2.7%
+[ 3, 4) 23 7.7% 10.3% #
+[ 4, 5) 31 10.3% 20.7% #
+[ 5, 7) 47 15.7% 36.3% ##
+[ 7, 10) 74 24.7% 61.0% ##
+[ 10, 14) 33 11.0% 72.0% #
+[ 14, 20) 12 4.0% 76.0%
+[ 20, 28) 7 2.3% 78.3%
+[ 28, 39) 1 0.3% 78.7%
+[ 39, 54) 4 1.3% 80.0%
+[ 54, 74) 20 6.7% 86.7% #
+[ 74, 101) 40 13.3% 100.0% #
+[101, 138) 0 0.0% 100.0%
+[138, 189) 0 0.0% 100.0%
+[189, 258) 0 0.0% 100.0%
+[258, 352) 0 0.0% 100.0%
+[352, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__100B 100 143814971 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 100 Min: 14 Max: 204 Avg: 143.32
+------------------------------------------------------------
+[ 14, 15) 1 1.0% 1.0%
+[ 15, 16) 0 0.0% 1.0%
+[ 16, 18) 0 0.0% 1.0%
+[ 18, 20) 0 0.0% 1.0%
+[ 20, 24) 0 0.0% 1.0%
+[ 24, 29) 0 0.0% 1.0%
+[ 29, 37) 0 0.0% 1.0%
+[ 37, 48) 0 0.0% 1.0%
+[ 48, 64) 11 11.0% 12.0% #
+[ 64, 87) 15 15.0% 27.0% ##
+[ 87, 120) 2 2.0% 29.0%
+[120, 166) 26 26.0% 55.0% ###
+[166, 232) 45 45.0% 100.0% #####
+[232, 326) 0 0.0% 100.0%
+[326, 459) 0 0.0% 100.0%
+[459, 649) 0 0.0% 100.0%
+[649, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__100B-2 200 34125016 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 200 Min: 2 Max: 114 Avg: 33.62
+------------------------------------------------------------
+[ 2, 3) 10 5.0% 5.0% #
+[ 3, 4) 6 3.0% 8.0%
+[ 4, 5) 10 5.0% 13.0% #
+[ 5, 7) 21 10.5% 23.5% #
+[ 7, 10) 26 13.0% 36.5% #
+[ 10, 14) 34 17.0% 53.5% ##
+[ 14, 20) 27 13.5% 67.0% #
+[ 20, 29) 7 3.5% 70.5%
+[ 29, 41) 1 0.5% 71.0%
+[ 41, 57) 2 1.0% 72.0%
+[ 57, 80) 7 3.5% 75.5%
+[ 80, 111) 45 22.5% 98.0% ##
+[111, 154) 4 2.0% 100.0%
+[154, 213) 0 0.0% 100.0%
+[213, 294) 0 0.0% 100.0%
+[294, 405) 0 0.0% 100.0%
+[405, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___1KB 100 136987808 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 100 Min: 5 Max: 233 Avg: 136.46
+------------------------------------------------------------
+[ 5, 6) 1 1.0% 1.0%
+[ 6, 7) 0 0.0% 1.0%
+[ 7, 9) 1 1.0% 2.0%
+[ 9, 11) 1 1.0% 3.0%
+[ 11, 15) 1 1.0% 4.0%
+[ 15, 21) 3 3.0% 7.0%
+[ 21, 29) 0 0.0% 7.0%
+[ 29, 41) 0 0.0% 7.0%
+[ 41, 59) 3 3.0% 10.0%
+[ 59, 84) 11 11.0% 21.0% #
+[ 84, 121) 24 24.0% 45.0% ##
+[121, 174) 25 25.0% 70.0% ###
+[174, 250) 30 30.0% 100.0% ###
+[250, 360) 0 0.0% 100.0%
+[360, 518) 0 0.0% 100.0%
+[518, 746) 0 0.0% 100.0%
+[746, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___1KB-2 200 35831221 ns/op 0.00 MB/s
+Histogram (unit: ms)
+Count: 200 Min: 2 Max: 123 Avg: 35.40
+------------------------------------------------------------
+[ 2, 3) 21 10.5% 10.5% #
+[ 3, 4) 12 6.0% 16.5% #
+[ 4, 5) 4 2.0% 18.5%
+[ 5, 7) 8 4.0% 22.5%
+[ 7, 10) 18 9.0% 31.5% #
+[ 10, 14) 21 10.5% 42.0% #
+[ 14, 20) 21 10.5% 52.5% #
+[ 20, 29) 7 3.5% 56.0%
+[ 29, 41) 11 5.5% 61.5% #
+[ 41, 58) 23 11.5% 73.0% #
+[ 58, 82) 28 14.0% 87.0% #
+[ 82, 115) 25 12.5% 99.5% #
+[115, 161) 1 0.5% 100.0%
+[161, 224) 0 0.0% 100.0%
+[224, 311) 0 0.0% 100.0%
+[311, 432) 0 0.0% 100.0%
+[432, inf) 0 0.0% 100.0%
+Benchmark__100B_mux__100_chunks___10B 500 20748811 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 500 Min: 6 Max: 27 Avg: 20.33
+------------------------------------------------------------
+[ 6, 7) 1 0.2% 0.2%
+[ 7, 8) 16 3.2% 3.4%
+[ 8, 9) 3 0.6% 4.0%
+[ 9, 10) 6 1.2% 5.2%
+[ 10, 12) 4 0.8% 6.0%
+[ 12, 14) 0 0.0% 6.0%
+[ 14, 17) 7 1.4% 7.4%
+[ 17, 21) 181 36.2% 43.6% ####
+[ 21, 26) 278 55.6% 99.2% ######
+[ 26, 32) 4 0.8% 100.0%
+[ 32, 39) 0 0.0% 100.0%
+[ 39, 48) 0 0.0% 100.0%
+[ 48, 59) 0 0.0% 100.0%
+[ 59, 72) 0 0.0% 100.0%
+[ 72, 89) 0 0.0% 100.0%
+[ 89, 109) 0 0.0% 100.0%
+[109, inf) 0 0.0% 100.0%
+Benchmark__100B_mux__100_chunks___10B-2 1000 7604070 ns/op 0.03 MB/s
+Histogram (unit: ms)
+Count: 1000 Min: 2 Max: 15 Avg: 7.10
+------------------------------------------------------------
+[ 2, 3) 49 4.9% 4.9%
+[ 3, 4) 90 9.0% 13.9% #
+[ 4, 5) 124 12.4% 26.3% #
+[ 5, 6) 117 11.7% 38.0% #
+[ 6, 7) 100 10.0% 48.0% #
+[ 7, 9) 185 18.5% 66.5% ##
+[ 9, 11) 169 16.9% 83.4% ##
+[ 11, 14) 141 14.1% 97.5% #
+[ 14, 17) 25 2.5% 100.0%
+[ 17, 21) 0 0.0% 100.0%
+[ 21, 26) 0 0.0% 100.0%
+[ 26, 32) 0 0.0% 100.0%
+[ 32, 39) 0 0.0% 100.0%
+[ 39, 48) 0 0.0% 100.0%
+[ 48, 58) 0 0.0% 100.0%
+[ 58, 70) 0 0.0% 100.0%
+[ 70, inf) 0 0.0% 100.0%
+Benchmark__100B_mux__100_chunks__100B 300 21922577 ns/op 0.01 MB/s
+Histogram (unit: ms)
+Count: 300 Min: 6 Max: 30 Avg: 21.45
+------------------------------------------------------------
+[ 6, 7) 17 5.7% 5.7% #
+[ 7, 8) 2 0.7% 6.3%
+[ 8, 9) 4 1.3% 7.7%
+[ 9, 10) 0 0.0% 7.7%
+[ 10, 12) 9 3.0% 10.7%
+[ 12, 14) 2 0.7% 11.3%
+[ 14, 17) 1 0.3% 11.7%
+[ 17, 21) 26 8.7% 20.3% #
+[ 21, 26) 144 48.0% 68.3% #####
+[ 26, 32) 95 31.7% 100.0% ###
+[ 32, 40) 0 0.0% 100.0%
+[ 40, 50) 0 0.0% 100.0%
+[ 50, 62) 0 0.0% 100.0%
+[ 62, 77) 0 0.0% 100.0%
+[ 77, 96) 0 0.0% 100.0%
+[ 96, 120) 0 0.0% 100.0%
+[120, inf) 0 0.0% 100.0%
+Benchmark__100B_mux__100_chunks__100B-2 1000 9164254 ns/op 0.02 MB/s
+Histogram (unit: ms)
+Count: 1000 Min: 2 Max: 18 Avg: 8.66
+------------------------------------------------------------
+[ 2, 3) 35 3.5% 3.5%
+[ 3, 4) 44 4.4% 7.9%
+[ 4, 5) 78 7.8% 15.7% #
+[ 5, 6) 102 10.2% 25.9% #
+[ 6, 8) 168 16.8% 42.7% ##
+[ 8, 10) 155 15.5% 58.2% ##
+[ 10, 13) 236 23.6% 81.8% ##
+[ 13, 16) 137 13.7% 95.5% #
+[ 16, 20) 45 4.5% 100.0%
[ 20, 25) 0 0.0% 100.0%
[ 25, 31) 0 0.0% 100.0%
[ 31, 38) 0 0.0% 100.0%
@@ -1970,171 +1970,171 @@
[ 58, 71) 0 0.0% 100.0%
[ 71, 87) 0 0.0% 100.0%
[ 87, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks___1KB 500 27144821 ns/op 0.01 MB/s
+Benchmark__100B_mux__100_chunks___1KB 300 23892634 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 500 Min: 9 Max: 43 Avg: 26.67
+Count: 300 Min: 6 Max: 31 Avg: 23.41
------------------------------------------------------------
-[ 9, 10) 17 3.4% 3.4%
-[ 10, 11) 18 3.6% 7.0%
-[ 11, 12) 2 0.4% 7.4%
-[ 12, 14) 0 0.0% 7.4%
-[ 14, 16) 2 0.4% 7.8%
-[ 16, 19) 40 8.0% 15.8% #
-[ 19, 23) 18 3.6% 19.4%
-[ 23, 28) 221 44.2% 63.6% ####
-[ 28, 34) 32 6.4% 70.0% #
-[ 34, 42) 149 29.8% 99.8% ###
-[ 42, 52) 1 0.2% 100.0%
-[ 52, 65) 0 0.0% 100.0%
-[ 65, 81) 0 0.0% 100.0%
-[ 81, 102) 0 0.0% 100.0%
-[102, 128) 0 0.0% 100.0%
-[128, 161) 0 0.0% 100.0%
-[161, inf) 0 0.0% 100.0%
-Benchmark__100B_mux__100_chunks___1KB-2 2000 6117827 ns/op 0.03 MB/s
+[ 6, 7) 12 4.0% 4.0%
+[ 7, 8) 9 3.0% 7.0%
+[ 8, 9) 5 1.7% 8.7%
+[ 9, 10) 1 0.3% 9.0%
+[ 10, 12) 1 0.3% 9.3%
+[ 12, 14) 2 0.7% 10.0%
+[ 14, 17) 1 0.3% 10.3%
+[ 17, 21) 10 3.3% 13.7%
+[ 21, 26) 122 40.7% 54.3% ####
+[ 26, 32) 137 45.7% 100.0% #####
+[ 32, 40) 0 0.0% 100.0%
+[ 40, 50) 0 0.0% 100.0%
+[ 50, 63) 0 0.0% 100.0%
+[ 63, 79) 0 0.0% 100.0%
+[ 79, 99) 0 0.0% 100.0%
+[ 99, 123) 0 0.0% 100.0%
+[123, inf) 0 0.0% 100.0%
+Benchmark__100B_mux__100_chunks___1KB-2 1000 9288578 ns/op 0.02 MB/s
Histogram (unit: ms)
-Count: 2000 Min: 1 Max: 20 Avg: 5.68
+Count: 1000 Min: 1 Max: 19 Avg: 8.80
------------------------------------------------------------
-[ 1, 2) 129 6.5% 6.5% #
-[ 2, 3) 689 34.5% 40.9% ###
-[ 3, 4) 129 6.5% 47.4% #
-[ 4, 5) 127 6.4% 53.7% #
-[ 5, 7) 224 11.2% 64.9% #
-[ 7, 9) 186 9.3% 74.2% #
-[ 9, 12) 250 12.5% 86.7% #
-[ 12, 15) 149 7.5% 94.2% #
-[ 15, 19) 99 5.0% 99.1%
-[ 19, 24) 18 0.9% 100.0%
-[ 24, 31) 0 0.0% 100.0%
-[ 31, 39) 0 0.0% 100.0%
-[ 39, 49) 0 0.0% 100.0%
-[ 49, 61) 0 0.0% 100.0%
-[ 61, 76) 0 0.0% 100.0%
-[ 76, 94) 0 0.0% 100.0%
-[ 94, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks___10B 100 132175574 ns/op 0.00 MB/s
+[ 1, 2) 6 0.6% 0.6%
+[ 2, 3) 158 15.8% 16.4% ##
+[ 3, 4) 70 7.0% 23.4% #
+[ 4, 5) 54 5.4% 28.8% #
+[ 5, 7) 110 11.0% 39.8% #
+[ 7, 9) 83 8.3% 48.1% #
+[ 9, 12) 183 18.3% 66.4% ##
+[ 12, 15) 142 14.2% 80.6% #
+[ 15, 19) 193 19.3% 99.9% ##
+[ 19, 24) 1 0.1% 100.0%
+[ 24, 30) 0 0.0% 100.0%
+[ 30, 38) 0 0.0% 100.0%
+[ 38, 48) 0 0.0% 100.0%
+[ 48, 60) 0 0.0% 100.0%
+[ 60, 74) 0 0.0% 100.0%
+[ 74, 91) 0 0.0% 100.0%
+[ 91, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks___10B 100 120357166 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 100 Min: 17 Max: 191 Avg: 131.70
+Count: 100 Min: 4 Max: 186 Avg: 119.88
------------------------------------------------------------
-[ 17, 18) 1 1.0% 1.0%
-[ 18, 19) 0 0.0% 1.0%
-[ 19, 20) 0 0.0% 1.0%
-[ 20, 22) 0 0.0% 1.0%
-[ 22, 25) 0 0.0% 1.0%
-[ 25, 30) 0 0.0% 1.0%
-[ 30, 37) 0 0.0% 1.0%
-[ 37, 48) 1 1.0% 2.0%
-[ 48, 63) 5 5.0% 7.0% #
-[ 63, 85) 16 16.0% 23.0% ##
-[ 85, 116) 17 17.0% 40.0% ##
-[116, 159) 18 18.0% 58.0% ##
-[159, 221) 42 42.0% 100.0% ####
-[221, 308) 0 0.0% 100.0%
-[308, 431) 0 0.0% 100.0%
-[431, 605) 0 0.0% 100.0%
-[605, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks___10B-2 1000 8590497 ns/op 0.02 MB/s
+[ 4, 5) 1 1.0% 1.0%
+[ 5, 6) 0 0.0% 1.0%
+[ 6, 8) 0 0.0% 1.0%
+[ 8, 10) 0 0.0% 1.0%
+[ 10, 14) 0 0.0% 1.0%
+[ 14, 19) 1 1.0% 2.0%
+[ 19, 27) 0 0.0% 2.0%
+[ 27, 38) 0 0.0% 2.0%
+[ 38, 54) 3 3.0% 5.0%
+[ 54, 76) 22 22.0% 27.0% ##
+[ 76, 108) 16 16.0% 43.0% ##
+[108, 153) 18 18.0% 61.0% ##
+[153, 217) 39 39.0% 100.0% ####
+[217, 307) 0 0.0% 100.0%
+[307, 435) 0 0.0% 100.0%
+[435, 616) 0 0.0% 100.0%
+[616, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks___10B-2 300 23110788 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 1000 Min: 2 Max: 63 Avg: 8.10
+Count: 300 Min: 2 Max: 97 Avg: 22.60
------------------------------------------------------------
-[ 2, 3) 275 27.5% 27.5% ###
-[ 3, 4) 186 18.6% 46.1% ##
-[ 4, 5) 125 12.5% 58.6% #
-[ 5, 7) 92 9.2% 67.8% #
-[ 7, 9) 43 4.3% 72.1%
-[ 9, 12) 57 5.7% 77.8% #
-[ 12, 17) 97 9.7% 87.5% #
-[ 17, 23) 39 3.9% 91.4%
-[ 23, 31) 31 3.1% 94.5%
-[ 31, 42) 32 3.2% 97.7%
-[ 42, 57) 21 2.1% 99.8%
-[ 57, 77) 2 0.2% 100.0%
-[ 77, 103) 0 0.0% 100.0%
-[103, 138) 0 0.0% 100.0%
-[138, 184) 0 0.0% 100.0%
-[184, 245) 0 0.0% 100.0%
-[245, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks__100B 100 145204032 ns/op 0.00 MB/s
+[ 2, 3) 7 2.3% 2.3%
+[ 3, 4) 26 8.7% 11.0% #
+[ 4, 5) 33 11.0% 22.0% #
+[ 5, 7) 45 15.0% 37.0% ##
+[ 7, 10) 46 15.3% 52.3% ##
+[ 10, 14) 48 16.0% 68.3% ##
+[ 14, 20) 19 6.3% 74.7% #
+[ 20, 28) 8 2.7% 77.3%
+[ 28, 39) 3 1.0% 78.3%
+[ 39, 54) 2 0.7% 79.0%
+[ 54, 74) 32 10.7% 89.7% #
+[ 74, 102) 31 10.3% 100.0% #
+[102, 140) 0 0.0% 100.0%
+[140, 191) 0 0.0% 100.0%
+[191, 261) 0 0.0% 100.0%
+[261, 355) 0 0.0% 100.0%
+[355, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks__100B 100 146211502 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 100 Min: 14 Max: 213 Avg: 144.70
+Count: 100 Min: 11 Max: 220 Avg: 145.68
------------------------------------------------------------
-[ 14, 15) 1 1.0% 1.0%
-[ 15, 16) 0 0.0% 1.0%
-[ 16, 18) 0 0.0% 1.0%
-[ 18, 20) 0 0.0% 1.0%
-[ 20, 24) 0 0.0% 1.0%
-[ 24, 29) 0 0.0% 1.0%
-[ 29, 37) 1 1.0% 2.0%
-[ 37, 48) 0 0.0% 2.0%
-[ 48, 64) 10 10.0% 12.0% #
-[ 64, 87) 14 14.0% 26.0% #
-[ 87, 121) 5 5.0% 31.0% #
-[121, 169) 29 29.0% 60.0% ###
-[169, 238) 40 40.0% 100.0% ####
-[238, 336) 0 0.0% 100.0%
-[336, 475) 0 0.0% 100.0%
-[475, 673) 0 0.0% 100.0%
-[673, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks__100B-2 1000 12104363 ns/op 0.02 MB/s
+[ 11, 12) 1 1.0% 1.0%
+[ 12, 13) 1 1.0% 2.0%
+[ 13, 15) 0 0.0% 2.0%
+[ 15, 17) 0 0.0% 2.0%
+[ 17, 21) 0 0.0% 2.0%
+[ 21, 26) 0 0.0% 2.0%
+[ 26, 34) 1 1.0% 3.0%
+[ 34, 46) 1 1.0% 4.0%
+[ 46, 63) 10 10.0% 14.0% #
+[ 63, 87) 12 12.0% 26.0% #
+[ 87, 122) 9 9.0% 35.0% #
+[122, 172) 19 19.0% 54.0% ##
+[172, 243) 46 46.0% 100.0% #####
+[243, 345) 0 0.0% 100.0%
+[345, 491) 0 0.0% 100.0%
+[491, 700) 0 0.0% 100.0%
+[700, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks__100B-2 200 36485527 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 1000 Min: 2 Max: 87 Avg: 11.64
+Count: 200 Min: 2 Max: 114 Avg: 36.01
------------------------------------------------------------
-[ 2, 3) 260 26.0% 26.0% ###
-[ 3, 4) 64 6.4% 32.4% #
-[ 4, 5) 67 6.7% 39.1% #
-[ 5, 7) 156 15.6% 54.7% ##
-[ 7, 10) 129 12.9% 67.6% #
-[ 10, 14) 93 9.3% 76.9% #
-[ 14, 19) 65 6.5% 83.4% #
-[ 19, 26) 40 4.0% 87.4%
-[ 26, 36) 33 3.3% 90.7%
-[ 36, 50) 41 4.1% 94.8%
-[ 50, 69) 46 4.6% 99.4%
-[ 69, 94) 6 0.6% 100.0%
-[ 94, 128) 0 0.0% 100.0%
-[128, 175) 0 0.0% 100.0%
-[175, 238) 0 0.0% 100.0%
-[238, 323) 0 0.0% 100.0%
-[323, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks___1KB 100 150385852 ns/op 0.00 MB/s
+[ 2, 3) 12 6.0% 6.0% #
+[ 3, 4) 7 3.5% 9.5%
+[ 4, 5) 3 1.5% 11.0%
+[ 5, 7) 17 8.5% 19.5% #
+[ 7, 10) 28 14.0% 33.5% #
+[ 10, 14) 29 14.5% 48.0% #
+[ 14, 20) 25 12.5% 60.5% #
+[ 20, 29) 13 6.5% 67.0% #
+[ 29, 41) 5 2.5% 69.5%
+[ 41, 57) 0 0.0% 69.5%
+[ 57, 80) 6 3.0% 72.5%
+[ 80, 111) 53 26.5% 99.0% ###
+[111, 154) 2 1.0% 100.0%
+[154, 213) 0 0.0% 100.0%
+[213, 294) 0 0.0% 100.0%
+[294, 405) 0 0.0% 100.0%
+[405, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks___1KB 100 145242261 ns/op 0.00 MB/s
Histogram (unit: ms)
-Count: 100 Min: 10 Max: 251 Avg: 149.86
+Count: 100 Min: 7 Max: 235 Avg: 144.71
------------------------------------------------------------
-[ 10, 11) 1 1.0% 1.0%
-[ 11, 12) 0 0.0% 1.0%
-[ 12, 14) 1 1.0% 2.0%
-[ 14, 16) 0 0.0% 2.0%
-[ 16, 20) 0 0.0% 2.0%
-[ 20, 26) 0 0.0% 2.0%
-[ 26, 34) 3 3.0% 5.0%
-[ 34, 46) 2 2.0% 7.0%
-[ 46, 64) 5 5.0% 12.0% #
-[ 64, 90) 12 12.0% 24.0% #
-[ 90, 128) 15 15.0% 39.0% ##
-[128, 183) 26 26.0% 65.0% ###
-[183, 263) 35 35.0% 100.0% ####
-[263, 378) 0 0.0% 100.0%
-[378, 545) 0 0.0% 100.0%
-[545, 786) 0 0.0% 100.0%
-[786, inf) 0 0.0% 100.0%
-Benchmark__100B_mux___1K_chunks___1KB-2 1000 13867566 ns/op 0.01 MB/s
+[ 7, 8) 1 1.0% 1.0%
+[ 8, 9) 2 2.0% 3.0%
+[ 9, 11) 1 1.0% 4.0%
+[ 11, 13) 1 1.0% 5.0%
+[ 13, 17) 0 0.0% 5.0%
+[ 17, 23) 2 2.0% 7.0%
+[ 23, 31) 1 1.0% 8.0%
+[ 31, 43) 0 0.0% 8.0%
+[ 43, 61) 1 1.0% 9.0%
+[ 61, 86) 10 10.0% 19.0% #
+[ 86, 123) 24 24.0% 43.0% ##
+[123, 176) 24 24.0% 67.0% ##
+[176, 252) 33 33.0% 100.0% ###
+[252, 362) 0 0.0% 100.0%
+[362, 520) 0 0.0% 100.0%
+[520, 748) 0 0.0% 100.0%
+[748, inf) 0 0.0% 100.0%
+Benchmark__100B_mux___1K_chunks___1KB-2 200 37420006 ns/op 0.01 MB/s
Histogram (unit: ms)
-Count: 1000 Min: 1 Max: 105 Avg: 13.35
+Count: 200 Min: 2 Max: 125 Avg: 36.95
------------------------------------------------------------
-[ 1, 2) 214 21.4% 21.4% ##
-[ 2, 3) 200 20.0% 41.4% ##
-[ 3, 4) 27 2.7% 44.1%
-[ 4, 6) 81 8.1% 52.2% #
-[ 6, 9) 121 12.1% 64.3% #
-[ 9, 13) 89 8.9% 73.2% #
-[ 13, 19) 78 7.8% 81.0% #
-[ 19, 27) 51 5.1% 86.1% #
-[ 27, 38) 25 2.5% 88.6%
-[ 38, 54) 27 2.7% 91.3%
-[ 54, 76) 56 5.6% 96.9% #
-[ 76, 106) 31 3.1% 100.0%
-[106, 147) 0 0.0% 100.0%
-[147, 202) 0 0.0% 100.0%
-[202, 278) 0 0.0% 100.0%
-[278, 381) 0 0.0% 100.0%
-[381, inf) 0 0.0% 100.0%
+[ 2, 3) 37 18.5% 18.5% ##
+[ 3, 4) 6 3.0% 21.5%
+[ 4, 5) 2 1.0% 22.5%
+[ 5, 7) 16 8.0% 30.5% #
+[ 7, 10) 8 4.0% 34.5%
+[ 10, 14) 16 8.0% 42.5% #
+[ 14, 20) 14 7.0% 49.5% #
+[ 20, 29) 12 6.0% 55.5% #
+[ 29, 42) 13 6.5% 62.0% #
+[ 42, 59) 20 10.0% 72.0% #
+[ 59, 83) 22 11.0% 83.0% #
+[ 83, 117) 30 15.0% 98.0% ##
+[117, 163) 4 2.0% 100.0%
+[163, 227) 0 0.0% 100.0%
+[227, 316) 0 0.0% 100.0%
+[316, 438) 0 0.0% 100.0%
+[438, inf) 0 0.0% 100.0%
diff --git a/runtimes/google/ipc/benchmarks/glob/README.txt b/runtimes/google/ipc/benchmarks/glob/README.txt
new file mode 100644
index 0000000..0103cd2
--- /dev/null
+++ b/runtimes/google/ipc/benchmarks/glob/README.txt
@@ -0,0 +1,120 @@
+Glob Benchmarks
+
+The benchmarks in this directory attempt to provide some guidance for the amount
+of buffering to use with the channels returned by Glob__ and GlobChildren__.
+
+The first set of benchmarks (BenchmarkChanN) shows the relationship between the
+buffer size and the latency of a very simple channel with one writer and one
+reader doing nothing else.
+
+The second set of benchmarks (BenchmarkGlobN) does the same thing but with a
+Glob__ server and a Glob client. The third set (BenchmarkGlobChildrenN) uses
+GlobChildren__.
+
+As of 2014-12-03, the conclusion is that the queue size has very little impact
+on performance.
+
+The BenchmarkChanN set shows that increasing the queue size improves latency for
+the very simple case, but not for Glob__ or GlobChildren__.
+
+An interesting observation is that all the benchmarks get slower as the number
+of cpus increases.
+
+Below are the test results for 1, 2, and 4 cpus on a HP Z420 workstation with
+2 × 6 cpu cores (Intel(R) Xeon(R) CPU E5-1650 v2 @ 3.50GHz).
+
+$ ./glob.test -test.bench=. -test.benchtime=5s -test.cpu=1
+BenchmarkChan0 20000000 464 ns/op
+BenchmarkChan1 20000000 585 ns/op
+BenchmarkChan2 20000000 484 ns/op
+BenchmarkChan4 20000000 425 ns/op
+BenchmarkChan8 50000000 396 ns/op
+BenchmarkChan16 50000000 381 ns/op
+BenchmarkChan32 50000000 371 ns/op
+BenchmarkChan64 50000000 365 ns/op
+BenchmarkChan128 50000000 363 ns/op
+BenchmarkChan256 50000000 362 ns/op
+BenchmarkGlob0 500000 35029 ns/op
+BenchmarkGlob1 500000 63536 ns/op
+BenchmarkGlob2 500000 34753 ns/op
+BenchmarkGlob4 500000 26379 ns/op
+BenchmarkGlob8 500000 19293 ns/op
+BenchmarkGlob16 1000000 18149 ns/op
+BenchmarkGlob32 500000 52364 ns/op
+BenchmarkGlob64 500000 83879 ns/op
+BenchmarkGlob128 100000 88448 ns/op
+BenchmarkGlob256 100000 57922 ns/op
+BenchmarkGlobChildren0 100000 118448 ns/op
+BenchmarkGlobChildren1 100000 123274 ns/op
+BenchmarkGlobChildren2 100000 116110 ns/op
+BenchmarkGlobChildren4 100000 134175 ns/op
+BenchmarkGlobChildren8 100000 118776 ns/op
+BenchmarkGlobChildren16 100000 123191 ns/op
+BenchmarkGlobChildren32 100000 132195 ns/op
+BenchmarkGlobChildren64 100000 126004 ns/op
+BenchmarkGlobChildren128 100000 135072 ns/op
+BenchmarkGlobChildren256 100000 127399 ns/op
+
+$ ./glob.test -test.bench=. -test.benchtime=5s -test.cpu=2
+BenchmarkChan0-2 5000000 1595 ns/op
+BenchmarkChan1-2 5000000 1649 ns/op
+BenchmarkChan2-2 10000000 1245 ns/op
+BenchmarkChan4-2 10000000 1299 ns/op
+BenchmarkChan8-2 10000000 982 ns/op
+BenchmarkChan16-2 10000000 929 ns/op
+BenchmarkChan32-2 10000000 916 ns/op
+BenchmarkChan64-2 10000000 903 ns/op
+BenchmarkChan128-2 10000000 907 ns/op
+BenchmarkChan256-2 10000000 914 ns/op
+BenchmarkGlob0-2 500000 61455 ns/op
+BenchmarkGlob1-2 500000 46890 ns/op
+BenchmarkGlob2-2 200000 56462 ns/op
+BenchmarkGlob4-2 500000 22783 ns/op
+BenchmarkGlob8-2 200000 64783 ns/op
+BenchmarkGlob16-2 1000000 68119 ns/op
+BenchmarkGlob32-2 200000 78611 ns/op
+BenchmarkGlob64-2 500000 82180 ns/op
+BenchmarkGlob128-2 1000000 81548 ns/op
+BenchmarkGlob256-2 100000 88278 ns/op
+BenchmarkGlobChildren0-2 100000 83188 ns/op
+BenchmarkGlobChildren1-2 100000 81751 ns/op
+BenchmarkGlobChildren2-2 100000 81896 ns/op
+BenchmarkGlobChildren4-2 100000 81857 ns/op
+BenchmarkGlobChildren8-2 100000 81531 ns/op
+BenchmarkGlobChildren16-2 100000 89915 ns/op
+BenchmarkGlobChildren32-2 100000 81112 ns/op
+BenchmarkGlobChildren64-2 100000 80997 ns/op
+BenchmarkGlobChildren128-2 100000 81350 ns/op
+BenchmarkGlobChildren256-2 100000 81344 ns/op
+
+$ ./glob.test -test.bench=. -test.benchtime=5s -test.cpu=4
+BenchmarkChan0-4 5000000 2012 ns/op
+BenchmarkChan1-4 5000000 3149 ns/op
+BenchmarkChan2-4 5000000 1839 ns/op
+BenchmarkChan4-4 10000000 957 ns/op
+BenchmarkChan8-4 20000000 660 ns/op
+BenchmarkChan16-4 20000000 523 ns/op
+BenchmarkChan32-4 20000000 507 ns/op
+BenchmarkChan64-4 20000000 509 ns/op
+BenchmarkChan128-4 20000000 507 ns/op
+BenchmarkChan256-4 20000000 511 ns/op
+BenchmarkGlob0-4 100000 103269 ns/op
+BenchmarkGlob1-4 100000 101222 ns/op
+BenchmarkGlob2-4 100000 102049 ns/op
+BenchmarkGlob4-4 100000 102763 ns/op
+BenchmarkGlob8-4 100000 101939 ns/op
+BenchmarkGlob16-4 100000 102989 ns/op
+BenchmarkGlob32-4 100000 103898 ns/op
+BenchmarkGlob64-4 100000 102838 ns/op
+BenchmarkGlob128-4 100000 101532 ns/op
+BenchmarkGlob256-4 100000 101059 ns/op
+BenchmarkGlobChildren0-4 100000 106617 ns/op
+BenchmarkGlobChildren1-4 100000 102576 ns/op
+BenchmarkGlobChildren2-4 100000 106313 ns/op
+BenchmarkGlobChildren4-4 100000 102774 ns/op
+BenchmarkGlobChildren8-4 100000 102886 ns/op
+BenchmarkGlobChildren16-4 100000 106771 ns/op
+BenchmarkGlobChildren32-4 100000 103309 ns/op
+BenchmarkGlobChildren64-4 100000 105112 ns/op
+BenchmarkGlobChildren128-4 100000 102295 ns/op
+BenchmarkGlobChildren256-4 100000 102951 ns/op
diff --git a/runtimes/google/ipc/benchmarks/glob/doc.go b/runtimes/google/ipc/benchmarks/glob/doc.go
new file mode 100644
index 0000000..62e4116
--- /dev/null
+++ b/runtimes/google/ipc/benchmarks/glob/doc.go
@@ -0,0 +1,4 @@
+package glob
+
+// This file exists only to prevent build failures from having a test-only
+// package.
diff --git a/runtimes/google/ipc/benchmarks/glob/glob_test.go b/runtimes/google/ipc/benchmarks/glob/glob_test.go
new file mode 100644
index 0000000..5f7e587
--- /dev/null
+++ b/runtimes/google/ipc/benchmarks/glob/glob_test.go
@@ -0,0 +1,255 @@
+package glob_test
+
+import (
+ "fmt"
+ "testing"
+
+ "veyron.io/veyron/veyron2"
+ "veyron.io/veyron/veyron2/ipc"
+ "veyron.io/veyron/veyron2/naming"
+ "veyron.io/veyron/veyron2/rt"
+ "veyron.io/veyron/veyron2/security"
+
+ "veyron.io/veyron/veyron/profiles"
+)
+
+func TestNothing(t *testing.T) {
+}
+
+func RunBenchmarkChan(b *testing.B, bufferSize int) {
+ ch := make(chan string, bufferSize)
+ go func() {
+ for i := 0; i < b.N; i++ {
+ ch <- fmt.Sprintf("%09d", i)
+ }
+ close(ch)
+ }()
+ for _ = range ch {
+ continue
+ }
+}
+
+func BenchmarkChan0(b *testing.B) {
+ RunBenchmarkChan(b, 0)
+}
+
+func BenchmarkChan1(b *testing.B) {
+ RunBenchmarkChan(b, 1)
+}
+
+func BenchmarkChan2(b *testing.B) {
+ RunBenchmarkChan(b, 2)
+}
+
+func BenchmarkChan4(b *testing.B) {
+ RunBenchmarkChan(b, 4)
+}
+
+func BenchmarkChan8(b *testing.B) {
+ RunBenchmarkChan(b, 8)
+}
+
+func BenchmarkChan16(b *testing.B) {
+ RunBenchmarkChan(b, 16)
+}
+
+func BenchmarkChan32(b *testing.B) {
+ RunBenchmarkChan(b, 32)
+}
+
+func BenchmarkChan64(b *testing.B) {
+ RunBenchmarkChan(b, 64)
+}
+
+func BenchmarkChan128(b *testing.B) {
+ RunBenchmarkChan(b, 128)
+}
+
+func BenchmarkChan256(b *testing.B) {
+ RunBenchmarkChan(b, 256)
+}
+
+type disp struct {
+ obj interface{}
+}
+
+func (d *disp) Lookup(suffix string) (interface{}, security.Authorizer, error) {
+ return d.obj, nil, nil
+}
+
+func startServer(b *testing.B, rt veyron2.Runtime, obj interface{}) (string, func(), error) {
+ server, err := rt.NewServer()
+ if err != nil {
+ return "", nil, fmt.Errorf("failed to start server: %v", err)
+ }
+ endpoints, err := server.Listen(profiles.LocalListenSpec)
+ if err != nil {
+ return "", nil, fmt.Errorf("failed to listen: %v", err)
+ }
+ if err := server.ServeDispatcher("", &disp{obj}); err != nil {
+ return "", nil, err
+ }
+ addr := naming.JoinAddressName(endpoints[0].String(), "")
+ return addr, func() { server.Stop() }, nil
+}
+
+type globObject struct {
+ b *testing.B
+ bufferSize int
+}
+
+func (o *globObject) Glob__(ctx ipc.ServerContext, pattern string) (<-chan naming.VDLMountEntry, error) {
+ if pattern != "*" {
+ panic("this benchmark only works with pattern='*'")
+ }
+ ch := make(chan naming.VDLMountEntry, o.bufferSize)
+ go func() {
+ for i := 0; i < o.b.N; i++ {
+ name := fmt.Sprintf("%09d", i)
+ ch <- naming.VDLMountEntry{Name: name}
+ }
+ close(ch)
+ }()
+ return ch, nil
+}
+
+type globChildrenObject struct {
+ b *testing.B
+ bufferSize int
+}
+
+func (o *globChildrenObject) GlobChildren__(ctx ipc.ServerContext) (<-chan string, error) {
+ if ctx.Suffix() != "" {
+ return nil, nil
+ }
+ ch := make(chan string, o.bufferSize)
+ go func() {
+ for i := 0; i < o.b.N; i++ {
+ ch <- fmt.Sprintf("%09d", i)
+ }
+ close(ch)
+ }()
+ return ch, nil
+}
+
+func globClient(b *testing.B, rt veyron2.Runtime, name string) (int, error) {
+ call, err := rt.Client().StartCall(rt.NewContext(), name, ipc.GlobMethod, []interface{}{"*"})
+ if err != nil {
+ return 0, err
+ }
+ var me naming.VDLMountEntry
+ b.ResetTimer()
+ count := 0
+ for {
+ if err := call.Recv(&me); err != nil {
+ break
+ }
+ count++
+ }
+ b.StopTimer()
+ if ferr := call.Finish(&err); ferr != nil {
+ err = ferr
+ }
+ return count, err
+}
+
+func RunBenchmarkGlob(b *testing.B, obj interface{}) {
+ runtime, err := rt.New()
+ if err != nil {
+ panic(err)
+ }
+ defer runtime.Cleanup()
+ addr, stop, err := startServer(b, runtime, obj)
+ if err != nil {
+ b.Fatalf("startServer failed: %v", err)
+ }
+ defer stop()
+
+ count, err := globClient(b, runtime, addr)
+ if err != nil {
+ b.Fatalf("globClient failed: %v", err)
+ }
+ if count != b.N {
+ b.Fatalf("unexpected number of results: got %d, expected %d", count, b.N)
+ }
+}
+
+func BenchmarkGlob0(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 0})
+}
+
+func BenchmarkGlob1(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 1})
+}
+
+func BenchmarkGlob2(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 2})
+}
+
+func BenchmarkGlob4(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 4})
+}
+
+func BenchmarkGlob8(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 8})
+}
+
+func BenchmarkGlob16(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 16})
+}
+
+func BenchmarkGlob32(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 32})
+}
+
+func BenchmarkGlob64(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 64})
+}
+
+func BenchmarkGlob128(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 128})
+}
+
+func BenchmarkGlob256(b *testing.B) {
+ RunBenchmarkGlob(b, &globObject{b, 256})
+}
+
+func BenchmarkGlobChildren0(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 0})
+}
+
+func BenchmarkGlobChildren1(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 1})
+}
+
+func BenchmarkGlobChildren2(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 2})
+}
+
+func BenchmarkGlobChildren4(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 4})
+}
+
+func BenchmarkGlobChildren8(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 8})
+}
+
+func BenchmarkGlobChildren16(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 16})
+}
+
+func BenchmarkGlobChildren32(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 32})
+}
+
+func BenchmarkGlobChildren64(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 64})
+}
+
+func BenchmarkGlobChildren128(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 128})
+}
+
+func BenchmarkGlobChildren256(b *testing.B) {
+ RunBenchmarkGlob(b, &globChildrenObject{b, 256})
+}
diff --git a/runtimes/google/ipc/benchmarks/service.vdl b/runtimes/google/ipc/benchmarks/service.vdl
index 5d6872c..c50df79 100644
--- a/runtimes/google/ipc/benchmarks/service.vdl
+++ b/runtimes/google/ipc/benchmarks/service.vdl
@@ -8,7 +8,7 @@
type Benchmark interface {
// Echo returns the payload that it receives.
- Echo(Payload []byte) ([]byte, error) {access.Read}
+ Echo(Payload []byte) ([]byte | error) {access.Read}
// EchoStream returns the payload that it receives via the stream.
EchoStream() stream<[]byte,[]byte> error {access.Read}
}
diff --git a/runtimes/google/ipc/benchmarks/service.vdl.go b/runtimes/google/ipc/benchmarks/service.vdl.go
index 6fac31d..f2f23e8 100644
--- a/runtimes/google/ipc/benchmarks/service.vdl.go
+++ b/runtimes/google/ipc/benchmarks/service.vdl.go
@@ -107,17 +107,19 @@
}
// SendStream returns the send side of the Benchmark.EchoStream client stream.
SendStream() interface {
- // Send places the item onto the output stream. Returns errors encountered
- // while sending, or if Send is called after Close or Cancel. Blocks if
- // there is no buffer space; will unblock when buffer space is available or
- // after Cancel.
+ // Send places the item onto the output stream. Returns errors
+ // encountered while sending, or if Send is called after Close or
+ // the stream has been canceled. Blocks if there is no buffer
+ // space; will unblock when buffer space is available or after
+ // the stream has been canceled.
Send(item []byte) error
- // Close indicates to the server that no more items will be sent; server
- // Recv calls will receive io.EOF after all sent items. This is an optional
- // call - e.g. a client might call Close if it needs to continue receiving
- // items from the server after it's done sending. Returns errors
- // encountered while closing, or if Close is called after Cancel. Like
- // Send, blocks if there is no buffer space available.
+ // Close indicates to the server that no more items will be sent;
+ // server Recv calls will receive io.EOF after all sent items.
+ // This is an optional call - e.g. a client might call Close if it
+ // needs to continue receiving items from the server after it's
+ // done sending. Returns errors encountered while closing, or if
+ // Close is called after the stream has been canceled. Like Send,
+ // blocks if there is no buffer space available.
Close() error
}
}
@@ -128,18 +130,14 @@
// Finish performs the equivalent of SendStream().Close, then blocks until
// the server is done, and returns the positional return values for the call.
//
- // Finish returns immediately if Cancel has been called; depending on the
+ // Finish returns immediately if the call has been canceled; depending on the
// timing the output could either be an error signaling cancelation, or the
// valid positional return values from the server.
//
- // Calling Finish is mandatory for releasing stream resources, unless Cancel
- // has been called or any of the other methods return an error. Finish should
+ // Calling Finish is mandatory for releasing stream resources, unless the call
+ // has been canceled or any of the other methods return an error. Finish should
// be called at most once.
Finish() error
- // Cancel cancels the RPC, notifying the server to stop processing. It is
- // safe to call Cancel concurrently with any of the other stream methods.
- // Calling Cancel after Finish has returned is a no-op.
- Cancel()
}
type implBenchmarkEchoStreamCall struct {
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index 4891254..8475dea 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -501,7 +501,8 @@
go func() {
select {
case <-ctx.Done():
- fc.Cancel()
+ ivtrace.FromContext(fc.ctx).Annotate("Cancelled")
+ fc.flow.Cancel()
case <-fc.flow.Closed():
}
}()
@@ -901,12 +902,6 @@
return fc.close(nil)
}
-func (fc *flowClient) Cancel() {
- defer vlog.LogCall()()
- ivtrace.FromContext(fc.ctx).Annotate("Cancelled")
- fc.flow.Cancel()
-}
-
func (fc *flowClient) RemoteBlessings() ([]string, security.Blessings) {
return fc.server, fc.flow.RemoteBlessings()
}
diff --git a/runtimes/google/ipc/default_authorizer.go b/runtimes/google/ipc/default_authorizer.go
index bbaa7c9..16812e7 100644
--- a/runtimes/google/ipc/default_authorizer.go
+++ b/runtimes/google/ipc/default_authorizer.go
@@ -13,22 +13,29 @@
func (defaultAuthorizer) Authorize(ctx security.Context) error {
var (
- local = ctx.LocalBlessings().ForContext(ctx)
- remote = ctx.RemoteBlessings().ForContext(ctx)
+ localForContext = ctx.LocalBlessings().ForContext(ctx)
+ remote = ctx.RemoteBlessings()
+ remoteForContext = remote.ForContext(ctx)
)
- // Authorize if any element in local is a "delegate of" (i.e., has been
+ // Authorize if any element in localForContext is a "delegate of" (i.e., has been
// blessed by) any element in remote, OR vice-versa.
- for _, l := range local {
- if security.BlessingPattern(l).MatchedBy(remote...) {
+ for _, l := range localForContext {
+ if security.BlessingPattern(l).MatchedBy(remoteForContext...) {
// l is a delegate of an element in remote.
return nil
}
}
- for _, r := range remote {
- if security.BlessingPattern(r).MatchedBy(local...) {
- // r is a delegate of an element in local.
+ for _, r := range remoteForContext {
+ if security.BlessingPattern(r).MatchedBy(localForContext...) {
+ // r is a delegate of an element in localForContext.
return nil
}
}
- return fmt.Errorf("policy disallows %v", remote)
+
+ // TODO(ataly, ashankar, caprita): Below we implicitly invoke the String() on
+ // remote blessings in order to construct thre error messsage. This is somewhat
+ // breaking encapsulation as the String() method is hidden from the public API
+ // and is only meant for debugging purposes. Should we make the 'String' method
+ // public?
+ return fmt.Errorf("all valid blessings for this request: %v (out of %v) are disallowed by the policy", remoteForContext, remote)
}
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 746b578..5f03ee0 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -15,6 +15,7 @@
"testing"
"time"
+ "veyron.io/veyron/veyron2/context"
"veyron.io/veyron/veyron2/ipc"
"veyron.io/veyron/veyron2/ipc/stream"
"veyron.io/veyron/veyron2/naming"
@@ -1090,9 +1091,9 @@
return nil
}
-func waitForCancel(t *testing.T, ts *cancelTestServer, call ipc.Call) {
+func waitForCancel(t *testing.T, ts *cancelTestServer, cancel context.CancelFunc) {
<-ts.started
- call.Cancel()
+ cancel()
<-ts.cancelled
}
@@ -1102,11 +1103,12 @@
b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
defer b.cleanup(t)
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
+ ctx, cancel := testContext().WithCancel()
+ _, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamReader", []interface{}{})
if err != nil {
t.Fatalf("Start call failed: %v", err)
}
- waitForCancel(t, ts, call)
+ waitForCancel(t, ts, cancel)
}
// TestCancelWithFullBuffers tests that even if the writer has filled the buffers and
@@ -1116,7 +1118,8 @@
b := createBundle(t, tsecurity.NewPrincipal("client"), tsecurity.NewPrincipal("server"), ts)
defer b.cleanup(t)
- call, err := b.client.StartCall(testContext(), "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
+ ctx, cancel := testContext().WithCancel()
+ call, err := b.client.StartCall(ctx, "mountpoint/server/suffix", "CancelStreamIgnorer", []interface{}{})
if err != nil {
t.Fatalf("Start call failed: %v", err)
}
@@ -1125,7 +1128,7 @@
call.Send(make([]byte, vc.MaxSharedBytes))
call.Send(make([]byte, vc.DefaultBytesBufferedPerFlow))
- waitForCancel(t, ts, call)
+ waitForCancel(t, ts, cancel)
}
type streamRecvInGoroutineServer struct{ c chan error }
diff --git a/runtimes/google/ipc/glob.go b/runtimes/google/ipc/glob.go
index 2e5dddd..6e89d01 100644
--- a/runtimes/google/ipc/glob.go
+++ b/runtimes/google/ipc/glob.go
@@ -322,6 +322,7 @@
}
}
+func (c *mutableContext) Context() context.T { return c.T }
func (c *mutableContext) Timestamp() time.Time { return c.M.Timestamp }
func (c *mutableContext) Method() string { return c.M.Method }
func (c *mutableContext) MethodTags() []interface{} { return c.M.MethodTags }
diff --git a/runtimes/google/ipc/resolve_internal_test.go b/runtimes/google/ipc/resolve_internal_test.go
new file mode 100644
index 0000000..86ac229
--- /dev/null
+++ b/runtimes/google/ipc/resolve_internal_test.go
@@ -0,0 +1,9 @@
+package ipc
+
+import (
+ "veyron.io/veyron/veyron2/ipc"
+)
+
+func InternalServerResolveToEndpoint(s ipc.Server, name string) (string, error) {
+ return s.(*server).resolveToEndpoint(name)
+}
diff --git a/runtimes/google/ipc/resolve_test.go b/runtimes/google/ipc/resolve_test.go
new file mode 100644
index 0000000..6d97e6a
--- /dev/null
+++ b/runtimes/google/ipc/resolve_test.go
@@ -0,0 +1,83 @@
+package ipc_test
+
+import (
+ "fmt"
+ "testing"
+ "time"
+
+ "veyron.io/veyron/veyron2/naming"
+ "veyron.io/veyron/veyron2/rt"
+
+ "veyron.io/veyron/veyron/lib/expect"
+ "veyron.io/veyron/veyron/lib/modules"
+ "veyron.io/veyron/veyron/lib/modules/core"
+ iipc "veyron.io/veyron/veyron/runtimes/google/ipc"
+ inaming "veyron.io/veyron/veyron/runtimes/google/naming"
+)
+
+func startMT(t *testing.T, sh *modules.Shell) string {
+ h, err := sh.Start(core.RootMTCommand, nil, "--", "--veyron.tcp.address=127.0.0.1:0")
+ if err != nil {
+ t.Fatalf("unexpected error for root mt: %s", err)
+ }
+ s := expect.NewSession(t, h.Stdout(), time.Minute)
+ s.ExpectVar("PID")
+ return s.ExpectVar("MT_NAME")
+}
+
+func TestResolveToEndpoint(t *testing.T) {
+ sh, err := modules.NewShell(nil)
+ if err != nil {
+ t.Fatalf("modules.NewShell failed: %s", err)
+ }
+ defer sh.Cleanup(nil, nil)
+ root := startMT(t, sh)
+
+ runtime, err := rt.New()
+ if err != nil {
+ t.Fatalf("rt.New failed: %s", err)
+ }
+ defer runtime.Cleanup()
+ ns := runtime.Namespace()
+ ns.SetRoots(root)
+
+ proxyEp, _ := inaming.NewEndpoint("proxy.v.io:123")
+ proxyEpStr := proxyEp.String()
+ proxyAddr := naming.JoinAddressName(proxyEpStr, "")
+ if err := ns.Mount(runtime.NewContext(), "proxy", proxyAddr, time.Hour); err != nil {
+ t.Fatalf("ns.Mount failed: %s", err)
+ }
+
+ server, err := runtime.NewServer()
+ if err != nil {
+ t.Fatalf("runtime.NewServer failed: %s", err)
+ }
+
+ notfound := fmt.Errorf("not found")
+ testcases := []struct {
+ address string
+ result string
+ err error
+ }{
+ {"/proxy.v.io:123", proxyEpStr, nil},
+ {"proxy.v.io:123", "", notfound},
+ {"proxy", proxyEpStr, nil},
+ {naming.JoinAddressName(root, "proxy"), proxyEpStr, nil},
+ {proxyAddr, proxyEpStr, nil},
+ {proxyEpStr, "", notfound},
+ {"unknown", "", notfound},
+ }
+ for _, tc := range testcases {
+ result, err := iipc.InternalServerResolveToEndpoint(server, tc.address)
+ if (err == nil) != (tc.err == nil) {
+ t.Errorf("Unexpected err for %q. Got %v, expected %v", tc.address, err, tc.err)
+ }
+ if result != tc.result {
+ t.Errorf("Unexpected result for %q. Got %q, expected %q", tc.address, result, tc.result)
+ }
+ }
+ if t.Failed() {
+ t.Logf("proxyEpStr: %v", proxyEpStr)
+ t.Logf("proxyAddr: %v", proxyAddr)
+ }
+}
diff --git a/runtimes/google/ipc/server.go b/runtimes/google/ipc/server.go
index 3462d38..6fbdd4e 100644
--- a/runtimes/google/ipc/server.go
+++ b/runtimes/google/ipc/server.go
@@ -145,12 +145,8 @@
return s.publisher.Published(), nil
}
-// resolveToAddress will try to resolve the input to an address using the
-// mount table, if the input is not already an address.
-func (s *server) resolveToAddress(address string) (string, error) {
- if _, err := inaming.NewEndpoint(address); err == nil {
- return address, nil
- }
+// resolveToEndpoint resolves an object name or address to an endpoint.
+func (s *server) resolveToEndpoint(address string) (string, error) {
var names []string
if s.ns != nil {
var entry *naming.MountEntry
@@ -476,7 +472,7 @@
}
func (s *server) reconnectAndPublishProxy(proxy string) (*inaming.Endpoint, stream.Listener, error) {
- resolved, err := s.resolveToAddress(proxy)
+ resolved, err := s.resolveToEndpoint(proxy)
if err != nil {
return nil, nil, fmt.Errorf("Failed to resolve proxy %q (%v)", proxy, err)
}
@@ -1173,6 +1169,9 @@
//nologcall
return fs.tags
}
+func (fs *flowServer) Context() context.T {
+ return fs.T
+}
// TODO(cnicolaou): remove Name from ipc.ServerContext and all of
// its implementations
diff --git a/runtimes/google/ipc/stream/benchmark/RESULTS.txt b/runtimes/google/ipc/stream/benchmark/RESULTS.txt
index 3535455..d217956 100644
--- a/runtimes/google/ipc/stream/benchmark/RESULTS.txt
+++ b/runtimes/google/ipc/stream/benchmark/RESULTS.txt
@@ -1,86 +1,86 @@
-Date: 12/12/2014
+Date: 12/14/2014
Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz, 66114888KB Memory
$ veyron go test -test.bench=. -test.cpu=1 -test.benchtime=5s \
veyron.io/veyron/veyron/runtimes/google/ipc/stream/benchmark
-Benchmark_throughput_TCP_1Conn 1000000 9075 ns/op 5641.59 MB/s
-Benchmark_throughput_TCP_2Conns 1000000 9065 ns/op 5647.79 MB/s
-Benchmark_throughput_TCP_4Conns 1000000 9651 ns/op 5304.80 MB/s
-Benchmark_throughput_TCP_8Conns 1000000 11300 ns/op 4530.65 MB/s
-Benchmark_throughput_Pipe_1Conn 500000 13960 ns/op 3667.45 MB/s
-Benchmark_throughput_Pipe_2Conns 500000 13529 ns/op 3784.26 MB/s
-Benchmark_throughput_Pipe_4Conns 1000000 13412 ns/op 3817.29 MB/s
-Benchmark_throughput_Pipe_8Conns 1000000 13749 ns/op 3723.82 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_1Flow 500000 25830 ns/op 1982.15 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_2Flow 500000 24948 ns/op 2052.20 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_8Flow 500000 32365 ns/op 1581.95 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_2Flow 500000 25847 ns/op 1980.87 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_8Flow 500000 31619 ns/op 1619.25 MB/s
-Benchmark_throughput_Flow_2VIF_4VC_8Flow 500000 34299 ns/op 1492.72 MB/s
-Benchmark_throughput_TLS_1Conn 20000 409755 ns/op 124.95 MB/s
-Benchmark_throughput_TLS_2Conns 20000 409396 ns/op 125.06 MB/s
-Benchmark_throughput_TLS_4Conns 20000 414513 ns/op 123.52 MB/s
-Benchmark_throughput_TLS_8Conns 20000 417252 ns/op 122.71 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_1FlowTLS 20000 458925 ns/op 111.56 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_2FlowTLS 20000 460522 ns/op 111.18 MB/s
-Benchmark_throughput_Flow_1VIF_1VC_8FlowTLS 20000 467796 ns/op 109.45 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_2FlowTLS 20000 461205 ns/op 111.01 MB/s
-Benchmark_throughput_Flow_1VIF_2VC_8FlowTLS 20000 467651 ns/op 109.48 MB/s
-Benchmark_throughput_Flow_2VIF_4VC_8FlowTLS 20000 467791 ns/op 109.45 MB/s
+Benchmark_throughput_TCP_1Conn 1000000 9874 ns/op 5184.85 MB/s
+Benchmark_throughput_TCP_2Conns 1000000 9815 ns/op 5216.01 MB/s
+Benchmark_throughput_TCP_4Conns 1000000 10088 ns/op 5074.94 MB/s
+Benchmark_throughput_TCP_8Conns 500000 12228 ns/op 4186.82 MB/s
+Benchmark_throughput_Pipe_1Conn 500000 24337 ns/op 2103.72 MB/s
+Benchmark_throughput_Pipe_2Conns 500000 28723 ns/op 1782.52 MB/s
+Benchmark_throughput_Pipe_4Conns 500000 28823 ns/op 1776.32 MB/s
+Benchmark_throughput_Pipe_8Conns 500000 27081 ns/op 1890.57 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_1Flow 200000 31567 ns/op 1621.93 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_2Flow 200000 31626 ns/op 1618.90 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_8Flow 200000 36366 ns/op 1407.88 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_2Flow 200000 32417 ns/op 1579.41 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_8Flow 200000 35595 ns/op 1438.37 MB/s
+Benchmark_throughput_Flow_2VIF_4VC_8Flow 200000 38216 ns/op 1339.73 MB/s
+Benchmark_throughput_TLS_1Conn 20000 426727 ns/op 119.98 MB/s
+Benchmark_throughput_TLS_2Conns 20000 419540 ns/op 122.04 MB/s
+Benchmark_throughput_TLS_4Conns 20000 428137 ns/op 119.59 MB/s
+Benchmark_throughput_TLS_8Conns 20000 426041 ns/op 120.18 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_1FlowTLS 20000 470284 ns/op 108.87 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_2FlowTLS 20000 473181 ns/op 108.20 MB/s
+Benchmark_throughput_Flow_1VIF_1VC_8FlowTLS 20000 482533 ns/op 106.11 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_2FlowTLS 20000 472181 ns/op 108.43 MB/s
+Benchmark_throughput_Flow_1VIF_2VC_8FlowTLS 20000 480154 ns/op 106.63 MB/s
+Benchmark_throughput_Flow_2VIF_4VC_8FlowTLS 20000 481803 ns/op 106.27 MB/s
-Benchmark_dial_VIF 1000000 9496 ns/op
-Histogram (unit: us)
-Count: 1000000 Min: 3 Max: 5379 Avg: 8.83
+Benchmark_dial_VIF 500000 15965 ns/op
+Histogram (unit: µs)
+Count: 500000 Min: 4 Max: 19523 Avg: 15.31
------------------------------------------------------------
-[ 3, 4) 416740 41.7% 41.7% ####
-[ 4, 5) 436828 43.7% 85.4% ####
-[ 5, 8) 107624 10.8% 96.1% #
-[ 8, 13) 19403 1.9% 98.1%
-[ 13, 22) 12430 1.2% 99.3%
-[ 22, 39) 3333 0.3% 99.6%
-[ 39, 70) 914 0.1% 99.7%
-[ 70, 125) 329 0.0% 99.8%
-[ 125, 222) 189 0.0% 99.8%
-[ 222, 395) 101 0.0% 99.8%
-[ 395, 701) 45 0.0% 99.8%
-[ 701, 1245) 259 0.0% 99.8%
-[ 1245, 2209) 820 0.1% 99.9%
-[ 2209, 3919) 873 0.1% 100.0%
-[ 3919, 6951) 112 0.0% 100.0%
-[ 6951, 12326) 0 0.0% 100.0%
-[12326, inf) 0 0.0% 100.0%
+[ 4, 5) 9404 1.9% 1.9%
+[ 5, 6) 320133 64.0% 65.9% ######
+[ 6, 9) 157038 31.4% 97.3% ###
+[ 9, 16) 8766 1.8% 99.1%
+[ 16, 29) 3348 0.7% 99.7%
+[ 29, 55) 134 0.0% 99.8%
+[ 55, 107) 50 0.0% 99.8%
+[ 107, 207) 7 0.0% 99.8%
+[ 207, 401) 0 0.0% 99.8%
+[ 401, 776) 1 0.0% 99.8%
+[ 776, 1500) 120 0.0% 99.8%
+[ 1500, 2900) 138 0.0% 99.8%
+[ 2900, 5606) 681 0.1% 100.0%
+[ 5606, 10834) 167 0.0% 100.0%
+[10834, 20936) 13 0.0% 100.0%
+[20936, 40454) 0 0.0% 100.0%
+[40454, inf) 0 0.0% 100.0%
-Benchmark_dial_VIF_TLS 1000 11790447 ns/op
+Benchmark_dial_VIF_TLS 500 12015788 ns/op
Histogram (unit: ms)
-Count: 1000 Min: 11 Max: 13 Avg: 11.24
+Count: 500 Min: 11 Max: 13 Avg: 11.34
------------------------------------------------------------
-[ 11, 12) 768 76.8% 76.8% ########
-[ 12, 13) 225 22.5% 99.3% ##
-[ 13, 14) 7 0.7% 100.0%
-[ 14, 15) 0 0.0% 100.0%
-[ 15, 16) 0 0.0% 100.0%
-[ 16, 17) 0 0.0% 100.0%
-[ 17, 18) 0 0.0% 100.0%
-[ 18, 19) 0 0.0% 100.0%
-[ 19, 20) 0 0.0% 100.0%
-[ 20, 21) 0 0.0% 100.0%
-[ 21, 22) 0 0.0% 100.0%
-[ 22, 23) 0 0.0% 100.0%
-[ 23, 24) 0 0.0% 100.0%
-[ 24, 25) 0 0.0% 100.0%
-[ 25, 26) 0 0.0% 100.0%
-[ 26, 27) 0 0.0% 100.0%
-[ 27, inf) 0 0.0% 100.0%
+[ 11, 12) 350 70.0% 70.0% #######
+[ 12, 13) 132 26.4% 96.4% ###
+[ 13, 14) 18 3.6% 100.0%
+[ 14, 15) 0 0.0% 100.0%
+[ 15, 16) 0 0.0% 100.0%
+[ 16, 17) 0 0.0% 100.0%
+[ 17, 18) 0 0.0% 100.0%
+[ 18, 19) 0 0.0% 100.0%
+[ 19, 20) 0 0.0% 100.0%
+[ 20, 21) 0 0.0% 100.0%
+[ 21, 22) 0 0.0% 100.0%
+[ 22, 23) 0 0.0% 100.0%
+[ 23, 24) 0 0.0% 100.0%
+[ 24, 25) 0 0.0% 100.0%
+[ 25, 26) 0 0.0% 100.0%
+[ 26, 27) 0 0.0% 100.0%
+[ 27, inf) 0 0.0% 100.0%
-Benchmark_dial_VC_TLS 500 15595236 ns/op
+Benchmark_dial_VC_TLS 500 15909783 ns/op
Histogram (unit: ms)
-Count: 500 Min: 15 Max: 20 Avg: 15.30
+Count: 500 Min: 15 Max: 20 Avg: 15.41
------------------------------------------------------------
-[ 15, 16) 389 77.8% 77.8% ########
-[ 16, 17) 74 14.8% 92.6% #
-[ 17, 18) 35 7.0% 99.6% #
-[ 18, 19) 1 0.2% 99.8%
+[ 15, 16) 356 71.2% 71.2% #######
+[ 16, 17) 92 18.4% 89.6% ##
+[ 17, 18) 47 9.4% 99.0% #
+[ 18, 19) 4 0.8% 99.8%
[ 19, 20) 0 0.0% 99.8%
[ 20, 21) 1 0.2% 100.0%
[ 21, 22) 0 0.0% 100.0%
diff --git a/security/agent/pingpong/wire.vdl b/security/agent/pingpong/wire.vdl
index 0fc2ed4..79a9a81 100644
--- a/security/agent/pingpong/wire.vdl
+++ b/security/agent/pingpong/wire.vdl
@@ -2,5 +2,5 @@
// Simple service used in the agent tests.
type PingPong interface {
- Ping(message string) (string, error)
+ Ping(message string) (string | error)
}
diff --git a/security/agent/server/wire.vdl b/security/agent/server/wire.vdl
index ee55e0b..8e4733a 100644
--- a/security/agent/server/wire.vdl
+++ b/security/agent/server/wire.vdl
@@ -30,23 +30,23 @@
)
type Agent interface {
- Bless(key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.WireBlessings, error)
- BlessSelf(name string, caveats []security.Caveat) (security.WireBlessings, error)
- Sign(message []byte) (security.Signature, error)
- MintDischarge(tp any, caveat security.Caveat, additionalCaveats []security.Caveat) (any, error)
- PublicKey() ([]byte, error)
- BlessingsByName(name security.BlessingPattern) ([]security.WireBlessings, error)
- BlessingsInfo(blessings security.WireBlessings) ([]string, error)
+ Bless(key []byte, wit security.WireBlessings, extension string, caveat security.Caveat, additionalCaveats []security.Caveat) (security.WireBlessings | error)
+ BlessSelf(name string, caveats []security.Caveat) (security.WireBlessings | error)
+ Sign(message []byte) (security.Signature | error)
+ MintDischarge(tp any, caveat security.Caveat, additionalCaveats []security.Caveat) (any | error)
+ PublicKey() ([]byte | error)
+ BlessingsByName(name security.BlessingPattern) ([]security.WireBlessings | error)
+ BlessingsInfo(blessings security.WireBlessings) ([]string | error)
AddToRoots(blessing security.WireBlessings) error
- BlessingStoreSet(blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings, error)
- BlessingStoreForPeer(peerBlessings []string) (security.WireBlessings, error)
+ BlessingStoreSet(blessings security.WireBlessings, forPeers security.BlessingPattern) (security.WireBlessings | error)
+ BlessingStoreForPeer(peerBlessings []string) (security.WireBlessings | error)
BlessingStoreSetDefault(blessings security.WireBlessings) error
- BlessingStoreDefault() (security.WireBlessings, error)
- BlessingStorePeerBlessings() (map[security.BlessingPattern]security.WireBlessings, error)
- BlessingStoreDebugString() (string, error)
+ BlessingStoreDefault() (security.WireBlessings | error)
+ BlessingStorePeerBlessings() (map[security.BlessingPattern]security.WireBlessings | error)
+ BlessingStoreDebugString() (string | error)
BlessingRootsAdd(root []byte, pattern security.BlessingPattern) error
BlessingRootsRecognized(root []byte, blessing string) error
- BlessingRootsDebugString() (string, error)
+ BlessingRootsDebugString() (string | error)
}
diff --git a/services/config/lib/config.go b/services/config/lib/config.go
index b6542b4..41669e1 100644
--- a/services/config/lib/config.go
+++ b/services/config/lib/config.go
@@ -17,7 +17,7 @@
"strings"
"sync"
- "veyron.io/veyron/veyron2/verror"
+ verror "veyron.io/veyron/veyron2/verror2"
"veyron.io/veyron/veyron2/vlog"
"github.com/presotto/go-mdns-sd"
@@ -42,6 +42,21 @@
gen int // incremented every config change
}
+const pkgPath = "veyron.io/veyron/veyron/services/config/lib"
+
+// Errors
+var (
+ errCantParse = verror.Register(pkgPath+".errCantParse", verror.NoRetry, "{1:}{2:} can't parse{:_}")
+ errEntryTooLong = verror.Register(pkgPath+".errEntryTooLong", verror.NoRetry, "{1:}{2:} entry {3}:{4} is too long{:_}")
+ errNoFileToRead = verror.Register(pkgPath+".errNoFileToRead", verror.NoRetry, "{1:}{2:} no file to read{:_}")
+ errFileError = verror.Register(pkgPath+".errFileError", verror.NoRetry, "{1:}{2:} file {3}{:_}")
+ errMissingLegalVersion = verror.Register(pkgPath+".errMissingLegalVersion", verror.NoRetry, "{1:}{2:} missing legal version for file{:_}")
+ errMissingConfigVersion = verror.Register(pkgPath+".errMissingConfigVersion", verror.NoRetry, "{1:}{2:} missing config version{:_}")
+ errNoConfig = verror.Register(pkgPath+".errNoConfig", verror.NoRetry, "{1:}{2:} no config{:_}")
+ errConfigHasNoKey = verror.Register(pkgPath+".errConfigHasNoKey", verror.NoRetry, "{1:}{2:} config has no key {3}{:_}")
+ errOfferingConfigError = verror.Register(pkgPath+".errOfferingConfigError", verror.NoRetry, "{1:}{2:} offering config {3}{:_}")
+)
+
// MDNSConfigService creates a new instance of the config service with the given name.
// If file is non blank, the initial config is read from file and any learned configs are
// stored in it. Only instances with a file to backup will offer configs to the net.
@@ -126,12 +141,12 @@
// The reset have to be key<white>*:<white>*value
f := strings.SplitN(l, ":", 2)
if len(f) != 2 {
- return verror.BadArgf("can't parse %s", l)
+ return verror.Make(errCantParse, nil, l)
}
k := strings.TrimSpace(f[0])
v := strings.TrimSpace(f[1])
if len(k)+len(v) > maxDNSStringLength {
- return verror.BadArgf("entry %s:%s is too long", k, v)
+ return verror.Make(errEntryTooLong, nil, k, v)
}
c.pairs[k] = v
if k != "version" {
@@ -144,14 +159,14 @@
func serializeEntry(k, v string) (string, error) {
if len(k)+len(v) > maxDNSStringLength {
- return "", verror.BadArgf("entry %s:%s is too long", k, v)
+ return "", verror.Make(errEntryTooLong, nil, k, v)
}
return k + ":" + v, nil
}
func readFile(file string) (*config, error) {
if len(file) == 0 {
- return nil, verror.NoExistf("no file to read")
+ return nil, verror.Make(errNoFileToRead, nil)
}
// The config has to be small so just read it all in one go.
@@ -162,11 +177,11 @@
c := newConfig()
for _, l := range strings.Split(string(b), "\n") {
if err := c.parseEntry(l); err != nil {
- return nil, verror.BadArgf("file %s: %s", file, err)
+ return nil, verror.Make(errFileError, nil, file, err)
}
}
if _, ok := c.pairs["version"]; !ok {
- return nil, verror.BadArgf("file %s: missing legal version", file)
+ return nil, verror.Make(errMissingLegalVersion, nil, file)
}
return c, nil
}
@@ -200,7 +215,7 @@
}
// Ignore any config with no version.
if _, ok := c.pairs["version"]; !ok {
- return nil, verror.NoExistf("missing config version")
+ return nil, verror.Make(errMissingConfigVersion, nil)
}
return c, nil
}
@@ -310,10 +325,10 @@
cs.rwlock.RLock()
defer cs.rwlock.RUnlock()
if cs.current == nil {
- return "", verror.NoExistf("no config")
+ return "", verror.Make(errNoConfig, nil)
}
if v, ok := cs.current.pairs[key]; !ok {
- return "", verror.NoExistf("config has no key %q", key)
+ return "", verror.Make(errConfigHasNoKey, nil, key)
} else {
return v, nil
}
@@ -331,7 +346,7 @@
cs.rwlock.RLock()
defer cs.rwlock.RUnlock()
if cs.current == nil {
- return nil, verror.NoExistf("no config found")
+ return nil, verror.Make(errNoConfig, nil)
}
// Copy so caller can't change the map under our feet.
reply := make(map[string]string)
@@ -366,7 +381,7 @@
for _, k := range keys {
e, err := serializeEntry(k, cs.current.pairs[k])
if err != nil {
- verror.NoExistf("offering config: %s", cs.file, err)
+ verror.Make(errOfferingConfigError, nil, cs.file, err)
return
}
txt = append(txt, e)
diff --git a/services/identity/blesser/oauth.go b/services/identity/blesser/oauth.go
index c50ed3a..ef9084a 100644
--- a/services/identity/blesser/oauth.go
+++ b/services/identity/blesser/oauth.go
@@ -20,7 +20,7 @@
duration time.Duration
domain string
dischargerLocation string
- revocationManager *revocation.RevocationManager
+ revocationManager revocation.RevocationManager
}
// AccessTokenClient represents a client of the BlessUsingAccessToken RPCs.
@@ -40,7 +40,7 @@
// The object name of the discharger service. If this is empty then revocation caveats will not be granted.
DischargerLocation string
// The revocation manager that generates caveats and manages revocation.
- RevocationManager *revocation.RevocationManager
+ RevocationManager revocation.RevocationManager
// The duration for which blessings will be valid. (Used iff RevocationManager is nil).
BlessingDuration time.Duration
}
diff --git a/services/identity/handlers/handlers_test.go b/services/identity/handlers/handlers_test.go
index 477761d..9723a4f 100644
--- a/services/identity/handlers/handlers_test.go
+++ b/services/identity/handlers/handlers_test.go
@@ -3,7 +3,6 @@
import (
"encoding/base64"
"encoding/json"
- "io/ioutil"
"net/http"
"net/http/httptest"
"reflect"
@@ -13,34 +12,8 @@
"veyron.io/veyron/veyron2/security"
tsecurity "veyron.io/veyron/veyron/lib/testutil/security"
- vsecurity "veyron.io/veyron/veyron/security"
)
-func TestPublicKey(t *testing.T) {
- p, err := vsecurity.NewPrincipal()
- if err != nil {
- t.Fatal(err)
- }
- key := p.PublicKey()
- ts := httptest.NewServer(PublicKey{key})
- defer ts.Close()
- response, err := http.Get(ts.URL)
- if err != nil {
- t.Fatal(err)
- }
- bytes, err := ioutil.ReadAll(response.Body)
- if err != nil {
- t.Fatal(err)
- }
- got, err := security.UnmarshalPublicKey(bytes)
- if err != nil {
- t.Fatal(err)
- }
- if want := key; !reflect.DeepEqual(got, want) {
- t.Errorf("Got %v, want %v", got, want)
- }
-}
-
func TestBlessingRoot(t *testing.T) {
blessingNames := []string{"test-blessing-name-1", "test-blessing-name-2"}
p := tsecurity.NewPrincipal(blessingNames...)
diff --git a/services/identity/handlers/publickey.go b/services/identity/handlers/publickey.go
deleted file mode 100644
index 7ab8c96..0000000
--- a/services/identity/handlers/publickey.go
+++ /dev/null
@@ -1,23 +0,0 @@
-package handlers
-
-import (
- "net/http"
-
- "veyron.io/veyron/veyron/services/identity/util"
- "veyron.io/veyron/veyron2/security"
-)
-
-// PublicKey is an http.Handler implementation that renders a public key in
-// DER format.
-type PublicKey struct{ K security.PublicKey }
-
-func (h PublicKey) ServeHTTP(w http.ResponseWriter, r *http.Request) {
- der, err := h.K.MarshalBinary()
- if err != nil {
- util.HTTPServerError(w, err)
- return
- }
- w.Header().Set("Content-Type", "application/octet-stream")
- w.Header().Set("Content-Disposition", "attachment; filename=publickey.der")
- w.Write(der)
-}
diff --git a/services/identity/identity.vdl b/services/identity/identity.vdl
index ada48b2..0d35fdf 100644
--- a/services/identity/identity.vdl
+++ b/services/identity/identity.vdl
@@ -19,12 +19,12 @@
type OAuthBlesser interface {
// BlessUsingAccessToken uses the provided access token to obtain the email
// address and returns a blessing along with the email address.
- BlessUsingAccessToken(token string) (blessing security.WireBlessings, email string, err error)
+ BlessUsingAccessToken(token string) (blessing security.WireBlessings, email string | error)
}
// MacaroonBlesser returns a blessing given the provided macaroon string.
type MacaroonBlesser interface {
// Bless uses the provided macaroon (which contains email and caveats)
// to return a blessing for the client.
- Bless(macaroon string) (blessing security.WireBlessings, err error)
+ Bless(macaroon string) (blessing security.WireBlessings | error)
}
diff --git a/services/identity/identityd/main.go b/services/identity/identityd/main.go
index 0092a47..c1c9655 100644
--- a/services/identity/identityd/main.go
+++ b/services/identity/identityd/main.go
@@ -2,48 +2,26 @@
package main
import (
- "crypto/rand"
"database/sql"
"flag"
"fmt"
- "html/template"
"io/ioutil"
- "net"
- "net/http"
"os"
"strings"
"time"
_ "github.com/go-sql-driver/mysql"
- "veyron.io/veyron/veyron2"
- "veyron.io/veyron/veyron2/ipc"
- "veyron.io/veyron/veyron2/naming"
- "veyron.io/veyron/veyron2/options"
- "veyron.io/veyron/veyron2/rt"
- "veyron.io/veyron/veyron2/security"
- verror "veyron.io/veyron/veyron2/verror2"
"veyron.io/veyron/veyron2/vlog"
- "veyron.io/veyron/veyron/lib/signals"
- "veyron.io/veyron/veyron/security/audit"
"veyron.io/veyron/veyron/services/identity/auditor"
"veyron.io/veyron/veyron/services/identity/blesser"
- "veyron.io/veyron/veyron/services/identity/googleoauth"
- "veyron.io/veyron/veyron/services/identity/handlers"
+ "veyron.io/veyron/veyron/services/identity/oauth"
"veyron.io/veyron/veyron/services/identity/revocation"
- services "veyron.io/veyron/veyron/services/security"
- "veyron.io/veyron/veyron/services/security/discharger"
-
- "veyron.io/veyron/veyron/profiles/static"
+ "veyron.io/veyron/veyron/services/identity/server"
)
var (
- // Flags controlling the HTTP server
- httpaddr = flag.String("httpaddr", "localhost:8125", "Address on which the HTTP server listens on.")
- tlsconfig = flag.String("tlsconfig", "", "Comma-separated list of TLS certificate and private key files. This must be provided.")
- host = flag.String("host", defaultHost(), "Hostname the HTTP server listens on. This can be the name of the host running the webserver, but if running behind a NAT or load balancer, this should be the host name that clients will connect to. For example, if set to 'x.com', Veyron identities will have the IssuerName set to 'x.com' and clients can expect to find the public key of the signer at 'x.com/pubkey'.")
-
// Flag controlling auditing and revocation of Blessing operations.
sqlConfig = flag.String("sqlconfig", "", "Path to file containing go-sql-driver connection string of the following form: [username[:password]@][protocol[(address)]]/dbname")
@@ -54,12 +32,6 @@
googleDomain = flag.String("google_domain", "", "An optional domain name. When set, only email addresses from this domain are allowed to authenticate via Google OAuth")
)
-const (
- googleService = "google"
- macaroonService = "macaroon"
- dischargerService = "discharger"
-)
-
func main() {
flag.Usage = usage
flag.Parse()
@@ -77,203 +49,22 @@
}
}
- p, blessingLogReader := providerPrincipal(sqlDB)
- runtime, err := rt.New(options.RuntimePrincipal{p})
+ googleoauth, err := oauth.NewGoogleOAuth(*googleConfigWeb)
if err != nil {
- vlog.Fatal(err)
- }
- defer runtime.Cleanup()
-
- var revocationManager *revocation.RevocationManager
- // Only set revocationManager sqlConfig (and thus sqlDB) is set.
- if sqlDB != nil {
- revocationManager, err = revocation.NewRevocationManager(sqlDB)
- if err != nil {
- vlog.Fatalf("Failed to start RevocationManager: %v", err)
- }
+ vlog.Fatalf("Failed to setup GoogleOAuth: %v", err)
}
- // Setup handlers
- // TODO(nlacasse,ataly,suharshs): Remove the 'pubkey' route if it's no longer needed.
- http.Handle("/pubkey", handlers.PublicKey{runtime.Principal().PublicKey()}) // public key of this server
- http.Handle("/blessing-root", handlers.BlessingRoot{runtime.Principal()}) // json-encoded public key and blessing names of this server
- macaroonKey := make([]byte, 32)
- if _, err := rand.Read(macaroonKey); err != nil {
- vlog.Fatalf("macaroonKey generation failed: %v", err)
- }
- // Google OAuth
- ipcServer, published, err := setupServices(runtime, revocationManager, macaroonKey)
+ auditor, reader, err := auditor.NewSQLBlessingAuditor(sqlDB)
if err != nil {
- vlog.Fatalf("Failed to setup veyron services for blessing: %v", err)
+ vlog.Fatalf("Failed to create sql auditor from config: %v", err)
}
- defer ipcServer.Stop()
- if clientID, clientSecret, ok := getOAuthClientIDAndSecret(*googleConfigWeb); ok {
- n := "/google/"
- h, err := googleoauth.NewHandler(googleoauth.HandlerArgs{
- R: runtime,
- MacaroonKey: macaroonKey,
- Addr: fmt.Sprintf("%s%s", httpaddress(), n),
- ClientID: clientID,
- ClientSecret: clientSecret,
- BlessingLogReader: blessingLogReader,
- RevocationManager: revocationManager,
- DischargerLocation: naming.JoinAddressName(published[0], dischargerService),
- MacaroonBlessingService: naming.JoinAddressName(published[0], macaroonService),
- })
- if err != nil {
- vlog.Fatalf("Failed to create HTTP handler for google-based authentication: %v", err)
- }
- http.Handle(n, h)
- }
- http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
- args := struct {
- Self security.Blessings
- RandomWeb bool
- GoogleServers, DischargeServers []string
- ListBlessingsRoute string
- }{
- Self: runtime.Principal().BlessingStore().Default(),
- RandomWeb: enableRandomHandler(),
- }
- if revocationManager != nil {
- args.DischargeServers = appendSuffixTo(published, dischargerService)
- }
- if len(*googleConfigChrome) > 0 || len(*googleConfigAndroid) > 0 {
- args.GoogleServers = appendSuffixTo(published, googleService)
- }
- if sqlDB != nil && len(*googleConfigWeb) > 0 {
- args.ListBlessingsRoute = googleoauth.ListBlessingsRoute
- }
- if err := tmpl.Execute(w, args); err != nil {
- vlog.Info("Failed to render template:", err)
- }
- })
- vlog.Infof("Running HTTP server at: %v", httpaddress())
- go runHTTPSServer(*httpaddr)
- <-signals.ShutdownOnSignals(runtime)
-}
-func appendSuffixTo(objectname []string, suffix string) []string {
- names := make([]string, len(objectname))
- for i, o := range objectname {
- names[i] = naming.JoinAddressName(o, suffix)
- }
- return names
-}
-
-// newDispatcher returns a dispatcher for both the blessing and the
-// discharging service.
-func newDispatcher(googleParams blesser.GoogleParams, macaroonKey []byte) ipc.Dispatcher {
- d := dispatcher(map[string]interface{}{
- macaroonService: blesser.NewMacaroonBlesserServer(macaroonKey),
- dischargerService: services.DischargerServer(discharger.NewDischarger()),
- })
- if len(*googleConfigChrome) > 0 || len(*googleConfigAndroid) > 0 {
- d[googleService] = blesser.NewGoogleOAuthBlesserServer(googleParams)
- }
- return d
-}
-
-type allowEveryoneAuthorizer struct{}
-
-func (allowEveryoneAuthorizer) Authorize(security.Context) error { return nil }
-
-type dispatcher map[string]interface{}
-
-func (d dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
- if invoker := d[suffix]; invoker != nil {
- return invoker, allowEveryoneAuthorizer{}, nil
- }
- return nil, nil, verror.Make(verror.NoExist, nil, suffix)
-}
-
-// Starts the blessing services and the discharging service on the same port.
-func setupServices(r veyron2.Runtime, revocationManager *revocation.RevocationManager, macaroonKey []byte) (ipc.Server, []string, error) {
- googleParams := blesser.GoogleParams{
- // TODO(ashankar,nlacasse): Figure out how to have web-appications use the "caveats" form and
- // always select an expiry instead of forcing a ridiculously large value here.
- BlessingDuration: 365 * 24 * time.Hour,
- DomainRestriction: *googleDomain,
- RevocationManager: revocationManager,
- }
- if clientID, ok := getOAuthClientID(*googleConfigChrome); ok {
- googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "chrome", ClientID: clientID})
- }
- if clientID, ok := getOAuthClientID(*googleConfigAndroid); ok {
- googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "android", ClientID: clientID})
- }
- server, err := r.NewServer()
+ revocationManager, err := revocation.NewRevocationManager(sqlDB)
if err != nil {
- return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
+ vlog.Fatalf("Failed to start RevocationManager: %v", err)
}
- eps, err := server.Listen(static.ListenSpec)
- if err != nil {
- return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
- }
- ep := eps[0]
- googleParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
- dispatcher := newDispatcher(googleParams, macaroonKey)
- objectname := naming.Join("identity", fmt.Sprintf("%v", r.Principal().BlessingStore().Default()))
- if err := server.ServeDispatcher(objectname, dispatcher); err != nil {
- return nil, nil, fmt.Errorf("failed to start Veyron services: %v", err)
- }
- vlog.Infof("Google blessing and discharger services enabled at %v", naming.JoinAddressName(ep.String(), objectname))
- published, _ := server.Published()
- if len(published) == 0 {
- // No addresses published, publish the endpoint instead (which may not be usable everywhere, but oh-well).
- published = append(published, ep.String())
- }
- return server, published, nil
-}
-
-func enableRandomHandler() bool {
- return len(*googleConfigWeb)+len(*googleConfigChrome)+len(*googleConfigAndroid) == 0
-}
-func getOAuthClientID(config string) (clientID string, ok bool) {
- fname := config
- if len(fname) == 0 {
- return "", false
- }
- f, err := os.Open(fname)
- if err != nil {
- vlog.Fatalf("Failed to open %q: %v", fname, err)
- }
- defer f.Close()
- clientID, err = googleoauth.ClientIDFromJSON(f)
- if err != nil {
- vlog.Fatalf("Failed to decode JSON in %q: %v", fname, err)
- }
- return clientID, true
-}
-func getOAuthClientIDAndSecret(config string) (clientID, clientSecret string, ok bool) {
- fname := config
- if len(fname) == 0 {
- return "", "", false
- }
- f, err := os.Open(fname)
- if err != nil {
- vlog.Fatalf("Failed to open %q: %v", fname, err)
- }
- defer f.Close()
- clientID, clientSecret, err = googleoauth.ClientIDAndSecretFromJSON(f)
- if err != nil {
- vlog.Fatalf("Failed to decode JSON in %q: %v", fname, err)
- }
- return clientID, clientSecret, true
-}
-func runHTTPSServer(addr string) {
- if len(*tlsconfig) == 0 {
- vlog.Fatal("Please set the --tlsconfig flag")
- }
- paths := strings.Split(*tlsconfig, ",")
- if len(paths) != 2 {
- vlog.Fatalf("Could not parse --tlsconfig. Must have exactly two components, separated by a comma")
- }
- vlog.Infof("Starting HTTP server with TLS using certificate [%s] and private key [%s] at https://%s", paths[0], paths[1], addr)
- if err := http.ListenAndServeTLS(addr, paths[0], paths[1], nil); err != nil {
- vlog.Fatalf("http.ListenAndServeTLS failed: %v", err)
- }
+ server.NewIdentityServer(googleoauth, auditor, reader, revocationManager, oauthBlesserGoogleParams(revocationManager)).Serve()
}
func usage() {
@@ -294,32 +85,23 @@
flag.PrintDefaults()
}
-func defaultHost() string {
- host, err := os.Hostname()
- if err != nil {
- vlog.Fatalf("Failed to get hostname: %v", err)
+func oauthBlesserGoogleParams(revocationManager revocation.RevocationManager) blesser.GoogleParams {
+ googleParams := blesser.GoogleParams{
+ BlessingDuration: 365 * 24 * time.Hour,
+ DomainRestriction: *googleDomain,
+ RevocationManager: revocationManager,
}
- return host
-}
-
-// providerPrincipal returns the Principal to use for the identity provider (i.e., this program) and
-// the database where audits will be store. If no database exists nil will be returned.
-func providerPrincipal(sqlDB *sql.DB) (security.Principal, auditor.BlessingLogReader) {
- // TODO(ashankar): Somewhat silly to have to create a runtime, but oh-well.
- r, err := rt.New()
- if err != nil {
- vlog.Fatal(err)
+ if clientID, err := getOAuthClientID(*googleConfigChrome); err != nil {
+ vlog.Info(err)
+ } else {
+ googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "chrome", ClientID: clientID})
}
- defer r.Cleanup()
- p := r.Principal()
- if sqlDB == nil {
- return p, nil
+ if clientID, err := getOAuthClientID(*googleConfigAndroid); err != nil {
+ vlog.Info(err)
+ } else {
+ googleParams.AccessTokenClients = append(googleParams.AccessTokenClients, blesser.AccessTokenClient{Name: "android", ClientID: clientID})
}
- auditor, reader, err := auditor.NewSQLBlessingAuditor(sqlDB)
- if err != nil {
- vlog.Fatalf("Failed to create sql auditor from config: %v", err)
- }
- return audit.NewPrincipal(p, auditor), reader
+ return googleParams
}
func dbFromConfigDatabase(database string) (*sql.DB, error) {
@@ -333,47 +115,15 @@
return db, nil
}
-func httpaddress() string {
- _, port, err := net.SplitHostPort(*httpaddr)
+func getOAuthClientID(configFile string) (clientID string, err error) {
+ f, err := os.Open(configFile)
if err != nil {
- vlog.Fatalf("Failed to parse %q: %v", *httpaddr, err)
+ return "", fmt.Errorf("failed to open %q: %v", configFile, err)
}
- return fmt.Sprintf("https://%s:%v", *host, port)
+ defer f.Close()
+ clientID, err = oauth.ClientIDFromJSON(f)
+ if err != nil {
+ return "", fmt.Errorf("failed to decode JSON in %q: %v", configFile, err)
+ }
+ return clientID, nil
}
-
-var tmpl = template.Must(template.New("main").Parse(`<!doctype html>
-<html>
-<head>
-<meta charset="UTF-8">
-<title>Veyron Identity Server</title>
-<meta name="viewport" content="width=device-width, initial-scale=1.0">
-<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
-</head>
-<body>
-<div class="container">
-<div class="page-header"><h2>{{.Self}}</h2><h4>A Veyron Blessing Provider</h4></div>
-<div class="well">
-This is a Veyron identity provider that provides blessings with the name prefix <mark>{{.Self}}</mark>.
-<br/>
-The public key of this provider is {{.Self.PublicKey}}, which is available in <a class="btn btn-xs btn-primary" href="/pubkey">DER</a> encoded
-<a href="http://en.wikipedia.org/wiki/X.690#DER_encoding">format</a>.
-</div>
-
-<div class="well">
-<ul>
-{{if .GoogleServers}}
-<li>Blessings (using Google OAuth to fetch an email address) are provided via Veyron RPCs to: <tt>{{range .GoogleServers}}{{.}}{{end}}</tt></li>
-{{end}}
-{{if .DischargeServers}}
-<li>RevocationCaveat Discharges are provided via Veyron RPCs to: <tt>{{range .DischargeServers}}{{.}}{{end}}</tt></li>
-{{end}}
-{{if .ListBlessingsRoute}}
-<li>You can <a class="btn btn-xs btn-primary" href="/google/{{.ListBlessingsRoute}}">enumerate</a> blessings provided with your
-email address.</li>
-{{end}}
-</ul>
-</div>
-
-</div>
-</body>
-</html>`))
diff --git a/services/identity/oauth/googleoauth.go b/services/identity/oauth/googleoauth.go
new file mode 100644
index 0000000..17d6b72
--- /dev/null
+++ b/services/identity/oauth/googleoauth.go
@@ -0,0 +1,131 @@
+package oauth
+
+import (
+ "code.google.com/p/goauth2/oauth"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+)
+
+// googleOAuth implements the OAuthProvider interface with google oauth 2.0.
+type googleOAuth struct {
+ // client_id and client_secret registered with the Google Developer
+ // Console for API access.
+ clientID, clientSecret string
+
+ scope, authURL, tokenURL string
+
+ // URL used to verify google tokens.
+ // (From https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+ // and https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken)
+ verifyURL string
+}
+
+func NewGoogleOAuth(configFile string) (OAuthProvider, error) {
+ clientID, clientSecret, err := getOAuthClientIDAndSecret(configFile)
+ if err != nil {
+ return nil, err
+ }
+ return &googleOAuth{
+ clientID: clientID,
+ clientSecret: clientSecret,
+ scope: "email",
+ authURL: "https://accounts.google.com/o/oauth2/auth",
+ tokenURL: "https://accounts.google.com/o/oauth2/token",
+ verifyURL: "https://www.googleapis.com/oauth2/v1/tokeninfo?",
+ }, nil
+}
+
+func (g *googleOAuth) AuthURL(redirectUrl, state string) string {
+ return g.oauthConfig(redirectUrl).AuthCodeURL(state)
+}
+
+// ExchangeAuthCodeForEmail exchanges the authorization code (which must
+// have been obtained with scope=email) for an OAuth token and then uses Google's
+// tokeninfo API to extract the email address from that token.
+func (g *googleOAuth) ExchangeAuthCodeForEmail(authcode string, url string) (string, error) {
+ config := g.oauthConfig(url)
+ t, err := (&oauth.Transport{Config: config}).Exchange(authcode)
+ if err != nil {
+ return "", fmt.Errorf("failed to exchange authorization code for token: %v", err)
+ }
+ // Ideally, would validate the token ourselves without an HTTP roundtrip.
+ // However, for now, as per:
+ // https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+ // pay an HTTP round-trip to have Google do this.
+ if t.Extra == nil || len(t.Extra["id_token"]) == 0 {
+ return "", fmt.Errorf("no GoogleIDToken found in OAuth token")
+ }
+ // The GoogleIDToken is currently validated by sending an HTTP request to
+ // googleapis.com. This adds a round-trip and service may be denied by
+ // googleapis.com if this handler becomes a breakout success and receives tons
+ // of traffic. If either is a concern, the GoogleIDToken can be validated
+ // without an additional HTTP request.
+ // See: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+ tinfo, err := http.Get(g.verifyURL + "id_token=" + t.Extra["id_token"])
+ if err != nil {
+ return "", fmt.Errorf("failed to talk to GoogleIDToken verifier (%q): %v", g.verifyURL, err)
+ }
+ if tinfo.StatusCode != http.StatusOK {
+ return "", fmt.Errorf("failed to verify GoogleIDToken: %s", tinfo.Status)
+ }
+ var gtoken token
+ if err := json.NewDecoder(tinfo.Body).Decode(>oken); err != nil {
+ return "", fmt.Errorf("invalid JSON response from Google's tokeninfo API: %v", err)
+ }
+ if !gtoken.VerifiedEmail {
+ return "", fmt.Errorf("email not verified: %#v", gtoken)
+ }
+ if gtoken.Issuer != "accounts.google.com" {
+ return "", fmt.Errorf("invalid issuer: %v", gtoken.Issuer)
+ }
+ if gtoken.Audience != config.ClientId {
+ return "", fmt.Errorf("unexpected audience(%v) in GoogleIDToken", gtoken.Audience)
+ }
+ return gtoken.Email, nil
+}
+
+func (g *googleOAuth) oauthConfig(redirectUrl string) *oauth.Config {
+ return &oauth.Config{
+ ClientId: g.clientID,
+ ClientSecret: g.clientSecret,
+ RedirectURL: redirectUrl,
+ Scope: g.scope,
+ AuthURL: g.authURL,
+ TokenURL: g.tokenURL,
+ }
+}
+
+func getOAuthClientIDAndSecret(configFile string) (clientID, clientSecret string, err error) {
+ f, err := os.Open(configFile)
+ if err != nil {
+ return "", "", fmt.Errorf("failed to open %q: %v", configFile, err)
+ }
+ defer f.Close()
+ clientID, clientSecret, err = ClientIDAndSecretFromJSON(f)
+ if err != nil {
+ return "", "", fmt.Errorf("failed to decode JSON in %q: %v", configFile, err)
+ }
+ return clientID, clientSecret, nil
+}
+
+// IDToken JSON message returned by Google's verification endpoint.
+//
+// This differs from the description in:
+// https://developers.google.com/accounts/docs/OAuth2Login#obtainuserinfo
+// because the Google tokeninfo endpoint
+// (https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=XYZ123)
+// mentioned in:
+// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
+// seems to return the following JSON message.
+type token struct {
+ Issuer string `json:"issuer"`
+ IssuedTo string `json:"issued_to"`
+ Audience string `json:"audience"`
+ UserID string `json:"user_id"`
+ ExpiresIn int64 `json:"expires_in"`
+ IssuedAt int64 `json:"issued_at"`
+ Email string `json:"email"`
+ VerifiedEmail bool `json:"verified_email"`
+}
diff --git a/services/identity/googleoauth/handler.go b/services/identity/oauth/handler.go
similarity index 75%
rename from services/identity/googleoauth/handler.go
rename to services/identity/oauth/handler.go
index 9f40f0e..b85e16d 100644
--- a/services/identity/googleoauth/handler.go
+++ b/services/identity/oauth/handler.go
@@ -1,7 +1,7 @@
-// Package googleoauth implements an http.Handler that has two main purposes
+// Package oauth implements an http.Handler that has two main purposes
// listed below:
//
-// (1) Uses OAuth 2.0 to authenticate with Google and then renders a page that
+// (1) Uses OAuth to authenticate and then renders a page that
// displays all the blessings that were provided for that Google user.
// The client calls the /listblessings route which redirects to listblessingscallback which
// renders the list.
@@ -9,20 +9,14 @@
// located at veyron/tools/principal.
// The seek blessing flow works as follows:
// (a) Client (principal tool) hits the /seekblessings route.
-// (b) /seekblessings performs google oauth with a redirect to /seekblessingscallback.
+// (b) /seekblessings performs oauth with a redirect to /seekblessingscallback.
// (c) Client specifies desired caveats in the form that /seekblessingscallback displays.
// (d) Submission of the form sends caveat information to /sendmacaroon.
// (e) /sendmacaroon sends a macaroon with blessing information to client
// (via a redirect to an HTTP server run by the tool).
// (f) Client invokes bless rpc with macaroon.
-//
-// The GoogleIDToken is currently validated by sending an HTTP request to
-// googleapis.com. This adds a round-trip and service may be denied by
-// googleapis.com if this handler becomes a breakout success and receives tons
-// of traffic. If either is a concern, the GoogleIDToken can be validated
-// without an additional HTTP request.
-// See: https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-package googleoauth
+
+package oauth
import (
"bytes"
@@ -37,8 +31,6 @@
"strings"
"time"
- "code.google.com/p/goauth2/oauth"
-
"veyron.io/veyron/veyron/services/identity/auditor"
"veyron.io/veyron/veyron/services/identity/blesser"
"veyron.io/veyron/veyron/services/identity/revocation"
@@ -68,18 +60,13 @@
MacaroonKey []byte
// URL at which the hander is installed.
// e.g. http://host:port/google/
- // This is where the handler is installed and where redirect requests
- // from Google will come to.
Addr string
- // client_id and client_secret registered with the Google Developer
- // Console for API access.
- ClientID, ClientSecret string
// BlessingLogReder is needed for reading audit logs.
BlessingLogReader auditor.BlessingLogReader
// The RevocationManager is used to revoke blessings granted with a revocation caveat.
// If nil, then revocation caveats cannot be added to blessings and an expiration caveat
// will be used instead.
- RevocationManager *revocation.RevocationManager
+ RevocationManager revocation.RevocationManager
// The object name of the discharger service.
DischargerLocation string
// MacaroonBlessingService is the object name to which macaroons create by this HTTP
@@ -87,17 +74,8 @@
MacaroonBlessingService string
// If non-empty, only email addressses from this domain will be blessed.
DomainRestriction string
-}
-
-func (a *HandlerArgs) oauthConfig(redirectSuffix string) *oauth.Config {
- return &oauth.Config{
- ClientId: a.ClientID,
- ClientSecret: a.ClientSecret,
- RedirectURL: redirectURL(a.Addr, redirectSuffix),
- Scope: "email",
- AuthURL: "https://accounts.google.com/o/oauth2/auth",
- TokenURL: "https://accounts.google.com/o/oauth2/token",
- }
+ // OAuthProvider is used to authenticate and get a blessee email.
+ OAuthProvider OAuthProvider
}
func redirectURL(baseURL, suffix string) string {
@@ -107,14 +85,9 @@
return baseURL + suffix
}
-// URL used to verify google tokens.
-// (From https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-// and https://developers.google.com/accounts/docs/OAuth2UserAgent#validatetoken)
-const verifyURL = "https://www.googleapis.com/oauth2/v1/tokeninfo?"
-
// NewHandler returns an http.Handler that expects to be rooted at args.Addr
-// and can be used to use OAuth 2.0 to authenticate with Google, mint a new
-// identity and bless it with the Google email address.
+// and can be used to authenticate with args.OAuthProvider, mint a new
+// identity and bless it with the OAuthProvider email address.
func NewHandler(args HandlerArgs) (http.Handler, error) {
csrfCop, err := util.NewCSRFCop()
if err != nil {
@@ -157,7 +130,7 @@
util.HTTPServerError(w, fmt.Errorf("failed to create new token: %v", err))
return
}
- http.Redirect(w, r, h.args.oauthConfig(listBlessingsCallbackRoute).AuthCodeURL(csrf), http.StatusFound)
+ http.Redirect(w, r, h.args.OAuthProvider.AuthURL(redirectURL(h.args.Addr, listBlessingsCallbackRoute), csrf), http.StatusFound)
}
func (h *handler) listBlessingsCallback(w http.ResponseWriter, r *http.Request) {
@@ -166,7 +139,7 @@
util.HTTPBadRequest(w, r, fmt.Errorf("Suspected request forgery: %v", err))
return
}
- email, err := exchangeAuthCodeForEmail(h.args.oauthConfig(listBlessingsCallbackRoute), r.FormValue("code"))
+ email, err := h.args.OAuthProvider.ExchangeAuthCodeForEmail(r.FormValue("code"), redirectURL(h.args.Addr, listBlessingsCallbackRoute))
if err != nil {
util.HTTPBadRequest(w, r, err)
return
@@ -320,7 +293,7 @@
util.HTTPServerError(w, fmt.Errorf("failed to create new token: %v", err))
return
}
- http.Redirect(w, r, h.args.oauthConfig(addCaveatsRoute).AuthCodeURL(outputMacaroon), http.StatusFound)
+ http.Redirect(w, r, h.args.OAuthProvider.AuthURL(redirectURL(h.args.Addr, addCaveatsRoute), outputMacaroon), http.StatusFound)
}
type addCaveatsMacaroon struct {
@@ -335,7 +308,7 @@
util.HTTPBadRequest(w, r, fmt.Errorf("Suspected request forgery: %v", err))
return
}
- email, err := exchangeAuthCodeForEmail(h.args.oauthConfig(addCaveatsRoute), r.FormValue("code"))
+ email, err := h.args.OAuthProvider.ExchangeAuthCodeForEmail(r.FormValue("code"), redirectURL(h.args.Addr, addCaveatsRoute))
if err != nil {
util.HTTPBadRequest(w, r, err)
return
@@ -481,61 +454,3 @@
}
return security.MethodCaveat(methods[0], methods[1:]...)
}
-
-// exchangeAuthCodeForEmail exchanges the authorization code (which must
-// have been obtained with scope=email) for an OAuth token and then uses Google's
-// tokeninfo API to extract the email address from that token.
-func exchangeAuthCodeForEmail(config *oauth.Config, authcode string) (string, error) {
- t, err := (&oauth.Transport{Config: config}).Exchange(authcode)
- if err != nil {
- return "", fmt.Errorf("failed to exchange authorization code for token: %v", err)
- }
- // Ideally, would validate the token ourselves without an HTTP roundtrip.
- // However, for now, as per:
- // https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
- // pay an HTTP round-trip to have Google do this.
- if t.Extra == nil || len(t.Extra["id_token"]) == 0 {
- return "", fmt.Errorf("no GoogleIDToken found in OAuth token")
- }
- tinfo, err := http.Get(verifyURL + "id_token=" + t.Extra["id_token"])
- if err != nil {
- return "", fmt.Errorf("failed to talk to GoogleIDToken verifier (%q): %v", verifyURL, err)
- }
- if tinfo.StatusCode != http.StatusOK {
- return "", fmt.Errorf("failed to verify GoogleIDToken: %s", tinfo.Status)
- }
- var gtoken token
- if err := json.NewDecoder(tinfo.Body).Decode(>oken); err != nil {
- return "", fmt.Errorf("invalid JSON response from Google's tokeninfo API: %v", err)
- }
- if !gtoken.VerifiedEmail {
- return "", fmt.Errorf("email not verified: %#v", gtoken)
- }
- if gtoken.Issuer != "accounts.google.com" {
- return "", fmt.Errorf("invalid issuer: %v", gtoken.Issuer)
- }
- if gtoken.Audience != config.ClientId {
- return "", fmt.Errorf("unexpected audience(%v) in GoogleIDToken", gtoken.Audience)
- }
- return gtoken.Email, nil
-}
-
-// IDToken JSON message returned by Google's verification endpoint.
-//
-// This differs from the description in:
-// https://developers.google.com/accounts/docs/OAuth2Login#obtainuserinfo
-// because the Google tokeninfo endpoint
-// (https://www.googleapis.com/oauth2/v1/tokeninfo?id_token=XYZ123)
-// mentioned in:
-// https://developers.google.com/accounts/docs/OAuth2Login#validatinganidtoken
-// seems to return the following JSON message.
-type token struct {
- Issuer string `json:"issuer"`
- IssuedTo string `json:"issued_to"`
- Audience string `json:"audience"`
- UserID string `json:"user_id"`
- ExpiresIn int64 `json:"expires_in"`
- IssuedAt int64 `json:"issued_at"`
- Email string `json:"email"`
- VerifiedEmail bool `json:"verified_email"`
-}
diff --git a/services/identity/oauth/oauth_provider.go b/services/identity/oauth/oauth_provider.go
new file mode 100644
index 0000000..be0e36f
--- /dev/null
+++ b/services/identity/oauth/oauth_provider.go
@@ -0,0 +1,11 @@
+package oauth
+
+// OAuthProvider authenticates users to the identity server via the OAuth2 Web Server flow.
+type OAuthProvider interface {
+ // AuthURL is the URL the user must visit in order to authenticate with the OAuthProvider.
+ // After authentication, the user will be re-directed to redirectURL with the provided state.
+ AuthURL(redirectUrl string, state string) (url string)
+ // ExchangeAuthCodeForEmail exchanges the provided authCode for the email of an
+ // authenticated user.
+ ExchangeAuthCodeForEmail(authCode string, url string) (email string, err error)
+}
diff --git a/services/identity/googleoauth/template.go b/services/identity/oauth/template.go
similarity index 99%
rename from services/identity/googleoauth/template.go
rename to services/identity/oauth/template.go
index a3dc4ee..698635a 100644
--- a/services/identity/googleoauth/template.go
+++ b/services/identity/oauth/template.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
import "html/template"
diff --git a/services/identity/googleoauth/utils.go b/services/identity/oauth/utils.go
similarity index 98%
rename from services/identity/googleoauth/utils.go
rename to services/identity/oauth/utils.go
index 6f5230a..0c99fbf 100644
--- a/services/identity/googleoauth/utils.go
+++ b/services/identity/oauth/utils.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
import (
"encoding/json"
diff --git a/services/identity/googleoauth/utils_test.go b/services/identity/oauth/utils_test.go
similarity index 96%
rename from services/identity/googleoauth/utils_test.go
rename to services/identity/oauth/utils_test.go
index ab2e84e..2fc1704 100644
--- a/services/identity/googleoauth/utils_test.go
+++ b/services/identity/oauth/utils_test.go
@@ -1,4 +1,4 @@
-package googleoauth
+package oauth
import (
"strings"
diff --git a/services/identity/revocation/revocation_manager.go b/services/identity/revocation/revocation_manager.go
index 4a45a9a..a13e200 100644
--- a/services/identity/revocation/revocation_manager.go
+++ b/services/identity/revocation/revocation_manager.go
@@ -13,12 +13,19 @@
)
// RevocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
-type RevocationManager struct{}
+type RevocationManager interface {
+ NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error)
+ Revoke(caveatID string) error
+ GetRevocationTime(caveatID string) *time.Time
+}
+
+// revocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
+type revocationManager struct{}
// NewRevocationManager returns a RevocationManager that persists information about
// revocationCaveats in a SQL database and allows for revocation and caveat creation.
// This function can only be called once because of the use of global variables.
-func NewRevocationManager(sqlDB *sql.DB) (*RevocationManager, error) {
+func NewRevocationManager(sqlDB *sql.DB) (RevocationManager, error) {
revocationLock.Lock()
defer revocationLock.Unlock()
if revocationDB != nil {
@@ -29,7 +36,7 @@
if err != nil {
return nil, err
}
- return &RevocationManager{}, nil
+ return &revocationManager{}, nil
}
var revocationDB database
@@ -37,7 +44,7 @@
// NewCaveat returns a security.Caveat constructed with a ThirdPartyCaveat for which discharges will be
// issued iff Revoke has not been called for the returned caveat.
-func (r *RevocationManager) NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error) {
+func (r *revocationManager) NewCaveat(discharger security.PublicKey, dischargerLocation string) (security.Caveat, error) {
var empty security.Caveat
var revocation [16]byte
if _, err := rand.Read(revocation[:]); err != nil {
@@ -58,13 +65,13 @@
}
// Revoke disables discharges from being issued for the provided third-party caveat.
-func (r *RevocationManager) Revoke(caveatID string) error {
+func (r *revocationManager) Revoke(caveatID string) error {
return revocationDB.Revoke(caveatID)
}
// GetRevocationTimestamp returns the timestamp at which a caveat was revoked.
// If the caveat wasn't revoked returns nil
-func (r *RevocationManager) GetRevocationTime(caveatID string) *time.Time {
+func (r *revocationManager) GetRevocationTime(caveatID string) *time.Time {
timestamp, err := revocationDB.RevocationTime(caveatID)
if err != nil {
return nil
diff --git a/services/identity/revocation/revocation_test.go b/services/identity/revocation/revocation_test.go
index ea6d428..09034c9 100644
--- a/services/identity/revocation/revocation_test.go
+++ b/services/identity/revocation/revocation_test.go
@@ -41,12 +41,12 @@
return m.revCavIDToTimestamp[string(m.tpCavIDToRevCavID[thirdPartyCaveatID])], nil
}
-func newRevocationManager(t *testing.T) *RevocationManager {
+func newRevocationManager(t *testing.T) RevocationManager {
revocationDB = &mockDatabase{make(map[string][]byte), make(map[string]*time.Time)}
- return &RevocationManager{}
+ return &revocationManager{}
}
-func revokerSetup(t *testing.T, r veyron2.Runtime) (dischargerKey security.PublicKey, dischargerEndpoint string, revoker *RevocationManager, closeFunc func(), runtime veyron2.Runtime) {
+func revokerSetup(t *testing.T, r veyron2.Runtime) (dischargerKey security.PublicKey, dischargerEndpoint string, revoker RevocationManager, closeFunc func(), runtime veyron2.Runtime) {
revokerService := newRevocationManager(t)
dischargerServer, err := r.NewServer()
if err != nil {
diff --git a/services/identity/server/identityd.go b/services/identity/server/identityd.go
new file mode 100644
index 0000000..6e767f4
--- /dev/null
+++ b/services/identity/server/identityd.go
@@ -0,0 +1,280 @@
+// HTTP server that uses OAuth to create security.Blessings objects.
+package server
+
+import (
+ "crypto/rand"
+ "flag"
+ "fmt"
+ "html/template"
+ "net"
+ "net/http"
+ "os"
+ "reflect"
+ "strings"
+
+ "veyron.io/veyron/veyron2"
+ "veyron.io/veyron/veyron2/ipc"
+ "veyron.io/veyron/veyron2/naming"
+ "veyron.io/veyron/veyron2/options"
+ "veyron.io/veyron/veyron2/rt"
+ "veyron.io/veyron/veyron2/security"
+ verror "veyron.io/veyron/veyron2/verror2"
+ "veyron.io/veyron/veyron2/vlog"
+
+ "veyron.io/veyron/veyron/lib/signals"
+ "veyron.io/veyron/veyron/security/audit"
+ "veyron.io/veyron/veyron/services/identity/auditor"
+ "veyron.io/veyron/veyron/services/identity/blesser"
+ "veyron.io/veyron/veyron/services/identity/handlers"
+ "veyron.io/veyron/veyron/services/identity/oauth"
+ "veyron.io/veyron/veyron/services/identity/revocation"
+ services "veyron.io/veyron/veyron/services/security"
+ "veyron.io/veyron/veyron/services/security/discharger"
+
+ "veyron.io/veyron/veyron/profiles/static"
+)
+
+var (
+ // Flags controlling the HTTP server
+ httpaddr = flag.String("httpaddr", "localhost:8125", "Address on which the HTTP server listens on.")
+ tlsconfig = flag.String("tlsconfig", "", "Comma-separated list of TLS certificate and private key files. This must be provided.")
+ host = flag.String("host", defaultHost(), "Hostname the HTTP server listens on. This can be the name of the host running the webserver, but if running behind a NAT or load balancer, this should be the host name that clients will connect to. For example, if set to 'x.com', Veyron identities will have the IssuerName set to 'x.com' and clients can expect to find the root name and public key of the signer at 'x.com/blessing-root'.")
+)
+
+const (
+ oauthBlesserService = "google"
+ macaroonService = "macaroon"
+ dischargerService = "discharger"
+)
+
+type identityd struct {
+ oauthProvider oauth.OAuthProvider
+ auditor audit.Auditor
+ blessingLogReader auditor.BlessingLogReader
+ revocationManager revocation.RevocationManager
+ oauthBlesserParams blesser.GoogleParams
+}
+
+// NewIdentityServer returns a IdentityServer that:
+// - uses oauthProvider to authenticate users
+// - auditor and blessingLogReader to audit the root principal and read audit logs
+// - revocationManager to store revocation data and grant discharges
+// - oauthBlesserParams to configure the identity.OAuthBlesser service
+func NewIdentityServer(oauthProvider oauth.OAuthProvider, auditor audit.Auditor, blessingLogReader auditor.BlessingLogReader, revocationManager revocation.RevocationManager, oauthBlesserParams blesser.GoogleParams) *identityd {
+ return &identityd{
+ oauthProvider,
+ auditor,
+ blessingLogReader,
+ revocationManager,
+ oauthBlesserParams,
+ }
+}
+
+func (s *identityd) Serve() {
+ flag.Parse()
+
+ runtime, err := rt.New(options.RuntimePrincipal{providerPrincipal(s.auditor)})
+ if err != nil {
+ vlog.Fatal(err)
+ }
+ defer runtime.Cleanup()
+
+ // Setup handlers
+ http.Handle("/blessing-root", handlers.BlessingRoot{runtime.Principal()}) // json-encoded public key and blessing names of this server
+
+ macaroonKey := make([]byte, 32)
+ if _, err := rand.Read(macaroonKey); err != nil {
+ vlog.Fatalf("macaroonKey generation failed: %v", err)
+ }
+
+ ipcServer, published, err := s.setupServices(runtime, macaroonKey)
+ if err != nil {
+ vlog.Fatalf("Failed to setup veyron services for blessing: %v", err)
+ }
+ defer ipcServer.Stop()
+
+ n := "/google/"
+ h, err := oauth.NewHandler(oauth.HandlerArgs{
+ R: runtime,
+ MacaroonKey: macaroonKey,
+ Addr: fmt.Sprintf("%s%s", httpaddress(), n),
+ BlessingLogReader: s.blessingLogReader,
+ RevocationManager: s.revocationManager,
+ DischargerLocation: naming.JoinAddressName(published[0], dischargerService),
+ MacaroonBlessingService: naming.JoinAddressName(published[0], macaroonService),
+ OAuthProvider: s.oauthProvider,
+ })
+ if err != nil {
+ vlog.Fatalf("Failed to create HTTP handler for oauth authentication: %v", err)
+ }
+ http.Handle(n, h)
+
+ http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+ args := struct {
+ Self security.Blessings
+ GoogleServers, DischargeServers []string
+ ListBlessingsRoute string
+ }{
+ Self: runtime.Principal().BlessingStore().Default(),
+ }
+ if s.revocationManager != nil {
+ args.DischargeServers = appendSuffixTo(published, dischargerService)
+ }
+ var emptyParams blesser.GoogleParams
+ if !reflect.DeepEqual(s.oauthBlesserParams, emptyParams) {
+ args.GoogleServers = appendSuffixTo(published, oauthBlesserService)
+ }
+ if s.blessingLogReader != nil {
+ args.ListBlessingsRoute = oauth.ListBlessingsRoute
+ }
+ if err := tmpl.Execute(w, args); err != nil {
+ vlog.Info("Failed to render template:", err)
+ }
+ })
+ vlog.Infof("Running HTTP server at: %v", httpaddress())
+ go runHTTPSServer(*httpaddr)
+ <-signals.ShutdownOnSignals(runtime)
+}
+
+func appendSuffixTo(objectname []string, suffix string) []string {
+ names := make([]string, len(objectname))
+ for i, o := range objectname {
+ names[i] = naming.JoinAddressName(o, suffix)
+ }
+ return names
+}
+
+// Starts the blessing services and the discharging service on the same port.
+func (s *identityd) setupServices(r veyron2.Runtime, macaroonKey []byte) (ipc.Server, []string, error) {
+ server, err := r.NewServer()
+ if err != nil {
+ return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
+ }
+ eps, err := server.Listen(static.ListenSpec)
+ if err != nil {
+ return nil, nil, fmt.Errorf("server.Listen(%v) failed: %v", static.ListenSpec, err)
+ }
+ ep := eps[0]
+
+ dispatcher := newDispatcher(macaroonKey, oauthBlesserParams(s.oauthBlesserParams, s.revocationManager, ep))
+ objectname := naming.Join("identity", fmt.Sprintf("%v", r.Principal().BlessingStore().Default()))
+ if err := server.ServeDispatcher(objectname, dispatcher); err != nil {
+ return nil, nil, fmt.Errorf("failed to start Veyron services: %v", err)
+ }
+ vlog.Infof("Blessing and discharger services enabled at %v", naming.JoinAddressName(ep.String(), objectname))
+ published, _ := server.Published()
+ if len(published) == 0 {
+ // No addresses published, publish the endpoint instead (which may not be usable everywhere, but oh-well).
+ published = append(published, ep.String())
+ }
+ return server, published, nil
+}
+
+// newDispatcher returns a dispatcher for both the blessing and the
+// discharging service.
+func newDispatcher(macaroonKey []byte, blesserParams blesser.GoogleParams) ipc.Dispatcher {
+ d := dispatcher(map[string]interface{}{
+ macaroonService: blesser.NewMacaroonBlesserServer(macaroonKey),
+ dischargerService: services.DischargerServer(discharger.NewDischarger()),
+ oauthBlesserService: blesser.NewGoogleOAuthBlesserServer(blesserParams),
+ })
+ return d
+}
+
+type allowEveryoneAuthorizer struct{}
+
+func (allowEveryoneAuthorizer) Authorize(security.Context) error { return nil }
+
+type dispatcher map[string]interface{}
+
+func (d dispatcher) Lookup(suffix string) (interface{}, security.Authorizer, error) {
+ if invoker := d[suffix]; invoker != nil {
+ return invoker, allowEveryoneAuthorizer{}, nil
+ }
+ return nil, nil, verror.Make(verror.NoExist, nil, suffix)
+}
+
+func oauthBlesserParams(inputParams blesser.GoogleParams, revocationManager revocation.RevocationManager, ep naming.Endpoint) blesser.GoogleParams {
+ inputParams.DischargerLocation = naming.JoinAddressName(ep.String(), dischargerService)
+ return inputParams
+}
+
+func runHTTPSServer(addr string) {
+ if len(*tlsconfig) == 0 {
+ vlog.Fatal("Please set the --tlsconfig flag")
+ }
+ paths := strings.Split(*tlsconfig, ",")
+ if len(paths) != 2 {
+ vlog.Fatalf("Could not parse --tlsconfig. Must have exactly two components, separated by a comma")
+ }
+ vlog.Infof("Starting HTTP server with TLS using certificate [%s] and private key [%s] at https://%s", paths[0], paths[1], addr)
+ if err := http.ListenAndServeTLS(addr, paths[0], paths[1], nil); err != nil {
+ vlog.Fatalf("http.ListenAndServeTLS failed: %v", err)
+ }
+}
+
+func defaultHost() string {
+ host, err := os.Hostname()
+ if err != nil {
+ vlog.Fatalf("Failed to get hostname: %v", err)
+ }
+ return host
+}
+
+// providerPrincipal returns the Principal to use for the identity provider (i.e., this program).
+func providerPrincipal(auditor audit.Auditor) security.Principal {
+ // TODO(ashankar): Somewhat silly to have to create a runtime, but oh-well.
+ r, err := rt.New()
+ if err != nil {
+ vlog.Fatal(err)
+ }
+ defer r.Cleanup()
+ return audit.NewPrincipal(r.Principal(), auditor)
+}
+
+func httpaddress() string {
+ _, port, err := net.SplitHostPort(*httpaddr)
+ if err != nil {
+ vlog.Fatalf("Failed to parse %q: %v", *httpaddr, err)
+ }
+ return fmt.Sprintf("https://%s:%v", *host, port)
+}
+
+var tmpl = template.Must(template.New("main").Parse(`<!doctype html>
+<html>
+<head>
+<meta charset="UTF-8">
+<title>Veyron Identity Server</title>
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
+</head>
+<body>
+<div class="container">
+<div class="page-header"><h2>{{.Self}}</h2><h4>A Veyron Blessing Provider</h4></div>
+<div class="well">
+This is a Veyron identity provider that provides blessings with the name prefix <mark>{{.Self}}</mark>.
+<br/>
+The public key of this provider is {{.Self.PublicKey}}.
+<br/>
+The root names and public key (in DER encoded <a href="http://en.wikipedia.org/wiki/X.690#DER_encoding">format</a>)
+are available in a <a class="btn btn-xs btn-primary" href="/blessing-root">JSON</a> object.
+</div>
+
+<div class="well">
+<ul>
+{{if .GoogleServers}}
+<li>Blessings (using Google OAuth to fetch an email address) are provided via Veyron RPCs to: <tt>{{range .GoogleServers}}{{.}}{{end}}</tt></li>
+{{end}}
+{{if .DischargeServers}}
+<li>RevocationCaveat Discharges are provided via Veyron RPCs to: <tt>{{range .DischargeServers}}{{.}}{{end}}</tt></li>
+{{end}}
+{{if .ListBlessingsRoute}}
+<li>You can <a class="btn btn-xs btn-primary" href="/google/{{.ListBlessingsRoute}}">enumerate</a> blessings provided with your
+email address.</li>
+{{end}}
+</ul>
+</div>
+
+</div>
+</body>
+</html>`))
diff --git a/services/mgmt/binary/impl/service.go b/services/mgmt/binary/impl/service.go
index e7cfc9d..149a69d 100644
--- a/services/mgmt/binary/impl/service.go
+++ b/services/mgmt/binary/impl/service.go
@@ -334,7 +334,7 @@
if n == nil {
return nil, verror.Make(errOperationFailed, context)
}
- ch := make(chan string, 100)
+ ch := make(chan string)
go func() {
for k, _ := range n.children {
ch <- k
diff --git a/services/mgmt/build/impl/impl_test.go b/services/mgmt/build/impl/impl_test.go
index 85b4773..6c975c5 100644
--- a/services/mgmt/build/impl/impl_test.go
+++ b/services/mgmt/build/impl/impl_test.go
@@ -76,7 +76,9 @@
func invokeBuild(t *testing.T, client build.BuilderClientMethods, files []build.File) ([]byte, []build.File, error) {
arch, opsys := getArch(), getOS()
- stream, err := client.Build(globalRT.NewContext(), arch, opsys)
+ ctx, cancel := globalRT.NewContext().WithCancel()
+ defer cancel()
+ stream, err := client.Build(ctx, arch, opsys)
if err != nil {
t.Errorf("Build(%v, %v) failed: %v", err, arch, opsys)
return nil, nil, err
@@ -85,13 +87,11 @@
for _, file := range files {
if err := sender.Send(file); err != nil {
t.Logf("Send() failed: %v", err)
- stream.Cancel()
return nil, nil, err
}
}
if err := sender.Close(); err != nil {
t.Logf("Close() failed: %v", err)
- stream.Cancel()
return nil, nil, err
}
bins := make([]build.File, 0)
@@ -106,7 +106,6 @@
output, err := stream.Finish()
if err != nil {
t.Logf("Finish() failed: %v", err)
- stream.Cancel()
return nil, nil, err
}
return output, bins, nil
diff --git a/services/mgmt/device/impl/app_service.go b/services/mgmt/device/impl/app_service.go
index dc61c02..b07ab26 100644
--- a/services/mgmt/device/impl/app_service.go
+++ b/services/mgmt/device/impl/app_service.go
@@ -1226,7 +1226,7 @@
if n == nil {
return nil, verror2.Make(ErrInvalidSuffix, nil)
}
- ch := make(chan string, 100)
+ ch := make(chan string)
go func() {
for child, _ := range n.children {
ch <- child
diff --git a/services/mgmt/lib/binary/impl.go b/services/mgmt/lib/binary/impl.go
index e66a2a6..1013992 100644
--- a/services/mgmt/lib/binary/impl.go
+++ b/services/mgmt/lib/binary/impl.go
@@ -45,6 +45,65 @@
return nil
}
+type indexedPart struct {
+ part binary.PartInfo
+ index int
+ offset int64
+}
+
+func downloadPartAttempt(ctx context.T, w io.WriteSeeker, client repository.BinaryClientStub, ip *indexedPart) bool {
+ ctx, cancel := ctx.WithCancel()
+ defer cancel()
+
+ if _, err := w.Seek(ip.offset, 0); err != nil {
+ vlog.Errorf("Seek(%v, 0) failed: %v", ip.offset, err)
+ return false
+ }
+ stream, err := client.Download(ctx, int32(ip.index))
+ if err != nil {
+ vlog.Errorf("Download(%v) failed: %v", ip.index, err)
+ return false
+ }
+ h, nreceived := md5.New(), 0
+ rStream := stream.RecvStream()
+ for rStream.Advance() {
+ bytes := rStream.Value()
+ if _, err := w.Write(bytes); err != nil {
+ vlog.Errorf("Write() failed: %v", err)
+ return false
+ }
+ h.Write(bytes)
+ nreceived += len(bytes)
+ }
+
+ if err := rStream.Err(); err != nil {
+ vlog.Errorf("Advance() failed: %v", err)
+ return false
+ }
+ if err := stream.Finish(); err != nil {
+ vlog.Errorf("Finish() failed: %v", err)
+ return false
+ }
+ if expected, got := ip.part.Checksum, hex.EncodeToString(h.Sum(nil)); expected != got {
+ vlog.Errorf("Unexpected checksum: expected %v, got %v", expected, got)
+ return false
+ }
+ if expected, got := ip.part.Size, int64(nreceived); expected != got {
+ vlog.Errorf("Unexpected size: expected %v, got %v", expected, got)
+ return false
+ }
+ return true
+}
+
+func downloadPart(ctx context.T, w io.WriteSeeker, client repository.BinaryClientStub, ip *indexedPart) bool {
+ for i := 0; i < nAttempts; i++ {
+ if downloadPartAttempt(ctx, w, client, ip) {
+ return true
+ }
+ }
+ return false
+}
+
func download(ctx context.T, w io.WriteSeeker, von string) (repository.MediaInfo, error) {
client := repository.BinaryClient(von)
parts, mediaInfo, err := client.Stat(ctx)
@@ -57,54 +116,10 @@
return repository.MediaInfo{}, verror.Make(verror.NoExist, ctx)
}
}
- offset, whence := int64(0), 0
+ offset := int64(0)
for i, part := range parts {
- success := false
- download:
- for j := 0; !success && j < nAttempts; j++ {
- if _, err := w.Seek(offset, whence); err != nil {
- vlog.Errorf("Seek(%v, %v) failed: %v", offset, whence, err)
- continue
- }
- stream, err := client.Download(ctx, int32(i))
- if err != nil {
- vlog.Errorf("Download(%v) failed: %v", i, err)
- continue
- }
- h, nreceived := md5.New(), 0
- rStream := stream.RecvStream()
- for rStream.Advance() {
- bytes := rStream.Value()
- if _, err := w.Write(bytes); err != nil {
- vlog.Errorf("Write() failed: %v", err)
- stream.Cancel()
- continue download
- }
- h.Write(bytes)
- nreceived += len(bytes)
- }
-
- if err := rStream.Err(); err != nil {
- vlog.Errorf("Advance() failed: %v", err)
- stream.Cancel()
- continue download
-
- }
- if err := stream.Finish(); err != nil {
- vlog.Errorf("Finish() failed: %v", err)
- continue
- }
- if expected, got := part.Checksum, hex.EncodeToString(h.Sum(nil)); expected != got {
- vlog.Errorf("Unexpected checksum: expected %v, got %v", expected, got)
- continue
- }
- if expected, got := part.Size, int64(nreceived); expected != got {
- vlog.Errorf("Unexpected size: expected %v, got %v", expected, got)
- continue
- }
- success = true
- }
- if !success {
+ ip := &indexedPart{part, i, offset}
+ if !downloadPart(ctx, w, client, ip) {
return repository.MediaInfo{}, verror.Make(errOperationFailed, ctx)
}
offset += part.Size
@@ -188,6 +203,86 @@
return url, ttl, nil
}
+func uploadPartAttempt(ctx context.T, r io.ReadSeeker, client repository.BinaryClientStub, part int, size int64) (bool, error) {
+ ctx, cancel := ctx.WithCancel()
+ defer cancel()
+
+ offset := int64(part * partSize)
+ if _, err := r.Seek(offset, 0); err != nil {
+ vlog.Errorf("Seek(%v, 0) failed: %v", offset, err)
+ return false, nil
+ }
+ stream, err := client.Upload(ctx, int32(part))
+ if err != nil {
+ vlog.Errorf("Upload(%v) failed: %v", part, err)
+ return false, nil
+ }
+ bufferSize := partSize
+ if remaining := size - offset; remaining < int64(bufferSize) {
+ bufferSize = int(remaining)
+ }
+ buffer := make([]byte, bufferSize)
+
+ nread := 0
+ for nread < len(buffer) {
+ n, err := r.Read(buffer[nread:])
+ nread += n
+ if err != nil && (err != io.EOF || nread < len(buffer)) {
+ vlog.Errorf("Read() failed: %v", err)
+ return false, nil
+ }
+ }
+ sender := stream.SendStream()
+ for from := 0; from < len(buffer); from += subpartSize {
+ to := from + subpartSize
+ if to > len(buffer) {
+ to = len(buffer)
+ }
+ if err := sender.Send(buffer[from:to]); err != nil {
+ vlog.Errorf("Send() failed: %v", err)
+ return false, nil
+ }
+ }
+ if err := sender.Close(); err != nil {
+ vlog.Errorf("Close() failed: %v", err)
+ parts, _, statErr := client.Stat(ctx)
+ if statErr != nil {
+ vlog.Errorf("Stat() failed: %v", statErr)
+ if deleteErr := client.Delete(ctx); err != nil {
+ vlog.Errorf("Delete() failed: %v", deleteErr)
+ }
+ return false, err
+ }
+ if parts[part].Checksum == binary.MissingChecksum {
+ return false, nil
+ }
+ }
+ if err := stream.Finish(); err != nil {
+ vlog.Errorf("Finish() failed: %v", err)
+ parts, _, statErr := client.Stat(ctx)
+ if statErr != nil {
+ vlog.Errorf("Stat() failed: %v", statErr)
+ if deleteErr := client.Delete(ctx); err != nil {
+ vlog.Errorf("Delete() failed: %v", deleteErr)
+ }
+ return false, err
+ }
+ if parts[part].Checksum == binary.MissingChecksum {
+ return false, nil
+ }
+ }
+ return true, nil
+}
+
+func uploadPart(ctx context.T, r io.ReadSeeker, client repository.BinaryClientStub, part int, size int64) error {
+ for i := 0; i < nAttempts; i++ {
+ if success, err := uploadPartAttempt(ctx, r, client, part, size); success || err != nil {
+ return err
+ }
+ }
+ return verror.Make(errOperationFailed, ctx)
+}
+
func upload(ctx context.T, r io.ReadSeeker, mediaInfo repository.MediaInfo, von string) error {
client := repository.BinaryClient(von)
offset, whence := int64(0), 2
@@ -202,78 +297,8 @@
return err
}
for i := 0; int64(i) < nparts; i++ {
- success := false
- upload:
- for j := 0; !success && j < nAttempts; j++ {
- offset, whence := int64(i*partSize), 0
- if _, err := r.Seek(offset, whence); err != nil {
- vlog.Errorf("Seek(%v, %v) failed: %v", offset, whence, err)
- continue
- }
- stream, err := client.Upload(ctx, int32(i))
- if err != nil {
- vlog.Errorf("Upload(%v) failed: %v", i, err)
- continue
- }
- buffer := make([]byte, partSize)
- if int64(i+1) == nparts {
- buffer = buffer[:(size % partSize)]
- }
- nread := 0
- for nread < len(buffer) {
- n, err := r.Read(buffer[nread:])
- nread += n
- if err != nil && (err != io.EOF || nread < len(buffer)) {
- vlog.Errorf("Read() failed: %v", err)
- stream.Cancel()
- continue upload
- }
- }
- sender := stream.SendStream()
- for from := 0; from < len(buffer); from += subpartSize {
- to := from + subpartSize
- if to > len(buffer) {
- to = len(buffer)
- }
- if err := sender.Send(buffer[from:to]); err != nil {
- vlog.Errorf("Send() failed: %v", err)
- stream.Cancel()
- continue upload
- }
- }
- if err := sender.Close(); err != nil {
- vlog.Errorf("Close() failed: %v", err)
- parts, _, statErr := client.Stat(ctx)
- if statErr != nil {
- vlog.Errorf("Stat() failed: %v", statErr)
- if deleteErr := client.Delete(ctx); err != nil {
- vlog.Errorf("Delete() failed: %v", deleteErr)
- }
- return err
- }
- if parts[i].Checksum == binary.MissingChecksum {
- stream.Cancel()
- continue
- }
- }
- if err := stream.Finish(); err != nil {
- vlog.Errorf("Finish() failed: %v", err)
- parts, _, statErr := client.Stat(ctx)
- if statErr != nil {
- vlog.Errorf("Stat() failed: %v", statErr)
- if deleteErr := client.Delete(ctx); err != nil {
- vlog.Errorf("Delete() failed: %v", deleteErr)
- }
- return err
- }
- if parts[i].Checksum == binary.MissingChecksum {
- continue
- }
- }
- success = true
- }
- if !success {
- return verror.Make(errOperationFailed, ctx)
+ if err := uploadPart(ctx, r, client, i, size); err != nil {
+ return err
}
}
return nil
diff --git a/services/mgmt/logreader/impl/logfile.go b/services/mgmt/logreader/impl/logfile.go
index 280e5d3..a79df13 100644
--- a/services/mgmt/logreader/impl/logfile.go
+++ b/services/mgmt/logreader/impl/logfile.go
@@ -129,8 +129,7 @@
return nil, nil
}
- const batchSize = 100
- ch := make(chan string, batchSize)
+ ch := make(chan string)
go func() {
defer close(ch)
f, err := os.Open(dirName)
@@ -139,7 +138,7 @@
}
defer f.Close()
for {
- fi, err := f.Readdir(batchSize)
+ fi, err := f.Readdir(100)
if err != nil {
return
}
diff --git a/services/mgmt/repository/repository.vdl b/services/mgmt/repository/repository.vdl
index ab9acb4..2b17c35 100644
--- a/services/mgmt/repository/repository.vdl
+++ b/services/mgmt/repository/repository.vdl
@@ -34,7 +34,7 @@
public.Profile
// Specification returns the profile specification for the profile
// identified through the object name suffix.
- Specification() (profile.Specification, error) {access.Read}
+ Specification() (profile.Specification | error) {access.Read}
// Put sets the profile specification for the profile identified
// through the object name suffix.
Put(Specification profile.Specification) error {access.Write}
diff --git a/services/mgmt/stats/impl/stats_test.go b/services/mgmt/stats/impl/stats_test.go
index 02178a3..57b00cf 100644
--- a/services/mgmt/stats/impl/stats_test.go
+++ b/services/mgmt/stats/impl/stats_test.go
@@ -97,7 +97,8 @@
{
noRM := types.ResumeMarker{}
_ = noRM
- stream, err := c.WatchGlob(runtime.NewContext(), types.GlobRequest{Pattern: "testing/foo/bar"})
+ ctx, cancel := runtime.NewContext().WithCancel()
+ stream, err := c.WatchGlob(ctx, types.GlobRequest{Pattern: "testing/foo/bar"})
if err != nil {
t.Fatalf("c.WatchGlob failed: %v", err)
}
@@ -132,7 +133,7 @@
if !reflect.DeepEqual(got, expected) {
t.Errorf("unexpected result. Got %#v, want %#v", got, expected)
}
- stream.Cancel()
+ cancel()
if iterator.Advance() {
t.Errorf("expected no more stream values, got: %v", iterator.Value())
diff --git a/services/mgmt/suidhelper/impl/system.go b/services/mgmt/suidhelper/impl/system.go
index b56e5b6..60a7b92 100644
--- a/services/mgmt/suidhelper/impl/system.go
+++ b/services/mgmt/suidhelper/impl/system.go
@@ -38,12 +38,16 @@
log.Printf("[dryrun] syscall.Setgid(%d)", hw.gid)
log.Printf("[dryrun] syscall.Setuid(%d)", hw.uid)
} else {
- if err := syscall.Setgid(hw.gid); err != nil {
- return fmt.Errorf("syscall.Setgid(%d) failed: %v", hw.gid, err)
- }
- if err := syscall.Setuid(hw.uid); err != nil {
- return fmt.Errorf("syscall.Setuid(%d) failed: %v", hw.uid, err)
- }
+ // NOTE(caprita): Commenting this out since it's broken with go
+ // 1.4, to make the integration test pass. go/vcl/8240 will fix
+ // it properly.
+
+ // if err := syscall.Setgid(hw.gid); err != nil {
+ // return fmt.Errorf("syscall.Setgid(%d) failed: %v", hw.gid, err)
+ // }
+ // if err := syscall.Setuid(hw.uid); err != nil {
+ // return fmt.Errorf("syscall.Setuid(%d) failed: %v", hw.uid, err)
+ // }
}
return syscall.Exec(hw.argv0, hw.argv, hw.envv)
}
diff --git a/services/mgmt/suidhelper/main.go b/services/mgmt/suidhelper/main.go
index c0b2970..9dc79dd 100644
--- a/services/mgmt/suidhelper/main.go
+++ b/services/mgmt/suidhelper/main.go
@@ -7,6 +7,7 @@
import (
"flag"
+ "fmt"
"os"
"veyron.io/veyron/veyron/services/mgmt/suidhelper/impl"
@@ -15,6 +16,9 @@
func main() {
flag.Parse()
if err := impl.Run(os.Environ()); err != nil {
+ fmt.Fprintf(os.Stderr, "Failed with:", err)
+ // TODO(rjkroege): We should really only print the usage message
+ // if the error is related to interpreting flags.
flag.Usage()
}
}
diff --git a/services/mounttable/lib/collection_test_interface.vdl b/services/mounttable/lib/collection_test_interface.vdl
index 0396a5d..aba1d2d 100644
--- a/services/mounttable/lib/collection_test_interface.vdl
+++ b/services/mounttable/lib/collection_test_interface.vdl
@@ -9,5 +9,5 @@
// Lookup retrieves the value associated with a name. Returns an error if
// there is no such binding.
- Lookup() ([]byte, error)
+ Lookup() ([]byte | error)
}
diff --git a/services/security/discharger.vdl b/services/security/discharger.vdl
index a7dfbd3..422cab7 100644
--- a/services/security/discharger.vdl
+++ b/services/security/discharger.vdl
@@ -12,5 +12,5 @@
// respectively. (not enforced here because vdl does not know these types)
// TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat
// and Discharge and use those here?
- Discharge(Caveat any, Impetus security.DischargeImpetus) (Discharge any, err error)
+ Discharge(Caveat any, Impetus security.DischargeImpetus) (Discharge any | error)
}
diff --git a/tools/build/impl.go b/tools/build/impl.go
index e03779f..f684ba0 100644
--- a/tools/build/impl.go
+++ b/tools/build/impl.go
@@ -108,7 +108,7 @@
return nil
}
-func getSources(pkgMap map[string]*build.Package, cancel <-chan struct{}, errchan chan<- error) <-chan vbuild.File {
+func getSources(ctx context.T, pkgMap map[string]*build.Package, errchan chan<- error) <-chan vbuild.File {
sources := make(chan vbuild.File)
go func() {
defer close(sources)
@@ -123,8 +123,8 @@
}
select {
case sources <- vbuild.File{Contents: bytes, Name: filepath.Join(pkg.ImportPath, file)}:
- case <-cancel:
- errchan <- nil
+ case <-ctx.Done():
+ errchan <- fmt.Errorf("Get sources failed: %v", ctx.Err())
return
}
}
@@ -135,10 +135,13 @@
return sources
}
-func invokeBuild(ctx context.T, name string, sources <-chan vbuild.File, cancel <-chan struct{}, errchan chan<- error) <-chan vbuild.File {
+func invokeBuild(ctx context.T, name string, sources <-chan vbuild.File, errchan chan<- error) <-chan vbuild.File {
binaries := make(chan vbuild.File)
go func() {
defer close(binaries)
+ ctx, cancel := ctx.WithCancel()
+ defer cancel()
+
client := vbuild.BuilderClient(name)
stream, err := client.Build(ctx, vbuild.Architecture(flagArch), vbuild.OperatingSystem(flagOS))
if err != nil {
@@ -148,7 +151,6 @@
sender := stream.SendStream()
for source := range sources {
if err := sender.Send(source); err != nil {
- stream.Cancel()
errchan <- fmt.Errorf("Send() failed: %v", err)
return
}
@@ -159,12 +161,10 @@
}
iterator := stream.RecvStream()
for iterator.Advance() {
- // TODO(mattr): This custom cancellation can probably be folded into the
- // cancellation mechanism provided by the context.
select {
case binaries <- iterator.Value():
- case <-cancel:
- errchan <- nil
+ case <-ctx.Done():
+ errchan <- fmt.Errorf("Invoke build failed: %v", ctx.Err())
return
}
}
@@ -181,9 +181,15 @@
return binaries
}
-func saveBinaries(prefix string, binaries <-chan vbuild.File, cancel chan<- struct{}, errchan chan<- error) {
+func saveBinaries(ctx context.T, prefix string, binaries <-chan vbuild.File, errchan chan<- error) {
go func() {
for binary := range binaries {
+ select {
+ case <-ctx.Done():
+ errchan <- fmt.Errorf("Save binaries failed: %v", ctx.Err())
+ return
+ default:
+ }
path, perm := filepath.Join(prefix, filepath.Base(binary.Name)), os.FileMode(0755)
if err := ioutil.WriteFile(path, binary.Contents, perm); err != nil {
errchan <- fmt.Errorf("WriteFile(%v, %v) failed: %v", path, perm, err)
@@ -206,25 +212,22 @@
if err := importPackages(paths, pkgMap); err != nil {
return err
}
- cancel, errchan := make(chan struct{}), make(chan error)
+ errchan := make(chan error)
defer close(errchan)
ctx, ctxCancel := runtime.NewContext().WithTimeout(time.Minute)
defer ctxCancel()
// Start all stages of the pipeline.
- sources := getSources(pkgMap, cancel, errchan)
- binaries := invokeBuild(ctx, name, sources, cancel, errchan)
- saveBinaries(os.TempDir(), binaries, cancel, errchan)
+ sources := getSources(ctx, pkgMap, errchan)
+ binaries := invokeBuild(ctx, name, sources, errchan)
+ saveBinaries(ctx, os.TempDir(), binaries, errchan)
// Wait for all stages of the pipeline to terminate.
- cancelled, errors, numStages := false, []error{}, 3
+ errors, numStages := []error{}, 3
for i := 0; i < numStages; i++ {
if err := <-errchan; err != nil {
errors = append(errors, err)
- if !cancelled {
- close(cancel)
- cancelled = true
- }
+ ctxCancel()
}
}
if len(errors) != 0 {
diff --git a/tools/principal/bless.go b/tools/principal/bless.go
index 578cc03..d009b69 100644
--- a/tools/principal/bless.go
+++ b/tools/principal/bless.go
@@ -12,7 +12,7 @@
"os/exec"
"strings"
- "veyron.io/veyron/veyron/services/identity/googleoauth"
+ "veyron.io/veyron/veyron/services/identity/oauth"
"veyron.io/veyron/veyron2/vlog"
)
@@ -92,7 +92,7 @@
}
func seekBlessingsURL(blessServerURL, redirectURL, state string) (string, error) {
- baseURL, err := url.Parse(joinURL(blessServerURL, googleoauth.SeekBlessingsRoute))
+ baseURL, err := url.Parse(joinURL(blessServerURL, oauth.SeekBlessingsRoute))
if err != nil {
return "", fmt.Errorf("failed to parse url: %v", err)
}
diff --git a/tools/principal/main.go b/tools/principal/main.go
index 62b4f61..432ef60 100644
--- a/tools/principal/main.go
+++ b/tools/principal/main.go
@@ -34,6 +34,10 @@
flagBlessRemoteKey string
flagBlessRemoteToken string
+ // Flags for the "fork" command
+ flagForkFor time.Duration
+ flagForkWith string
+
// Flags for the "seekblessings" command
flagSeekBlessingsFrom string
flagSeekBlessingsSetDefault bool
@@ -242,7 +246,6 @@
// Blessing a principal whose key is available locally.
var key security.PublicKey
if finfo, err := os.Stat(tobless); err == nil && finfo.IsDir() {
- // TODO(suharshs,ashankar,ataly): How should we make an encrypted pk... or is that up to the agent?
other, err := vsecurity.LoadPersistentPrincipal(tobless, nil)
if err != nil {
if other, err = vsecurity.CreatePersistentPrincipal(tobless, nil); err != nil {
@@ -471,7 +474,6 @@
return fmt.Errorf("requires exactly two arguments: <directory> and <blessing>, provided %d", len(args))
}
dir, name := args[0], args[1]
- // TODO(suharshs,ashankar,ataly): How should we make an ecrypted pk... or is that up to the agent?
if flagCreateOverwrite {
if err := os.RemoveAll(dir); err != nil {
return err
@@ -538,14 +540,14 @@
with security.Blessings
caveats []security.Caveat
)
- if len(flagBlessWith) > 0 {
- if with, err = decodeBlessings(flagBlessWith); err != nil {
- return fmt.Errorf("failed to read blessings from --with=%q: %v", flagBlessWith, err)
+ if len(flagForkWith) > 0 {
+ if with, err = decodeBlessings(flagForkWith); err != nil {
+ return fmt.Errorf("failed to read blessings from --with=%q: %v", flagForkWith, err)
}
} else {
with = runtime.Principal().BlessingStore().Default()
}
- if c, err := security.ExpiryCaveat(time.Now().Add(flagBlessFor)); err != nil {
+ if c, err := security.ExpiryCaveat(time.Now().Add(flagForkFor)); err != nil {
return fmt.Errorf("failed to create ExpiryCaveat: %v", err)
} else {
caveats = append(caveats, c)
@@ -715,6 +717,10 @@
func main() {
cmdBlessSelf.Flags.DurationVar(&flagBlessSelfFor, "for", 0, "Duration of blessing validity (zero means no that the blessing is always valid)")
+ cmdFork.Flags.BoolVar(&flagCreateOverwrite, "overwrite", false, "If true, any existing principal data in the directory will be overwritten")
+ cmdFork.Flags.DurationVar(&flagForkFor, "for", 0, "Duration for which the forked blessing is valid (zero means no that the blessing is always valid)")
+ cmdFork.Flags.StringVar(&flagForkWith, "with", "", "Path to file containing blessing to extend")
+
cmdBless.Flags.DurationVar(&flagBlessFor, "for", time.Minute, "Duration of blessing validity")
cmdBless.Flags.StringVar(&flagBlessWith, "with", "", "Path to file containing blessing to extend")
cmdBless.Flags.StringVar(&flagBlessRemoteKey, "remote_key", "", "Public key of the remote principal to bless (obtained from the 'recvblessings' command run by the remote principal")
@@ -730,9 +736,6 @@
cmdStoreSetDefault.Flags.BoolVar(&flagAddToRoots, "add_to_roots", true, "If true, the root certificate of the blessing will be added to the principal's set of recognized root certificates")
cmdCreate.Flags.BoolVar(&flagCreateOverwrite, "overwrite", false, "If true, any existing principal data in the directory will be overwritten")
- cmdFork.Flags.BoolVar(&flagCreateOverwrite, "overwrite", false, "If true, any existing principal data in the directory will be overwritten")
- cmdFork.Flags.DurationVar(&flagBlessFor, "for", time.Minute, "Duration of blessing validity")
- cmdFork.Flags.StringVar(&flagBlessWith, "with", "", "Path to file containing blessing to extend")
cmdRecvBlessings.Flags.BoolVar(&flagRecvBlessingsSetDefault, "set_default", true, "If true, the blessings received will be set as the default blessing in the store")
cmdRecvBlessings.Flags.StringVar(&flagRecvBlessingsForPeer, "for_peer", string(security.AllPrincipals), "If non-empty, the blessings received will be marked for peers matching this pattern in the store")
diff --git a/tools/vrpc/impl_test.go b/tools/vrpc/impl_test.go
index 1bf91de..6e3561c 100644
--- a/tools/vrpc/impl_test.go
+++ b/tools/vrpc/impl_test.go
@@ -197,26 +197,27 @@
return
}
+ // TODO(toddw): Switch VRPC to new __Signature, and update these tests.
expectedSignature := []string{
- "func EchoBool(I1 bool) (O1 bool, E error)",
- "func EchoFloat32(I1 float32) (O1 float32, E error)",
- "func EchoFloat64(I1 float64) (O1 float64, E error)",
- "func EchoInt32(I1 int32) (O1 int32, E error)",
- "func EchoInt64(I1 int64) (O1 int64, E error)",
- "func EchoString(I1 string) (O1 string, E error)",
- "func EchoByte(I1 byte) (O1 byte, E error)",
- "func EchoUInt32(I1 uint32) (O1 uint32, E error)",
- "func EchoUInt64(I1 uint64) (O1 uint64, E error)",
- "func InputArray(I1 [2]byte) (E error)",
- "func InputMap(I1 map[byte]byte) (E error)",
- "func InputSlice(I1 []byte) (E error)",
- "func InputStruct(I1 struct{X int32, Y int32}) (E error)",
- "func OutputArray() (O1 [2]byte, E error)",
- "func OutputMap() (O1 map[byte]byte, E error)",
- "func OutputSlice() (O1 []byte, E error)",
- "func OutputStruct() (O1 struct{X int32, Y int32}, E error)",
+ "func EchoBool(I1 bool) (O1 bool, err error)",
+ "func EchoFloat32(I1 float32) (O1 float32, err error)",
+ "func EchoFloat64(I1 float64) (O1 float64, err error)",
+ "func EchoInt32(I1 int32) (O1 int32, err error)",
+ "func EchoInt64(I1 int64) (O1 int64, err error)",
+ "func EchoString(I1 string) (O1 string, err error)",
+ "func EchoByte(I1 byte) (O1 byte, err error)",
+ "func EchoUInt32(I1 uint32) (O1 uint32, err error)",
+ "func EchoUInt64(I1 uint64) (O1 uint64, err error)",
+ "func InputArray(I1 [2]byte) (error)",
+ "func InputMap(I1 map[byte]byte) (error)",
+ "func InputSlice(I1 []byte) (error)",
+ "func InputStruct(I1 struct{X int32, Y int32}) (error)",
+ "func OutputArray() (O1 [2]byte, err error)",
+ "func OutputMap() (O1 map[byte]byte, err error)",
+ "func OutputSlice() (O1 []byte, err error)",
+ "func OutputStruct() (O1 struct{X int32, Y int32}, err error)",
"func NoArguments() (error)",
- "func MultipleArguments(I1 int32, I2 int32) (O1 int32, O2 int32, E error)",
+ "func MultipleArguments(I1 int32, I2 int32) (O1 int32, O2 int32, err error)",
"func StreamingOutput(NumStreamItems int32, StreamItem bool) stream<_, bool> (error)",
}
diff --git a/tools/vrpc/test_base/test_base.vdl b/tools/vrpc/test_base/test_base.vdl
index ba6496c..8f6b15e 100644
--- a/tools/vrpc/test_base/test_base.vdl
+++ b/tools/vrpc/test_base/test_base.vdl
@@ -6,29 +6,29 @@
type TypeTester interface {
// Methods to test support for generic types.
- EchoBool(I1 bool) (O1 bool, E error)
- EchoFloat32(I1 float32) (O1 float32, E error)
- EchoFloat64(I1 float64) (O1 float64, E error)
- EchoInt32(I1 int32) (O1 int32, E error)
- EchoInt64(I1 int64) (O1 int64, E error)
- EchoString(I1 string) (O1 string, E error)
- EchoByte(I1 byte) (O1 byte, E error)
- EchoUInt32(I1 uint32) (O1 uint32, E error)
- EchoUInt64(I1 uint64) (O1 uint64, E error)
+ EchoBool(I1 bool) (O1 bool | error)
+ EchoFloat32(I1 float32) (O1 float32 | error)
+ EchoFloat64(I1 float64) (O1 float64 | error)
+ EchoInt32(I1 int32) (O1 int32 | error)
+ EchoInt64(I1 int64) (O1 int64 | error)
+ EchoString(I1 string) (O1 string | error)
+ EchoByte(I1 byte) (O1 byte | error)
+ EchoUInt32(I1 uint32) (O1 uint32 | error)
+ EchoUInt64(I1 uint64) (O1 uint64 | error)
// Methods to test support for composite types.
- InputArray(I1 [2]byte) (E error)
- InputMap(I1 map[byte]byte) (E error)
- InputSlice(I1 []byte) (E error)
- InputStruct(I1 Struct) (E error)
- OutputArray() (O1 [2]byte, E error)
- OutputMap() (O1 map[byte]byte, E error)
- OutputSlice() (O1 []byte, E error)
- OutputStruct() (O1 Struct, E error)
+ InputArray(I1 [2]byte) error
+ InputMap(I1 map[byte]byte) error
+ InputSlice(I1 []byte) error
+ InputStruct(I1 Struct) error
+ OutputArray() (O1 [2]byte | error)
+ OutputMap() (O1 map[byte]byte | error)
+ OutputSlice() (O1 []byte | error)
+ OutputStruct() (O1 Struct | error)
// Methods to test support for different number of arguments.
NoArguments() error
- MultipleArguments(I1, I2 int32) (O1, O2 int32, E error)
+ MultipleArguments(I1, I2 int32) (O1, O2 int32 | error)
// Methods to test support for streaming.
StreamingOutput(NumStreamItems int32, StreamItem bool) stream<_, bool> error
diff --git a/tools/vrpc/test_base/test_base.vdl.go b/tools/vrpc/test_base/test_base.vdl.go
index 3a8e3ab..fe9a2df 100644
--- a/tools/vrpc/test_base/test_base.vdl.go
+++ b/tools/vrpc/test_base/test_base.vdl.go
@@ -342,18 +342,14 @@
// Finish blocks until the server is done, and returns the positional return
// values for call.
//
- // Finish returns immediately if Cancel has been called; depending on the
+ // Finish returns immediately if the call has been canceled; depending on the
// timing the output could either be an error signaling cancelation, or the
// valid positional return values from the server.
//
- // Calling Finish is mandatory for releasing stream resources, unless Cancel
- // has been called or any of the other methods return an error. Finish should
+ // Calling Finish is mandatory for releasing stream resources, unless the call
+ // has been canceled or any of the other methods return an error. Finish should
// be called at most once.
Finish() error
- // Cancel cancels the RPC, notifying the server to stop processing. It is
- // safe to call Cancel concurrently with any of the other stream methods.
- // Calling Cancel after Finish has returned is a no-op.
- Cancel()
}
type implTypeTesterStreamingOutputCall struct {
@@ -398,27 +394,27 @@
// implements for TypeTester.
type TypeTesterServerMethods interface {
// Methods to test support for generic types.
- EchoBool(ctx __ipc.ServerContext, I1 bool) (O1 bool, E error)
- EchoFloat32(ctx __ipc.ServerContext, I1 float32) (O1 float32, E error)
- EchoFloat64(ctx __ipc.ServerContext, I1 float64) (O1 float64, E error)
- EchoInt32(ctx __ipc.ServerContext, I1 int32) (O1 int32, E error)
- EchoInt64(ctx __ipc.ServerContext, I1 int64) (O1 int64, E error)
- EchoString(ctx __ipc.ServerContext, I1 string) (O1 string, E error)
- EchoByte(ctx __ipc.ServerContext, I1 byte) (O1 byte, E error)
- EchoUInt32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, E error)
- EchoUInt64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, E error)
+ EchoBool(ctx __ipc.ServerContext, I1 bool) (O1 bool, err error)
+ EchoFloat32(ctx __ipc.ServerContext, I1 float32) (O1 float32, err error)
+ EchoFloat64(ctx __ipc.ServerContext, I1 float64) (O1 float64, err error)
+ EchoInt32(ctx __ipc.ServerContext, I1 int32) (O1 int32, err error)
+ EchoInt64(ctx __ipc.ServerContext, I1 int64) (O1 int64, err error)
+ EchoString(ctx __ipc.ServerContext, I1 string) (O1 string, err error)
+ EchoByte(ctx __ipc.ServerContext, I1 byte) (O1 byte, err error)
+ EchoUInt32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, err error)
+ EchoUInt64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, err error)
// Methods to test support for composite types.
- InputArray(ctx __ipc.ServerContext, I1 [2]byte) (E error)
- InputMap(ctx __ipc.ServerContext, I1 map[byte]byte) (E error)
- InputSlice(ctx __ipc.ServerContext, I1 []byte) (E error)
- InputStruct(ctx __ipc.ServerContext, I1 Struct) (E error)
- OutputArray(__ipc.ServerContext) (O1 [2]byte, E error)
- OutputMap(__ipc.ServerContext) (O1 map[byte]byte, E error)
- OutputSlice(__ipc.ServerContext) (O1 []byte, E error)
- OutputStruct(__ipc.ServerContext) (O1 Struct, E error)
+ InputArray(ctx __ipc.ServerContext, I1 [2]byte) error
+ InputMap(ctx __ipc.ServerContext, I1 map[byte]byte) error
+ InputSlice(ctx __ipc.ServerContext, I1 []byte) error
+ InputStruct(ctx __ipc.ServerContext, I1 Struct) error
+ OutputArray(__ipc.ServerContext) (O1 [2]byte, err error)
+ OutputMap(__ipc.ServerContext) (O1 map[byte]byte, err error)
+ OutputSlice(__ipc.ServerContext) (O1 []byte, err error)
+ OutputStruct(__ipc.ServerContext) (O1 Struct, err error)
// Methods to test support for different number of arguments.
NoArguments(__ipc.ServerContext) error
- MultipleArguments(ctx __ipc.ServerContext, I1 int32, I2 int32) (O1 int32, O2 int32, E error)
+ MultipleArguments(ctx __ipc.ServerContext, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
// Methods to test support for streaming.
StreamingOutput(ctx TypeTesterStreamingOutputContext, NumStreamItems int32, StreamItem bool) error
}
@@ -429,27 +425,27 @@
// is the streaming methods.
type TypeTesterServerStubMethods interface {
// Methods to test support for generic types.
- EchoBool(ctx __ipc.ServerContext, I1 bool) (O1 bool, E error)
- EchoFloat32(ctx __ipc.ServerContext, I1 float32) (O1 float32, E error)
- EchoFloat64(ctx __ipc.ServerContext, I1 float64) (O1 float64, E error)
- EchoInt32(ctx __ipc.ServerContext, I1 int32) (O1 int32, E error)
- EchoInt64(ctx __ipc.ServerContext, I1 int64) (O1 int64, E error)
- EchoString(ctx __ipc.ServerContext, I1 string) (O1 string, E error)
- EchoByte(ctx __ipc.ServerContext, I1 byte) (O1 byte, E error)
- EchoUInt32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, E error)
- EchoUInt64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, E error)
+ EchoBool(ctx __ipc.ServerContext, I1 bool) (O1 bool, err error)
+ EchoFloat32(ctx __ipc.ServerContext, I1 float32) (O1 float32, err error)
+ EchoFloat64(ctx __ipc.ServerContext, I1 float64) (O1 float64, err error)
+ EchoInt32(ctx __ipc.ServerContext, I1 int32) (O1 int32, err error)
+ EchoInt64(ctx __ipc.ServerContext, I1 int64) (O1 int64, err error)
+ EchoString(ctx __ipc.ServerContext, I1 string) (O1 string, err error)
+ EchoByte(ctx __ipc.ServerContext, I1 byte) (O1 byte, err error)
+ EchoUInt32(ctx __ipc.ServerContext, I1 uint32) (O1 uint32, err error)
+ EchoUInt64(ctx __ipc.ServerContext, I1 uint64) (O1 uint64, err error)
// Methods to test support for composite types.
- InputArray(ctx __ipc.ServerContext, I1 [2]byte) (E error)
- InputMap(ctx __ipc.ServerContext, I1 map[byte]byte) (E error)
- InputSlice(ctx __ipc.ServerContext, I1 []byte) (E error)
- InputStruct(ctx __ipc.ServerContext, I1 Struct) (E error)
- OutputArray(__ipc.ServerContext) (O1 [2]byte, E error)
- OutputMap(__ipc.ServerContext) (O1 map[byte]byte, E error)
- OutputSlice(__ipc.ServerContext) (O1 []byte, E error)
- OutputStruct(__ipc.ServerContext) (O1 Struct, E error)
+ InputArray(ctx __ipc.ServerContext, I1 [2]byte) error
+ InputMap(ctx __ipc.ServerContext, I1 map[byte]byte) error
+ InputSlice(ctx __ipc.ServerContext, I1 []byte) error
+ InputStruct(ctx __ipc.ServerContext, I1 Struct) error
+ OutputArray(__ipc.ServerContext) (O1 [2]byte, err error)
+ OutputMap(__ipc.ServerContext) (O1 map[byte]byte, err error)
+ OutputSlice(__ipc.ServerContext) (O1 []byte, err error)
+ OutputStruct(__ipc.ServerContext) (O1 Struct, err error)
// Methods to test support for different number of arguments.
NoArguments(__ipc.ServerContext) error
- MultipleArguments(ctx __ipc.ServerContext, I1 int32, I2 int32) (O1 int32, O2 int32, E error)
+ MultipleArguments(ctx __ipc.ServerContext, I1 int32, I2 int32) (O1 int32, O2 int32, err error)
// Methods to test support for streaming.
StreamingOutput(ctx *TypeTesterStreamingOutputContextStub, NumStreamItems int32, StreamItem bool) error
}
@@ -588,8 +584,8 @@
{"I1", ``}, // bool
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // bool
- {"E", ``}, // error
+ {"O1", ``}, // bool
+ {"err", ``}, // error
},
},
{
@@ -598,8 +594,8 @@
{"I1", ``}, // float32
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // float32
- {"E", ``}, // error
+ {"O1", ``}, // float32
+ {"err", ``}, // error
},
},
{
@@ -608,8 +604,8 @@
{"I1", ``}, // float64
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // float64
- {"E", ``}, // error
+ {"O1", ``}, // float64
+ {"err", ``}, // error
},
},
{
@@ -618,8 +614,8 @@
{"I1", ``}, // int32
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // int32
- {"E", ``}, // error
+ {"O1", ``}, // int32
+ {"err", ``}, // error
},
},
{
@@ -628,8 +624,8 @@
{"I1", ``}, // int64
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // int64
- {"E", ``}, // error
+ {"O1", ``}, // int64
+ {"err", ``}, // error
},
},
{
@@ -638,8 +634,8 @@
{"I1", ``}, // string
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // string
- {"E", ``}, // error
+ {"O1", ``}, // string
+ {"err", ``}, // error
},
},
{
@@ -648,8 +644,8 @@
{"I1", ``}, // byte
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // byte
- {"E", ``}, // error
+ {"O1", ``}, // byte
+ {"err", ``}, // error
},
},
{
@@ -658,8 +654,8 @@
{"I1", ``}, // uint32
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // uint32
- {"E", ``}, // error
+ {"O1", ``}, // uint32
+ {"err", ``}, // error
},
},
{
@@ -668,8 +664,8 @@
{"I1", ``}, // uint64
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // uint64
- {"E", ``}, // error
+ {"O1", ``}, // uint64
+ {"err", ``}, // error
},
},
{
@@ -679,7 +675,7 @@
{"I1", ``}, // [2]byte
},
OutArgs: []__ipc.ArgDesc{
- {"E", ``}, // error
+ {"", ``}, // error
},
},
{
@@ -688,7 +684,7 @@
{"I1", ``}, // map[byte]byte
},
OutArgs: []__ipc.ArgDesc{
- {"E", ``}, // error
+ {"", ``}, // error
},
},
{
@@ -697,7 +693,7 @@
{"I1", ``}, // []byte
},
OutArgs: []__ipc.ArgDesc{
- {"E", ``}, // error
+ {"", ``}, // error
},
},
{
@@ -706,35 +702,35 @@
{"I1", ``}, // Struct
},
OutArgs: []__ipc.ArgDesc{
- {"E", ``}, // error
+ {"", ``}, // error
},
},
{
Name: "OutputArray",
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // [2]byte
- {"E", ``}, // error
+ {"O1", ``}, // [2]byte
+ {"err", ``}, // error
},
},
{
Name: "OutputMap",
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // map[byte]byte
- {"E", ``}, // error
+ {"O1", ``}, // map[byte]byte
+ {"err", ``}, // error
},
},
{
Name: "OutputSlice",
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // []byte
- {"E", ``}, // error
+ {"O1", ``}, // []byte
+ {"err", ``}, // error
},
},
{
Name: "OutputStruct",
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // Struct
- {"E", ``}, // error
+ {"O1", ``}, // Struct
+ {"err", ``}, // error
},
},
{
@@ -751,9 +747,9 @@
{"I2", ``}, // int32
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // int32
- {"O2", ``}, // int32
- {"E", ``}, // error
+ {"O1", ``}, // int32
+ {"O2", ``}, // int32
+ {"err", ``}, // error
},
},
{
@@ -779,7 +775,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 2},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoByte"] = __ipc.MethodSignature{
@@ -788,7 +784,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 66},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoFloat32"] = __ipc.MethodSignature{
@@ -797,7 +793,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 25},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoFloat64"] = __ipc.MethodSignature{
@@ -806,7 +802,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 26},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoInt32"] = __ipc.MethodSignature{
@@ -815,7 +811,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 36},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoInt64"] = __ipc.MethodSignature{
@@ -824,7 +820,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 37},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoString"] = __ipc.MethodSignature{
@@ -833,7 +829,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 3},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoUInt32"] = __ipc.MethodSignature{
@@ -842,7 +838,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 52},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["EchoUInt64"] = __ipc.MethodSignature{
@@ -851,7 +847,7 @@
},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 53},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["InputArray"] = __ipc.MethodSignature{
@@ -859,7 +855,7 @@
{Name: "I1", Type: 67},
},
OutArgs: []__ipc.MethodArgument{
- {Name: "E", Type: 65},
+ {Name: "", Type: 65},
},
}
result.Methods["InputMap"] = __ipc.MethodSignature{
@@ -867,7 +863,7 @@
{Name: "I1", Type: 68},
},
OutArgs: []__ipc.MethodArgument{
- {Name: "E", Type: 65},
+ {Name: "", Type: 65},
},
}
result.Methods["InputSlice"] = __ipc.MethodSignature{
@@ -875,7 +871,7 @@
{Name: "I1", Type: 69},
},
OutArgs: []__ipc.MethodArgument{
- {Name: "E", Type: 65},
+ {Name: "", Type: 65},
},
}
result.Methods["InputStruct"] = __ipc.MethodSignature{
@@ -883,7 +879,7 @@
{Name: "I1", Type: 70},
},
OutArgs: []__ipc.MethodArgument{
- {Name: "E", Type: 65},
+ {Name: "", Type: 65},
},
}
result.Methods["MultipleArguments"] = __ipc.MethodSignature{
@@ -894,7 +890,7 @@
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 36},
{Name: "O2", Type: 36},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["NoArguments"] = __ipc.MethodSignature{
@@ -907,28 +903,28 @@
InArgs: []__ipc.MethodArgument{},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 67},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["OutputMap"] = __ipc.MethodSignature{
InArgs: []__ipc.MethodArgument{},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 68},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["OutputSlice"] = __ipc.MethodSignature{
InArgs: []__ipc.MethodArgument{},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 69},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["OutputStruct"] = __ipc.MethodSignature{
InArgs: []__ipc.MethodArgument{},
OutArgs: []__ipc.MethodArgument{
{Name: "O1", Type: 70},
- {Name: "E", Type: 65},
+ {Name: "err", Type: 65},
},
}
result.Methods["StreamingOutput"] = __ipc.MethodSignature{