Merge "veyron/services/mgmt/binary/impl: provide useful GetACL default"
diff --git a/lib/modules/core/mounttable.go b/lib/modules/core/mounttable.go
index 00acb04..9ea0084 100644
--- a/lib/modules/core/mounttable.go
+++ b/lib/modules/core/mounttable.go
@@ -1,6 +1,7 @@
package core
import (
+ "flag"
"fmt"
"io"
"os"
@@ -13,7 +14,11 @@
mounttable "v.io/core/veyron/services/mounttable/lib"
)
+var details *bool
+
func init() {
+ details = flag.CommandLine.Bool("l", false, "use a long listing format for ls")
+
modules.RegisterChild(RootMTCommand, "", rootMountTable)
modules.RegisterChild(MTCommand, `<mount point>
reads NAMESPACE_ROOT from its environment and mounts a new mount table at <mount point>`, mountTable)
@@ -46,9 +51,9 @@
}
mp = args[0]
}
- mt, err := mounttable.NewMountTable("")
+ mt, err := mounttable.NewMountTableDispatcher("")
if err != nil {
- return fmt.Errorf("mounttable.NewMountTable failed: %s", err)
+ return fmt.Errorf("mounttable.NewMountTableDispatcher failed: %s", err)
}
eps, err := server.Listen(lspec)
if err != nil {
@@ -69,11 +74,6 @@
ctx, shutdown := veyron2.Init()
defer shutdown()
- details := false
- if len(args) > 0 && args[0] == "-l" {
- details = true
- args = args[1:]
- }
ns := veyron2.GetNamespace(ctx)
entry := 0
output := ""
@@ -83,7 +83,7 @@
return err
}
for n := range ch {
- if details {
+ if *details {
output += fmt.Sprintf("R%d=%s[", entry, n.Name)
t := ""
for _, s := range n.Servers {
diff --git a/lib/netconfig/ipaux_linux.go b/lib/netconfig/ipaux_linux.go
index b2a14ca..9afc7dd 100644
--- a/lib/netconfig/ipaux_linux.go
+++ b/lib/netconfig/ipaux_linux.go
@@ -385,16 +385,16 @@
// IPRoutes returns all kernel known routes. If defaultOnly is set, only default routes
// are returned.
func GetIPRoutes(defaultOnly bool) []*IPRoute {
- var x []*IPRoute
+ var iproutes []*IPRoute
rib, err := syscall.NetlinkRIB(syscall.RTM_GETROUTE, syscall.AF_UNSPEC)
if err != nil {
vlog.Infof("Couldn't read: %s", err)
- return x
+ return iproutes
}
msgs, err := syscall.ParseNetlinkMessage(rib)
if err != nil {
vlog.Infof("Couldn't parse: %s", err)
- return x
+ return iproutes
}
L:
for _, m := range msgs {
@@ -406,7 +406,6 @@
continue
}
r := new(IPRoute)
- r.Net.IP = net.IPv4zero
for _, a := range attrs {
switch a.Attr.Type {
case syscall.RTA_DST:
@@ -425,19 +424,34 @@
}
}
}
+
+ // There is no RTA_DST attribute if destination is a default gateway.
+ // Set the destination IP with zero IP, if not set yet.
+ if r.Net.IP == nil {
+ if r.Gateway == nil {
+ continue
+ }
+ if r.Gateway.To4() != nil {
+ r.Net.IP = net.IPv4zero
+ } else {
+ r.Net.IP = net.IPv6zero
+ }
+ }
+
+ addrLen := 128
+ if r.Net.IP.To4() != nil {
+ addrLen = 32
+ }
+
b := m.Data[:syscall.SizeofRtMsg]
a := (*syscall.RtMsg)(unsafe.Pointer(&b[0]))
- len := 128
- if r.Net.IP.To4() != nil {
- len = 32
- }
- if int(a.Dst_len) > len {
+ if int(a.Dst_len) > addrLen {
continue
}
- r.Net.Mask = net.CIDRMask(int(a.Dst_len), len)
+ r.Net.Mask = net.CIDRMask(int(a.Dst_len), addrLen)
if !defaultOnly || IsDefaultIPRoute(r) {
- x = append(x, r)
+ iproutes = append(iproutes, r)
}
}
- return x
+ return iproutes
}
diff --git a/lib/netstate/netstate.go b/lib/netstate/netstate.go
index 2cbb35b..e13a62f 100644
--- a/lib/netstate/netstate.go
+++ b/lib/netstate/netstate.go
@@ -221,8 +221,10 @@
// IsIPProtocol returns true if its parameter is one of the allowed
// network/protocol values for IP.
func IsIPProtocol(n string) bool {
+ // Removed the training IP version number.
+ n = strings.TrimRightFunc(n, func(r rune) bool { return r == '4' || r == '6' })
switch n {
- case "ip+net", "ip", "tcp", "tcp4", "tcp6", "udp", "wsh":
+ case "ip+net", "ip", "tcp", "udp", "ws", "wsh":
return true
default:
return false
diff --git a/lib/testutil/integration/testdata/integration_test.go b/lib/testutil/integration/testdata/integration_test.go
index 97308d7..5d11ed6 100644
--- a/lib/testutil/integration/testdata/integration_test.go
+++ b/lib/testutil/integration/testdata/integration_test.go
@@ -1,6 +1,8 @@
package testdata
import (
+ "bufio"
+ "bytes"
"testing"
"v.io/core/veyron/lib/modules"
@@ -21,8 +23,10 @@
t.Fatalf("unexpected output, want %s, got %s", want, got)
}
- // TODO(sjr): revive this once stderr handling is fixed.
- // if want, got := "hello world\n", bash.Start("-c", "echo hello world 1>&2").ErrorOutput(); want != got {
- // t.Fatalf("unexpected output, want %s, got %s", want, got)
- // }
+ inv := bash.Start("-c", "echo hello world 1>&2")
+ var buf bytes.Buffer
+ inv.WaitOrDie(nil, bufio.NewWriter(&buf))
+ if want, got := "hello world\n", string(buf.Bytes()); want != got {
+ t.Fatalf("unexpected output, want %s, got %s", want, got)
+ }
}
diff --git a/lib/testutil/integration/util.go b/lib/testutil/integration/util.go
index 8f5b314..0511b15 100644
--- a/lib/testutil/integration/util.go
+++ b/lib/testutil/integration/util.go
@@ -126,19 +126,25 @@
WithEnv(env []string) TestBinary
}
+// Invocation represents a single invocation of a TestBinary.
+//
+// Any bytes written by the invocation to its standard error may be recovered
+// using the Wait or WaitOrDie functions.
+//
+// For example:
+// bin := env.BinaryFromPath("/bin/bash")
+// inv := bin.Start("-c", "echo hello world 1>&2")
+// var buf bytes.Buffer
+// inv.WaitOrDie(nil, bufio.NewWriter(&buf))
+// // buf.Bytes() now contains 'hello world\n'
type Invocation interface {
Stdin() io.Writer
Stdout() io.Reader
- Stderr() io.Reader
// Output reads the invocation's stdout until EOF and then returns what
// was read as a string.
Output() string
- // ErrorOutput reads the invocation's stderr until EOF and then returns
- // what was read as a string.
- ErrorOutput() string
-
// Sends the given signal to this invocation. It is up to the test
// author to decide whether failure to deliver the signal is fatal to
// the test.
@@ -232,14 +238,6 @@
return readerToString(i.env.t, i.Stdout())
}
-func (i *integrationTestBinaryInvocation) Stderr() io.Reader {
- return (*i.handle).Stderr()
-}
-
-func (i *integrationTestBinaryInvocation) ErrorOutput() string {
- return readerToString(i.env.t, i.Stderr())
-}
-
func (i *integrationTestBinaryInvocation) Wait(stdout, stderr io.Writer) error {
return (*i.handle).Shutdown(stdout, stderr)
}
diff --git a/profiles/internal/util.go b/profiles/internal/util.go
index ac8a062..4c03b6e 100644
--- a/profiles/internal/util.go
+++ b/profiles/internal/util.go
@@ -3,6 +3,7 @@
import (
"fmt"
"os"
+ "strings"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/vlog"
@@ -48,8 +49,14 @@
accessible := netstate.AddrList(addrs)
// Try and find an address on a interface with a default route.
- predicates := []netstate.AddressPredicate{netstate.IsPublicUnicastIPv4,
- netstate.IsUnicastIPv4, netstate.IsPublicUnicastIPv6}
+ // We give preference to IPv4 over IPv6 for compatibility for now.
+ var predicates []netstate.AddressPredicate
+ if !strings.HasSuffix(network, "6") {
+ predicates = append(predicates, netstate.IsPublicUnicastIPv4, netstate.IsUnicastIPv4)
+ }
+ if !strings.HasSuffix(network, "4") {
+ predicates = append(predicates, netstate.IsPublicUnicastIPv6, netstate.IsUnicastIPv6)
+ }
for _, predicate := range predicates {
if addrs := accessible.Filter(predicate); len(addrs) > 0 {
onDefaultRoutes := addrs.Filter(netstate.IsOnDefaultRoute)
diff --git a/runtimes/google/ipc/benchmark/RESULTS.txt b/runtimes/google/ipc/benchmark/RESULTS.txt
index 95a44bf..eec067a 100644
--- a/runtimes/google/ipc/benchmark/RESULTS.txt
+++ b/runtimes/google/ipc/benchmark/RESULTS.txt
@@ -8,95 +8,92 @@
continuously in the same process.
================================================================================
-Date: 02/02/2015
+Date: 02/03/2015
Platform: Intel(R) Xeon(R) CPU E5-2689 0 @ 2.60GHz, 66114888KB Memory
-Benchmark____1B 5000 1941933 ns/op 0.00 MB/s
+Benchmark____1B 5000 1911937 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 4 Avg: 1.35
+ Count: 5000 Min: 1 Max: 4 Avg: 1.33
------------------------------------------------------------
- [ 1, 2) 3792 75.8% 75.8% ########
- [ 2, 3) 734 14.7% 90.5% #
- [ 3, 4) 397 7.9% 98.5% #
- [ 4, inf) 77 1.5% 100.0%
-Benchmark____1B-2 5000 1744191 ns/op 0.00 MB/s
+ [ 1, 2) 3837 76.7% 76.7% ########
+ [ 2, 3) 720 14.4% 91.1% #
+ [ 3, 4) 386 7.7% 98.9% #
+ [ 4, inf) 57 1.1% 100.0%
+Benchmark____1B-2 5000 1735328 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 3 Avg: 1.17
+ Count: 5000 Min: 1 Max: 4 Avg: 1.16
------------------------------------------------------------
[ 1, 2) 4518 90.4% 90.4% #########
- [ 2, 3) 91 1.8% 92.2%
- [ 3, inf) 391 7.8% 100.0% #
-Benchmark___10B 5000 2015671 ns/op 0.01 MB/s
+ [ 2, 3) 149 3.0% 93.3%
+ [ 3, 4) 332 6.6% 100.0% #
+ [ 4, inf) 1 0.0% 100.0%
+Benchmark___10B 5000 1976083 ns/op 0.01 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 9 Avg: 1.39
+ Count: 5000 Min: 1 Max: 8 Avg: 1.37
------------------------------------------------------------
[ 1, 2) 4554 91.1% 91.1% #########
- [ 2, 3) 17 0.3% 91.4%
+ [ 2, 3) 19 0.4% 91.5%
[ 3, 4) 102 2.0% 93.5%
- [ 4, 5) 21 0.4% 93.9%
- [ 5, 6) 60 1.2% 95.1%
- [ 6, 8) 180 3.6% 98.7%
- [ 8, 10) 66 1.3% 100.0%
+ [ 4, 5) 23 0.5% 94.0%
+ [ 5, 6) 74 1.5% 95.4%
+ [ 6, 7) 136 2.7% 98.2%
+ [ 7, 9) 92 1.8% 100.0%
+ [ 9, inf) 0 0.0% 100.0%
+Benchmark___10B-2 5000 1764546 ns/op 0.01 MB/s
+--- Histogram (unit: ms)
+ Count: 5000 Min: 1 Max: 6 Avg: 1.17
+ ------------------------------------------------------------
+ [ 1, 2) 4752 95.0% 95.0% ##########
+ [ 2, 3) 0 0.0% 95.0%
+ [ 3, 4) 0 0.0% 95.0%
+ [ 4, 5) 123 2.5% 97.5%
+ [ 5, 6) 123 2.5% 100.0%
+ [ 6, inf) 2 0.0% 100.0%
+Benchmark__100B 5000 2065635 ns/op 0.10 MB/s
+--- Histogram (unit: ms)
+ Count: 5000 Min: 1 Max: 14 Avg: 1.44
+ ------------------------------------------------------------
+ [ 1, 2) 4711 94.2% 94.2% #########
+ [ 2, 3) 6 0.1% 94.3%
+ [ 3, 4) 11 0.2% 94.6%
+ [ 4, 5) 41 0.8% 95.4%
+ [ 5, 6) 29 0.6% 96.0%
+ [ 6, 8) 1 0.0% 96.0%
+ [ 8, 10) 64 1.3% 97.3%
+ [ 10, 13) 111 2.2% 99.5%
+ [ 13, 16) 26 0.5% 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, inf) 0 0.0% 100.0%
+Benchmark__100B-2 5000 1800099 ns/op 0.11 MB/s
+--- Histogram (unit: ms)
+ Count: 5000 Min: 1 Max: 9 Avg: 1.19
+ ------------------------------------------------------------
+ [ 1, 2) 4834 96.7% 96.7% ##########
+ [ 2, 3) 1 0.0% 96.7%
+ [ 3, 4) 0 0.0% 96.7%
+ [ 4, 5) 0 0.0% 96.7%
+ [ 5, 6) 0 0.0% 96.7%
+ [ 6, 8) 157 3.1% 99.8%
+ [ 8, 10) 8 0.2% 100.0%
[ 10, 12) 0 0.0% 100.0%
[ 12, inf) 0 0.0% 100.0%
-Benchmark___10B-2 5000 1830436 ns/op 0.01 MB/s
+Benchmark___1KB 3000 2160307 ns/op 0.93 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 6 Avg: 1.20
+ Count: 3000 Min: 1 Max: 19 Avg: 1.50
------------------------------------------------------------
- [ 1, 2) 4731 94.6% 94.6% #########
- [ 2, 3) 21 0.4% 95.0%
- [ 3, 4) 0 0.0% 95.0%
- [ 4, 5) 47 0.9% 96.0%
- [ 5, 6) 161 3.2% 99.2%
- [ 6, inf) 40 0.8% 100.0%
-Benchmark__100B 3000 2140626 ns/op 0.09 MB/s
---- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 15 Avg: 1.47
- ------------------------------------------------------------
- [ 1, 2) 2811 93.7% 93.7% #########
- [ 2, 3) 6 0.2% 93.9%
- [ 3, 4) 5 0.2% 94.1%
- [ 4, 5) 17 0.6% 94.6%
- [ 5, 7) 36 1.2% 95.8%
- [ 7, 9) 19 0.6% 96.5%
- [ 9, 11) 38 1.3% 97.7%
- [ 11, 14) 62 2.1% 99.8%
- [ 14, 18) 6 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, 41) 0 0.0% 100.0%
- [ 41, 50) 0 0.0% 100.0%
- [ 50, inf) 0 0.0% 100.0%
-Benchmark__100B-2 5000 1852904 ns/op 0.11 MB/s
---- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 11 Avg: 1.21
- ------------------------------------------------------------
- [ 1, 2) 4803 96.1% 96.1% ##########
- [ 2, 3) 20 0.4% 96.5%
- [ 3, 4) 0 0.0% 96.5%
- [ 4, 5) 0 0.0% 96.5%
- [ 5, 6) 0 0.0% 96.5%
- [ 6, 8) 160 3.2% 99.7%
- [ 8, 10) 9 0.2% 99.8%
- [ 10, 12) 8 0.2% 100.0%
- [ 12, 15) 0 0.0% 100.0%
- [ 15, 18) 0 0.0% 100.0%
- [ 18, inf) 0 0.0% 100.0%
-Benchmark___1KB 3000 2231959 ns/op 0.90 MB/s
---- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 19 Avg: 1.53
- ------------------------------------------------------------
- [ 1, 2) 2875 95.8% 95.8% ##########
- [ 2, 3) 1 0.0% 95.9%
- [ 3, 4) 0 0.0% 95.9%
- [ 4, 5) 0 0.0% 95.9%
- [ 5, 7) 8 0.3% 96.1%
- [ 7, 9) 21 0.7% 96.8%
- [ 9, 12) 0 0.0% 96.8%
- [ 12, 15) 29 1.0% 97.8%
- [ 15, 19) 56 1.9% 99.7%
- [ 19, 24) 10 0.3% 100.0%
+ [ 1, 2) 2883 96.1% 96.1% ##########
+ [ 2, 3) 0 0.0% 96.1%
+ [ 3, 4) 0 0.0% 96.1%
+ [ 4, 5) 0 0.0% 96.1%
+ [ 5, 7) 8 0.3% 96.4%
+ [ 7, 9) 20 0.7% 97.0%
+ [ 9, 12) 0 0.0% 97.0%
+ [ 12, 15) 28 0.9% 98.0%
+ [ 15, 19) 53 1.8% 99.7%
+ [ 19, 24) 8 0.3% 100.0%
[ 24, 30) 0 0.0% 100.0%
[ 30, 38) 0 0.0% 100.0%
[ 38, 48) 0 0.0% 100.0%
@@ -104,36 +101,34 @@
[ 60, 74) 0 0.0% 100.0%
[ 74, 91) 0 0.0% 100.0%
[ 91, inf) 0 0.0% 100.0%
-Benchmark___1KB-2 3000 2078680 ns/op 0.96 MB/s
+Benchmark___1KB-2 5000 1845717 ns/op 1.08 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 12 Avg: 1.35
+ Count: 5000 Min: 1 Max: 10 Avg: 1.22
------------------------------------------------------------
- [ 1, 2) 2699 90.0% 90.0% #########
- [ 2, 3) 213 7.1% 97.1% #
- [ 3, 4) 0 0.0% 97.1%
- [ 4, 5) 0 0.0% 97.1%
- [ 5, 6) 0 0.0% 97.1%
- [ 6, 8) 0 0.0% 97.1%
- [ 8, 10) 20 0.7% 97.7%
- [ 10, 13) 68 2.3% 100.0%
- [ 13, 16) 0 0.0% 100.0%
- [ 16, 20) 0 0.0% 100.0%
- [ 20, 24) 0 0.0% 100.0%
- [ 24, inf) 0 0.0% 100.0%
-Benchmark__10KB 3000 2548055 ns/op 7.85 MB/s
+ [ 1, 2) 4857 97.1% 97.1% ##########
+ [ 2, 3) 7 0.1% 97.3%
+ [ 3, 4) 0 0.0% 97.3%
+ [ 4, 5) 0 0.0% 97.3%
+ [ 5, 6) 0 0.0% 97.3%
+ [ 6, 8) 0 0.0% 97.3%
+ [ 8, 10) 123 2.5% 99.7%
+ [ 10, 12) 13 0.3% 100.0%
+ [ 12, 15) 0 0.0% 100.0%
+ [ 15, inf) 0 0.0% 100.0%
+Benchmark__10KB 3000 2461125 ns/op 8.13 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 24 Avg: 1.73
+ Count: 3000 Min: 1 Max: 24 Avg: 1.65
------------------------------------------------------------
- [ 1, 2) 2665 88.8% 88.8% #########
- [ 2, 3) 196 6.5% 95.4% #
- [ 3, 4) 0 0.0% 95.4%
- [ 4, 5) 0 0.0% 95.4%
- [ 5, 7) 0 0.0% 95.4%
- [ 7, 9) 42 1.4% 96.8%
- [ 9, 12) 0 0.0% 96.8%
- [ 12, 16) 30 1.0% 97.8%
- [ 16, 21) 19 0.6% 98.4%
- [ 21, 27) 48 1.6% 100.0%
+ [ 1, 2) 2865 95.5% 95.5% ##########
+ [ 2, 3) 19 0.6% 96.1%
+ [ 3, 4) 0 0.0% 96.1%
+ [ 4, 5) 0 0.0% 96.1%
+ [ 5, 7) 0 0.0% 96.1%
+ [ 7, 9) 27 0.9% 97.0%
+ [ 9, 12) 1 0.0% 97.1%
+ [ 12, 16) 0 0.0% 97.1%
+ [ 16, 21) 28 0.9% 98.0%
+ [ 21, 27) 60 2.0% 100.0%
[ 27, 35) 0 0.0% 100.0%
[ 35, 44) 0 0.0% 100.0%
[ 44, 56) 0 0.0% 100.0%
@@ -141,240 +136,171 @@
[ 71, 89) 0 0.0% 100.0%
[ 89, 111) 0 0.0% 100.0%
[111, inf) 0 0.0% 100.0%
-Benchmark__10KB-2 3000 2242089 ns/op 8.92 MB/s
+Benchmark__10KB-2 5000 2002215 ns/op 9.99 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 14 Avg: 1.53
+ Count: 5000 Min: 1 Max: 12 Avg: 1.32
------------------------------------------------------------
- [ 1, 2) 2328 77.6% 77.6% ########
- [ 2, 3) 581 19.4% 97.0% ##
- [ 3, 4) 0 0.0% 97.0%
- [ 4, 5) 0 0.0% 97.0%
- [ 5, 6) 0 0.0% 97.0%
- [ 6, 8) 0 0.0% 97.0%
- [ 8, 10) 0 0.0% 97.0%
- [ 10, 13) 45 1.5% 98.5%
- [ 13, 16) 46 1.5% 100.0%
+ [ 1, 2) 4634 92.7% 92.7% #########
+ [ 2, 3) 230 4.6% 97.3%
+ [ 3, 4) 0 0.0% 97.3%
+ [ 4, 5) 0 0.0% 97.3%
+ [ 5, 6) 0 0.0% 97.3%
+ [ 6, 8) 0 0.0% 97.3%
+ [ 8, 10) 0 0.0% 97.3%
+ [ 10, 13) 136 2.7% 100.0%
+ [ 13, 16) 0 0.0% 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, inf) 0 0.0% 100.0%
-Benchmark_100KB 2000 5112233 ns/op 39.12 MB/s
+ [ 20, 24) 0 0.0% 100.0%
+ [ 24, inf) 0 0.0% 100.0%
+Benchmark_100KB 2000 4987528 ns/op 40.10 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 3 Max: 26 Avg: 4.49
+ Count: 2000 Min: 3 Max: 28 Avg: 4.44
------------------------------------------------------------
- [ 3, 4) 1819 91.0% 91.0% #########
- [ 4, 5) 0 0.0% 91.0%
- [ 5, 6) 0 0.0% 91.0%
- [ 6, 7) 0 0.0% 91.0%
- [ 7, 9) 44 2.2% 93.2%
- [ 9, 11) 1 0.1% 93.2%
- [ 11, 14) 0 0.0% 93.2%
- [ 14, 18) 0 0.0% 93.2%
- [ 18, 23) 45 2.2% 95.5%
- [ 23, 29) 91 4.5% 100.0%
+ [ 3, 4) 1846 92.3% 92.3% #########
+ [ 4, 5) 3 0.2% 92.5%
+ [ 5, 6) 0 0.0% 92.5%
+ [ 6, 7) 0 0.0% 92.5%
+ [ 7, 9) 28 1.4% 93.9%
+ [ 9, 11) 1 0.1% 93.9%
+ [ 11, 14) 0 0.0% 93.9%
+ [ 14, 18) 0 0.0% 93.9%
+ [ 18, 23) 29 1.5% 95.4%
+ [ 23, 29) 93 4.7% 100.0%
[ 29, 37) 0 0.0% 100.0%
- [ 37, 46) 0 0.0% 100.0%
- [ 46, 58) 0 0.0% 100.0%
- [ 58, 73) 0 0.0% 100.0%
- [ 73, 91) 0 0.0% 100.0%
- [ 91, 113) 0 0.0% 100.0%
- [113, inf) 0 0.0% 100.0%
-Benchmark_100KB-2 2000 3661880 ns/op 54.62 MB/s
+ [ 37, 47) 0 0.0% 100.0%
+ [ 47, 60) 0 0.0% 100.0%
+ [ 60, 76) 0 0.0% 100.0%
+ [ 76, 96) 0 0.0% 100.0%
+ [ 96, 120) 0 0.0% 100.0%
+ [120, inf) 0 0.0% 100.0%
+Benchmark_100KB-2 2000 3358703 ns/op 59.55 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 19 Avg: 3.00
+ Count: 2000 Min: 2 Max: 15 Avg: 2.78
------------------------------------------------------------
- [ 2, 3) 1657 82.9% 82.9% ########
- [ 3, 4) 143 7.2% 90.0% #
- [ 4, 5) 67 3.4% 93.4%
- [ 5, 6) 1 0.1% 93.4%
- [ 6, 8) 0 0.0% 93.4%
- [ 8, 10) 0 0.0% 93.4%
- [ 10, 13) 13 0.7% 94.1%
- [ 13, 16) 48 2.4% 96.5%
- [ 16, 20) 71 3.6% 100.0%
- [ 20, 25) 0 0.0% 100.0%
- [ 25, 31) 0 0.0% 100.0%
- [ 31, 38) 0 0.0% 100.0%
- [ 38, 47) 0 0.0% 100.0%
- [ 47, 58) 0 0.0% 100.0%
- [ 58, 72) 0 0.0% 100.0%
- [ 72, 89) 0 0.0% 100.0%
- [ 89, inf) 0 0.0% 100.0%
+ [ 2, 3) 1755 87.8% 87.8% #########
+ [ 3, 4) 74 3.7% 91.5%
+ [ 4, 5) 53 2.7% 94.1%
+ [ 5, 6) 0 0.0% 94.1%
+ [ 6, 7) 0 0.0% 94.1%
+ [ 7, 9) 0 0.0% 94.1%
+ [ 9, 11) 0 0.0% 94.1%
+ [ 11, 14) 36 1.8% 95.9%
+ [ 14, 17) 82 4.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, inf) 0 0.0% 100.0%
-Benchmark____1_chunk_____1B 3000 2154678 ns/op 0.00 MB/s
+Benchmark____1_chunk_____1B 3000 2147302 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 4 Avg: 1.42
+ Count: 3000 Min: 1 Max: 4 Avg: 1.43
------------------------------------------------------------
- [ 1, 2) 2069 69.0% 69.0% #######
- [ 2, 3) 599 20.0% 88.9% ##
- [ 3, 4) 331 11.0% 100.0% #
+ [ 1, 2) 2049 68.3% 68.3% #######
+ [ 2, 3) 628 20.9% 89.2% ##
+ [ 3, 4) 321 10.7% 99.9% #
+ [ 4, inf) 2 0.1% 100.0%
+Benchmark____1_chunk_____1B-2 5000 1892882 ns/op 0.00 MB/s
+--- Histogram (unit: ms)
+ Count: 5000 Min: 1 Max: 4 Avg: 1.20
+ ------------------------------------------------------------
+ [ 1, 2) 4363 87.3% 87.3% #########
+ [ 2, 3) 286 5.7% 93.0% #
+ [ 3, 4) 350 7.0% 100.0% #
[ 4, inf) 1 0.0% 100.0%
-Benchmark____1_chunk_____1B-2 5000 1907902 ns/op 0.00 MB/s
---- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 4 Avg: 1.21
- ------------------------------------------------------------
- [ 1, 2) 4345 86.9% 86.9% #########
- [ 2, 3) 275 5.5% 92.4% #
- [ 3, 4) 377 7.5% 99.9% #
- [ 4, inf) 3 0.1% 100.0%
-Benchmark____1_chunk____10B 3000 2234222 ns/op 0.01 MB/s
+Benchmark____1_chunk____10B 3000 2225520 ns/op 0.01 MB/s
--- Histogram (unit: ms)
Count: 3000 Min: 1 Max: 7 Avg: 1.44
------------------------------------------------------------
- [ 1, 2) 2603 86.8% 86.8% #########
- [ 2, 3) 65 2.2% 88.9%
- [ 3, 4) 77 2.6% 91.5%
- [ 4, 5) 50 1.7% 93.2%
- [ 5, 6) 87 2.9% 96.1%
- [ 6, 7) 117 3.9% 100.0%
- [ 7, inf) 1 0.0% 100.0%
-Benchmark____1_chunk____10B-2 5000 1920770 ns/op 0.01 MB/s
+ [ 1, 2) 2609 87.0% 87.0% #########
+ [ 2, 3) 62 2.1% 89.0%
+ [ 3, 4) 75 2.5% 91.5%
+ [ 4, 5) 46 1.5% 93.1%
+ [ 5, 6) 90 3.0% 96.1%
+ [ 6, 7) 112 3.7% 99.8%
+ [ 7, inf) 6 0.2% 100.0%
+Benchmark____1_chunk____10B-2 5000 1921505 ns/op 0.01 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 5 Avg: 1.21
+ Count: 5000 Min: 1 Max: 6 Avg: 1.21
------------------------------------------------------------
- [ 1, 2) 4571 91.4% 91.4% #########
- [ 2, 3) 106 2.1% 93.5%
- [ 3, 4) 23 0.5% 94.0%
- [ 4, 5) 284 5.7% 99.7% #
- [ 5, inf) 16 0.3% 100.0%
-Benchmark____1_chunk___100B 3000 2296619 ns/op 0.09 MB/s
+ [ 1, 2) 4576 91.5% 91.5% #########
+ [ 2, 3) 100 2.0% 93.5%
+ [ 3, 4) 27 0.5% 94.1%
+ [ 4, 5) 279 5.6% 99.6% #
+ [ 5, 6) 17 0.3% 100.0%
+ [ 6, inf) 1 0.0% 100.0%
+Benchmark____1_chunk___100B 3000 2282133 ns/op 0.09 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 12 Avg: 1.49
+ Count: 3000 Min: 1 Max: 11 Avg: 1.47
------------------------------------------------------------
- [ 1, 2) 2680 89.3% 89.3% #########
- [ 2, 3) 98 3.3% 92.6%
- [ 3, 4) 10 0.3% 92.9%
- [ 4, 5) 53 1.8% 94.7%
- [ 5, 6) 2 0.1% 94.8%
- [ 6, 8) 57 1.9% 96.7%
- [ 8, 10) 55 1.8% 98.5%
- [ 10, 13) 45 1.5% 100.0%
- [ 13, 16) 0 0.0% 100.0%
- [ 16, 20) 0 0.0% 100.0%
- [ 20, 24) 0 0.0% 100.0%
- [ 24, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___100B-2 5000 1971568 ns/op 0.10 MB/s
+ [ 1, 2) 2705 90.2% 90.2% #########
+ [ 2, 3) 66 2.2% 92.4%
+ [ 3, 4) 13 0.4% 92.8%
+ [ 4, 5) 59 2.0% 94.8%
+ [ 5, 6) 0 0.0% 94.8%
+ [ 6, 8) 68 2.3% 97.0%
+ [ 8, 10) 51 1.7% 98.7%
+ [ 10, 12) 38 1.3% 100.0%
+ [ 12, 15) 0 0.0% 100.0%
+ [ 15, 18) 0 0.0% 100.0%
+ [ 18, inf) 0 0.0% 100.0%
+Benchmark____1_chunk___100B-2 5000 1953792 ns/op 0.10 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 7 Avg: 1.26
+ Count: 5000 Min: 1 Max: 6 Avg: 1.25
------------------------------------------------------------
- [ 1, 2) 4521 90.4% 90.4% #########
- [ 2, 3) 257 5.1% 95.6% #
- [ 3, 4) 0 0.0% 95.6%
- [ 4, 5) 0 0.0% 95.6%
- [ 5, 6) 66 1.3% 96.9%
- [ 6, 7) 155 3.1% 100.0%
- [ 7, inf) 1 0.0% 100.0%
-Benchmark____1_chunk____1KB 3000 2399265 ns/op 0.83 MB/s
+ [ 1, 2) 4543 90.9% 90.9% #########
+ [ 2, 3) 234 4.7% 95.5%
+ [ 3, 4) 0 0.0% 95.5%
+ [ 4, 5) 0 0.0% 95.5%
+ [ 5, 6) 91 1.8% 97.4%
+ [ 6, inf) 132 2.6% 100.0%
+Benchmark____1_chunk____1KB 3000 2417281 ns/op 0.83 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 17 Avg: 1.56
+ Count: 3000 Min: 1 Max: 19 Avg: 1.63
------------------------------------------------------------
- [ 1, 2) 2695 89.8% 89.8% #########
- [ 2, 3) 146 4.9% 94.7%
- [ 3, 4) 3 0.1% 94.8%
- [ 4, 5) 1 0.0% 94.8%
- [ 5, 7) 42 1.4% 96.2%
- [ 7, 9) 0 0.0% 96.2%
- [ 9, 12) 43 1.4% 97.7%
- [ 12, 15) 42 1.4% 99.1%
- [ 15, 19) 28 0.9% 100.0%
- [ 19, 24) 0 0.0% 100.0%
+ [ 1, 2) 2522 84.1% 84.1% ########
+ [ 2, 3) 331 11.0% 95.1% #
+ [ 3, 4) 1 0.0% 95.1%
+ [ 4, 5) 1 0.0% 95.2%
+ [ 5, 7) 30 1.0% 96.2%
+ [ 7, 9) 2 0.1% 96.2%
+ [ 9, 12) 30 1.0% 97.2%
+ [ 12, 15) 49 1.6% 98.9%
+ [ 15, 19) 33 1.1% 100.0%
+ [ 19, 24) 1 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____1_chunk____1KB-2 5000 2143186 ns/op 0.93 MB/s
+ [ 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____1_chunk____1KB-2 5000 2015100 ns/op 0.99 MB/s
--- Histogram (unit: ms)
- Count: 5000 Min: 1 Max: 12 Avg: 1.47
+ Count: 5000 Min: 1 Max: 8 Avg: 1.30
------------------------------------------------------------
- [ 1, 2) 3732 74.6% 74.6% #######
- [ 2, 3) 1100 22.0% 96.6% ##
+ [ 1, 2) 4453 89.1% 89.1% #########
+ [ 2, 3) 379 7.6% 96.6% #
[ 3, 4) 0 0.0% 96.6%
[ 4, 5) 0 0.0% 96.6%
[ 5, 6) 0 0.0% 96.6%
- [ 6, 8) 52 1.0% 97.7%
- [ 8, 10) 62 1.2% 98.9%
- [ 10, 13) 54 1.1% 100.0%
- [ 13, 16) 0 0.0% 100.0%
- [ 16, 20) 0 0.0% 100.0%
- [ 20, 24) 0 0.0% 100.0%
- [ 24, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___10KB 3000 2829279 ns/op 7.07 MB/s
+ [ 6, 7) 0 0.0% 96.6%
+ [ 7, 9) 168 3.4% 100.0%
+ [ 9, inf) 0 0.0% 100.0%
+Benchmark____1_chunk___10KB 3000 2703920 ns/op 7.40 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 26 Avg: 2.72
+ Count: 3000 Min: 2 Max: 20 Avg: 2.61
------------------------------------------------------------
- [ 1, 2) 2 0.1% 0.1%
- [ 2, 3) 2859 95.3% 95.4% ##########
- [ 3, 4) 0 0.0% 95.4%
- [ 4, 5) 0 0.0% 95.4%
- [ 5, 7) 0 0.0% 95.4%
- [ 7, 9) 27 0.9% 96.3%
- [ 9, 12) 5 0.2% 96.4%
- [ 12, 16) 5 0.2% 96.6%
- [ 16, 21) 37 1.2% 97.8%
- [ 21, 27) 65 2.2% 100.0%
- [ 27, 35) 0 0.0% 100.0%
- [ 35, 45) 0 0.0% 100.0%
- [ 45, 58) 0 0.0% 100.0%
- [ 58, 74) 0 0.0% 100.0%
- [ 74, 94) 0 0.0% 100.0%
- [ 94, 118) 0 0.0% 100.0%
- [118, inf) 0 0.0% 100.0%
-Benchmark____1_chunk___10KB-2 3000 2402468 ns/op 8.32 MB/s
---- Histogram (unit: ms)
- Count: 3000 Min: 1 Max: 13 Avg: 2.00
- ------------------------------------------------------------
- [ 1, 2) 879 29.3% 29.3% ###
- [ 2, 3) 2021 67.4% 96.7% #######
- [ 3, 4) 0 0.0% 96.7%
- [ 4, 5) 0 0.0% 96.7%
- [ 5, 6) 0 0.0% 96.7%
- [ 6, 8) 0 0.0% 96.7%
- [ 8, 10) 24 0.8% 97.5%
- [ 10, 13) 49 1.6% 99.1%
- [ 13, 16) 27 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, inf) 0 0.0% 100.0%
-Benchmark____1_chunk__100KB 2000 5417885 ns/op 36.91 MB/s
---- Histogram (unit: ms)
- Count: 2000 Min: 3 Max: 29 Avg: 4.65
- ------------------------------------------------------------
- [ 3, 4) 1730 86.5% 86.5% #########
- [ 4, 5) 54 2.7% 89.2%
- [ 5, 6) 0 0.0% 89.2%
- [ 6, 7) 0 0.0% 89.2%
- [ 7, 9) 27 1.4% 90.6%
- [ 9, 11) 45 2.2% 92.8%
- [ 11, 14) 0 0.0% 92.8%
- [ 14, 18) 0 0.0% 92.8%
- [ 18, 23) 69 3.5% 96.2%
- [ 23, 30) 75 3.8% 100.0%
- [ 30, 38) 0 0.0% 100.0%
- [ 38, 48) 0 0.0% 100.0%
- [ 48, 61) 0 0.0% 100.0%
- [ 61, 77) 0 0.0% 100.0%
- [ 77, 97) 0 0.0% 100.0%
- [ 97, 122) 0 0.0% 100.0%
- [122, inf) 0 0.0% 100.0%
-Benchmark____1_chunk__100KB-2 2000 3784105 ns/op 52.85 MB/s
---- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 20 Avg: 3.10
- ------------------------------------------------------------
- [ 2, 3) 1356 67.8% 67.8% #######
- [ 3, 4) 448 22.4% 90.2% ##
- [ 4, 5) 57 2.9% 93.1%
- [ 5, 6) 0 0.0% 93.1%
- [ 6, 8) 0 0.0% 93.1%
- [ 8, 10) 0 0.0% 93.1%
- [ 10, 13) 55 2.8% 95.8%
- [ 13, 16) 59 3.0% 98.8%
- [ 16, 20) 24 1.2% 100.0%
- [ 20, 25) 1 0.1% 100.0%
+ [ 2, 3) 2858 95.3% 95.3% ##########
+ [ 3, 4) 0 0.0% 95.3%
+ [ 4, 5) 0 0.0% 95.3%
+ [ 5, 6) 0 0.0% 95.3%
+ [ 6, 8) 34 1.1% 96.4%
+ [ 8, 10) 1 0.0% 96.4%
+ [ 10, 13) 0 0.0% 96.4%
+ [ 13, 16) 34 1.1% 97.6%
+ [ 16, 20) 49 1.6% 99.2%
+ [ 20, 25) 24 0.8% 100.0%
[ 25, 31) 0 0.0% 100.0%
[ 31, 39) 0 0.0% 100.0%
[ 39, 49) 0 0.0% 100.0%
@@ -382,204 +308,216 @@
[ 61, 75) 0 0.0% 100.0%
[ 75, 92) 0 0.0% 100.0%
[ 92, inf) 0 0.0% 100.0%
-Benchmark___10_chunk_____1B 2000 3738398 ns/op 0.01 MB/s
+Benchmark____1_chunk___10KB-2 3000 2201032 ns/op 9.09 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 30 Avg: 3.18
+ Count: 3000 Min: 1 Max: 11 Avg: 1.48
------------------------------------------------------------
- [ 2, 3) 1091 54.6% 54.6% #####
- [ 3, 4) 828 41.4% 96.0% ####
+ [ 1, 2) 2307 76.9% 76.9% ########
+ [ 2, 3) 593 19.8% 96.7% ##
+ [ 3, 4) 0 0.0% 96.7%
+ [ 4, 5) 0 0.0% 96.7%
+ [ 5, 6) 0 0.0% 96.7%
+ [ 6, 8) 0 0.0% 96.7%
+ [ 8, 10) 50 1.7% 98.3%
+ [ 10, 12) 50 1.7% 100.0%
+ [ 12, 15) 0 0.0% 100.0%
+ [ 15, 18) 0 0.0% 100.0%
+ [ 18, inf) 0 0.0% 100.0%
+Benchmark____1_chunk__100KB 2000 5233249 ns/op 38.22 MB/s
+--- Histogram (unit: ms)
+ Count: 2000 Min: 3 Max: 27 Avg: 4.53
+ ------------------------------------------------------------
+ [ 3, 4) 1654 82.7% 82.7% ########
+ [ 4, 5) 130 6.5% 89.2% #
+ [ 5, 6) 0 0.0% 89.2%
+ [ 6, 7) 0 0.0% 89.2%
+ [ 7, 9) 70 3.5% 92.7%
+ [ 9, 11) 2 0.1% 92.8%
+ [ 11, 14) 0 0.0% 92.8%
+ [ 14, 18) 0 0.0% 92.8%
+ [ 18, 23) 87 4.4% 97.2%
+ [ 23, 29) 57 2.9% 100.0%
+ [ 29, 37) 0 0.0% 100.0%
+ [ 37, 47) 0 0.0% 100.0%
+ [ 47, 59) 0 0.0% 100.0%
+ [ 59, 74) 0 0.0% 100.0%
+ [ 74, 93) 0 0.0% 100.0%
+ [ 93, 117) 0 0.0% 100.0%
+ [117, inf) 0 0.0% 100.0%
+Benchmark____1_chunk__100KB-2 2000 3569385 ns/op 56.03 MB/s
+--- Histogram (unit: ms)
+ Count: 2000 Min: 2 Max: 13 Avg: 2.82
+ ------------------------------------------------------------
+ [ 2, 3) 1669 83.5% 83.5% ########
+ [ 3, 4) 163 8.2% 91.6% #
+ [ 4, 5) 29 1.5% 93.1%
+ [ 5, 6) 0 0.0% 93.1%
+ [ 6, 7) 0 0.0% 93.1%
+ [ 7, 9) 0 0.0% 93.1%
+ [ 9, 11) 0 0.0% 93.1%
+ [ 11, 14) 139 7.0% 100.0% #
+ [ 14, 17) 0 0.0% 100.0%
+ [ 17, 21) 0 0.0% 100.0%
+ [ 21, 25) 0 0.0% 100.0%
+ [ 25, inf) 0 0.0% 100.0%
+Benchmark___10_chunk_____1B 2000 3741137 ns/op 0.01 MB/s
+--- Histogram (unit: ms)
+ Count: 2000 Min: 2 Max: 29 Avg: 3.15
+ ------------------------------------------------------------
+ [ 2, 3) 1180 59.0% 59.0% ######
+ [ 3, 4) 739 37.0% 96.0% ####
[ 4, 5) 0 0.0% 96.0%
[ 5, 6) 0 0.0% 96.0%
- [ 6, 8) 1 0.1% 96.0%
- [ 8, 11) 0 0.0% 96.0%
- [ 11, 14) 19 1.0% 97.0%
+ [ 6, 8) 0 0.0% 96.0%
+ [ 8, 11) 3 0.2% 96.1%
+ [ 11, 14) 17 0.9% 97.0%
[ 14, 18) 0 0.0% 97.0%
- [ 18, 23) 19 1.0% 97.9%
+ [ 18, 23) 20 1.0% 98.0%
[ 23, 30) 41 2.1% 100.0%
- [ 30, 39) 1 0.1% 100.0%
+ [ 30, 39) 0 0.0% 100.0%
[ 39, 50) 0 0.0% 100.0%
- [ 50, 64) 0 0.0% 100.0%
- [ 64, 81) 0 0.0% 100.0%
- [ 81, 103) 0 0.0% 100.0%
- [103, 130) 0 0.0% 100.0%
- [130, inf) 0 0.0% 100.0%
-Benchmark___10_chunk_____1B-2 3000 2838899 ns/op 0.01 MB/s
+ [ 50, 63) 0 0.0% 100.0%
+ [ 63, 80) 0 0.0% 100.0%
+ [ 80, 101) 0 0.0% 100.0%
+ [101, 128) 0 0.0% 100.0%
+ [128, inf) 0 0.0% 100.0%
+Benchmark___10_chunk_____1B-2 3000 2846887 ns/op 0.01 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 2 Max: 17 Avg: 2.42
+ Count: 3000 Min: 2 Max: 18 Avg: 2.43
------------------------------------------------------------
- [ 2, 3) 2705 90.2% 90.2% #########
- [ 3, 4) 206 6.9% 97.0% #
+ [ 2, 3) 2700 90.0% 90.0% #########
+ [ 3, 4) 211 7.0% 97.0% #
[ 4, 5) 1 0.0% 97.1%
[ 5, 6) 0 0.0% 97.1%
[ 6, 8) 0 0.0% 97.1%
[ 8, 10) 0 0.0% 97.1%
- [ 10, 12) 4 0.1% 97.2%
- [ 12, 15) 43 1.4% 98.6%
- [ 15, 19) 41 1.4% 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, inf) 0 0.0% 100.0%
-Benchmark___10_chunk____10B 2000 3750396 ns/op 0.05 MB/s
+ [ 10, 13) 25 0.8% 97.9%
+ [ 13, 16) 31 1.0% 98.9%
+ [ 16, 20) 32 1.1% 100.0%
+ [ 20, 25) 0 0.0% 100.0%
+ [ 25, 31) 0 0.0% 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, 87) 0 0.0% 100.0%
+ [ 87, inf) 0 0.0% 100.0%
+Benchmark___10_chunk____10B 2000 3793093 ns/op 0.05 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 31 Avg: 3.15
+ Count: 2000 Min: 2 Max: 33 Avg: 3.19
------------------------------------------------------------
- [ 2, 3) 1179 59.0% 59.0% ######
- [ 3, 4) 747 37.4% 96.3% ####
- [ 4, 5) 0 0.0% 96.3%
- [ 5, 6) 0 0.0% 96.3%
- [ 6, 8) 0 0.0% 96.3%
- [ 8, 11) 0 0.0% 96.3%
- [ 11, 14) 18 0.9% 97.2%
+ [ 2, 3) 1187 59.4% 59.4% ######
+ [ 3, 4) 737 36.9% 96.2% ####
+ [ 4, 5) 0 0.0% 96.2%
+ [ 5, 6) 0 0.0% 96.2%
+ [ 6, 8) 0 0.0% 96.2%
+ [ 8, 11) 0 0.0% 96.2%
+ [ 11, 14) 20 1.0% 97.2%
[ 14, 18) 0 0.0% 97.2%
- [ 18, 24) 19 1.0% 98.2%
- [ 24, 31) 32 1.6% 99.8%
- [ 31, 40) 5 0.2% 100.0%
- [ 40, 51) 0 0.0% 100.0%
- [ 51, 65) 0 0.0% 100.0%
- [ 65, 83) 0 0.0% 100.0%
- [ 83, 106) 0 0.0% 100.0%
- [106, 134) 0 0.0% 100.0%
- [134, inf) 0 0.0% 100.0%
-Benchmark___10_chunk____10B-2 3000 2669872 ns/op 0.07 MB/s
+ [ 18, 24) 20 1.0% 98.2%
+ [ 24, 31) 2 0.1% 98.3%
+ [ 31, 40) 34 1.7% 100.0%
+ [ 40, 52) 0 0.0% 100.0%
+ [ 52, 67) 0 0.0% 100.0%
+ [ 67, 86) 0 0.0% 100.0%
+ [ 86, 110) 0 0.0% 100.0%
+ [110, 140) 0 0.0% 100.0%
+ [140, inf) 0 0.0% 100.0%
+Benchmark___10_chunk____10B-2 3000 2683120 ns/op 0.07 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 2 Max: 14 Avg: 2.37
+ Count: 3000 Min: 2 Max: 15 Avg: 2.39
------------------------------------------------------------
- [ 2, 3) 2712 90.4% 90.4% #########
- [ 3, 4) 208 6.9% 97.3% #
+ [ 2, 3) 2713 90.4% 90.4% #########
+ [ 3, 4) 207 6.9% 97.3% #
[ 4, 5) 0 0.0% 97.3%
[ 5, 6) 0 0.0% 97.3%
[ 6, 7) 0 0.0% 97.3%
[ 7, 9) 0 0.0% 97.3%
[ 9, 11) 0 0.0% 97.3%
- [ 11, 14) 52 1.7% 99.1%
- [ 14, 17) 28 0.9% 100.0%
+ [ 11, 14) 7 0.2% 97.6%
+ [ 14, 17) 73 2.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, inf) 0 0.0% 100.0%
-Benchmark___10_chunk___100B 2000 3830903 ns/op 0.52 MB/s
+ [ 32, 39) 0 0.0% 100.0%
+ [ 39, inf) 0 0.0% 100.0%
+Benchmark___10_chunk___100B 2000 3847823 ns/op 0.52 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 43 Avg: 3.34
+ Count: 2000 Min: 2 Max: 38 Avg: 3.35
------------------------------------------------------------
- [ 2, 3) 880 44.0% 44.0% ####
- [ 3, 4) 1052 52.6% 96.6% #####
- [ 4, 5) 3 0.2% 96.8%
+ [ 2, 3) 902 45.1% 45.1% #####
+ [ 3, 4) 1034 51.7% 96.8% #####
+ [ 4, 5) 0 0.0% 96.8%
[ 5, 7) 0 0.0% 96.8%
[ 7, 9) 0 0.0% 96.8%
[ 9, 12) 0 0.0% 96.8%
- [ 12, 16) 17 0.9% 97.6%
+ [ 12, 16) 16 0.8% 97.6%
[ 16, 21) 0 0.0% 97.6%
- [ 21, 28) 17 0.9% 98.5%
- [ 28, 37) 27 1.4% 99.8%
- [ 37, 48) 4 0.2% 100.0%
- [ 48, 63) 0 0.0% 100.0%
- [ 63, 82) 0 0.0% 100.0%
- [ 82, 106) 0 0.0% 100.0%
- [106, 138) 0 0.0% 100.0%
- [138, 178) 0 0.0% 100.0%
- [178, inf) 0 0.0% 100.0%
-Benchmark___10_chunk___100B-2 3000 2793961 ns/op 0.72 MB/s
+ [ 21, 27) 16 0.8% 98.4%
+ [ 27, 35) 0 0.0% 98.4%
+ [ 35, 45) 32 1.6% 100.0%
+ [ 45, 58) 0 0.0% 100.0%
+ [ 58, 75) 0 0.0% 100.0%
+ [ 75, 97) 0 0.0% 100.0%
+ [ 97, 125) 0 0.0% 100.0%
+ [125, 161) 0 0.0% 100.0%
+ [161, inf) 0 0.0% 100.0%
+Benchmark___10_chunk___100B-2 3000 2917670 ns/op 0.69 MB/s
--- Histogram (unit: ms)
- Count: 3000 Min: 2 Max: 21 Avg: 2.41
+ Count: 3000 Min: 2 Max: 23 Avg: 2.47
------------------------------------------------------------
- [ 2, 3) 2717 90.6% 90.6% #########
- [ 3, 4) 211 7.0% 97.6% #
- [ 4, 5) 0 0.0% 97.6%
+ [ 2, 3) 2687 89.6% 89.6% #########
+ [ 3, 4) 227 7.6% 97.1% #
+ [ 4, 5) 14 0.5% 97.6%
[ 5, 6) 0 0.0% 97.6%
[ 6, 8) 0 0.0% 97.6%
[ 8, 10) 0 0.0% 97.6%
[ 10, 13) 0 0.0% 97.6%
- [ 13, 16) 48 1.6% 99.2%
- [ 16, 20) 11 0.4% 99.6%
- [ 20, 25) 13 0.4% 100.0%
- [ 25, 32) 0 0.0% 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, 95) 0 0.0% 100.0%
- [ 95, inf) 0 0.0% 100.0%
-Benchmark___10_chunk____1KB 2000 4349817 ns/op 4.60 MB/s
+ [ 13, 17) 30 1.0% 98.6%
+ [ 17, 22) 37 1.2% 99.8%
+ [ 22, 28) 5 0.2% 100.0%
+ [ 28, 35) 0 0.0% 100.0%
+ [ 35, 44) 0 0.0% 100.0%
+ [ 44, 55) 0 0.0% 100.0%
+ [ 55, 68) 0 0.0% 100.0%
+ [ 68, 85) 0 0.0% 100.0%
+ [ 85, 105) 0 0.0% 100.0%
+ [105, inf) 0 0.0% 100.0%
+Benchmark___10_chunk____1KB 2000 4485605 ns/op 4.46 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 3 Max: 48 Avg: 4.07
+ Count: 2000 Min: 3 Max: 53 Avg: 4.14
------------------------------------------------------------
- [ 3, 4) 1907 95.4% 95.4% ##########
- [ 4, 5) 11 0.6% 95.9%
- [ 5, 6) 12 0.6% 96.5%
- [ 6, 8) 0 0.0% 96.5%
+ [ 3, 4) 1903 95.2% 95.2% ##########
+ [ 4, 5) 3 0.2% 95.3%
+ [ 5, 6) 11 0.6% 95.9%
+ [ 6, 8) 12 0.6% 96.5%
[ 8, 10) 0 0.0% 96.5%
[ 10, 13) 0 0.0% 96.5%
[ 13, 17) 0 0.0% 96.5%
- [ 17, 22) 21 1.1% 97.6%
- [ 22, 29) 0 0.0% 97.6%
- [ 29, 38) 21 1.1% 98.6%
- [ 38, 50) 28 1.4% 100.0%
- [ 50, 66) 0 0.0% 100.0%
- [ 66, 87) 0 0.0% 100.0%
- [ 87, 114) 0 0.0% 100.0%
- [114, 148) 0 0.0% 100.0%
- [148, 192) 0 0.0% 100.0%
- [192, inf) 0 0.0% 100.0%
-Benchmark___10_chunk____1KB-2 2000 3167146 ns/op 6.31 MB/s
+ [ 17, 23) 22 1.1% 97.6%
+ [ 23, 31) 0 0.0% 97.6%
+ [ 31, 41) 22 1.1% 98.7%
+ [ 41, 54) 27 1.4% 100.0%
+ [ 54, 71) 0 0.0% 100.0%
+ [ 71, 93) 0 0.0% 100.0%
+ [ 93, 122) 0 0.0% 100.0%
+ [122, 160) 0 0.0% 100.0%
+ [160, 210) 0 0.0% 100.0%
+ [210, inf) 0 0.0% 100.0%
+Benchmark___10_chunk____1KB-2 2000 3174383 ns/op 6.30 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 22 Avg: 2.53
+ Count: 2000 Min: 2 Max: 24 Avg: 2.56
------------------------------------------------------------
- [ 2, 3) 1734 86.7% 86.7% #########
- [ 3, 4) 210 10.5% 97.2% #
- [ 4, 5) 7 0.4% 97.6%
+ [ 2, 3) 1733 86.7% 86.7% #########
+ [ 3, 4) 198 9.9% 96.6% #
+ [ 4, 5) 20 1.0% 97.6%
[ 5, 6) 0 0.0% 97.6%
[ 6, 8) 0 0.0% 97.6%
[ 8, 10) 0 0.0% 97.6%
[ 10, 13) 0 0.0% 97.6%
- [ 13, 17) 13 0.7% 98.2%
- [ 17, 21) 17 0.9% 99.1%
- [ 21, 27) 19 1.0% 100.0%
- [ 27, 34) 0 0.0% 100.0%
- [ 34, 42) 0 0.0% 100.0%
- [ 42, 52) 0 0.0% 100.0%
- [ 52, 65) 0 0.0% 100.0%
- [ 65, 81) 0 0.0% 100.0%
- [ 81, 100) 0 0.0% 100.0%
- [100, inf) 0 0.0% 100.0%
-Benchmark___10_chunk___10KB 1000 6486765 ns/op 30.83 MB/s
---- Histogram (unit: ms)
- Count: 1000 Min: 4 Max: 50 Avg: 5.74
- ------------------------------------------------------------
- [ 4, 5) 821 82.1% 82.1% ########
- [ 5, 6) 128 12.8% 94.9% #
- [ 6, 7) 3 0.3% 95.2%
- [ 7, 9) 1 0.1% 95.3%
- [ 9, 11) 0 0.0% 95.3%
- [ 11, 14) 0 0.0% 95.3%
- [ 14, 18) 8 0.8% 96.1%
- [ 18, 23) 0 0.0% 96.1%
- [ 23, 30) 3 0.3% 96.4%
- [ 30, 39) 5 0.5% 96.9%
- [ 39, 51) 31 3.1% 100.0%
- [ 51, 67) 0 0.0% 100.0%
- [ 67, 88) 0 0.0% 100.0%
- [ 88, 115) 0 0.0% 100.0%
- [115, 150) 0 0.0% 100.0%
- [150, 195) 0 0.0% 100.0%
- [195, inf) 0 0.0% 100.0%
-Benchmark___10_chunk___10KB-2 2000 4310677 ns/op 46.40 MB/s
---- Histogram (unit: ms)
- Count: 2000 Min: 2 Max: 24 Avg: 3.84
- ------------------------------------------------------------
- [ 2, 3) 3 0.2% 0.2%
- [ 3, 4) 1762 88.1% 88.2% #########
- [ 4, 5) 33 1.7% 89.9%
- [ 5, 6) 124 6.2% 96.1% #
- [ 6, 8) 0 0.0% 96.1%
- [ 8, 10) 0 0.0% 96.1%
- [ 10, 13) 0 0.0% 96.1%
- [ 13, 17) 0 0.0% 96.1%
- [ 17, 22) 33 1.7% 97.8%
- [ 22, 28) 45 2.2% 100.0%
+ [ 13, 17) 1 0.1% 97.6%
+ [ 17, 22) 27 1.4% 99.0%
+ [ 22, 28) 21 1.1% 100.0%
[ 28, 35) 0 0.0% 100.0%
[ 35, 44) 0 0.0% 100.0%
[ 44, 55) 0 0.0% 100.0%
@@ -587,564 +525,633 @@
[ 69, 86) 0 0.0% 100.0%
[ 86, 107) 0 0.0% 100.0%
[107, inf) 0 0.0% 100.0%
-Benchmark___10_chunk__100KB 300 29183306 ns/op 68.53 MB/s
+Benchmark___10_chunk___10KB 1000 6269496 ns/op 31.90 MB/s
--- Histogram (unit: ms)
- Count: 300 Min: 21 Max: 71 Avg: 28.66
+ Count: 1000 Min: 4 Max: 46 Avg: 5.53
------------------------------------------------------------
- [ 21, 22) 186 62.0% 62.0% ######
- [ 22, 23) 31 10.3% 72.3% #
- [ 23, 24) 5 1.7% 74.0%
- [ 24, 26) 1 0.3% 74.3%
- [ 26, 28) 0 0.0% 74.3%
- [ 28, 31) 23 7.7% 82.0% #
- [ 31, 35) 1 0.3% 82.3%
- [ 35, 41) 0 0.0% 82.3%
- [ 41, 49) 0 0.0% 82.3%
- [ 49, 59) 25 8.3% 90.7% #
- [ 59, 72) 28 9.3% 100.0% #
- [ 72, 89) 0 0.0% 100.0%
- [ 89, 111) 0 0.0% 100.0%
- [111, 140) 0 0.0% 100.0%
- [140, 178) 0 0.0% 100.0%
- [178, 228) 0 0.0% 100.0%
- [228, inf) 0 0.0% 100.0%
-Benchmark___10_chunk__100KB-2 500 16030525 ns/op 124.76 MB/s
+ [ 4, 5) 884 88.4% 88.4% #########
+ [ 5, 6) 70 7.0% 95.4% #
+ [ 6, 7) 0 0.0% 95.4%
+ [ 7, 9) 0 0.0% 95.4%
+ [ 9, 11) 0 0.0% 95.4%
+ [ 11, 14) 0 0.0% 95.4%
+ [ 14, 18) 7 0.7% 96.1%
+ [ 18, 23) 0 0.0% 96.1%
+ [ 23, 30) 0 0.0% 96.1%
+ [ 30, 39) 7 0.7% 96.8%
+ [ 39, 51) 32 3.2% 100.0%
+ [ 51, 66) 0 0.0% 100.0%
+ [ 66, 85) 0 0.0% 100.0%
+ [ 85, 110) 0 0.0% 100.0%
+ [110, 142) 0 0.0% 100.0%
+ [142, 184) 0 0.0% 100.0%
+ [184, inf) 0 0.0% 100.0%
+Benchmark___10_chunk___10KB-2 2000 4354054 ns/op 45.93 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 11 Max: 38 Avg: 15.56
+ Count: 2000 Min: 2 Max: 26 Avg: 3.88
------------------------------------------------------------
- [ 11, 12) 88 17.6% 17.6% ##
- [ 12, 13) 295 59.0% 76.6% ######
- [ 13, 14) 14 2.8% 79.4%
- [ 14, 15) 1 0.2% 79.6%
- [ 15, 17) 6 1.2% 80.8%
- [ 17, 20) 9 1.8% 82.6%
- [ 20, 23) 0 0.0% 82.6%
- [ 23, 27) 0 0.0% 82.6%
- [ 27, 32) 37 7.4% 90.0% #
- [ 32, 39) 50 10.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, 110) 0 0.0% 100.0%
- [110, 137) 0 0.0% 100.0%
- [137, inf) 0 0.0% 100.0%
+ [ 2, 3) 3 0.2% 0.2%
+ [ 3, 4) 1758 87.9% 88.1% #########
+ [ 4, 5) 40 2.0% 90.1%
+ [ 5, 6) 120 6.0% 96.1% #
+ [ 6, 8) 1 0.1% 96.1%
+ [ 8, 10) 0 0.0% 96.1%
+ [ 10, 13) 0 0.0% 96.1%
+ [ 13, 17) 0 0.0% 96.1%
+ [ 17, 22) 30 1.5% 97.6%
+ [ 22, 28) 48 2.4% 100.0%
+ [ 28, 36) 0 0.0% 100.0%
+ [ 36, 46) 0 0.0% 100.0%
+ [ 46, 58) 0 0.0% 100.0%
+ [ 58, 73) 0 0.0% 100.0%
+ [ 73, 92) 0 0.0% 100.0%
+ [ 92, 116) 0 0.0% 100.0%
+ [116, inf) 0 0.0% 100.0%
+Benchmark___10_chunk__100KB 300 27690944 ns/op 72.23 MB/s
+--- Histogram (unit: ms)
+ Count: 300 Min: 21 Max: 58 Avg: 27.25
+ ------------------------------------------------------------
+ [ 21, 22) 209 69.7% 69.7% #######
+ [ 22, 23) 15 5.0% 74.7% #
+ [ 23, 24) 1 0.3% 75.0%
+ [ 24, 26) 0 0.0% 75.0%
+ [ 26, 28) 0 0.0% 75.0%
+ [ 28, 31) 22 7.3% 82.3% #
+ [ 31, 35) 0 0.0% 82.3%
+ [ 35, 40) 0 0.0% 82.3%
+ [ 40, 46) 0 0.0% 82.3%
+ [ 46, 54) 23 7.7% 90.0% #
+ [ 54, 65) 30 10.0% 100.0% #
+ [ 65, 79) 0 0.0% 100.0%
+ [ 79, 96) 0 0.0% 100.0%
+ [ 96, 118) 0 0.0% 100.0%
+ [118, 147) 0 0.0% 100.0%
+ [147, 183) 0 0.0% 100.0%
+ [183, inf) 0 0.0% 100.0%
+Benchmark___10_chunk__100KB-2 500 15686136 ns/op 127.50 MB/s
+--- Histogram (unit: ms)
+ Count: 500 Min: 11 Max: 37 Avg: 15.20
+ ------------------------------------------------------------
+ [ 11, 12) 147 29.4% 29.4% ###
+ [ 12, 13) 237 47.4% 76.8% #####
+ [ 13, 14) 11 2.2% 79.0%
+ [ 14, 15) 2 0.4% 79.4%
+ [ 15, 17) 14 2.8% 82.2%
+ [ 17, 19) 2 0.4% 82.6%
+ [ 19, 22) 0 0.0% 82.6%
+ [ 22, 26) 0 0.0% 82.6%
+ [ 26, 31) 49 9.8% 92.4% #
+ [ 31, 38) 38 7.6% 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, 105) 0 0.0% 100.0%
+ [105, 130) 0 0.0% 100.0%
+ [130, inf) 0 0.0% 100.0%
-Benchmark__100_chunk_____1B 500 14799281 ns/op 0.01 MB/s
+Benchmark__100_chunk_____1B 500 15105687 ns/op 0.01 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 14 Max: 16 Avg: 14.23
+ Count: 500 Min: 14 Max: 16 Avg: 14.60
------------------------------------------------------------
- [ 14, 15) 386 77.2% 77.2% ########
- [ 15, 16) 113 22.6% 99.8% ##
- [ 16, inf) 1 0.2% 100.0%
-Benchmark__100_chunk_____1B-2 1000 10135511 ns/op 0.02 MB/s
+ [ 14, 15) 222 44.4% 44.4% ####
+ [ 15, 16) 258 51.6% 96.0% #####
+ [ 16, inf) 20 4.0% 100.0%
+Benchmark__100_chunk_____1B-2 1000 10873485 ns/op 0.02 MB/s
--- Histogram (unit: ms)
- Count: 1000 Min: 8 Max: 11 Avg: 9.63
+ Count: 1000 Min: 8 Max: 13 Avg: 10.38
------------------------------------------------------------
- [ 8, 9) 11 1.1% 1.1%
- [ 9, 10) 432 43.2% 44.3% ####
- [ 10, 11) 477 47.7% 92.0% #####
- [ 11, inf) 80 8.0% 100.0% #
-Benchmark__100_chunk____10B 500 15137229 ns/op 0.13 MB/s
+ [ 8, 9) 5 0.5% 0.5%
+ [ 9, 10) 119 11.9% 12.4% #
+ [ 10, 11) 465 46.5% 58.9% #####
+ [ 11, 12) 316 31.6% 90.5% ###
+ [ 12, 13) 93 9.3% 99.8% #
+ [ 13, inf) 2 0.2% 100.0%
+Benchmark__100_chunk____10B 500 15092213 ns/op 0.13 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 14 Max: 18 Avg: 14.73
+ Count: 500 Min: 13 Max: 17 Avg: 14.67
------------------------------------------------------------
- [ 14, 15) 148 29.6% 29.6% ###
- [ 15, 16) 339 67.8% 97.4% #######
- [ 16, 17) 12 2.4% 99.8%
- [ 17, 18) 0 0.0% 99.8%
- [ 18, inf) 1 0.2% 100.0%
-Benchmark__100_chunk____10B-2 1000 10731944 ns/op 0.19 MB/s
---- Histogram (unit: ms)
- Count: 1000 Min: 8 Max: 12 Avg: 10.26
- ------------------------------------------------------------
- [ 8, 9) 12 1.2% 1.2%
- [ 9, 10) 159 15.9% 17.1% ##
- [ 10, 11) 421 42.1% 59.2% ####
- [ 11, 12) 375 37.5% 96.7% ####
- [ 12, inf) 33 3.3% 100.0%
-Benchmark__100_chunk___100B 500 15355974 ns/op 1.30 MB/s
---- Histogram (unit: ms)
- Count: 500 Min: 14 Max: 17 Avg: 14.83
- ------------------------------------------------------------
- [ 14, 15) 128 25.6% 25.6% ###
- [ 15, 16) 330 66.0% 91.6% #######
- [ 16, 17) 41 8.2% 99.8% #
+ [ 13, 14) 1 0.2% 0.2%
+ [ 14, 15) 174 34.8% 35.0% ###
+ [ 15, 16) 317 63.4% 98.4% ######
+ [ 16, 17) 7 1.4% 99.8%
[ 17, inf) 1 0.2% 100.0%
-Benchmark__100_chunk___100B-2 1000 10757797 ns/op 1.86 MB/s
+Benchmark__100_chunk____10B-2 1000 10896191 ns/op 0.18 MB/s
--- Histogram (unit: ms)
- Count: 1000 Min: 8 Max: 13 Avg: 10.25
+ Count: 1000 Min: 8 Max: 13 Avg: 10.39
------------------------------------------------------------
- [ 8, 9) 32 3.2% 3.2%
- [ 9, 10) 217 21.7% 24.9% ##
- [ 10, 11) 363 36.3% 61.2% ####
- [ 11, 12) 253 25.3% 86.5% ###
- [ 12, 13) 127 12.7% 99.2% #
- [ 13, inf) 8 0.8% 100.0%
-Benchmark__100_chunk____1KB 500 17505005 ns/op 11.43 MB/s
+ [ 8, 9) 10 1.0% 1.0%
+ [ 9, 10) 113 11.3% 12.3% #
+ [ 10, 11) 387 38.7% 51.0% ####
+ [ 11, 12) 458 45.8% 96.8% #####
+ [ 12, 13) 31 3.1% 99.9%
+ [ 13, inf) 1 0.1% 100.0%
+Benchmark__100_chunk___100B 500 15641654 ns/op 1.28 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 15 Max: 19 Avg: 17.03
+ Count: 500 Min: 13 Max: 17 Avg: 15.17
------------------------------------------------------------
- [ 15, 16) 51 10.2% 10.2% #
- [ 16, 17) 112 22.4% 32.6% ##
- [ 17, 18) 115 23.0% 55.6% ##
- [ 18, 19) 216 43.2% 98.8% ####
- [ 19, inf) 6 1.2% 100.0%
-Benchmark__100_chunk____1KB-2 1000 11660590 ns/op 17.15 MB/s
+ [ 13, 14) 1 0.2% 0.2%
+ [ 14, 15) 106 21.2% 21.4% ##
+ [ 15, 16) 208 41.6% 63.0% ####
+ [ 16, 17) 177 35.4% 98.4% ####
+ [ 17, inf) 8 1.6% 100.0%
+Benchmark__100_chunk___100B-2 1000 11037083 ns/op 1.81 MB/s
--- Histogram (unit: ms)
- Count: 1000 Min: 8 Max: 14 Avg: 11.15
+ Count: 1000 Min: 8 Max: 13 Avg: 10.53
------------------------------------------------------------
- [ 8, 9) 11 1.1% 1.1%
- [ 9, 10) 158 15.8% 16.9% ##
- [ 10, 11) 183 18.3% 35.2% ##
- [ 11, 12) 270 27.0% 62.2% ###
- [ 12, 13) 123 12.3% 74.5% #
- [ 13, 14) 206 20.6% 95.1% ##
- [ 14, inf) 49 4.9% 100.0%
-Benchmark__100_chunk___10KB 200 37914384 ns/op 52.75 MB/s
+ [ 8, 9) 21 2.1% 2.1%
+ [ 9, 10) 175 17.5% 19.6% ##
+ [ 10, 11) 285 28.5% 48.1% ###
+ [ 11, 12) 298 29.8% 77.9% ###
+ [ 12, 13) 211 21.1% 99.0% ##
+ [ 13, inf) 10 1.0% 100.0%
+Benchmark__100_chunk____1KB 500 17686556 ns/op 11.31 MB/s
--- Histogram (unit: ms)
- Count: 200 Min: 35 Max: 42 Avg: 37.35
+ Count: 500 Min: 15 Max: 21 Avg: 17.16
------------------------------------------------------------
- [ 35, 36) 9 4.5% 4.5%
- [ 36, 37) 4 2.0% 6.5%
- [ 37, 38) 120 60.0% 66.5% ######
- [ 38, 39) 52 26.0% 92.5% ###
- [ 39, 40) 8 4.0% 96.5%
- [ 40, 41) 5 2.5% 99.0%
- [ 41, 43) 2 1.0% 100.0%
- [ 43, inf) 0 0.0% 100.0%
-Benchmark__100_chunk___10KB-2 300 20888999 ns/op 95.74 MB/s
+ [ 15, 16) 30 6.0% 6.0% #
+ [ 16, 17) 125 25.0% 31.0% ###
+ [ 17, 18) 122 24.4% 55.4% ##
+ [ 18, 19) 191 38.2% 93.6% ####
+ [ 19, 20) 26 5.2% 98.8% #
+ [ 20, 21) 4 0.8% 99.6%
+ [ 21, inf) 2 0.4% 100.0%
+Benchmark__100_chunk____1KB-2 1000 11974933 ns/op 16.70 MB/s
--- Histogram (unit: ms)
- Count: 300 Min: 18 Max: 23 Avg: 20.38
+ Count: 1000 Min: 8 Max: 16 Avg: 11.48
------------------------------------------------------------
- [ 18, 19) 15 5.0% 5.0% #
- [ 19, 20) 11 3.7% 8.7%
- [ 20, 21) 135 45.0% 53.7% #####
- [ 21, 22) 125 41.7% 95.3% ####
- [ 22, 23) 13 4.3% 99.7%
- [ 23, inf) 1 0.3% 100.0%
-Benchmark__100_chunk__100KB 30 215706680 ns/op 92.72 MB/s
+ [ 8, 9) 6 0.6% 0.6%
+ [ 9, 10) 87 8.7% 9.3% #
+ [ 10, 11) 202 20.2% 29.5% ##
+ [ 11, 12) 246 24.6% 54.1% ##
+ [ 12, 13) 125 12.5% 66.6% #
+ [ 13, 15) 332 33.2% 99.8% ###
+ [ 15, 17) 2 0.2% 100.0%
+ [ 17, 19) 0 0.0% 100.0%
+ [ 19, inf) 0 0.0% 100.0%
+Benchmark__100_chunk___10KB 200 38603079 ns/op 51.81 MB/s
--- Histogram (unit: ms)
- Count: 30 Min: 210 Max: 220 Avg: 215.20
+ Count: 200 Min: 35 Max: 41 Avg: 38.10
------------------------------------------------------------
- [210, 211) 1 3.3% 3.3%
- [211, 212) 2 6.7% 10.0% #
- [212, 213) 0 0.0% 10.0%
- [213, 214) 9 30.0% 40.0% ###
- [214, 215) 4 13.3% 53.3% #
- [215, 217) 4 13.3% 66.7% #
- [217, 219) 1 3.3% 70.0%
- [219, 221) 9 30.0% 100.0% ###
- [221, 224) 0 0.0% 100.0%
- [224, 227) 0 0.0% 100.0%
- [227, inf) 0 0.0% 100.0%
-Benchmark__100_chunk__100KB-2 100 113221561 ns/op 176.64 MB/s
+ [ 35, 36) 5 2.5% 2.5%
+ [ 36, 37) 4 2.0% 4.5%
+ [ 37, 38) 21 10.5% 15.0% #
+ [ 38, 39) 123 61.5% 76.5% ######
+ [ 39, 40) 31 15.5% 92.0% ##
+ [ 40, 41) 15 7.5% 99.5% #
+ [ 41, inf) 1 0.5% 100.0%
+Benchmark__100_chunk___10KB-2 300 21864340 ns/op 91.47 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 108 Max: 120 Avg: 112.75
+ Count: 300 Min: 18 Max: 24 Avg: 21.35
------------------------------------------------------------
- [108, 109) 2 2.0% 2.0%
- [109, 110) 7 7.0% 9.0% #
- [110, 111) 3 3.0% 12.0%
- [111, 112) 16 16.0% 28.0% ##
- [112, 113) 20 20.0% 48.0% ##
- [113, 115) 29 29.0% 77.0% ###
- [115, 117) 20 20.0% 97.0% ##
- [117, 120) 2 2.0% 99.0%
- [120, 123) 1 1.0% 100.0%
- [123, 127) 0 0.0% 100.0%
- [127, 132) 0 0.0% 100.0%
- [132, 138) 0 0.0% 100.0%
- [138, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk_____1B 50 127031961 ns/op 0.02 MB/s
+ [ 18, 19) 6 2.0% 2.0%
+ [ 19, 20) 12 4.0% 6.0%
+ [ 20, 21) 36 12.0% 18.0% #
+ [ 21, 22) 94 31.3% 49.3% ###
+ [ 22, 23) 124 41.3% 90.7% ####
+ [ 23, 24) 24 8.0% 98.7% #
+ [ 24, inf) 4 1.3% 100.0%
+Benchmark__100_chunk__100KB 30 218748547 ns/op 91.43 MB/s
--- Histogram (unit: ms)
- Count: 50 Min: 123 Max: 131 Avg: 126.56
+ Count: 30 Min: 214 Max: 225 Avg: 218.23
+ ------------------------------------------------------------
+ [214, 215) 4 13.3% 13.3% #
+ [215, 216) 4 13.3% 26.7% #
+ [216, 217) 3 10.0% 36.7% #
+ [217, 218) 3 10.0% 46.7% #
+ [218, 219) 3 10.0% 56.7% #
+ [219, 221) 5 16.7% 73.3% ##
+ [221, 223) 4 13.3% 86.7% #
+ [223, 226) 4 13.3% 100.0% #
+ [226, 229) 0 0.0% 100.0%
+ [229, 233) 0 0.0% 100.0%
+ [233, 237) 0 0.0% 100.0%
+ [237, inf) 0 0.0% 100.0%
+Benchmark__100_chunk__100KB-2 50 113819574 ns/op 175.72 MB/s
+--- Histogram (unit: ms)
+ Count: 50 Min: 108 Max: 118 Avg: 113.30
+ ------------------------------------------------------------
+ [108, 109) 1 2.0% 2.0%
+ [109, 110) 2 4.0% 6.0%
+ [110, 111) 1 2.0% 8.0%
+ [111, 112) 9 18.0% 26.0% ##
+ [112, 113) 8 16.0% 42.0% ##
+ [113, 115) 10 20.0% 62.0% ##
+ [115, 117) 16 32.0% 94.0% ###
+ [117, 119) 3 6.0% 100.0% #
+ [119, 122) 0 0.0% 100.0%
+ [122, 125) 0 0.0% 100.0%
+ [125, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk_____1B 50 129084503 ns/op 0.02 MB/s
+--- Histogram (unit: ms)
+ Count: 50 Min: 123 Max: 135 Avg: 128.56
------------------------------------------------------------
[123, 124) 1 2.0% 2.0%
- [124, 125) 1 2.0% 4.0%
- [125, 126) 11 22.0% 26.0% ##
- [126, 127) 19 38.0% 64.0% ####
- [127, 128) 6 12.0% 76.0% #
- [128, 130) 8 16.0% 92.0% ##
- [130, 132) 4 8.0% 100.0% #
- [132, 134) 0 0.0% 100.0%
- [134, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk_____1B-2 100 82251965 ns/op 0.02 MB/s
+ [124, 125) 0 0.0% 2.0%
+ [125, 126) 1 2.0% 4.0%
+ [126, 127) 0 0.0% 4.0%
+ [127, 128) 9 18.0% 22.0% ##
+ [128, 130) 29 58.0% 80.0% ######
+ [130, 132) 6 12.0% 92.0% #
+ [132, 135) 3 6.0% 98.0% #
+ [135, 138) 1 2.0% 100.0%
+ [138, 142) 0 0.0% 100.0%
+ [142, 147) 0 0.0% 100.0%
+ [147, 153) 0 0.0% 100.0%
+ [153, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk_____1B-2 100 85455855 ns/op 0.02 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 75 Max: 93 Avg: 81.77
+ Count: 100 Min: 78 Max: 99 Avg: 84.98
------------------------------------------------------------
- [ 75, 76) 3 3.0% 3.0%
- [ 76, 77) 10 10.0% 13.0% #
- [ 77, 78) 6 6.0% 19.0% #
- [ 78, 79) 5 5.0% 24.0% #
- [ 79, 81) 17 17.0% 41.0% ##
- [ 81, 83) 17 17.0% 58.0% ##
- [ 83, 86) 27 27.0% 85.0% ###
- [ 86, 89) 6 6.0% 91.0% #
- [ 89, 93) 8 8.0% 99.0% #
- [ 93, 98) 1 1.0% 100.0%
- [ 98, 104) 0 0.0% 100.0%
- [104, 112) 0 0.0% 100.0%
- [112, 122) 0 0.0% 100.0%
- [122, 134) 0 0.0% 100.0%
- [134, 148) 0 0.0% 100.0%
- [148, 165) 0 0.0% 100.0%
- [165, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk____10B 50 126841430 ns/op 0.16 MB/s
+ [ 78, 79) 5 5.0% 5.0% #
+ [ 79, 80) 3 3.0% 8.0%
+ [ 80, 81) 8 8.0% 16.0% #
+ [ 81, 82) 10 10.0% 26.0% #
+ [ 82, 84) 12 12.0% 38.0% #
+ [ 84, 86) 19 19.0% 57.0% ##
+ [ 86, 89) 19 19.0% 76.0% ##
+ [ 89, 93) 21 21.0% 97.0% ##
+ [ 93, 98) 1 1.0% 98.0%
+ [ 98, 104) 2 2.0% 100.0%
+ [104, 111) 0 0.0% 100.0%
+ [111, 120) 0 0.0% 100.0%
+ [120, 131) 0 0.0% 100.0%
+ [131, 144) 0 0.0% 100.0%
+ [144, 161) 0 0.0% 100.0%
+ [161, 181) 0 0.0% 100.0%
+ [181, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk____10B 50 132496755 ns/op 0.15 MB/s
--- Histogram (unit: ms)
- Count: 50 Min: 121 Max: 130 Avg: 126.34
+ Count: 50 Min: 126 Max: 141 Avg: 131.96
------------------------------------------------------------
- [121, 122) 1 2.0% 2.0%
- [122, 123) 0 0.0% 2.0%
- [123, 124) 1 2.0% 4.0%
- [124, 125) 0 0.0% 4.0%
- [125, 126) 7 14.0% 18.0% #
- [126, 128) 31 62.0% 80.0% ######
- [128, 130) 9 18.0% 98.0% ##
- [130, 132) 1 2.0% 100.0%
- [132, 135) 0 0.0% 100.0%
- [135, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk____10B-2 100 80662645 ns/op 0.25 MB/s
---- Histogram (unit: ms)
- Count: 100 Min: 73 Max: 93 Avg: 80.11
- ------------------------------------------------------------
- [ 73, 74) 2 2.0% 2.0%
- [ 74, 75) 3 3.0% 5.0%
- [ 75, 76) 10 10.0% 15.0% #
- [ 76, 77) 12 12.0% 27.0% #
- [ 77, 79) 19 19.0% 46.0% ##
- [ 79, 81) 13 13.0% 59.0% #
- [ 81, 84) 20 20.0% 79.0% ##
- [ 84, 88) 12 12.0% 91.0% #
- [ 88, 92) 6 6.0% 97.0% #
- [ 92, 98) 3 3.0% 100.0%
- [ 98, 105) 0 0.0% 100.0%
- [105, 113) 0 0.0% 100.0%
- [113, 123) 0 0.0% 100.0%
- [123, 136) 0 0.0% 100.0%
- [136, 152) 0 0.0% 100.0%
- [152, 171) 0 0.0% 100.0%
- [171, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk___100B 50 130500666 ns/op 1.53 MB/s
---- Histogram (unit: ms)
- Count: 50 Min: 125 Max: 141 Avg: 129.98
- ------------------------------------------------------------
- [125, 126) 1 2.0% 2.0%
- [126, 127) 1 2.0% 4.0%
- [127, 128) 1 2.0% 6.0%
- [128, 129) 6 12.0% 18.0% #
- [129, 131) 27 54.0% 72.0% #####
- [131, 133) 8 16.0% 88.0% ##
- [133, 136) 4 8.0% 96.0% #
- [136, 139) 1 2.0% 98.0%
- [139, 143) 1 2.0% 100.0%
+ [126, 127) 1 2.0% 2.0%
+ [127, 128) 0 0.0% 2.0%
+ [128, 129) 1 2.0% 4.0%
+ [129, 130) 3 6.0% 10.0% #
+ [130, 132) 21 42.0% 52.0% ####
+ [132, 134) 13 26.0% 78.0% ###
+ [134, 136) 5 10.0% 88.0% #
+ [136, 139) 3 6.0% 94.0% #
+ [139, 143) 3 6.0% 100.0% #
[143, 148) 0 0.0% 100.0%
[148, 154) 0 0.0% 100.0%
[154, 161) 0 0.0% 100.0%
- [161, 170) 0 0.0% 100.0%
- [170, 181) 0 0.0% 100.0%
- [181, 194) 0 0.0% 100.0%
- [194, 210) 0 0.0% 100.0%
- [210, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk___100B-2 100 82993437 ns/op 2.41 MB/s
+ [161, 169) 0 0.0% 100.0%
+ [169, 179) 0 0.0% 100.0%
+ [179, 191) 0 0.0% 100.0%
+ [191, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk____10B-2 100 84457521 ns/op 0.24 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 72 Max: 93 Avg: 82.49
+ Count: 100 Min: 76 Max: 99 Avg: 83.95
------------------------------------------------------------
- [ 72, 73) 1 1.0% 1.0%
- [ 73, 74) 0 0.0% 1.0%
- [ 74, 75) 0 0.0% 1.0%
- [ 75, 76) 1 1.0% 2.0%
- [ 76, 78) 10 10.0% 12.0% #
- [ 78, 80) 14 14.0% 26.0% #
- [ 80, 83) 15 15.0% 41.0% ##
- [ 83, 87) 48 48.0% 89.0% #####
- [ 87, 92) 7 7.0% 96.0% #
- [ 92, 98) 4 4.0% 100.0%
- [ 98, 105) 0 0.0% 100.0%
- [105, 114) 0 0.0% 100.0%
- [114, 125) 0 0.0% 100.0%
- [125, 138) 0 0.0% 100.0%
- [138, 155) 0 0.0% 100.0%
- [155, 175) 0 0.0% 100.0%
- [175, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk____1KB 50 152120390 ns/op 13.15 MB/s
+ [ 76, 77) 1 1.0% 1.0%
+ [ 77, 78) 3 3.0% 4.0%
+ [ 78, 79) 6 6.0% 10.0% #
+ [ 79, 80) 6 6.0% 16.0% #
+ [ 80, 82) 11 11.0% 27.0% #
+ [ 82, 84) 23 23.0% 50.0% ##
+ [ 84, 87) 28 28.0% 78.0% ###
+ [ 87, 91) 13 13.0% 91.0% #
+ [ 91, 96) 8 8.0% 99.0% #
+ [ 96, 102) 1 1.0% 100.0%
+ [102, 110) 0 0.0% 100.0%
+ [110, 119) 0 0.0% 100.0%
+ [119, 131) 0 0.0% 100.0%
+ [131, 146) 0 0.0% 100.0%
+ [146, 164) 0 0.0% 100.0%
+ [164, 186) 0 0.0% 100.0%
+ [186, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk___100B 50 134022599 ns/op 1.49 MB/s
--- Histogram (unit: ms)
- Count: 50 Min: 145 Max: 161 Avg: 151.72
+ Count: 50 Min: 127 Max: 138 Avg: 133.44
------------------------------------------------------------
- [145, 146) 1 2.0% 2.0%
- [146, 147) 1 2.0% 4.0%
- [147, 148) 1 2.0% 6.0%
- [148, 149) 2 4.0% 10.0%
- [149, 151) 17 34.0% 44.0% ###
- [151, 153) 8 16.0% 60.0% ##
- [153, 156) 16 32.0% 92.0% ###
- [156, 159) 2 4.0% 96.0%
- [159, 163) 2 4.0% 100.0%
- [163, 168) 0 0.0% 100.0%
- [168, 174) 0 0.0% 100.0%
- [174, 181) 0 0.0% 100.0%
- [181, 190) 0 0.0% 100.0%
- [190, 201) 0 0.0% 100.0%
- [201, 214) 0 0.0% 100.0%
- [214, 230) 0 0.0% 100.0%
- [230, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk____1KB-2 100 91860277 ns/op 21.77 MB/s
+ [127, 128) 1 2.0% 2.0%
+ [128, 129) 0 0.0% 2.0%
+ [129, 130) 0 0.0% 2.0%
+ [130, 131) 1 2.0% 4.0%
+ [131, 132) 3 6.0% 10.0% #
+ [132, 134) 27 54.0% 64.0% #####
+ [134, 136) 11 22.0% 86.0% ##
+ [136, 139) 7 14.0% 100.0% #
+ [139, 142) 0 0.0% 100.0%
+ [142, 146) 0 0.0% 100.0%
+ [146, 150) 0 0.0% 100.0%
+ [150, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk___100B-2 100 85330166 ns/op 2.34 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 80 Max: 106 Avg: 91.33
+ Count: 100 Min: 76 Max: 96 Avg: 84.86
------------------------------------------------------------
- [ 80, 81) 2 2.0% 2.0%
- [ 81, 82) 2 2.0% 4.0%
- [ 82, 83) 3 3.0% 7.0%
- [ 83, 84) 4 4.0% 11.0%
- [ 84, 86) 10 10.0% 21.0% #
- [ 86, 88) 11 11.0% 32.0% #
- [ 88, 91) 14 14.0% 46.0% #
- [ 91, 95) 19 19.0% 65.0% ##
- [ 95, 100) 26 26.0% 91.0% ###
- [100, 107) 9 9.0% 100.0% #
+ [ 76, 77) 1 1.0% 1.0%
+ [ 77, 78) 2 2.0% 3.0%
+ [ 78, 79) 9 9.0% 12.0% #
+ [ 79, 80) 5 5.0% 17.0% #
+ [ 80, 82) 8 8.0% 25.0% #
+ [ 82, 84) 10 10.0% 35.0% #
+ [ 84, 87) 29 29.0% 64.0% ###
+ [ 87, 91) 25 25.0% 89.0% ###
+ [ 91, 95) 9 9.0% 98.0% #
+ [ 95, 101) 2 2.0% 100.0%
+ [101, 108) 0 0.0% 100.0%
+ [108, 116) 0 0.0% 100.0%
+ [116, 126) 0 0.0% 100.0%
+ [126, 139) 0 0.0% 100.0%
+ [139, 155) 0 0.0% 100.0%
+ [155, 174) 0 0.0% 100.0%
+ [174, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk____1KB 50 155794224 ns/op 12.84 MB/s
+--- Histogram (unit: ms)
+ Count: 50 Min: 148 Max: 164 Avg: 155.34
+ ------------------------------------------------------------
+ [148, 149) 1 2.0% 2.0%
+ [149, 150) 0 0.0% 2.0%
+ [150, 151) 0 0.0% 2.0%
+ [151, 152) 3 6.0% 8.0% #
+ [152, 154) 4 8.0% 16.0% #
+ [154, 156) 20 40.0% 56.0% ####
+ [156, 159) 17 34.0% 90.0% ###
+ [159, 162) 3 6.0% 96.0% #
+ [162, 166) 2 4.0% 100.0%
+ [166, 171) 0 0.0% 100.0%
+ [171, 177) 0 0.0% 100.0%
+ [177, 184) 0 0.0% 100.0%
+ [184, 193) 0 0.0% 100.0%
+ [193, 204) 0 0.0% 100.0%
+ [204, 217) 0 0.0% 100.0%
+ [217, 233) 0 0.0% 100.0%
+ [233, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk____1KB-2 100 95134335 ns/op 21.02 MB/s
+--- Histogram (unit: ms)
+ Count: 100 Min: 81 Max: 105 Avg: 94.59
+ ------------------------------------------------------------
+ [ 81, 82) 1 1.0% 1.0%
+ [ 82, 83) 1 1.0% 2.0%
+ [ 83, 84) 0 0.0% 2.0%
+ [ 84, 85) 1 1.0% 3.0%
+ [ 85, 87) 3 3.0% 6.0%
+ [ 87, 89) 10 10.0% 16.0% #
+ [ 89, 92) 6 6.0% 22.0% #
+ [ 92, 96) 31 31.0% 53.0% ###
+ [ 96, 101) 39 39.0% 92.0% ####
+ [101, 107) 8 8.0% 100.0% #
[107, 115) 0 0.0% 100.0%
[115, 125) 0 0.0% 100.0%
- [125, 138) 0 0.0% 100.0%
- [138, 154) 0 0.0% 100.0%
- [154, 174) 0 0.0% 100.0%
- [174, 199) 0 0.0% 100.0%
- [199, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk___10KB 20 337020835 ns/op 59.34 MB/s
+ [125, 137) 0 0.0% 100.0%
+ [137, 152) 0 0.0% 100.0%
+ [152, 171) 0 0.0% 100.0%
+ [171, 195) 0 0.0% 100.0%
+ [195, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk___10KB 20 340093645 ns/op 58.81 MB/s
--- Histogram (unit: ms)
- Count: 20 Min: 331 Max: 342 Avg: 336.50
+ Count: 20 Min: 331 Max: 352 Avg: 339.65
------------------------------------------------------------
[331, 332) 1 5.0% 5.0% #
[332, 333) 2 10.0% 15.0% #
- [333, 334) 1 5.0% 20.0% #
- [334, 335) 3 15.0% 35.0% ##
- [335, 336) 2 10.0% 45.0% #
- [336, 338) 2 10.0% 55.0% #
- [338, 340) 5 25.0% 80.0% ###
- [340, 343) 4 20.0% 100.0% ##
- [343, 346) 0 0.0% 100.0%
- [346, 350) 0 0.0% 100.0%
- [350, 354) 0 0.0% 100.0%
- [354, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk___10KB-2 50 177497001 ns/op 112.68 MB/s
+ [333, 334) 0 0.0% 15.0%
+ [334, 335) 0 0.0% 15.0%
+ [335, 337) 2 10.0% 25.0% #
+ [337, 339) 4 20.0% 45.0% ##
+ [339, 342) 5 25.0% 70.0% ###
+ [342, 346) 3 15.0% 85.0% ##
+ [346, 351) 2 10.0% 95.0% #
+ [351, 357) 1 5.0% 100.0% #
+ [357, 364) 0 0.0% 100.0%
+ [364, 373) 0 0.0% 100.0%
+ [373, 384) 0 0.0% 100.0%
+ [384, 397) 0 0.0% 100.0%
+ [397, 414) 0 0.0% 100.0%
+ [414, 434) 0 0.0% 100.0%
+ [434, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk___10KB-2 50 180545176 ns/op 110.78 MB/s
--- Histogram (unit: ms)
- Count: 50 Min: 172 Max: 183 Avg: 176.96
+ Count: 50 Min: 171 Max: 190 Avg: 180.06
------------------------------------------------------------
- [172, 173) 4 8.0% 8.0% #
- [173, 174) 2 4.0% 12.0%
- [174, 175) 8 16.0% 28.0% ##
- [175, 176) 4 8.0% 36.0% #
- [176, 177) 2 4.0% 40.0%
- [177, 179) 9 18.0% 58.0% ##
- [179, 181) 18 36.0% 94.0% ####
- [181, 184) 3 6.0% 100.0% #
- [184, 187) 0 0.0% 100.0%
- [187, 191) 0 0.0% 100.0%
- [191, 195) 0 0.0% 100.0%
- [195, inf) 0 0.0% 100.0%
-Benchmark___1K_chunk__100KB 3 2185333858 ns/op 91.52 MB/s
+ [171, 172) 1 2.0% 2.0%
+ [172, 173) 0 0.0% 2.0%
+ [173, 174) 1 2.0% 4.0%
+ [174, 175) 0 0.0% 4.0%
+ [175, 177) 7 14.0% 18.0% #
+ [177, 179) 8 16.0% 34.0% ##
+ [179, 182) 14 28.0% 62.0% ###
+ [182, 185) 16 32.0% 94.0% ###
+ [185, 189) 2 4.0% 98.0%
+ [189, 194) 1 2.0% 100.0%
+ [194, 201) 0 0.0% 100.0%
+ [201, 209) 0 0.0% 100.0%
+ [209, 219) 0 0.0% 100.0%
+ [219, 231) 0 0.0% 100.0%
+ [231, 246) 0 0.0% 100.0%
+ [246, 264) 0 0.0% 100.0%
+ [264, inf) 0 0.0% 100.0%
+Benchmark___1K_chunk__100KB 3 2241353636 ns/op 89.23 MB/s
--- Histogram (unit: s)
Count: 3 Min: 2 Max: 2 Avg: 2.00
------------------------------------------------------------
[ 2, inf) 3 100.0% 100.0% ##########
-Benchmark___1K_chunk__100KB-2 5 1140505127 ns/op 175.36 MB/s
+Benchmark___1K_chunk__100KB-2 5 1152111781 ns/op 173.59 MB/s
--- Histogram (unit: s)
Count: 5 Min: 1 Max: 1 Avg: 1.00
------------------------------------------------------------
[ 1, inf) 5 100.0% 100.0% ##########
-Benchmark__per_chunk____1B 50000 127847 ns/op 0.02 MB/s
-Benchmark__per_chunk____1B-2 100000 81496 ns/op 0.02 MB/s
-Benchmark__per_chunk___10B 50000 125213 ns/op 0.16 MB/s
-Benchmark__per_chunk___10B-2 100000 79532 ns/op 0.25 MB/s
-Benchmark__per_chunk__100B 50000 126242 ns/op 1.58 MB/s
-Benchmark__per_chunk__100B-2 100000 77971 ns/op 2.57 MB/s
-Benchmark__per_chunk___1KB 50000 148314 ns/op 13.48 MB/s
-Benchmark__per_chunk___1KB-2 100000 87787 ns/op 22.78 MB/s
-Benchmark__per_chunk__10KB 20000 323521 ns/op 61.82 MB/s
-Benchmark__per_chunk__10KB-2 50000 172500 ns/op 115.94 MB/s
-Benchmark__per_chunk_100KB 3000 2065561 ns/op 96.83 MB/s
-Benchmark__per_chunk_100KB-2 10000 1062338 ns/op 188.26 MB/s
+Benchmark__per_chunk____1B 50000 124707 ns/op 0.02 MB/s
+Benchmark__per_chunk____1B-2 100000 78017 ns/op 0.03 MB/s
+Benchmark__per_chunk___10B 50000 122584 ns/op 0.16 MB/s
+Benchmark__per_chunk___10B-2 100000 75094 ns/op 0.27 MB/s
+Benchmark__per_chunk__100B 50000 124183 ns/op 1.61 MB/s
+Benchmark__per_chunk__100B-2 100000 74955 ns/op 2.67 MB/s
+Benchmark__per_chunk___1KB 50000 144432 ns/op 13.85 MB/s
+Benchmark__per_chunk___1KB-2 100000 79305 ns/op 25.22 MB/s
+Benchmark__per_chunk__10KB 20000 314733 ns/op 63.55 MB/s
+Benchmark__per_chunk__10KB-2 50000 163532 ns/op 122.30 MB/s
+Benchmark__per_chunk_100KB 3000 2015176 ns/op 99.25 MB/s
+Benchmark__per_chunk_100KB-2 10000 1048505 ns/op 190.75 MB/s
-Benchmark___10B_mux__100_chunks___10B 500 16428840 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___10B 500 16408021 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 8 Max: 18 Avg: 16.03
+ Count: 500 Min: 7 Max: 18 Avg: 15.99
------------------------------------------------------------
- [ 8, 9) 4 0.8% 0.8%
- [ 9, 10) 0 0.0% 0.8%
- [ 10, 11) 0 0.0% 0.8%
- [ 11, 12) 1 0.2% 1.0%
- [ 12, 13) 3 0.6% 1.6%
- [ 13, 15) 5 1.0% 2.6%
- [ 15, 17) 403 80.6% 83.2% ########
- [ 17, 19) 84 16.8% 100.0% ##
+ [ 7, 8) 1 0.2% 0.2%
+ [ 8, 9) 2 0.4% 0.6%
+ [ 9, 10) 2 0.4% 1.0%
+ [ 10, 11) 0 0.0% 1.0%
+ [ 11, 12) 1 0.2% 1.2%
+ [ 12, 14) 8 1.6% 2.8%
+ [ 14, 16) 34 6.8% 9.6% #
+ [ 16, 19) 452 90.4% 100.0% #########
[ 19, 22) 0 0.0% 100.0%
- [ 22, 25) 0 0.0% 100.0%
- [ 25, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___10B-2 2000 4039798 ns/op 0.00 MB/s
+ [ 22, 26) 0 0.0% 100.0%
+ [ 26, 30) 0 0.0% 100.0%
+ [ 30, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks___10B-2 2000 3878477 ns/op 0.01 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 10 Avg: 3.55
+ Count: 2000 Min: 1 Max: 9 Avg: 3.39
------------------------------------------------------------
- [ 1, 2) 104 5.2% 5.2% #
- [ 2, 3) 588 29.4% 34.6% ###
- [ 3, 4) 397 19.9% 54.5% ##
- [ 4, 5) 375 18.8% 73.2% ##
- [ 5, 6) 278 13.9% 87.1% #
- [ 6, 8) 208 10.4% 97.5% #
- [ 8, 10) 48 2.4% 99.9%
- [ 10, 12) 2 0.1% 100.0%
- [ 12, 15) 0 0.0% 100.0%
- [ 15, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__100B 500 16959639 ns/op 0.00 MB/s
+ [ 1, 2) 122 6.1% 6.1% #
+ [ 2, 3) 599 30.0% 36.1% ###
+ [ 3, 4) 439 22.0% 58.0% ##
+ [ 4, 5) 389 19.5% 77.5% ##
+ [ 5, 6) 235 11.8% 89.2% #
+ [ 6, 8) 194 9.7% 98.9% #
+ [ 8, 10) 22 1.1% 100.0%
+ [ 10, 12) 0 0.0% 100.0%
+ [ 12, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__100B 500 17052264 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 10 Max: 19 Avg: 16.44
+ Count: 500 Min: 7 Max: 21 Avg: 16.57
------------------------------------------------------------
- [ 10, 11) 3 0.6% 0.6%
- [ 11, 12) 0 0.0% 0.6%
- [ 12, 13) 3 0.6% 1.2%
- [ 13, 14) 1 0.2% 1.4%
- [ 14, 15) 77 15.4% 16.8% ##
- [ 15, 17) 122 24.4% 41.2% ##
- [ 17, 19) 286 57.2% 98.4% ######
- [ 19, 21) 8 1.6% 100.0%
- [ 21, 24) 0 0.0% 100.0%
- [ 24, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__100B-2 2000 4129118 ns/op 0.00 MB/s
+ [ 7, 8) 1 0.2% 0.2%
+ [ 8, 9) 0 0.0% 0.2%
+ [ 9, 10) 0 0.0% 0.2%
+ [ 10, 11) 1 0.2% 0.4%
+ [ 11, 13) 1 0.2% 0.6%
+ [ 13, 15) 53 10.6% 11.2% #
+ [ 15, 17) 152 30.4% 41.6% ###
+ [ 17, 20) 281 56.2% 97.8% ######
+ [ 20, 24) 11 2.2% 100.0%
+ [ 24, 28) 0 0.0% 100.0%
+ [ 28, 33) 0 0.0% 100.0%
+ [ 33, 39) 0 0.0% 100.0%
+ [ 39, 47) 0 0.0% 100.0%
+ [ 47, 56) 0 0.0% 100.0%
+ [ 56, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__100B-2 2000 4022209 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 12 Avg: 3.64
+ Count: 2000 Min: 1 Max: 12 Avg: 3.53
------------------------------------------------------------
- [ 1, 2) 77 3.9% 3.9%
- [ 2, 3) 693 34.6% 38.5% ###
- [ 3, 4) 407 20.4% 58.9% ##
- [ 4, 5) 308 15.4% 74.2% ##
- [ 5, 6) 182 9.1% 83.4% #
- [ 6, 8) 213 10.7% 94.0% #
- [ 8, 10) 91 4.5% 98.6%
- [ 10, 13) 29 1.5% 100.0%
+ [ 1, 2) 99 5.0% 5.0%
+ [ 2, 3) 733 36.6% 41.6% ####
+ [ 3, 4) 384 19.2% 60.8% ##
+ [ 4, 5) 296 14.8% 75.6% #
+ [ 5, 6) 169 8.5% 84.1% #
+ [ 6, 8) 207 10.4% 94.4% #
+ [ 8, 10) 94 4.7% 99.1%
+ [ 10, 13) 18 0.9% 100.0%
[ 13, 16) 0 0.0% 100.0%
[ 16, 20) 0 0.0% 100.0%
[ 20, 24) 0 0.0% 100.0%
[ 24, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___1KB 500 19240324 ns/op 0.00 MB/s
+Benchmark___10B_mux__100_chunks___1KB 500 19001451 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 13 Max: 24 Avg: 18.60
+ Count: 500 Min: 7 Max: 23 Avg: 18.44
------------------------------------------------------------
- [ 13, 14) 1 0.2% 0.2%
- [ 14, 15) 0 0.0% 0.2%
- [ 15, 16) 0 0.0% 0.2%
- [ 16, 17) 152 30.4% 30.6% ###
- [ 17, 18) 75 15.0% 45.6% ##
- [ 18, 20) 58 11.6% 57.2% #
- [ 20, 22) 179 35.8% 93.0% ####
- [ 22, 25) 35 7.0% 100.0% #
- [ 25, 28) 0 0.0% 100.0%
- [ 28, 32) 0 0.0% 100.0%
- [ 32, 36) 0 0.0% 100.0%
- [ 36, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks___1KB-2 2000 4765628 ns/op 0.00 MB/s
+ [ 7, 8) 1 0.2% 0.2%
+ [ 8, 9) 0 0.0% 0.2%
+ [ 9, 10) 0 0.0% 0.2%
+ [ 10, 11) 0 0.0% 0.2%
+ [ 11, 13) 2 0.4% 0.6%
+ [ 13, 15) 3 0.6% 1.2%
+ [ 15, 18) 244 48.8% 50.0% #####
+ [ 18, 21) 64 12.8% 62.8% #
+ [ 21, 25) 186 37.2% 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, 76) 0 0.0% 100.0%
+ [ 76, 92) 0 0.0% 100.0%
+ [ 92, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks___1KB-2 2000 4690985 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 15 Avg: 4.29
+ Count: 2000 Min: 1 Max: 14 Avg: 4.20
------------------------------------------------------------
- [ 1, 2) 49 2.5% 2.5%
- [ 2, 3) 573 28.7% 31.1% ###
- [ 3, 4) 411 20.6% 51.7% ##
- [ 4, 5) 262 13.1% 64.8% #
- [ 5, 7) 369 18.4% 83.2% ##
- [ 7, 9) 150 7.5% 90.7% #
- [ 9, 11) 87 4.4% 95.1%
- [ 11, 14) 90 4.5% 99.6%
- [ 14, 18) 9 0.5% 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, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__10KB 200 38595003 ns/op 0.00 MB/s
+ [ 1, 2) 66 3.3% 3.3%
+ [ 2, 3) 547 27.4% 30.7% ###
+ [ 3, 4) 441 22.1% 52.7% ##
+ [ 4, 5) 267 13.4% 66.0% #
+ [ 5, 6) 228 11.4% 77.5% #
+ [ 6, 8) 213 10.7% 88.1% #
+ [ 8, 10) 118 5.9% 94.0% #
+ [ 10, 13) 95 4.8% 98.8%
+ [ 13, 16) 25 1.2% 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, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__10KB 200 39337476 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 200 Min: 8 Max: 43 Avg: 38.09
+ Count: 200 Min: 31 Max: 43 Avg: 38.81
------------------------------------------------------------
- [ 8, 9) 2 1.0% 1.0%
- [ 9, 10) 0 0.0% 1.0%
- [ 10, 11) 0 0.0% 1.0%
- [ 11, 13) 0 0.0% 1.0%
- [ 13, 15) 0 0.0% 1.0%
- [ 15, 18) 0 0.0% 1.0%
- [ 18, 22) 0 0.0% 1.0%
- [ 22, 27) 0 0.0% 1.0%
- [ 27, 33) 2 1.0% 2.0%
- [ 33, 41) 125 62.5% 64.5% ######
- [ 41, 51) 71 35.5% 100.0% ####
- [ 51, 64) 0 0.0% 100.0%
- [ 64, 81) 0 0.0% 100.0%
- [ 81, 102) 0 0.0% 100.0%
- [102, 129) 0 0.0% 100.0%
- [129, 163) 0 0.0% 100.0%
- [163, inf) 0 0.0% 100.0%
-Benchmark___10B_mux__100_chunks__10KB-2 500 13282699 ns/op 0.00 MB/s
+ [ 31, 32) 1 0.5% 0.5%
+ [ 32, 33) 0 0.0% 0.5%
+ [ 33, 34) 0 0.0% 0.5%
+ [ 34, 35) 28 14.0% 14.5% #
+ [ 35, 36) 18 9.0% 23.5% #
+ [ 36, 38) 43 21.5% 45.0% ##
+ [ 38, 40) 1 0.5% 45.5%
+ [ 40, 43) 77 38.5% 84.0% ####
+ [ 43, 46) 32 16.0% 100.0% ##
+ [ 46, 50) 0 0.0% 100.0%
+ [ 50, 55) 0 0.0% 100.0%
+ [ 55, 61) 0 0.0% 100.0%
+ [ 61, inf) 0 0.0% 100.0%
+Benchmark___10B_mux__100_chunks__10KB-2 500 12546220 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 1 Max: 27 Avg: 12.81
+ Count: 500 Min: 1 Max: 26 Avg: 12.06
------------------------------------------------------------
[ 1, 2) 12 2.4% 2.4%
- [ 2, 3) 87 17.4% 19.8% ##
- [ 3, 4) 19 3.8% 23.6%
- [ 4, 5) 19 3.8% 27.4%
- [ 5, 7) 23 4.6% 32.0%
- [ 7, 9) 25 5.0% 37.0% #
- [ 9, 12) 31 6.2% 43.2% #
- [ 12, 16) 45 9.0% 52.2% #
- [ 16, 21) 130 26.0% 78.2% ###
- [ 21, 28) 109 21.8% 100.0% ##
- [ 28, 36) 0 0.0% 100.0%
- [ 36, 46) 0 0.0% 100.0%
- [ 46, 59) 0 0.0% 100.0%
- [ 59, 75) 0 0.0% 100.0%
- [ 75, 95) 0 0.0% 100.0%
- [ 95, 120) 0 0.0% 100.0%
- [120, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___10B 100 89458344 ns/op 0.00 MB/s
+ [ 2, 3) 72 14.4% 16.8% #
+ [ 3, 4) 32 6.4% 23.2% #
+ [ 4, 5) 22 4.4% 27.6%
+ [ 5, 7) 32 6.4% 34.0% #
+ [ 7, 9) 26 5.2% 39.2% #
+ [ 9, 12) 39 7.8% 47.0% #
+ [ 12, 16) 61 12.2% 59.2% #
+ [ 16, 21) 105 21.0% 80.2% ##
+ [ 21, 27) 99 19.8% 100.0% ##
+ [ 27, 35) 0 0.0% 100.0%
+ [ 35, 45) 0 0.0% 100.0%
+ [ 45, 58) 0 0.0% 100.0%
+ [ 58, 74) 0 0.0% 100.0%
+ [ 74, 94) 0 0.0% 100.0%
+ [ 94, 118) 0 0.0% 100.0%
+ [118, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___10B 100 90698047 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 21 Max: 141 Avg: 88.95
+ Count: 100 Min: 3 Max: 146 Avg: 90.14
------------------------------------------------------------
- [ 21, 22) 1 1.0% 1.0%
- [ 22, 23) 0 0.0% 1.0%
- [ 23, 24) 0 0.0% 1.0%
- [ 24, 26) 0 0.0% 1.0%
- [ 26, 29) 2 2.0% 3.0%
- [ 29, 33) 1 1.0% 4.0%
- [ 33, 39) 1 1.0% 5.0%
- [ 39, 48) 5 5.0% 10.0% #
- [ 48, 60) 12 12.0% 22.0% #
- [ 60, 77) 18 18.0% 40.0% ##
- [ 77, 101) 21 21.0% 61.0% ##
- [101, 134) 33 33.0% 94.0% ###
- [134, 180) 6 6.0% 100.0% #
- [180, 243) 0 0.0% 100.0%
- [243, 330) 0 0.0% 100.0%
- [330, 449) 0 0.0% 100.0%
- [449, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___10B-2 2000 5537208 ns/op 0.00 MB/s
+ [ 3, 4) 1 1.0% 1.0%
+ [ 4, 5) 0 0.0% 1.0%
+ [ 5, 6) 3 3.0% 4.0%
+ [ 6, 8) 1 1.0% 5.0%
+ [ 8, 11) 0 0.0% 5.0%
+ [ 11, 16) 0 0.0% 5.0%
+ [ 16, 23) 2 2.0% 7.0%
+ [ 23, 33) 0 0.0% 7.0%
+ [ 33, 47) 4 4.0% 11.0%
+ [ 47, 66) 16 16.0% 27.0% ##
+ [ 66, 93) 28 28.0% 55.0% ###
+ [ 93, 131) 30 30.0% 85.0% ###
+ [131, 183) 15 15.0% 100.0% ##
+ [183, 256) 0 0.0% 100.0%
+ [256, 358) 0 0.0% 100.0%
+ [358, 501) 0 0.0% 100.0%
+ [501, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___10B-2 2000 5197620 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 46 Avg: 5.05
+ Count: 2000 Min: 1 Max: 44 Avg: 4.71
------------------------------------------------------------
- [ 1, 2) 36 1.8% 1.8%
- [ 2, 3) 785 39.2% 41.1% ####
- [ 3, 4) 580 29.0% 70.0% ###
- [ 4, 6) 266 13.3% 83.4% #
- [ 6, 8) 59 3.0% 86.3%
- [ 8, 11) 48 2.4% 88.7%
- [ 11, 15) 76 3.8% 92.5%
- [ 15, 20) 37 1.9% 94.4%
- [ 20, 27) 54 2.7% 97.1%
- [ 27, 36) 36 1.8% 98.9%
- [ 36, 48) 23 1.2% 100.0%
- [ 48, 64) 0 0.0% 100.0%
- [ 64, 85) 0 0.0% 100.0%
- [ 85, 112) 0 0.0% 100.0%
- [112, 146) 0 0.0% 100.0%
- [146, 190) 0 0.0% 100.0%
- [190, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__100B 100 95560922 ns/op 0.00 MB/s
+ [ 1, 2) 42 2.1% 2.1%
+ [ 2, 3) 914 45.7% 47.8% #####
+ [ 3, 4) 548 27.4% 75.2% ###
+ [ 4, 6) 191 9.6% 84.8% #
+ [ 6, 8) 48 2.4% 87.2%
+ [ 8, 11) 50 2.5% 89.7%
+ [ 11, 15) 76 3.8% 93.5%
+ [ 15, 20) 30 1.5% 95.0%
+ [ 20, 27) 46 2.3% 97.2%
+ [ 27, 36) 40 2.0% 99.2%
+ [ 36, 48) 15 0.8% 100.0%
+ [ 48, 63) 0 0.0% 100.0%
+ [ 63, 83) 0 0.0% 100.0%
+ [ 83, 109) 0 0.0% 100.0%
+ [109, 142) 0 0.0% 100.0%
+ [142, 185) 0 0.0% 100.0%
+ [185, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__100B 100 94502013 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 4 Max: 154 Avg: 95.10
+ Count: 100 Min: 4 Max: 157 Avg: 93.97
------------------------------------------------------------
[ 4, 5) 1 1.0% 1.0%
[ 5, 6) 0 0.0% 1.0%
@@ -1152,455 +1159,455 @@
[ 7, 9) 1 1.0% 2.0%
[ 9, 12) 0 0.0% 2.0%
[ 12, 17) 0 0.0% 2.0%
- [ 17, 24) 2 2.0% 4.0%
- [ 24, 34) 0 0.0% 4.0%
- [ 34, 48) 2 2.0% 6.0%
- [ 48, 68) 18 18.0% 24.0% ##
- [ 68, 96) 25 25.0% 49.0% ###
- [ 96, 135) 35 35.0% 84.0% ####
- [135, 190) 16 16.0% 100.0% ##
- [190, 266) 0 0.0% 100.0%
- [266, 373) 0 0.0% 100.0%
- [373, 522) 0 0.0% 100.0%
- [522, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__100B-2 2000 5772039 ns/op 0.00 MB/s
+ [ 17, 24) 0 0.0% 2.0%
+ [ 24, 34) 1 1.0% 3.0%
+ [ 34, 48) 3 3.0% 6.0%
+ [ 48, 68) 19 19.0% 25.0% ##
+ [ 68, 96) 27 27.0% 52.0% ###
+ [ 96, 136) 39 39.0% 91.0% ####
+ [136, 191) 9 9.0% 100.0% #
+ [191, 269) 0 0.0% 100.0%
+ [269, 378) 0 0.0% 100.0%
+ [378, 531) 0 0.0% 100.0%
+ [531, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__100B-2 2000 5453937 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 48 Avg: 5.29
+ Count: 2000 Min: 1 Max: 44 Avg: 4.96
------------------------------------------------------------
- [ 1, 2) 19 1.0% 1.0%
- [ 2, 3) 754 37.7% 38.7% ####
- [ 3, 4) 569 28.5% 67.1% ###
- [ 4, 6) 329 16.4% 83.6% ##
- [ 6, 8) 56 2.8% 86.4%
- [ 8, 11) 45 2.2% 88.6%
- [ 11, 15) 34 1.7% 90.3%
- [ 15, 21) 75 3.8% 94.1%
- [ 21, 28) 75 3.8% 97.8%
- [ 28, 38) 24 1.2% 99.0%
- [ 38, 51) 20 1.0% 100.0%
- [ 51, 67) 0 0.0% 100.0%
- [ 67, 88) 0 0.0% 100.0%
- [ 88, 116) 0 0.0% 100.0%
- [116, 152) 0 0.0% 100.0%
- [152, 198) 0 0.0% 100.0%
- [198, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___1KB 100 104839465 ns/op 0.00 MB/s
+ [ 1, 2) 28 1.4% 1.4%
+ [ 2, 3) 870 43.5% 44.9% ####
+ [ 3, 4) 565 28.2% 73.2% ###
+ [ 4, 6) 245 12.2% 85.4% #
+ [ 6, 8) 41 2.1% 87.5%
+ [ 8, 11) 42 2.1% 89.6%
+ [ 11, 15) 24 1.2% 90.8%
+ [ 15, 20) 73 3.7% 94.4%
+ [ 20, 27) 53 2.7% 97.1%
+ [ 27, 36) 37 1.9% 98.9%
+ [ 36, 48) 22 1.1% 100.0%
+ [ 48, 63) 0 0.0% 100.0%
+ [ 63, 83) 0 0.0% 100.0%
+ [ 83, 109) 0 0.0% 100.0%
+ [109, 142) 0 0.0% 100.0%
+ [142, 185) 0 0.0% 100.0%
+ [185, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___1KB 100 107052234 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 9 Max: 179 Avg: 104.38
+ Count: 100 Min: 9 Max: 169 Avg: 106.52
------------------------------------------------------------
- [ 9, 10) 3 3.0% 3.0%
- [ 10, 11) 0 0.0% 3.0%
- [ 11, 12) 1 1.0% 4.0%
- [ 12, 14) 1 1.0% 5.0%
- [ 14, 17) 0 0.0% 5.0%
- [ 17, 22) 0 0.0% 5.0%
- [ 22, 29) 0 0.0% 5.0%
- [ 29, 39) 3 3.0% 8.0%
- [ 39, 54) 3 3.0% 11.0%
- [ 54, 75) 9 9.0% 20.0% #
- [ 75, 105) 35 35.0% 55.0% ####
- [105, 148) 20 20.0% 75.0% ##
- [148, 208) 25 25.0% 100.0% ###
- [208, 293) 0 0.0% 100.0%
- [293, 413) 0 0.0% 100.0%
- [413, 583) 0 0.0% 100.0%
- [583, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks___1KB-2 1000 7235554 ns/op 0.00 MB/s
---- Histogram (unit: ms)
- Count: 1000 Min: 1 Max: 55 Avg: 6.74
- ------------------------------------------------------------
- [ 1, 2) 10 1.0% 1.0%
- [ 2, 3) 240 24.0% 25.0% ##
- [ 3, 4) 272 27.2% 52.2% ###
- [ 4, 6) 265 26.5% 78.7% ###
- [ 6, 8) 44 4.4% 83.1%
- [ 8, 11) 30 3.0% 86.1%
- [ 11, 15) 22 2.2% 88.3%
- [ 15, 21) 38 3.8% 92.1%
- [ 21, 29) 20 2.0% 94.1%
- [ 29, 39) 32 3.2% 97.3%
- [ 39, 53) 25 2.5% 99.8%
- [ 53, 71) 2 0.2% 100.0%
- [ 71, 95) 0 0.0% 100.0%
- [ 95, 126) 0 0.0% 100.0%
- [126, 167) 0 0.0% 100.0%
- [167, 221) 0 0.0% 100.0%
- [221, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__10KB 100 72299884 ns/op 0.00 MB/s
---- Histogram (unit: ms)
- Count: 100 Min: 8 Max: 122 Avg: 71.77
- ------------------------------------------------------------
- [ 8, 9) 1 1.0% 1.0%
- [ 9, 10) 0 0.0% 1.0%
+ [ 9, 10) 1 1.0% 1.0%
[ 10, 11) 0 0.0% 1.0%
- [ 11, 13) 0 0.0% 1.0%
- [ 13, 16) 0 0.0% 1.0%
- [ 16, 20) 4 4.0% 5.0%
- [ 20, 26) 0 0.0% 5.0%
- [ 26, 35) 4 4.0% 9.0%
- [ 35, 47) 11 11.0% 20.0% #
- [ 47, 64) 12 12.0% 32.0% #
- [ 64, 87) 42 42.0% 74.0% ####
- [ 87, 119) 24 24.0% 98.0% ##
- [119, 163) 2 2.0% 100.0%
- [163, 223) 0 0.0% 100.0%
- [223, 306) 0 0.0% 100.0%
- [306, 420) 0 0.0% 100.0%
- [420, inf) 0 0.0% 100.0%
-Benchmark___10B_mux___1K_chunks__10KB-2 200 36957063 ns/op 0.00 MB/s
+ [ 11, 12) 0 0.0% 1.0%
+ [ 12, 14) 0 0.0% 1.0%
+ [ 14, 17) 2 2.0% 3.0%
+ [ 17, 22) 0 0.0% 3.0%
+ [ 22, 29) 0 0.0% 3.0%
+ [ 29, 39) 1 1.0% 4.0%
+ [ 39, 53) 2 2.0% 6.0%
+ [ 53, 74) 14 14.0% 20.0% #
+ [ 74, 103) 38 38.0% 58.0% ####
+ [103, 144) 11 11.0% 69.0% #
+ [144, 201) 31 31.0% 100.0% ###
+ [201, 282) 0 0.0% 100.0%
+ [282, 396) 0 0.0% 100.0%
+ [396, 555) 0 0.0% 100.0%
+ [555, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks___1KB-2 2000 6698998 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 200 Min: 2 Max: 72 Avg: 36.49
+ Count: 2000 Min: 1 Max: 54 Avg: 6.20
------------------------------------------------------------
- [ 2, 3) 8 4.0% 4.0%
- [ 3, 4) 5 2.5% 6.5%
- [ 4, 5) 6 3.0% 9.5%
- [ 5, 7) 3 1.5% 11.0%
- [ 7, 10) 6 3.0% 14.0%
- [ 10, 14) 6 3.0% 17.0%
- [ 14, 19) 8 4.0% 21.0%
- [ 19, 26) 12 6.0% 27.0% #
- [ 26, 35) 31 15.5% 42.5% ##
- [ 35, 47) 48 24.0% 66.5% ##
- [ 47, 63) 52 26.0% 92.5% ###
- [ 63, 85) 15 7.5% 100.0% #
- [ 85, 114) 0 0.0% 100.0%
- [114, 153) 0 0.0% 100.0%
- [153, 205) 0 0.0% 100.0%
- [205, 274) 0 0.0% 100.0%
- [274, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks___10B 500 17595461 ns/op 0.11 MB/s
+ [ 1, 2) 7 0.4% 0.4%
+ [ 2, 3) 554 27.7% 28.1% ###
+ [ 3, 4) 655 32.8% 60.8% ###
+ [ 4, 6) 433 21.7% 82.5% ##
+ [ 6, 8) 59 3.0% 85.4%
+ [ 8, 11) 38 1.9% 87.3%
+ [ 11, 15) 41 2.1% 89.4%
+ [ 15, 21) 63 3.2% 92.5%
+ [ 21, 29) 45 2.2% 94.8%
+ [ 29, 39) 61 3.1% 97.8%
+ [ 39, 53) 40 2.0% 99.8%
+ [ 53, 71) 4 0.2% 100.0%
+ [ 71, 94) 0 0.0% 100.0%
+ [ 94, 125) 0 0.0% 100.0%
+ [125, 165) 0 0.0% 100.0%
+ [165, 218) 0 0.0% 100.0%
+ [218, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__10KB 100 72865483 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 7 Max: 35 Avg: 17.11
+ Count: 100 Min: 17 Max: 119 Avg: 72.31
------------------------------------------------------------
- [ 7, 8) 1 0.2% 0.2%
- [ 8, 9) 1 0.2% 0.4%
- [ 9, 10) 0 0.0% 0.4%
- [ 10, 11) 0 0.0% 0.4%
- [ 11, 13) 4 0.8% 1.2%
- [ 13, 16) 380 76.0% 77.2% ########
- [ 16, 19) 43 8.6% 85.8% #
- [ 19, 23) 2 0.4% 86.2%
- [ 23, 28) 14 2.8% 89.0%
- [ 28, 35) 54 10.8% 99.8% #
- [ 35, 44) 1 0.2% 100.0%
- [ 44, 55) 0 0.0% 100.0%
- [ 55, 69) 0 0.0% 100.0%
- [ 69, 86) 0 0.0% 100.0%
- [ 86, 108) 0 0.0% 100.0%
- [108, 135) 0 0.0% 100.0%
- [135, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks___10B-2 2000 4157817 ns/op 0.48 MB/s
+ [ 17, 18) 4 4.0% 4.0%
+ [ 18, 19) 2 2.0% 6.0%
+ [ 19, 20) 0 0.0% 6.0%
+ [ 20, 22) 1 1.0% 7.0%
+ [ 22, 25) 1 1.0% 8.0%
+ [ 25, 29) 0 0.0% 8.0%
+ [ 29, 35) 1 1.0% 9.0%
+ [ 35, 43) 8 8.0% 17.0% #
+ [ 43, 54) 7 7.0% 24.0% #
+ [ 54, 70) 17 17.0% 41.0% ##
+ [ 70, 91) 33 33.0% 74.0% ###
+ [ 91, 120) 26 26.0% 100.0% ###
+ [120, 160) 0 0.0% 100.0%
+ [160, 215) 0 0.0% 100.0%
+ [215, 289) 0 0.0% 100.0%
+ [289, 391) 0 0.0% 100.0%
+ [391, inf) 0 0.0% 100.0%
+Benchmark___10B_mux___1K_chunks__10KB-2 200 36049367 ns/op 0.00 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 22 Avg: 3.67
+ Count: 200 Min: 2 Max: 77 Avg: 35.57
------------------------------------------------------------
- [ 1, 2) 29 1.5% 1.5%
- [ 2, 3) 804 40.2% 41.7% ####
- [ 3, 4) 550 27.5% 69.2% ###
- [ 4, 5) 289 14.5% 83.6% #
- [ 5, 7) 160 8.0% 91.6% #
- [ 7, 9) 31 1.6% 93.2%
- [ 9, 12) 63 3.2% 96.3%
- [ 12, 16) 32 1.6% 97.9%
- [ 16, 21) 36 1.8% 99.7%
- [ 21, 27) 6 0.3% 100.0%
- [ 27, 34) 0 0.0% 100.0%
- [ 34, 43) 0 0.0% 100.0%
- [ 43, 54) 0 0.0% 100.0%
- [ 54, 67) 0 0.0% 100.0%
- [ 67, 84) 0 0.0% 100.0%
- [ 84, 104) 0 0.0% 100.0%
- [104, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks__100B 500 18203976 ns/op 0.11 MB/s
+ [ 2, 3) 9 4.5% 4.5%
+ [ 3, 4) 7 3.5% 8.0%
+ [ 4, 5) 3 1.5% 9.5%
+ [ 5, 7) 6 3.0% 12.5%
+ [ 7, 10) 6 3.0% 15.5%
+ [ 10, 14) 6 3.0% 18.5%
+ [ 14, 19) 9 4.5% 23.0%
+ [ 19, 26) 17 8.5% 31.5% #
+ [ 26, 36) 29 14.5% 46.0% #
+ [ 36, 49) 46 23.0% 69.0% ##
+ [ 49, 66) 54 27.0% 96.0% ###
+ [ 66, 89) 8 4.0% 100.0%
+ [ 89, 120) 0 0.0% 100.0%
+ [120, 162) 0 0.0% 100.0%
+ [162, 218) 0 0.0% 100.0%
+ [218, 292) 0 0.0% 100.0%
+ [292, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks___10B 500 17557482 ns/op 0.11 MB/s
--- Histogram (unit: ms)
- Count: 500 Min: 8 Max: 39 Avg: 17.78
+ Count: 500 Min: 11 Max: 35 Avg: 17.08
+ ------------------------------------------------------------
+ [ 11, 12) 4 0.8% 0.8%
+ [ 12, 13) 3 0.6% 1.4%
+ [ 13, 14) 0 0.0% 1.4%
+ [ 14, 15) 98 19.6% 21.0% ##
+ [ 15, 17) 317 63.4% 84.4% ######
+ [ 17, 19) 11 2.2% 86.6%
+ [ 19, 22) 2 0.4% 87.0%
+ [ 22, 26) 4 0.8% 87.8%
+ [ 26, 31) 6 1.2% 89.0%
+ [ 31, 37) 55 11.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, 82) 0 0.0% 100.0%
+ [ 82, 101) 0 0.0% 100.0%
+ [101, 125) 0 0.0% 100.0%
+ [125, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks___10B-2 2000 4004379 ns/op 0.50 MB/s
+--- Histogram (unit: ms)
+ Count: 2000 Min: 1 Max: 21 Avg: 3.51
+ ------------------------------------------------------------
+ [ 1, 2) 40 2.0% 2.0%
+ [ 2, 3) 894 44.7% 46.7% ####
+ [ 3, 4) 504 25.2% 71.9% ###
+ [ 4, 5) 259 13.0% 84.9% #
+ [ 5, 7) 124 6.2% 91.1% #
+ [ 7, 9) 35 1.8% 92.8%
+ [ 9, 12) 88 4.4% 97.2%
+ [ 12, 16) 32 1.6% 98.8%
+ [ 16, 20) 16 0.8% 99.6%
+ [ 20, 26) 8 0.4% 100.0%
+ [ 26, 33) 0 0.0% 100.0%
+ [ 33, 41) 0 0.0% 100.0%
+ [ 41, 51) 0 0.0% 100.0%
+ [ 51, 64) 0 0.0% 100.0%
+ [ 64, 80) 0 0.0% 100.0%
+ [ 80, 99) 0 0.0% 100.0%
+ [ 99, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks__100B 500 18342199 ns/op 0.11 MB/s
+--- Histogram (unit: ms)
+ Count: 500 Min: 8 Max: 39 Avg: 17.82
------------------------------------------------------------
[ 8, 9) 1 0.2% 0.2%
[ 9, 10) 0 0.0% 0.2%
[ 10, 11) 0 0.0% 0.2%
[ 11, 12) 0 0.0% 0.2%
- [ 12, 14) 5 1.0% 1.2%
- [ 14, 17) 405 81.0% 82.2% ########
- [ 17, 20) 21 4.2% 86.4%
- [ 20, 24) 1 0.2% 86.6%
- [ 24, 30) 8 1.6% 88.2%
- [ 30, 37) 54 10.8% 99.0% #
- [ 37, 46) 5 1.0% 100.0%
+ [ 12, 14) 4 0.8% 1.0%
+ [ 14, 17) 411 82.2% 83.2% ########
+ [ 17, 20) 15 3.0% 86.2%
+ [ 20, 24) 3 0.6% 86.8%
+ [ 24, 30) 7 1.4% 88.2%
+ [ 30, 37) 41 8.2% 96.4% #
+ [ 37, 46) 18 3.6% 100.0%
[ 46, 58) 0 0.0% 100.0%
[ 58, 73) 0 0.0% 100.0%
[ 73, 92) 0 0.0% 100.0%
[ 92, 116) 0 0.0% 100.0%
[116, 146) 0 0.0% 100.0%
[146, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks__100B-2 2000 4271254 ns/op 0.47 MB/s
+Benchmark___1KB_mux__100_chunks__100B-2 2000 4158739 ns/op 0.48 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 26 Avg: 3.79
+ Count: 2000 Min: 1 Max: 24 Avg: 3.66
------------------------------------------------------------
- [ 1, 2) 31 1.6% 1.6%
- [ 2, 3) 761 38.1% 39.6% ####
- [ 3, 4) 550 27.5% 67.1% ###
- [ 4, 5) 316 15.8% 82.9% ##
- [ 5, 7) 166 8.3% 91.2% #
- [ 7, 9) 25 1.2% 92.5%
- [ 9, 12) 65 3.2% 95.7%
- [ 12, 16) 48 2.4% 98.1%
- [ 16, 21) 22 1.1% 99.2%
- [ 21, 27) 16 0.8% 100.0%
+ [ 1, 2) 27 1.4% 1.4%
+ [ 2, 3) 875 43.8% 45.1% ####
+ [ 3, 4) 522 26.1% 71.2% ###
+ [ 4, 5) 257 12.9% 84.1% #
+ [ 5, 7) 153 7.7% 91.7% #
+ [ 7, 9) 19 1.0% 92.7%
+ [ 9, 12) 51 2.6% 95.2%
+ [ 12, 16) 58 2.9% 98.1%
+ [ 16, 21) 20 1.0% 99.1%
+ [ 21, 27) 18 0.9% 100.0%
[ 27, 35) 0 0.0% 100.0%
- [ 35, 45) 0 0.0% 100.0%
- [ 45, 58) 0 0.0% 100.0%
- [ 58, 74) 0 0.0% 100.0%
- [ 74, 94) 0 0.0% 100.0%
- [ 94, 118) 0 0.0% 100.0%
- [118, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks___1KB 300 20682669 ns/op 0.10 MB/s
+ [ 35, 44) 0 0.0% 100.0%
+ [ 44, 56) 0 0.0% 100.0%
+ [ 56, 71) 0 0.0% 100.0%
+ [ 71, 89) 0 0.0% 100.0%
+ [ 89, 111) 0 0.0% 100.0%
+ [111, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks___1KB 300 20721971 ns/op 0.10 MB/s
--- Histogram (unit: ms)
- Count: 300 Min: 13 Max: 41 Avg: 20.18
+ Count: 300 Min: 13 Max: 42 Avg: 20.25
------------------------------------------------------------
[ 13, 14) 1 0.3% 0.3%
- [ 14, 15) 2 0.7% 1.0%
- [ 15, 16) 0 0.0% 1.0%
- [ 16, 17) 0 0.0% 1.0%
- [ 17, 19) 245 81.7% 82.7% ########
- [ 19, 22) 8 2.7% 85.3%
- [ 22, 25) 5 1.7% 87.0%
- [ 25, 29) 0 0.0% 87.0%
- [ 29, 34) 1 0.3% 87.3%
- [ 34, 41) 28 9.3% 96.7% #
- [ 41, 50) 10 3.3% 100.0%
- [ 50, 61) 0 0.0% 100.0%
- [ 61, 75) 0 0.0% 100.0%
- [ 75, 92) 0 0.0% 100.0%
- [ 92, 114) 0 0.0% 100.0%
- [114, 141) 0 0.0% 100.0%
- [141, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks___1KB-2 2000 4950276 ns/op 0.40 MB/s
+ [ 14, 15) 0 0.0% 0.3%
+ [ 15, 16) 0 0.0% 0.3%
+ [ 16, 17) 21 7.0% 7.3% #
+ [ 17, 19) 213 71.0% 78.3% #######
+ [ 19, 22) 15 5.0% 83.3% #
+ [ 22, 25) 3 1.0% 84.3%
+ [ 25, 29) 7 2.3% 86.7%
+ [ 29, 35) 8 2.7% 89.3%
+ [ 35, 42) 31 10.3% 99.7% #
+ [ 42, 51) 1 0.3% 100.0%
+ [ 51, 62) 0 0.0% 100.0%
+ [ 62, 76) 0 0.0% 100.0%
+ [ 76, 94) 0 0.0% 100.0%
+ [ 94, 117) 0 0.0% 100.0%
+ [117, 145) 0 0.0% 100.0%
+ [145, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks___1KB-2 2000 4859684 ns/op 0.41 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 26 Avg: 4.46
+ Count: 2000 Min: 1 Max: 27 Avg: 4.37
------------------------------------------------------------
- [ 1, 2) 12 0.6% 0.6%
- [ 2, 3) 546 27.3% 27.9% ###
- [ 3, 4) 517 25.9% 53.8% ###
- [ 4, 5) 354 17.7% 71.5% ##
- [ 5, 7) 341 17.1% 88.5% ##
- [ 7, 9) 60 3.0% 91.5%
- [ 9, 12) 37 1.9% 93.4%
- [ 12, 16) 76 3.8% 97.2%
- [ 16, 21) 20 1.0% 98.2%
- [ 21, 27) 37 1.9% 100.0%
- [ 27, 35) 0 0.0% 100.0%
- [ 35, 45) 0 0.0% 100.0%
- [ 45, 58) 0 0.0% 100.0%
- [ 58, 74) 0 0.0% 100.0%
- [ 74, 94) 0 0.0% 100.0%
- [ 94, 118) 0 0.0% 100.0%
- [118, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks__10KB 200 39416624 ns/op 0.05 MB/s
+ [ 1, 2) 16 0.8% 0.8%
+ [ 2, 3) 597 29.9% 30.7% ###
+ [ 3, 4) 522 26.1% 56.8% ###
+ [ 4, 5) 321 16.1% 72.8% ##
+ [ 5, 7) 331 16.6% 89.4% ##
+ [ 7, 9) 57 2.9% 92.2%
+ [ 9, 12) 30 1.5% 93.7%
+ [ 12, 16) 65 3.2% 97.0%
+ [ 16, 21) 25 1.2% 98.2%
+ [ 21, 28) 36 1.8% 100.0%
+ [ 28, 36) 0 0.0% 100.0%
+ [ 36, 46) 0 0.0% 100.0%
+ [ 46, 59) 0 0.0% 100.0%
+ [ 59, 75) 0 0.0% 100.0%
+ [ 75, 95) 0 0.0% 100.0%
+ [ 95, 120) 0 0.0% 100.0%
+ [120, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks__10KB 200 41306487 ns/op 0.05 MB/s
--- Histogram (unit: ms)
- Count: 200 Min: 14 Max: 57 Avg: 38.98
+ Count: 200 Min: 14 Max: 62 Avg: 40.84
------------------------------------------------------------
- [ 14, 15) 2 1.0% 1.0%
- [ 15, 16) 0 0.0% 1.0%
- [ 16, 17) 0 0.0% 1.0%
- [ 17, 19) 2 1.0% 2.0%
- [ 19, 21) 0 0.0% 2.0%
- [ 21, 24) 0 0.0% 2.0%
- [ 24, 28) 0 0.0% 2.0%
- [ 28, 33) 4 2.0% 4.0%
- [ 33, 40) 130 65.0% 69.0% #######
- [ 40, 49) 16 8.0% 77.0% #
- [ 49, 61) 46 23.0% 100.0% ##
- [ 61, 76) 0 0.0% 100.0%
- [ 76, 96) 0 0.0% 100.0%
- [ 96, 122) 0 0.0% 100.0%
- [122, 155) 0 0.0% 100.0%
- [155, 198) 0 0.0% 100.0%
- [198, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux__100_chunks__10KB-2 500 13370112 ns/op 0.15 MB/s
+ [ 14, 15) 1 0.5% 0.5%
+ [ 15, 16) 0 0.0% 0.5%
+ [ 16, 17) 1 0.5% 1.0%
+ [ 17, 19) 0 0.0% 1.0%
+ [ 19, 21) 0 0.0% 1.0%
+ [ 21, 24) 1 0.5% 1.5%
+ [ 24, 28) 0 0.0% 1.5%
+ [ 28, 34) 7 3.5% 5.0%
+ [ 34, 41) 123 61.5% 66.5% ######
+ [ 41, 51) 20 10.0% 76.5% #
+ [ 51, 64) 47 23.5% 100.0% ##
+ [ 64, 81) 0 0.0% 100.0%
+ [ 81, 103) 0 0.0% 100.0%
+ [103, 131) 0 0.0% 100.0%
+ [131, 168) 0 0.0% 100.0%
+ [168, 215) 0 0.0% 100.0%
+ [215, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux__100_chunks__10KB-2 500 13333632 ns/op 0.15 MB/s
--- Histogram (unit: ms)
Count: 500 Min: 1 Max: 35 Avg: 12.88
------------------------------------------------------------
[ 1, 2) 6 1.2% 1.2%
- [ 2, 3) 94 18.8% 20.0% ##
- [ 3, 4) 29 5.8% 25.8% #
- [ 4, 6) 22 4.4% 30.2%
- [ 6, 8) 15 3.0% 33.2%
- [ 8, 11) 55 11.0% 44.2% #
- [ 11, 15) 31 6.2% 50.4% #
- [ 15, 20) 174 34.8% 85.2% ###
- [ 20, 26) 14 2.8% 88.0%
- [ 26, 34) 54 10.8% 98.8% #
- [ 34, 44) 6 1.2% 100.0%
+ [ 2, 3) 85 17.0% 18.2% ##
+ [ 3, 4) 28 5.6% 23.8% #
+ [ 4, 6) 21 4.2% 28.0%
+ [ 6, 8) 24 4.8% 32.8%
+ [ 8, 11) 58 11.6% 44.4% #
+ [ 11, 15) 41 8.2% 52.6% #
+ [ 15, 20) 164 32.8% 85.4% ###
+ [ 20, 26) 11 2.2% 87.6%
+ [ 26, 34) 59 11.8% 99.4% #
+ [ 34, 44) 3 0.6% 100.0%
[ 44, 57) 0 0.0% 100.0%
[ 57, 73) 0 0.0% 100.0%
[ 73, 94) 0 0.0% 100.0%
[ 94, 120) 0 0.0% 100.0%
[120, 153) 0 0.0% 100.0%
[153, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks___10B 100 95315574 ns/op 0.02 MB/s
+Benchmark___1KB_mux___1K_chunks___10B 100 95489036 ns/op 0.02 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 23 Max: 150 Avg: 94.81
+ Count: 100 Min: 6 Max: 149 Avg: 95.00
------------------------------------------------------------
- [ 23, 24) 1 1.0% 1.0%
- [ 24, 25) 0 0.0% 1.0%
- [ 25, 26) 0 0.0% 1.0%
- [ 26, 28) 1 1.0% 2.0%
- [ 28, 31) 0 0.0% 2.0%
- [ 31, 36) 1 1.0% 3.0%
- [ 36, 42) 2 2.0% 5.0%
- [ 42, 51) 5 5.0% 10.0% #
- [ 51, 64) 7 7.0% 17.0% #
- [ 64, 82) 17 17.0% 34.0% ##
- [ 82, 107) 24 24.0% 58.0% ##
- [107, 141) 38 38.0% 96.0% ####
- [141, 189) 4 4.0% 100.0%
- [189, 255) 0 0.0% 100.0%
- [255, 346) 0 0.0% 100.0%
- [346, 472) 0 0.0% 100.0%
- [472, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks___10B-2 2000 5107260 ns/op 0.39 MB/s
+ [ 6, 7) 1 1.0% 1.0%
+ [ 7, 8) 0 0.0% 1.0%
+ [ 8, 9) 0 0.0% 1.0%
+ [ 9, 11) 1 1.0% 2.0%
+ [ 11, 14) 0 0.0% 2.0%
+ [ 14, 19) 0 0.0% 2.0%
+ [ 19, 26) 0 0.0% 2.0%
+ [ 26, 36) 3 3.0% 5.0%
+ [ 36, 50) 8 8.0% 13.0% #
+ [ 50, 69) 10 10.0% 23.0% #
+ [ 69, 96) 21 21.0% 44.0% ##
+ [ 96, 134) 38 38.0% 82.0% ####
+ [134, 186) 18 18.0% 100.0% ##
+ [186, 259) 0 0.0% 100.0%
+ [259, 361) 0 0.0% 100.0%
+ [361, 504) 0 0.0% 100.0%
+ [504, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks___10B-2 2000 5187056 ns/op 0.39 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 46 Avg: 4.61
+ Count: 2000 Min: 1 Max: 49 Avg: 4.70
------------------------------------------------------------
- [ 1, 2) 15 0.8% 0.8%
- [ 2, 3) 792 39.6% 40.4% ####
- [ 3, 4) 669 33.5% 73.8% ###
- [ 4, 6) 289 14.5% 88.2% #
- [ 6, 8) 28 1.4% 89.7%
- [ 8, 11) 23 1.2% 90.8%
- [ 11, 15) 34 1.7% 92.5%
- [ 15, 20) 36 1.8% 94.3%
- [ 20, 27) 71 3.6% 97.9%
- [ 27, 36) 37 1.9% 99.7%
- [ 36, 48) 6 0.3% 100.0%
- [ 48, 64) 0 0.0% 100.0%
- [ 64, 85) 0 0.0% 100.0%
- [ 85, 112) 0 0.0% 100.0%
- [112, 146) 0 0.0% 100.0%
- [146, 190) 0 0.0% 100.0%
- [190, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks__100B 100 94447578 ns/op 0.02 MB/s
+ [ 1, 2) 19 1.0% 1.0%
+ [ 2, 3) 848 42.4% 43.4% ####
+ [ 3, 4) 637 31.9% 75.2% ###
+ [ 4, 6) 247 12.4% 87.6% #
+ [ 6, 8) 26 1.3% 88.9%
+ [ 8, 11) 19 1.0% 89.8%
+ [ 11, 15) 44 2.2% 92.0%
+ [ 15, 21) 40 2.0% 94.0%
+ [ 21, 28) 93 4.7% 98.7%
+ [ 28, 38) 24 1.2% 99.9%
+ [ 38, 51) 3 0.2% 100.0%
+ [ 51, 68) 0 0.0% 100.0%
+ [ 68, 90) 0 0.0% 100.0%
+ [ 90, 118) 0 0.0% 100.0%
+ [118, 155) 0 0.0% 100.0%
+ [155, 202) 0 0.0% 100.0%
+ [202, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks__100B 100 96851485 ns/op 0.02 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 2 Max: 149 Avg: 93.96
+ Count: 100 Min: 16 Max: 168 Avg: 96.35
------------------------------------------------------------
- [ 2, 3) 1 1.0% 1.0%
- [ 3, 4) 0 0.0% 1.0%
- [ 4, 5) 0 0.0% 1.0%
- [ 5, 7) 0 0.0% 1.0%
- [ 7, 10) 2 2.0% 3.0%
- [ 10, 15) 0 0.0% 3.0%
- [ 15, 22) 1 1.0% 4.0%
- [ 22, 32) 2 2.0% 6.0%
- [ 32, 46) 7 7.0% 13.0% #
- [ 46, 65) 9 9.0% 22.0% #
- [ 65, 92) 20 20.0% 42.0% ##
- [ 92, 130) 40 40.0% 82.0% ####
- [130, 184) 18 18.0% 100.0% ##
- [184, 259) 0 0.0% 100.0%
- [259, 364) 0 0.0% 100.0%
- [364, 511) 0 0.0% 100.0%
- [511, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks__100B-2 2000 5333802 ns/op 0.37 MB/s
+ [ 16, 17) 1 1.0% 1.0%
+ [ 17, 18) 1 1.0% 2.0%
+ [ 18, 19) 0 0.0% 2.0%
+ [ 19, 21) 0 0.0% 2.0%
+ [ 21, 24) 0 0.0% 2.0%
+ [ 24, 29) 2 2.0% 4.0%
+ [ 29, 36) 2 2.0% 6.0%
+ [ 36, 46) 2 2.0% 8.0%
+ [ 46, 60) 7 7.0% 15.0% #
+ [ 60, 80) 16 16.0% 31.0% ##
+ [ 80, 108) 29 29.0% 60.0% ###
+ [108, 147) 36 36.0% 96.0% ####
+ [147, 202) 4 4.0% 100.0%
+ [202, 279) 0 0.0% 100.0%
+ [279, 387) 0 0.0% 100.0%
+ [387, 538) 0 0.0% 100.0%
+ [538, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks__100B-2 2000 5385397 ns/op 0.37 MB/s
--- Histogram (unit: ms)
- Count: 2000 Min: 1 Max: 55 Avg: 4.84
+ Count: 2000 Min: 1 Max: 56 Avg: 4.88
------------------------------------------------------------
- [ 1, 2) 16 0.8% 0.8%
- [ 2, 3) 766 38.3% 39.1% ####
- [ 3, 4) 670 33.5% 72.6% ###
- [ 4, 6) 318 15.9% 88.5% ##
- [ 6, 8) 36 1.8% 90.3%
- [ 8, 11) 12 0.6% 90.9%
- [ 11, 15) 26 1.3% 92.2%
- [ 15, 21) 46 2.3% 94.5%
- [ 21, 29) 65 3.2% 97.8%
- [ 29, 39) 34 1.7% 99.5%
- [ 39, 53) 7 0.4% 99.8%
- [ 53, 71) 4 0.2% 100.0%
- [ 71, 95) 0 0.0% 100.0%
- [ 95, 126) 0 0.0% 100.0%
- [126, 167) 0 0.0% 100.0%
- [167, 221) 0 0.0% 100.0%
- [221, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks___1KB 100 106144273 ns/op 0.02 MB/s
+ [ 1, 2) 22 1.1% 1.1%
+ [ 2, 3) 822 41.1% 42.2% ####
+ [ 3, 4) 657 32.9% 75.0% ###
+ [ 4, 6) 262 13.1% 88.2% #
+ [ 6, 8) 33 1.7% 89.8%
+ [ 8, 11) 15 0.8% 90.6%
+ [ 11, 15) 16 0.8% 91.4%
+ [ 15, 21) 40 2.0% 93.4%
+ [ 21, 29) 93 4.7% 98.0%
+ [ 29, 40) 29 1.5% 99.5%
+ [ 40, 54) 10 0.5% 100.0%
+ [ 54, 72) 1 0.1% 100.0%
+ [ 72, 96) 0 0.0% 100.0%
+ [ 96, 128) 0 0.0% 100.0%
+ [128, 170) 0 0.0% 100.0%
+ [170, 225) 0 0.0% 100.0%
+ [225, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks___1KB 100 110514593 ns/op 0.02 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 6 Max: 173 Avg: 105.63
+ Count: 100 Min: 6 Max: 174 Avg: 110.01
------------------------------------------------------------
[ 6, 7) 1 1.0% 1.0%
[ 7, 8) 0 0.0% 1.0%
[ 8, 9) 0 0.0% 1.0%
[ 9, 11) 0 0.0% 1.0%
[ 11, 14) 1 1.0% 2.0%
- [ 14, 19) 3 3.0% 5.0%
- [ 19, 26) 1 1.0% 6.0%
- [ 26, 36) 4 4.0% 10.0%
- [ 36, 51) 4 4.0% 14.0%
- [ 51, 72) 8 8.0% 22.0% #
- [ 72, 102) 24 24.0% 46.0% ##
- [102, 144) 26 26.0% 72.0% ###
- [144, 204) 28 28.0% 100.0% ###
+ [ 14, 19) 1 1.0% 3.0%
+ [ 19, 26) 1 1.0% 4.0%
+ [ 26, 36) 3 3.0% 7.0%
+ [ 36, 51) 3 3.0% 10.0%
+ [ 51, 72) 13 13.0% 23.0% #
+ [ 72, 102) 23 23.0% 46.0% ##
+ [102, 144) 19 19.0% 65.0% ##
+ [144, 204) 35 35.0% 100.0% ####
[204, 288) 0 0.0% 100.0%
- [288, 406) 0 0.0% 100.0%
- [406, 573) 0 0.0% 100.0%
- [573, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks___1KB-2 1000 7132495 ns/op 0.28 MB/s
+ [288, 407) 0 0.0% 100.0%
+ [407, 575) 0 0.0% 100.0%
+ [575, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks___1KB-2 1000 7283778 ns/op 0.27 MB/s
--- Histogram (unit: ms)
- Count: 1000 Min: 1 Max: 43 Avg: 6.64
+ Count: 1000 Min: 1 Max: 44 Avg: 6.78
------------------------------------------------------------
- [ 1, 2) 24 2.4% 2.4%
- [ 2, 3) 286 28.6% 31.0% ###
- [ 3, 4) 272 27.2% 58.2% ###
- [ 4, 6) 217 21.7% 79.9% ##
- [ 6, 8) 44 4.4% 84.3%
- [ 8, 11) 15 1.5% 85.8%
- [ 11, 15) 11 1.1% 86.9%
- [ 15, 20) 19 1.9% 88.8%
- [ 20, 27) 14 1.4% 90.2%
- [ 27, 36) 87 8.7% 98.9% #
- [ 36, 48) 11 1.1% 100.0%
+ [ 1, 2) 23 2.3% 2.3%
+ [ 2, 3) 268 26.8% 29.1% ###
+ [ 3, 4) 295 29.5% 58.6% ###
+ [ 4, 6) 204 20.4% 79.0% ##
+ [ 6, 8) 51 5.1% 84.1% #
+ [ 8, 11) 13 1.3% 85.4%
+ [ 11, 15) 9 0.9% 86.3%
+ [ 15, 20) 29 2.9% 89.2%
+ [ 20, 27) 12 1.2% 90.4%
+ [ 27, 36) 80 8.0% 98.4% #
+ [ 36, 48) 16 1.6% 100.0%
[ 48, 63) 0 0.0% 100.0%
- [ 63, 82) 0 0.0% 100.0%
- [ 82, 107) 0 0.0% 100.0%
- [107, 139) 0 0.0% 100.0%
- [139, 181) 0 0.0% 100.0%
- [181, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks__10KB 100 75825411 ns/op 0.03 MB/s
+ [ 63, 83) 0 0.0% 100.0%
+ [ 83, 109) 0 0.0% 100.0%
+ [109, 142) 0 0.0% 100.0%
+ [142, 185) 0 0.0% 100.0%
+ [185, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks__10KB 100 76530881 ns/op 0.03 MB/s
--- Histogram (unit: ms)
- Count: 100 Min: 3 Max: 130 Avg: 75.35
+ Count: 100 Min: 17 Max: 137 Avg: 75.99
------------------------------------------------------------
- [ 3, 4) 1 1.0% 1.0%
- [ 4, 5) 0 0.0% 1.0%
- [ 5, 6) 0 0.0% 1.0%
- [ 6, 8) 0 0.0% 1.0%
- [ 8, 11) 0 0.0% 1.0%
- [ 11, 16) 0 0.0% 1.0%
- [ 16, 22) 4 4.0% 5.0%
- [ 22, 31) 0 0.0% 5.0%
- [ 31, 44) 7 7.0% 12.0% #
- [ 44, 62) 14 14.0% 26.0% #
- [ 62, 87) 38 38.0% 64.0% ####
- [ 87, 121) 29 29.0% 93.0% ###
- [121, 169) 7 7.0% 100.0% #
- [169, 235) 0 0.0% 100.0%
- [235, 326) 0 0.0% 100.0%
- [326, 452) 0 0.0% 100.0%
- [452, inf) 0 0.0% 100.0%
-Benchmark___1KB_mux___1K_chunks__10KB-2 200 38383294 ns/op 0.05 MB/s
+ [ 17, 18) 6 6.0% 6.0% #
+ [ 18, 19) 0 0.0% 6.0%
+ [ 19, 20) 1 1.0% 7.0%
+ [ 20, 22) 2 2.0% 9.0%
+ [ 22, 25) 0 0.0% 9.0%
+ [ 25, 29) 0 0.0% 9.0%
+ [ 29, 35) 0 0.0% 9.0%
+ [ 35, 44) 5 5.0% 14.0% #
+ [ 44, 56) 10 10.0% 24.0% #
+ [ 56, 73) 20 20.0% 44.0% ##
+ [ 73, 97) 27 27.0% 71.0% ###
+ [ 97, 130) 28 28.0% 99.0% ###
+ [130, 176) 1 1.0% 100.0%
+ [176, 239) 0 0.0% 100.0%
+ [239, 326) 0 0.0% 100.0%
+ [326, 445) 0 0.0% 100.0%
+ [445, inf) 0 0.0% 100.0%
+Benchmark___1KB_mux___1K_chunks__10KB-2 200 38503258 ns/op 0.05 MB/s
--- Histogram (unit: ms)
- Count: 200 Min: 1 Max: 81 Avg: 37.88
+ Count: 200 Min: 2 Max: 80 Avg: 38.01
------------------------------------------------------------
- [ 1, 2) 1 0.5% 0.5%
- [ 2, 3) 10 5.0% 5.5% #
- [ 3, 4) 4 2.0% 7.5%
- [ 4, 6) 3 1.5% 9.0%
- [ 6, 9) 9 4.5% 13.5%
- [ 9, 13) 3 1.5% 15.0%
- [ 13, 18) 12 6.0% 21.0% #
- [ 18, 25) 7 3.5% 24.5%
- [ 25, 35) 37 18.5% 43.0% ##
- [ 35, 48) 46 23.0% 66.0% ##
- [ 48, 66) 48 24.0% 90.0% ##
- [ 66, 90) 20 10.0% 100.0% #
- [ 90, 123) 0 0.0% 100.0%
- [123, 167) 0 0.0% 100.0%
- [167, 226) 0 0.0% 100.0%
- [226, 305) 0 0.0% 100.0%
- [305, inf) 0 0.0% 100.0%
+ [ 2, 3) 10 5.0% 5.0% #
+ [ 3, 4) 1 0.5% 5.5%
+ [ 4, 5) 2 1.0% 6.5%
+ [ 5, 7) 4 2.0% 8.5%
+ [ 7, 10) 5 2.5% 11.0%
+ [ 10, 14) 12 6.0% 17.0% #
+ [ 14, 19) 4 2.0% 19.0%
+ [ 19, 26) 12 6.0% 25.0% #
+ [ 26, 36) 36 18.0% 43.0% ##
+ [ 36, 49) 54 27.0% 70.0% ###
+ [ 49, 67) 47 23.5% 93.5% ##
+ [ 67, 91) 13 6.5% 100.0% #
+ [ 91, 123) 0 0.0% 100.0%
+ [123, 166) 0 0.0% 100.0%
+ [166, 224) 0 0.0% 100.0%
+ [224, 302) 0 0.0% 100.0%
+ [302, inf) 0 0.0% 100.0%
diff --git a/runtimes/google/ipc/benchmark/client.go b/runtimes/google/ipc/benchmark/client.go
index 2ecdae8..c29f942 100644
--- a/runtimes/google/ipc/benchmark/client.go
+++ b/runtimes/google/ipc/benchmark/client.go
@@ -107,7 +107,7 @@
}
}
if i != chunkCnt {
- rDone <- fmt.Errorf("EchoStream returned %d chunks, but expected %d", n, chunkCnt)
+ rDone <- fmt.Errorf("EchoStream returned %d chunks, but expected %d", i, chunkCnt)
return
}
rDone <- rStream.Err()
diff --git a/runtimes/google/ipc/client.go b/runtimes/google/ipc/client.go
index a534864..15c86de 100644
--- a/runtimes/google/ipc/client.go
+++ b/runtimes/google/ipc/client.go
@@ -112,7 +112,6 @@
}
var _ ipc.Client = (*client)(nil)
-var _ ipc.BindOpt = (*client)(nil)
type vcInfo struct {
vc stream.VC
@@ -686,11 +685,6 @@
c.vcMapMu.Unlock()
}
-// IPCBindOpt makes client implement BindOpt.
-func (c *client) IPCBindOpt() {
- //nologcall
-}
-
// flowClient implements the RPC client-side protocol for a single RPC, over a
// flow that's already connected to the server.
type flowClient struct {
diff --git a/runtimes/google/ipc/full_test.go b/runtimes/google/ipc/full_test.go
index 3e85647..da0d385 100644
--- a/runtimes/google/ipc/full_test.go
+++ b/runtimes/google/ipc/full_test.go
@@ -69,16 +69,6 @@
c.Unlock()
}
-type fakeTimeCaveat int
-
-func (c fakeTimeCaveat) Validate(security.Context) error {
- now := clock.Now()
- if now > int(c) {
- return fmt.Errorf("fakeTimeCaveat expired: now=%d > then=%d", now, c)
- }
- return nil
-}
-
// We need a special way to create contexts for tests. We
// can't create a real runtime in the runtime implementation
// so we use a fake one that panics if used. The runtime
@@ -195,15 +185,26 @@
type dischargeServer struct{}
func (*dischargeServer) Discharge(ctx ipc.ServerCall, cav vdl.AnyRep, _ security.DischargeImpetus) (vdl.AnyRep, error) {
- c, ok := cav.(security.ThirdPartyCaveat)
- if !ok {
- return nil, fmt.Errorf("discharger: unknown caveat(%T)", cav)
+ // TODO(ashankar): During refactoring, this "if" statement must remain.
+ // After security.Caveat.ValidatorVOM is removed, the "else" part can go away.
+ var tpc security.ThirdPartyCaveat
+ if c, ok := cav.(security.Caveat); ok {
+ tpc = c.ThirdPartyDetails()
+ } else {
+ tpc, _ = cav.(security.ThirdPartyCaveat)
}
- if err := c.Dischargeable(ctx); err != nil {
- return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", c, err)
+ if tpc == nil {
+ return nil, fmt.Errorf("discharger: %T does not represent a third-party caveat", cav)
+ }
+ if err := tpc.Dischargeable(ctx); err != nil {
+ return nil, fmt.Errorf("third-party caveat %v cannot be discharged for this context: %v", cav, err)
}
// Add a fakeTimeCaveat to be able to control discharge expiration via 'clock'.
- return ctx.LocalPrincipal().MintDischarge(c, newCaveat(fakeTimeCaveat(clock.Now())))
+ expiry, err := security.NewCaveat(fakeTimeCaveat, clock.Now())
+ if err != nil {
+ return nil, fmt.Errorf("failed to create an expiration on the discharge: %v", err)
+ }
+ return ctx.LocalPrincipal().MintDischarge(cav, expiry)
}
func startServer(t *testing.T, principal security.Principal, sm stream.Manager, ns naming.Namespace, name string, disp ipc.Dispatcher, opts ...ipc.ServerOpt) (naming.Endpoint, ipc.Server) {
@@ -751,7 +752,7 @@
if err != nil {
panic(err)
}
- return newCaveat(tpc)
+ return tpc
}
// dischargeTestServer implements the discharge service. Always fails to
@@ -784,14 +785,10 @@
mkClient = func(req security.ThirdPartyRequirements) vc.LocalPrincipal {
// Setup the client so that it shares a blessing with a third-party caveat with the server.
- tpc, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
+ cav, err := security.NewPublicKeyCaveat(pdischarger.PublicKey(), "mountpoint/discharger", req, security.UnconstrainedUse())
if err != nil {
t.Fatalf("Failed to create ThirdPartyCaveat(%+v): %v", req, err)
}
- cav, err := security.NewCaveat(tpc)
- if err != nil {
- t.Fatal(err)
- }
b, err := pclient.BlessSelf("client_for_server", cav)
if err != nil {
t.Fatalf("BlessSelf failed: %v", err)
@@ -1632,7 +1629,7 @@
if err != nil {
t.Error(err)
}
- dc.PrepareDischarges(testContext(), []security.ThirdPartyCaveat{tpcav2}, security.DischargeImpetus{})
+ dc.PrepareDischarges(testContext(), []security.ThirdPartyCaveat{tpcav2.ThirdPartyDetails()}, security.DischargeImpetus{})
// Ensure that discharger1 was not called and discharger2 was called.
if discharger1.called {
@@ -1745,11 +1742,18 @@
clientB.Close()
}
-func init() {
- vdl.Register(fakeTimeCaveat(0))
+var fakeTimeCaveat = security.CaveatDescriptor{
+ Id: uniqueid.Id{0x18, 0xba, 0x6f, 0x84, 0xd5, 0xec, 0xdb, 0x9b, 0xf2, 0x32, 0x19, 0x5b, 0x53, 0x92, 0x80, 0x0},
+ ParamType: vdl.TypeOf(int64(0)),
}
func TestMain(m *testing.M) {
testutil.Init()
+ security.RegisterCaveatValidator(fakeTimeCaveat, func(_ security.Context, t int64) error {
+ if now := clock.Now(); now > int(t) {
+ return fmt.Errorf("fakeTimeCaveat expired: now=%d > then=%d", now, t)
+ }
+ return nil
+ })
os.Exit(m.Run())
}
diff --git a/runtimes/google/ipc/stream/vc/vc_test.go b/runtimes/google/ipc/stream/vc/vc_test.go
index 05f4edd..81c1ece 100644
--- a/runtimes/google/ipc/stream/vc/vc_test.go
+++ b/runtimes/google/ipc/stream/vc/vc_test.go
@@ -180,13 +180,6 @@
var _ vc.DischargeClient = (mockDischargeClient)(nil)
func TestHandshakeWithDischargesTLS(t *testing.T) {
- newCaveat := func(validator security.CaveatValidator) security.Caveat {
- cav, err := security.NewCaveat(validator)
- if err != nil {
- t.Fatal(err)
- }
- return cav
- }
var (
discharger = tsecurity.NewPrincipal("discharger")
client = tsecurity.NewPrincipal()
@@ -204,10 +197,10 @@
// Setup 'client' and 'server' so that they use a blessing from 'root' with a third-party caveat
// during VC handshake.
- if err := root.Bless(client, "client", newCaveat(tpcav)); err != nil {
+ if err := root.Bless(client, "client", tpcav); err != nil {
t.Fatal(err)
}
- if err := root.Bless(server, "server", newCaveat(tpcav)); err != nil {
+ if err := root.Bless(server, "server", tpcav); err != nil {
t.Fatal(err)
}
diff --git a/runtimes/google/ipc/testutil_test.go b/runtimes/google/ipc/testutil_test.go
index 01f9444..7eb79eb 100644
--- a/runtimes/google/ipc/testutil_test.go
+++ b/runtimes/google/ipc/testutil_test.go
@@ -50,14 +50,6 @@
}
}
-func newCaveat(v security.CaveatValidator) security.Caveat {
- cav, err := security.NewCaveat(v)
- if err != nil {
- panic(err)
- }
- return cav
-}
-
func mkCaveat(cav security.Caveat, err error) security.Caveat {
if err != nil {
panic(err)
diff --git a/runtimes/google/naming/namespace/all_test.go b/runtimes/google/naming/namespace/all_test.go
index 170cfac..f57b00c 100644
--- a/runtimes/google/naming/namespace/all_test.go
+++ b/runtimes/google/naming/namespace/all_test.go
@@ -167,11 +167,11 @@
}
func runMT(t *testing.T, ctx *context.T, mountPoint string) *serverEntry {
- mt, err := service.NewMountTable("")
+ mtd, err := service.NewMountTableDispatcher("")
if err != nil {
- boom(t, "NewMountTable returned error: %v", err)
+ boom(t, "NewMountTableDispatcher returned error: %v", err)
}
- return run(t, ctx, mt, mountPoint, true)
+ return run(t, ctx, mtd, mountPoint, true)
}
func run(t *testing.T, ctx *context.T, disp ipc.Dispatcher, mountPoint string, mt bool) *serverEntry {
diff --git a/runtimes/google/naming/namespace/glob.go b/runtimes/google/naming/namespace/glob.go
index 0b85a21..d79f099 100644
--- a/runtimes/google/naming/namespace/glob.go
+++ b/runtimes/google/naming/namespace/glob.go
@@ -1,7 +1,6 @@
package namespace
import (
- "container/list"
"io"
"strings"
@@ -16,106 +15,197 @@
"v.io/core/veyron2/vlog"
)
-const mountTableGlobReplyStreamLength = 100
-
-type queuedEntry struct {
- me *naming.MountEntry
- depth int // number of mount tables traversed recursively
+// task is a sub-glob that has to be performed against a mount table. Tasks are
+// done in parrallel to speed up the glob.
+type task struct {
+ pattern *glob.Glob // pattern to match
+ me *naming.MountEntry // server to match at
+ depth int // number of mount tables traversed recursively
}
-// globAtServer performs a Glob at a single server and adds any results to the list. Paramters are:
-// server the server to perform the glob at. This may include multiple names for different
-// instances of the same server.
-// pelems the pattern to match relative to the mounted subtree.
-// l the list to add results to.
-// recursive true to continue below the matched pattern
-func (ns *namespace) globAtServer(ctx *context.T, qe *queuedEntry, pattern *glob.Glob, l *list.List) error {
- server := qe.me
+// globAtServer performs a Glob on the servers at a mount point. It cycles through the set of
+// servers until it finds one that replies.
+func (ns *namespace) globAtServer(ctx *context.T, t *task, replies chan *task) {
+ defer func() {
+ if t.me.Error == nil {
+ replies <- nil
+ } else {
+ replies <- t
+ }
+ }()
client := veyron2.GetClient(ctx)
- pstr := pattern.String()
- vlog.VI(2).Infof("globAtServer(%v, %v)", *server, pstr)
+ pstr := t.pattern.String()
+ vlog.VI(2).Infof("globAtServer(%v, %v)", *t.me, pstr)
+ // We collect errors trying to connect to servers so that we have something to
+ // return if we go through them all and noone answers.
var lastErr error
+
// Trying each instance till we get one that works.
- for _, s := range server.Servers {
- // If the pattern is finished (so we're only querying about the root on the
- // remote server) and the server is not another MT, then we needn't send the
- // query on since we know the server will not supply a new address for the
- // current name.
- if pattern.Finished() {
- if !server.ServesMountTable() {
- return nil
- }
- }
-
- // If this is restricted recursive and not a mount table, don't
- // descend into it.
- if pattern.Restricted() && !server.ServesMountTable() && pattern.Len() == 0 {
- return nil
- }
-
+ for _, s := range t.me.Servers {
// Don't further resolve s.Server.
callCtx, _ := context.WithTimeout(ctx, callTimeout)
- // Make sure that we turn the s.Server address or name into a rooted name.
- serverName := naming.JoinAddressName(s.Server, "")
- call, err := client.StartCall(callCtx, serverName, ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
+ call, err := client.StartCall(callCtx, naming.JoinAddressName(s.Server, ""), ipc.GlobMethod, []interface{}{pstr}, options.NoResolve{})
if err != nil {
lastErr = err
continue // try another instance
}
- // At this point we're commited to a server since it answered tha call.
+ // At this point we're commited to a server since it answered the call. Cycle
+ // through all replies from that server.
for {
+ // If the mount table returns an error, we're done. Send the task to the channel
+ // including the error. This terminates the task.
var e naming.VDLMountEntry
err := call.Recv(&e)
if err == io.EOF {
break
}
if err != nil {
- return err
+ t.me.Error = err
+ return
}
- // Prefix the results with the path of the mount point.
- e.Name = naming.Join(server.Name, e.Name)
-
// Convert to the ever so slightly different name.MountTable version of a MountEntry
// and add it to the list.
- x := &queuedEntry{
+ x := &task{
me: &naming.MountEntry{
- Name: e.Name,
+ Name: naming.Join(t.me.Name, e.Name),
Servers: convertServers(e.Servers),
},
- depth: qe.depth,
+ depth: t.depth + 1,
}
x.me.SetServesMountTable(e.MT)
- // x.depth is the number of severs we've walked through since we've gone
- // recursive (i.e. with pattern length of 0).
- if pattern.Len() == 0 {
- if x.depth++; x.depth > ns.maxRecursiveGlobDepth {
+
+ // x.depth is the number of servers we've walked through since we've gone
+ // recursive (i.e. with pattern length of 0). Limit the depth of globs.
+ // TODO(p): return an error?
+ if t.pattern.Len() == 0 {
+ if x.depth > ns.maxRecursiveGlobDepth {
continue
}
}
- l.PushBack(x)
+ replies <- x
}
var globerr error
if err := call.Finish(&globerr); err != nil {
- return err
+ globerr = err
}
- return globerr
+ t.me.Error = globerr
+ return
}
- return lastErr
+ // Just soak up the last error (if any).
+ t.me.Error = lastErr
+}
+
+// depth returns the directory depth of a given name. It is used to pick off the unsatisfied part of the pattern.
+func depth(name string) int {
+ name = strings.Trim(naming.Clean(name), "/")
+ if name == "" {
+ return 0
+ }
+ return strings.Count(name, "/") + 1
+}
+
+// globLoop fires off a go routine for each server and read backs replies.
+func (ns *namespace) globLoop(ctx *context.T, e *naming.MountEntry, prefix string, pattern *glob.Glob, reply chan naming.MountEntry) {
+ defer close(reply)
+
+ // Provide enough buffers to avoid too much switching between the readers and the writers.
+ // This size is just a guess.
+ replies := make(chan *task, 100)
+ defer close(replies)
+
+ // Push the first task into the channel to start the ball rolling. This task has the
+ // root of the search and the full pattern. It will be the first task fired off in the for
+ // loop that follows.
+ replies <- &task{me: e, pattern: pattern}
+ inFlight := 0
+
+ // Perform a parallel search of the name graph. Each task will send what it learns
+ // on the replies channel. If the reply is a mount point and the pattern is not completely
+ // fulfilled, a new task will be fired off to handle it.
+ for {
+ select {
+ case t := <-replies:
+ // A nil reply represents a successfully terminated task.
+ // If no tasks are running, return.
+ if t == nil {
+ if inFlight--; inFlight <= 0 {
+ return
+ }
+ continue
+ }
+
+ // We want to output this entry if there was a real error other than
+ // "not a mount table".
+ // TODO(p): return errors on a different reply channel?
+ //
+ // An error reply is also a terminated task.
+ // If no tasks are running, return.
+ if t.me.Error != nil {
+ if !notAnMT(t.me.Error) {
+ t.me.Name = naming.Join(prefix, t.me.Name)
+ reply <- *t.me
+ }
+ if inFlight--; inFlight <= 0 {
+ return
+ }
+ continue
+ }
+
+ // Get the pattern elements below the current path.
+ suffix := pattern.Split(depth(t.me.Name))
+
+ // If we've satisfied the request and this isn't the root,
+ // reply to the caller.
+ if suffix.Len() == 0 && t.depth != 0 {
+ x := *t.me
+ x.Name = naming.Join(prefix, x.Name)
+ reply <- x
+ }
+
+ // If the pattern is finished (so we're only querying about the root on the
+ // remote server) and the server is not another MT, then we needn't send the
+ // query on since we know the server will not supply a new address for the
+ // current name.
+ if suffix.Finished() {
+ if !t.me.ServesMountTable() {
+ continue
+ }
+ }
+
+ // If this is restricted recursive and not a mount table, don't descend into it.
+ if suffix.Restricted() && suffix.Len() == 0 && !t.me.ServesMountTable() {
+ continue
+ }
+
+ // Perform a glob at the next server.
+ inFlight++
+ t.pattern = suffix
+ go ns.globAtServer(ctx, t, replies)
+ }
+ }
}
// Glob implements naming.MountTable.Glob.
func (ns *namespace) Glob(ctx *context.T, pattern string) (chan naming.MountEntry, error) {
defer vlog.LogCall()()
+
+ // Root the pattern. If we have no servers to query, give up.
e, patternWasRooted := ns.rootMountEntry(pattern)
if len(e.Servers) == 0 {
return nil, verror.Make(naming.ErrNoMountTable, ctx)
}
+ // If the name doesn't parse, give up.
+ g, err := glob.Parse(e.Name)
+ if err != nil {
+ return nil, err
+ }
+
// If pattern was already rooted, make sure we tack that root
// onto all returned names. Otherwise, just return the relative
// name.
@@ -123,62 +213,8 @@
if patternWasRooted {
prefix = e.Servers[0].Server
}
- g, err := glob.Parse(e.Name)
- if err != nil {
- return nil, err
- }
e.Name = ""
reply := make(chan naming.MountEntry, 100)
go ns.globLoop(ctx, e, prefix, g, reply)
return reply, nil
}
-
-// depth returns the directory depth of a given name.
-func depth(name string) int {
- name = strings.Trim(naming.Clean(name), "/")
- if name == "" {
- return 0
- }
- return strings.Count(name, "/") + 1
-}
-
-func (ns *namespace) globLoop(ctx *context.T, e *naming.MountEntry, prefix string, pattern *glob.Glob, reply chan naming.MountEntry) {
- defer close(reply)
-
- // As we encounter new mount tables while traversing the Glob, we add them to the list 'l'. The loop below
- // traverses this list removing a mount table each time and calling globAtServer to perform a glob at that
- // server. globAtServer will send on 'reply' any terminal entries that match the glob and add any new mount
- // tables to be traversed to the list 'l'.
- l := list.New()
- l.PushBack(&queuedEntry{me: e})
- atRoot := true
-
- // Perform a breadth first search of the name graph.
- for le := l.Front(); le != nil; le = l.Front() {
- l.Remove(le)
- e := le.Value.(*queuedEntry)
-
- // Get the pattern elements below the current path.
- suffix := pattern.Split(depth(e.me.Name))
-
- // Perform a glob at the server.
- err := ns.globAtServer(ctx, e, suffix, l)
-
- // We want to output this entry if:
- // 1. There was a real error, we return whatever name gave us the error.
- if err != nil && !notAnMT(err) {
- x := *e.me
- x.Name = naming.Join(prefix, x.Name)
- x.Error = err
- reply <- x
- }
-
- // 2. The current name fullfills the pattern.
- if suffix.Len() == 0 && !atRoot {
- x := *e.me
- x.Name = naming.Join(prefix, x.Name)
- reply <- x
- }
- atRoot = false
- }
-}
diff --git a/runtimes/google/rt/ipc_test.go b/runtimes/google/rt/ipc_test.go
index 3d72538..95a95c1 100644
--- a/runtimes/google/rt/ipc_test.go
+++ b/runtimes/google/rt/ipc_test.go
@@ -59,14 +59,6 @@
return ret
}
-func newCaveat(v security.CaveatValidator) security.Caveat {
- cav, err := security.NewCaveat(v)
- if err != nil {
- panic(err)
- }
- return cav
-}
-
func mkCaveat(cav security.Caveat, err error) security.Caveat {
if err != nil {
panic(err)
@@ -89,7 +81,7 @@
if err != nil {
panic(err)
}
- return newCaveat(tpc)
+ return tpc
}
func startServer(ctx *context.T, s interface{}) (ipc.Server, string, error) {
diff --git a/runtimes/google/rt/security.go b/runtimes/google/rt/security.go
index e3cc484..fd3226a 100644
--- a/runtimes/google/rt/security.go
+++ b/runtimes/google/rt/security.go
@@ -81,8 +81,8 @@
return -1, nil
}
ifd, err := strconv.Atoi(fd)
- if err == nil && handle != nil {
- // If we're using a handle, children can't inherit the agent.
+ if err == nil {
+ // Don't let children accidentally inherit the agent connection.
syscall.CloseOnExec(ifd)
}
return ifd, err
diff --git a/runtimes/google/testing/mocks/ipc/simple_client.go b/runtimes/google/testing/mocks/ipc/simple_client.go
index e9ce243..7ce530b 100644
--- a/runtimes/google/testing/mocks/ipc/simple_client.go
+++ b/runtimes/google/testing/mocks/ipc/simple_client.go
@@ -13,18 +13,23 @@
"v.io/core/veyron2/vom"
)
+type ClientWithTimesCalled interface {
+ ipc.Client
+ TimesCalled(method string) int
+}
+
// NewSimpleClient creates a new mocked ipc client where the given map of method name
// to outputs is used for evaluating the method calls.
// It also adds some testing features such as counters for number of times a method is called
-func NewSimpleClient(methodsResults map[string][]interface{}) *SimpleMockClient {
- return &SimpleMockClient{
+func NewSimpleClient(methodsResults map[string][]interface{}) ClientWithTimesCalled {
+ return &simpleMockClient{
results: methodsResults,
timesCalled: make(map[string]int),
}
}
-// SimpleMockClient implements ipc.Client
-type SimpleMockClient struct {
+// simpleMockClient implements ipc.Client
+type simpleMockClient struct {
// Protects timesCalled
sync.Mutex
@@ -35,17 +40,12 @@
}
// TimesCalled returns number of times the given method has been called.
-func (c *SimpleMockClient) TimesCalled(method string) int {
+func (c *simpleMockClient) TimesCalled(method string) int {
return c.timesCalled[method]
}
-// IPCBindOpt Implements ipc.Client
-func (c *SimpleMockClient) IPCBindOpt() {
- //nologcall
-}
-
// StartCall Implements ipc.Client
-func (c *SimpleMockClient) StartCall(ctx *context.T, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
+func (c *simpleMockClient) StartCall(ctx *context.T, name, method string, args []interface{}, opts ...ipc.CallOpt) (ipc.Call, error) {
defer vlog.LogCall()()
results, ok := c.results[method]
if !ok {
@@ -77,7 +77,7 @@
}
// Close implements ipc.Client
-func (*SimpleMockClient) Close() {
+func (*simpleMockClient) Close() {
defer vlog.LogCall()()
}
diff --git a/security/agent/agent_test.go b/security/agent/agent_test.go
index a6593f6..0c9005e 100644
--- a/security/agent/agent_test.go
+++ b/security/agent/agent_test.go
@@ -167,7 +167,7 @@
return
}
-func (p *mockPrincipal) MintDischarge(security.ThirdPartyCaveat, security.Caveat, ...security.Caveat) (security.Discharge, error) {
+func (p *mockPrincipal) MintDischarge(interface{}, security.Caveat, ...security.Caveat) (security.Discharge, error) {
defer p.reset()
d, _ := p.NextResult.(security.Discharge)
return d, p.NextError
@@ -311,7 +311,7 @@
return b
}
-func newThirdPartyCaveatAndDischarge(t *testing.T) (security.ThirdPartyCaveat, security.Discharge) {
+func newThirdPartyCaveatAndDischarge(t *testing.T) (security.Caveat, security.Discharge) {
p := newPrincipal(t)
c, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
if err != nil {
diff --git a/security/agent/client.go b/security/agent/client.go
index 77c6dde..99854c5 100644
--- a/security/agent/client.go
+++ b/security/agent/client.go
@@ -120,10 +120,9 @@
return
}
-func (c *client) MintDischarge(tp security.ThirdPartyCaveat, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
+func (c *client) MintDischarge(tp interface{}, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
var discharge security.Discharge
- err := c.caller.call("MintDischarge", results(&discharge), vdl.AnyRep(tp), caveat, additionalCaveats)
- if err != nil {
+ if err := c.caller.call("MintDischarge", results(&discharge), vdl.AnyRep(tp), caveat, additionalCaveats); err != nil {
return nil, err
}
return discharge, nil
diff --git a/security/agent/server/server.go b/security/agent/server/server.go
index 7175a57..a274c53 100644
--- a/security/agent/server/server.go
+++ b/security/agent/server/server.go
@@ -7,7 +7,6 @@
"crypto/sha512"
"crypto/x509"
"encoding/base64"
- "fmt"
"io"
"net"
"os"
@@ -254,11 +253,7 @@
}
func (a agentd) MintDischarge(_ ipc.ServerContext, tp vdl.AnyRep, caveat security.Caveat, additionalCaveats []security.Caveat) (vdl.AnyRep, error) {
- tpCaveat, ok := tp.(security.ThirdPartyCaveat)
- if !ok {
- return nil, fmt.Errorf("provided caveat of type %T does not implement security.ThirdPartyCaveat", tp)
- }
- return a.principal.MintDischarge(tpCaveat, caveat, additionalCaveats...)
+ return a.principal.MintDischarge(tp, caveat, additionalCaveats...)
}
func (a keymgr) newKey(in_memory bool) (id []byte, p security.Principal, err error) {
diff --git a/security/audit/principal.go b/security/audit/principal.go
index b7f9347..879d8f6 100644
--- a/security/audit/principal.go
+++ b/security/audit/principal.go
@@ -46,7 +46,7 @@
return sig, nil
}
-func (p *auditingPrincipal) MintDischarge(tp security.ThirdPartyCaveat, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
+func (p *auditingPrincipal) MintDischarge(tp interface{}, caveat security.Caveat, additionalCaveats ...security.Caveat) (security.Discharge, error) {
d, err := p.principal.MintDischarge(tp, caveat, additionalCaveats...)
// No need to log the discharge
if err = p.audit(err, "MintDischarge", addCaveats(args{tp, caveat}, additionalCaveats...), nil); err != nil {
diff --git a/security/audit/principal_test.go b/security/audit/principal_test.go
index 4b0d977..f080af7 100644
--- a/security/audit/principal_test.go
+++ b/security/audit/principal_test.go
@@ -156,7 +156,7 @@
return
}
-func (p *mockPrincipal) MintDischarge(security.ThirdPartyCaveat, security.Caveat, ...security.Caveat) (security.Discharge, error) {
+func (p *mockPrincipal) MintDischarge(interface{}, security.Caveat, ...security.Caveat) (security.Discharge, error) {
defer p.reset()
d, _ := p.NextResult.(security.Discharge)
return d, p.NextError
@@ -249,7 +249,7 @@
return b
}
-func newThirdPartyCaveatAndDischarge(t *testing.T) (security.ThirdPartyCaveat, security.Discharge) {
+func newThirdPartyCaveatAndDischarge(t *testing.T) (security.Caveat, security.Discharge) {
p := newPrincipal(t)
c, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
if err != nil {
diff --git a/services/identity/auditor/blessing_auditor.go b/services/identity/auditor/blessing_auditor.go
index cd540e9..d6858ae 100644
--- a/services/identity/auditor/blessing_auditor.go
+++ b/services/identity/auditor/blessing_auditor.go
@@ -78,7 +78,18 @@
if !ok {
return d, fmt.Errorf("failed to extract extension")
}
- d.email = strings.Split(extension, "/")[0]
+ // Find the first email component
+ for _, n := range strings.Split(extension, security.ChainSeparator) {
+ // HACK ALERT: An email is the first entry to end up with
+ // a single "@" in it
+ if strings.Count(n, "@") == 1 {
+ d.email = n
+ break
+ }
+ }
+ if len(d.email) == 0 {
+ return d, fmt.Errorf("failed to extract email address from extension %q", extension)
+ }
var caveats []security.Caveat
for _, arg := range entry.Arguments[3:] {
if cav, ok := arg.(security.Caveat); !ok {
diff --git a/services/identity/auditor/blessing_auditor_test.go b/services/identity/auditor/blessing_auditor_test.go
index c592699..ab0dadc 100644
--- a/services/identity/auditor/blessing_auditor_test.go
+++ b/services/identity/auditor/blessing_auditor_test.go
@@ -28,24 +28,24 @@
Blessings security.Blessings
}{
{
- Extension: "email/nocaveats",
- Email: "email",
+ Extension: "foo@bar.com/nocaveats/bar@baz.com",
+ Email: "foo@bar.com",
RevocationCaveatID: "",
- Blessings: newBlessing(t, p, "test/email/nocaveats"),
+ Blessings: newBlessing(t, p, "test/foo@bar.com/nocaveats/bar@baz.com"),
},
{
- Extension: "email/caveat",
- Email: "email",
+ Extension: "users/foo@bar.com/caveat",
+ Email: "foo@bar.com",
Caveats: []security.Caveat{expiryCaveat},
RevocationCaveatID: "",
- Blessings: newBlessing(t, p, "test/email/caveat"),
+ Blessings: newBlessing(t, p, "test/foo@bar.com/caveat"),
},
{
- Extension: "email/caveatAndRevocation",
- Email: "email",
- Caveats: []security.Caveat{expiryCaveat, newCaveat(security.NewCaveat(revocationCaveat))},
- RevocationCaveatID: revocationCaveat.ID(),
- Blessings: newBlessing(t, p, "test/email/caveatAndRevocation"),
+ Extension: "special/guests/foo@bar.com/caveatAndRevocation",
+ Email: "foo@bar.com",
+ Caveats: []security.Caveat{expiryCaveat, revocationCaveat},
+ RevocationCaveatID: revocationCaveat.ThirdPartyDetails().ID(),
+ Blessings: newBlessing(t, p, "test/foo@bar.com/caveatAndRevocation"),
},
}
@@ -86,7 +86,7 @@
}
}
-func newThirdPartyCaveat(t *testing.T, p security.Principal) security.ThirdPartyCaveat {
+func newThirdPartyCaveat(t *testing.T, p security.Principal) security.Caveat {
tp, err := security.NewPublicKeyCaveat(p.PublicKey(), "location", security.ThirdPartyRequirements{}, newCaveat(security.MethodCaveat("method")))
if err != nil {
t.Fatal(err)
diff --git a/services/identity/revocation/caveat.vdl b/services/identity/revocation/caveat.vdl
new file mode 100644
index 0000000..673e29f
--- /dev/null
+++ b/services/identity/revocation/caveat.vdl
@@ -0,0 +1,17 @@
+package revocation
+
+import (
+ "v.io/core/veyron2/uniqueid"
+ "v.io/core/veyron2/security"
+)
+
+// NotRevokedCaveat is used to implement revocation.
+// It validates iff the parameter is not included in a list of blacklisted
+// values.
+//
+// The third-party discharging service checks this revocation caveat against a
+// database of blacklisted (revoked) keys before issuing a discharge.
+const NotRevokedCaveat = security.CaveatDescriptor{
+ Id: uniqueid.Id{0x4b, 0x46, 0x5c, 0x56, 0x37, 0x79, 0xd1, 0x3b, 0x7b, 0xa3, 0xa7, 0xd6, 0xa5, 0x34, 0x80, 0x0},
+ ParamType: typeobject([]byte),
+}
diff --git a/services/identity/revocation/caveat.vdl.go b/services/identity/revocation/caveat.vdl.go
new file mode 100644
index 0000000..2990f95
--- /dev/null
+++ b/services/identity/revocation/caveat.vdl.go
@@ -0,0 +1,41 @@
+// This file was auto-generated by the veyron vdl tool.
+// Source: caveat.vdl
+
+package revocation
+
+import (
+ "v.io/core/veyron2/security"
+
+ "v.io/core/veyron2/uniqueid"
+
+ // The non-user imports are prefixed with "__" to prevent collisions.
+ __vdl "v.io/core/veyron2/vdl"
+)
+
+// NotRevokedCaveat is used to implement revocation.
+// It validates iff the parameter is not included in a list of blacklisted
+// values.
+//
+// The third-party discharging service checks this revocation caveat against a
+// database of blacklisted (revoked) keys before issuing a discharge.
+var NotRevokedCaveat = security.CaveatDescriptor{
+ Id: uniqueid.Id{
+ 75,
+ 70,
+ 92,
+ 86,
+ 55,
+ 121,
+ 209,
+ 59,
+ 123,
+ 163,
+ 167,
+ 214,
+ 165,
+ 52,
+ 128,
+ 0,
+ },
+ ParamType: __vdl.TypeOf([]byte("")),
+}
diff --git a/services/identity/revocation/revocation_manager.go b/services/identity/revocation/revocation_manager.go
index 235b88f..ed685ff 100644
--- a/services/identity/revocation/revocation_manager.go
+++ b/services/identity/revocation/revocation_manager.go
@@ -10,6 +10,7 @@
"v.io/core/veyron2/security"
"v.io/core/veyron2/vdl"
+ "v.io/core/veyron2/vom"
)
// RevocationManager persists information for revocation caveats to provided discharges and allow for future revocations.
@@ -50,18 +51,22 @@
if _, err := rand.Read(revocation[:]); err != nil {
return empty, err
}
- restriction, err := security.NewCaveat(revocationCaveat(revocation))
+ restriction, err := security.NewCaveat(NotRevokedCaveat, revocation[:])
if err != nil {
return empty, err
}
+ // TODO(ashankar): Remove when removing ValidatorVOM
+ if restriction.ValidatorVOM, err = vom.Encode(revocationCaveat(revocation)); err != nil {
+ return empty, err
+ }
cav, err := security.NewPublicKeyCaveat(discharger, dischargerLocation, security.ThirdPartyRequirements{}, restriction)
if err != nil {
return empty, err
}
- if err = revocationDB.InsertCaveat(cav.ID(), revocation[:]); err != nil {
+ if err = revocationDB.InsertCaveat(cav.ThirdPartyDetails().ID(), revocation[:]); err != nil {
return empty, err
}
- return security.NewCaveat(cav)
+ return cav, nil
}
// Revoke disables discharges from being issued for the provided third-party caveat.
@@ -79,22 +84,29 @@
return timestamp
}
-type revocationCaveat [16]byte
-
-func (cav revocationCaveat) Validate(security.Context) error {
+func isRevoked(_ security.Context, key []byte) error {
revocationLock.RLock()
if revocationDB == nil {
revocationLock.RUnlock()
return fmt.Errorf("missing call to NewRevocationManager")
}
revocationLock.RUnlock()
- revoked, err := revocationDB.IsRevoked(cav[:])
+ revoked, err := revocationDB.IsRevoked(key)
if revoked {
return fmt.Errorf("revoked")
}
return err
}
+// TODO(ashankar): Remove when removing security.Caveat.ValidatorVOM.
+type revocationCaveat [16]byte
+
+func (cav revocationCaveat) Validate(ctx security.Context) error {
+ return isRevoked(ctx, cav[:])
+}
+
func init() {
+ // TODO(ashankar): Remove when removing security.Caveat.ValidatorVOM
vdl.Register(revocationCaveat{})
+ security.RegisterCaveatValidator(NotRevokedCaveat, isRevoked)
}
diff --git a/services/identity/server/identityd.go b/services/identity/server/identityd.go
index b415f20..3416ef8 100644
--- a/services/identity/server/identityd.go
+++ b/services/identity/server/identityd.go
@@ -43,7 +43,7 @@
dischargerService = "discharger"
)
-type identityd struct {
+type IdentityServer struct {
oauthProvider oauth.OAuthProvider
auditor audit.Auditor
blessingLogReader auditor.BlessingLogReader
@@ -58,8 +58,8 @@
// - 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.OAuthBlesserParams, caveatSelector caveats.CaveatSelector, emailClassifier *util.EmailClassifier) *identityd {
- return &identityd{
+func NewIdentityServer(oauthProvider oauth.OAuthProvider, auditor audit.Auditor, blessingLogReader auditor.BlessingLogReader, revocationManager revocation.RevocationManager, oauthBlesserParams blesser.OAuthBlesserParams, caveatSelector caveats.CaveatSelector, emailClassifier *util.EmailClassifier) *IdentityServer {
+ return &IdentityServer{
oauthProvider,
auditor,
blessingLogReader,
@@ -70,7 +70,7 @@
}
}
-func (s *identityd) Serve(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) {
+func (s *IdentityServer) Serve(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) {
ctx, err := veyron2.SetPrincipal(ctx, audit.NewPrincipal(
veyron2.GetPrincipal(ctx), s.auditor))
if err != nil {
@@ -80,7 +80,7 @@
<-signals.ShutdownOnSignals(ctx)
}
-func (s *identityd) Listen(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) (ipc.Server, []string, string) {
+func (s *IdentityServer) Listen(ctx *context.T, listenSpec *ipc.ListenSpec, host, httpaddr, tlsconfig string) (ipc.Server, []string, string) {
// Setup handlers
// json-encoded public key and blessing names of this server
@@ -153,7 +153,7 @@
}
// Starts the blessing services and the discharging service on the same port.
-func (s *identityd) setupServices(ctx *context.T, listenSpec *ipc.ListenSpec, macaroonKey []byte) (ipc.Server, []string, error) {
+func (s *IdentityServer) setupServices(ctx *context.T, listenSpec *ipc.ListenSpec, macaroonKey []byte) (ipc.Server, []string, error) {
server, err := veyron2.NewServer(ctx)
if err != nil {
return nil, nil, fmt.Errorf("failed to create new ipc.Server: %v", err)
diff --git a/services/mgmt/application/impl/dispatcher.go b/services/mgmt/application/impl/dispatcher.go
index 6b13186..b08cddd 100644
--- a/services/mgmt/application/impl/dispatcher.go
+++ b/services/mgmt/application/impl/dispatcher.go
@@ -3,6 +3,7 @@
import (
"path/filepath"
+ "v.io/core/veyron2/ipc"
"v.io/core/veyron2/naming"
"v.io/core/veyron2/security"
"v.io/core/veyron2/services/security/access"
@@ -22,7 +23,7 @@
// NewDispatcher is the dispatcher factory. storeDir is a path to a directory in which to
// serialize the applicationd state.
-func NewDispatcher(storeDir string) (*dispatcher, error) {
+func NewDispatcher(storeDir string) (ipc.Dispatcher, error) {
store, err := fs.NewMemstore(filepath.Join(storeDir, "applicationdstate.db"))
if err != nil {
return nil, err
diff --git a/services/mgmt/application/impl/service.go b/services/mgmt/application/impl/service.go
index 8ad14cd..fa6dfc5 100644
--- a/services/mgmt/application/impl/service.go
+++ b/services/mgmt/application/impl/service.go
@@ -5,6 +5,7 @@
"v.io/core/veyron/services/mgmt/lib/acls"
"v.io/core/veyron/services/mgmt/lib/fs"
+ "v.io/core/veyron/services/mgmt/repository"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/naming"
@@ -37,7 +38,7 @@
)
// NewApplicationService returns a new Application service implementation.
-func NewApplicationService(store *fs.Memstore, storeRoot, suffix string) *appRepoService {
+func NewApplicationService(store *fs.Memstore, storeRoot, suffix string) repository.ApplicationServerMethods {
return &appRepoService{store: store, storeRoot: storeRoot, suffix: suffix}
}
diff --git a/services/mgmt/binary/impl/dispatcher.go b/services/mgmt/binary/impl/dispatcher.go
index a8538d3..df9fc64 100644
--- a/services/mgmt/binary/impl/dispatcher.go
+++ b/services/mgmt/binary/impl/dispatcher.go
@@ -5,6 +5,7 @@
"os"
"path/filepath"
+ "v.io/core/veyron2/ipc"
"v.io/core/veyron2/security"
"v.io/core/veyron2/services/mgmt/repository"
"v.io/core/veyron2/services/security/access"
@@ -26,7 +27,7 @@
}
// NewDispatcher is the dispatcher factory.
-func NewDispatcher(principal security.Principal, state *state) (*dispatcher, error) {
+func NewDispatcher(principal security.Principal, state *state) (ipc.Dispatcher, error) {
return &dispatcher{
state: state,
locks: acls.NewLocks(),
diff --git a/services/mgmt/build/impl/service.go b/services/mgmt/build/impl/service.go
index e5569b4..6e2395b 100644
--- a/services/mgmt/build/impl/service.go
+++ b/services/mgmt/build/impl/service.go
@@ -30,7 +30,7 @@
}
// NewBuilderService returns a new Build service implementation.
-func NewBuilderService(gobin, goroot string) *builderService {
+func NewBuilderService(gobin, goroot string) build.BuilderServerMethods {
return &builderService{
gobin: gobin,
goroot: goroot,
diff --git a/services/mgmt/debug/dispatcher.go b/services/mgmt/debug/dispatcher.go
index 02d10bb..205ae58 100644
--- a/services/mgmt/debug/dispatcher.go
+++ b/services/mgmt/debug/dispatcher.go
@@ -21,7 +21,7 @@
var _ ipc.Dispatcher = (*dispatcher)(nil)
-func NewDispatcher(logsDir string, authorizer security.Authorizer) *dispatcher {
+func NewDispatcher(logsDir string, authorizer security.Authorizer) ipc.Dispatcher {
return &dispatcher{logsDir, authorizer}
}
diff --git a/services/mgmt/device/impl/impl_test.go b/services/mgmt/device/impl/impl_test.go
index 72402e9..9660a1b 100644
--- a/services/mgmt/device/impl/impl_test.go
+++ b/services/mgmt/device/impl/impl_test.go
@@ -504,13 +504,7 @@
}
}
-func verifyAppWorkspace(t *testing.T, root, appID, instanceID string) {
- // HACK ALERT: for now, we peek inside the device manager's directory
- // structure (which ought to be opaque) to check for what the app has
- // written to its local root.
- //
- // TODO(caprita): add support to device manager to browse logs/app local
- // root.
+func instanceDirForApp(root, appID, instanceID string) string {
applicationDirName := func(title string) string {
h := md5.New()
h.Write([]byte(title))
@@ -519,8 +513,17 @@
}
components := strings.Split(appID, "/")
appTitle, installationID := components[0], components[1]
- instanceDir := filepath.Join(root, applicationDirName(appTitle), "installation-"+installationID, "instances", "instance-"+instanceID)
- rootDir := filepath.Join(instanceDir, "root")
+ return filepath.Join(root, applicationDirName(appTitle), "installation-"+installationID, "instances", "instance-"+instanceID)
+}
+
+func verifyAppWorkspace(t *testing.T, root, appID, instanceID string) {
+ // HACK ALERT: for now, we peek inside the device manager's directory
+ // structure (which ought to be opaque) to check for what the app has
+ // written to its local root.
+ //
+ // TODO(caprita): add support to device manager to browse logs/app local
+ // root.
+ rootDir := filepath.Join(instanceDirForApp(root, appID, instanceID), "root")
testFile := filepath.Join(rootDir, "testfile")
if read, err := ioutil.ReadFile(testFile); err != nil {
t.Fatalf("Failed to read %v: %v", testFile, err)
@@ -530,6 +533,16 @@
// END HACK
}
+func verifyAppState(t *testing.T, root, appID, instanceID, state string) {
+ // Same hack alert as verifyAppWorkspace
+ testFile := filepath.Join(instanceDirForApp(root, appID, instanceID), state)
+ if read, err := ioutil.ReadFile(testFile); err != nil {
+ t.Fatalf("Failed to read %v: %v", testFile, err)
+ } else if want, got := "status", string(read); want != got {
+ t.Fatalf("Expected to read %v, got %v instead", want, got)
+ }
+}
+
func verifyPingArgs(t *testing.T, pingCh <-chan pingArgs, username, flagValue, envValue string) {
var args pingArgs
select {
@@ -622,6 +635,7 @@
// Wait until the app pings us that it's ready.
verifyPingArgs(t, pingCh, userName(t), "flag-val-install", "env-val-envelope")
+ verifyAppState(t, root, appID, instance1ID, "started")
v1EP1 := resolve(t, ctx, "appV1", 1)[0]
diff --git a/services/mgmt/profile/impl/dispatcher.go b/services/mgmt/profile/impl/dispatcher.go
index 40f04e8..35396a1 100644
--- a/services/mgmt/profile/impl/dispatcher.go
+++ b/services/mgmt/profile/impl/dispatcher.go
@@ -3,11 +3,11 @@
import (
"path/filepath"
- "v.io/core/veyron/services/mgmt/repository"
-
- "v.io/core/veyron/services/mgmt/lib/fs"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/security"
+
+ "v.io/core/veyron/services/mgmt/lib/fs"
+ "v.io/core/veyron/services/mgmt/repository"
)
// dispatcher holds the state of the profile repository dispatcher.
@@ -21,7 +21,7 @@
// NewDispatcher is the dispatcher factory. storeDir is a path to a
// directory in which the profile state is persisted.
-func NewDispatcher(storeDir string, authorizer security.Authorizer) (*dispatcher, error) {
+func NewDispatcher(storeDir string, authorizer security.Authorizer) (ipc.Dispatcher, error) {
store, err := fs.NewMemstore(filepath.Join(storeDir, "profilestate.db"))
if err != nil {
return nil, err
diff --git a/services/mgmt/profile/impl/service.go b/services/mgmt/profile/impl/service.go
index 329672b..f528d5a 100644
--- a/services/mgmt/profile/impl/service.go
+++ b/services/mgmt/profile/impl/service.go
@@ -5,6 +5,7 @@
"v.io/core/veyron/services/mgmt/lib/fs"
"v.io/core/veyron/services/mgmt/profile"
+ "v.io/core/veyron/services/mgmt/repository"
"v.io/core/veyron2/ipc"
"v.io/core/veyron2/naming"
@@ -27,7 +28,7 @@
)
// NewProfileService returns a new Profile service implementation.
-func NewProfileService(store *fs.Memstore, storeRoot, suffix string) *profileService {
+func NewProfileService(store *fs.Memstore, storeRoot, suffix string) repository.ProfileServerMethods {
return &profileService{store: store, storeRoot: storeRoot, suffix: suffix}
}
diff --git a/services/mounttable/lib/mounttable.go b/services/mounttable/lib/mounttable.go
index 9280527..93f0926 100644
--- a/services/mounttable/lib/mounttable.go
+++ b/services/mounttable/lib/mounttable.go
@@ -69,13 +69,13 @@
const templateVar = "%%"
-// NewMountTable creates a new server that uses the ACLs specified in
+// NewMountTableDispatcher creates a new server that uses the ACLs specified in
// aclfile for authorization.
//
// aclfile is a JSON-encoded mapping from paths in the mounttable to the
// access.TaggedACLMap for that path. The tags used in the map are the typical
// access tags (the Tag type defined in veyron2/services/security/access).
-func NewMountTable(aclfile string) (*mountTable, error) {
+func NewMountTableDispatcher(aclfile string) (ipc.Dispatcher, error) {
mt := &mountTable{
root: new(node),
}
@@ -413,11 +413,23 @@
// Mount a server onto the name in the receiver.
func (ms *mountContext) Mount(ctx ipc.ServerContext, server string, ttlsecs uint32, flags naming.MountFlag) error {
+ return ms.MountX(ctx, server, nil, ttlsecs, flags)
+}
+
+func (ms *mountContext) MountX(ctx ipc.ServerContext, server string, patterns []security.BlessingPattern, ttlsecs uint32, flags naming.MountFlag) error {
+ if len(patterns) == 0 {
+ // No patterns provided in the request, take the conservative
+ // approach and assume that the server being mounted will
+ // present the same blessings as the client calling Mount.
+ for _, b := range ctx.RemoteBlessings().ForContext(ctx) {
+ patterns = append(patterns, security.BlessingPattern(b))
+ }
+ }
mt := ms.mt
if ttlsecs == 0 {
ttlsecs = 10 * 365 * 24 * 60 * 60 // a really long time
}
- vlog.VI(2).Infof("*********************Mount %q -> %s", ms.name, server)
+ vlog.VI(2).Infof("*********************Mount %q -> %v%s", ms.name, patterns, server)
// Make sure the server address is reasonable.
epString := server
@@ -445,13 +457,13 @@
}
wantMT := hasMTFlag(flags)
if n.mount == nil {
- n.mount = &mount{servers: NewServerList(), mt: wantMT}
+ n.mount = &mount{servers: newServerList(), mt: wantMT}
} else {
if wantMT != n.mount.mt {
return fmt.Errorf("MT doesn't match")
}
}
- n.mount.servers.add(server, time.Duration(ttlsecs)*time.Second)
+ n.mount.servers.add(server, patterns, time.Duration(ttlsecs)*time.Second)
return nil
}
diff --git a/services/mounttable/lib/mounttable_test.go b/services/mounttable/lib/mounttable_test.go
index a1404d9..7ac6586 100644
--- a/services/mounttable/lib/mounttable_test.go
+++ b/services/mounttable/lib/mounttable_test.go
@@ -2,7 +2,6 @@
import (
"errors"
- "fmt"
"io"
"reflect"
"runtime/debug"
@@ -33,10 +32,10 @@
t.Fatal(string(debug.Stack()))
}
-func doMount(t *testing.T, ctx *context.T, ep, suffix, service string, shouldSucceed bool) {
+func doMount(t *testing.T, ctx *context.T, ep, suffix, service string, blessingPatterns []security.BlessingPattern, shouldSucceed bool) {
name := naming.JoinAddressName(ep, suffix)
client := veyron2.GetClient(ctx)
- call, err := client.StartCall(ctx, name, "Mount", []interface{}{service, uint32(ttlSecs), 0}, options.NoResolve{})
+ call, err := client.StartCall(ctx, name, "MountX", []interface{}{service, blessingPatterns, uint32(ttlSecs), 0}, options.NoResolve{})
if err != nil {
if !shouldSucceed {
return
@@ -179,22 +178,33 @@
}
}
-// resolve assumes that the mount contains 0 or 1 servers.
-func resolve(ctx *context.T, name string) (string, error) {
+func mountentry2names(e *naming.VDLMountEntry) []string {
+ names := make([]string, len(e.Servers))
+ for idx, s := range e.Servers {
+ names[idx] = naming.JoinAddressName(s.Server, e.Name)
+ }
+ return names
+}
+
+func strslice(strs ...string) []string {
+ return strs
+}
+
+func resolve(ctx *context.T, name string) (*naming.VDLMountEntry, error) {
// Resolve the name one level.
client := veyron2.GetClient(ctx)
call, err := client.StartCall(ctx, name, "ResolveStep", nil, options.NoResolve{})
if err != nil {
- return "", err
+ return nil, err
}
var entry naming.VDLMountEntry
if ierr := call.Finish(&entry, &err); ierr != nil {
- return "", ierr
+ return nil, ierr
}
if len(entry.Servers) < 1 {
- return "", errors.New("resolve returned no servers")
+ return nil, errors.New("resolve returned no servers")
}
- return naming.JoinAddressName(entry.Servers[0].Server, entry.Name), nil
+ return &entry, nil
}
func export(t *testing.T, ctx *context.T, name, contents string) {
@@ -205,7 +215,7 @@
}
// Export the value.
client := veyron2.GetClient(ctx)
- call, err := client.StartCall(ctx, resolved, "Export", []interface{}{contents, true}, options.NoResolve{})
+ call, err := client.StartCall(ctx, mountentry2names(resolved)[0], "Export", []interface{}{contents, true}, options.NoResolve{})
if err != nil {
boom(t, "Failed to Export.StartCall %s to %s: %s", name, contents, err)
}
@@ -228,7 +238,7 @@
}
// Look up the value.
client := veyron2.GetClient(ctx)
- call, err := client.StartCall(ctx, resolved, "Lookup", nil, options.NoResolve{})
+ call, err := client.StartCall(ctx, mountentry2names(resolved)[0], "Lookup", nil, options.NoResolve{})
if err != nil {
if shouldSucceed {
boom(t, "Failed Lookup.StartCall %s: %s", name, err)
@@ -259,9 +269,9 @@
boom(t, "r.NewServer: %s", err)
}
// Add mount table service.
- mt, err := NewMountTable(acl)
+ mt, err := NewMountTableDispatcher(acl)
if err != nil {
- boom(t, "NewMountTable: %v", err)
+ boom(t, "NewMountTableDispatcher: %v", err)
}
// Start serving on a loopback address.
eps, err := server.Listen(veyron2.GetListenSpec(rootCtx))
@@ -310,7 +320,7 @@
// Mount the collection server into the mount table.
vlog.Infof("Mount the collection server into the mount table.")
- doMount(t, rootCtx, mtAddr, "stuff", collectionName, true)
+ doMount(t, rootCtx, mtAddr, "stuff", collectionName, nil, true)
// Create a few objects and make sure we can read them.
vlog.Infof("Create a few objects.")
@@ -328,9 +338,9 @@
// Test multiple mounts.
vlog.Infof("Multiple mounts.")
- doMount(t, rootCtx, mtAddr, "a/b", collectionName, true)
- doMount(t, rootCtx, mtAddr, "x/y", collectionName, true)
- doMount(t, rootCtx, mtAddr, "alpha//beta", collectionName, true)
+ doMount(t, rootCtx, mtAddr, "a/b", collectionName, nil, true)
+ doMount(t, rootCtx, mtAddr, "x/y", collectionName, nil, true)
+ doMount(t, rootCtx, mtAddr, "alpha//beta", collectionName, nil, true)
vlog.Infof("Make sure we can read them.")
checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuff/falls"), "falls mainly on the plain", true)
checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "a/b/falls"), "falls mainly on the plain", true)
@@ -360,7 +370,7 @@
// Test specific unmount.
vlog.Info("Test specific unmount.")
- doMount(t, rootCtx, mtAddr, "a/b", collectionName, true)
+ doMount(t, rootCtx, mtAddr, "a/b", collectionName, nil, true)
doUnmount(t, rootCtx, mtAddr, "a/b", collectionName, true)
checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "a/b/falls"), "falls mainly on the plain", false)
@@ -368,15 +378,15 @@
vlog.Info("Try timing out a mount.")
ft := NewFakeTimeClock()
setServerListClock(ft)
- doMount(t, rootCtx, mtAddr, "stuffWithTTL", collectionName, true)
+ doMount(t, rootCtx, mtAddr, "stuffWithTTL", collectionName, nil, true)
checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuffWithTTL/the/rain"), "the rain", true)
ft.advance(time.Duration(ttlSecs+4) * time.Second)
checkContents(t, rootCtx, naming.JoinAddressName(mtAddr, "stuffWithTTL/the/rain"), "the rain", false)
// Test unauthorized mount.
vlog.Info("Test unauthorized mount.")
- doMount(t, bobCtx, mtAddr, "/a/b", collectionName, false)
- doMount(t, aliceCtx, mtAddr, "/a/b", collectionName, false)
+ doMount(t, bobCtx, mtAddr, "/a/b", collectionName, nil, false)
+ doMount(t, aliceCtx, mtAddr, "/a/b", collectionName, nil, false)
doUnmount(t, bobCtx, mtAddr, "x/y", collectionName, false)
}
@@ -456,9 +466,9 @@
// set up a mount space
fakeServer := naming.JoinAddressName(estr, "quux")
- doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
- doMount(t, rootCtx, estr, "in/the/middle", fakeServer, true)
- doMount(t, rootCtx, estr, "of/the/night", fakeServer, true)
+ doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
+ doMount(t, rootCtx, estr, "in/the/middle", fakeServer, nil, true)
+ doMount(t, rootCtx, estr, "of/the/night", fakeServer, nil, true)
// Try various globs.
tests := []struct {
@@ -503,14 +513,14 @@
fakeServer := naming.JoinAddressName(estr, "quux")
// Noone should be able to mount on someone else's names.
- doMount(t, aliceCtx, estr, "users/ted", fakeServer, false)
- doMount(t, bobCtx, estr, "users/carol", fakeServer, false)
- doMount(t, rootCtx, estr, "users/george", fakeServer, false)
+ doMount(t, aliceCtx, estr, "users/ted", fakeServer, nil, false)
+ doMount(t, bobCtx, estr, "users/carol", fakeServer, nil, false)
+ doMount(t, rootCtx, estr, "users/george", fakeServer, nil, false)
// Anyone should be able to mount on their own names.
- doMount(t, aliceCtx, estr, "users/alice", fakeServer, true)
- doMount(t, bobCtx, estr, "users/bob", fakeServer, true)
- doMount(t, rootCtx, estr, "users/root", fakeServer, true)
+ doMount(t, aliceCtx, estr, "users/alice", fakeServer, nil, true)
+ doMount(t, bobCtx, estr, "users/bob", fakeServer, nil, true)
+ doMount(t, rootCtx, estr, "users/root", fakeServer, nil, true)
}
func TestGlobACLs(t *testing.T) {
@@ -522,9 +532,9 @@
// set up a mount space
fakeServer := naming.JoinAddressName(estr, "quux")
- doMount(t, aliceCtx, estr, "one/bright/day", fakeServer, false) // Fails because alice can't mount there.
- doMount(t, bobCtx, estr, "one/bright/day", fakeServer, true)
- doMount(t, rootCtx, estr, "a/b/c", fakeServer, true)
+ doMount(t, aliceCtx, estr, "one/bright/day", fakeServer, nil, false) // Fails because alice can't mount there.
+ doMount(t, bobCtx, estr, "one/bright/day", fakeServer, nil, true)
+ doMount(t, rootCtx, estr, "a/b/c", fakeServer, nil, true)
// Try various globs.
tests := []struct {
@@ -555,7 +565,7 @@
// Set up one mount.
fakeServer := naming.JoinAddressName(estr, "quux")
- doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
+ doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
checkMatch(t, []string{"one", "one/bright", "one/bright/day"}, doGlob(t, rootCtx, estr, "", "*/..."))
// After the unmount nothing should be left
@@ -563,7 +573,7 @@
checkMatch(t, nil, doGlob(t, rootCtx, estr, "", "*/..."))
// Set up a mount, then set the ACL.
- doMount(t, rootCtx, estr, "one/bright/day", fakeServer, true)
+ doMount(t, rootCtx, estr, "one/bright/day", fakeServer, nil, true)
checkMatch(t, []string{"one", "one/bright", "one/bright/day"}, doGlob(t, rootCtx, estr, "", "*/..."))
acl := access.TaggedACLMap{"Read": access.ACL{In: []security.BlessingPattern{security.BlessingPattern("...")}}}
doSetACL(t, rootCtx, estr, "one/bright", acl, "", true)
@@ -582,8 +592,8 @@
// set up a mount space
fakeServer := naming.JoinAddressName(estr, "quux")
- doMount(t, bobCtx, estr, "one/bright/day", fakeServer, true)
- doMount(t, rootCtx, estr, "a/b/c", fakeServer, true)
+ doMount(t, bobCtx, estr, "one/bright/day", fakeServer, nil, true)
+ doMount(t, rootCtx, estr, "a/b/c", fakeServer, nil, true)
// It shouldn't be possible to delete anything with children unless explicitly requested.
doDeleteNode(t, rootCtx, estr, "a/b", false)
@@ -607,12 +617,12 @@
server, estr := newMT(t, "", rootCtx)
defer server.Stop()
- doMount(t, rootCtx, estr, "endpoint", naming.JoinAddressName(estr, "life/on/the/mississippi"), true)
- doMount(t, rootCtx, estr, "hostport", "/atrampabroad:8000", true)
- doMount(t, rootCtx, estr, "hostport-endpoint-platypus", "/@atrampabroad:8000@@", true)
- doMount(t, rootCtx, estr, "invalid/not/rooted", "atrampabroad:8000", false)
- doMount(t, rootCtx, estr, "invalid/no/port", "/atrampabroad", false)
- doMount(t, rootCtx, estr, "invalid/endpoint", "/@following the equator:8000@@@", false)
+ doMount(t, rootCtx, estr, "endpoint", naming.JoinAddressName(estr, "life/on/the/mississippi"), nil, true)
+ doMount(t, rootCtx, estr, "hostport", "/atrampabroad:8000", nil, true)
+ doMount(t, rootCtx, estr, "hostport-endpoint-platypus", "/@atrampabroad:8000@@", nil, true)
+ doMount(t, rootCtx, estr, "invalid/not/rooted", "atrampabroad:8000", nil, false)
+ doMount(t, rootCtx, estr, "invalid/no/port", "/atrampabroad", nil, false)
+ doMount(t, rootCtx, estr, "invalid/endpoint", "/@following the equator:8000@@@", nil, false)
}
func TestExpiry(t *testing.T) {
@@ -628,10 +638,10 @@
ft := NewFakeTimeClock()
setServerListClock(ft)
- doMount(t, rootCtx, estr, "a1/b1", collectionName, true)
- doMount(t, rootCtx, estr, "a1/b2", collectionName, true)
- doMount(t, rootCtx, estr, "a2/b1", collectionName, true)
- doMount(t, rootCtx, estr, "a2/b2/c", collectionName, true)
+ doMount(t, rootCtx, estr, "a1/b1", collectionName, nil, true)
+ doMount(t, rootCtx, estr, "a1/b2", collectionName, nil, true)
+ doMount(t, rootCtx, estr, "a2/b1", collectionName, nil, true)
+ doMount(t, rootCtx, estr, "a2/b2/c", collectionName, nil, true)
checkMatch(t, []string{"a1/b1", "a2/b1"}, doGlob(t, rootCtx, estr, "", "*/b1/..."))
ft.advance(time.Duration(ttlSecs/2) * time.Second)
@@ -639,27 +649,66 @@
checkMatch(t, []string{"c"}, doGlob(t, rootCtx, estr, "a2/b2", "*"))
// Refresh only a1/b1. All the other mounts will expire upon the next
// ft advance.
- doMount(t, rootCtx, estr, "a1/b1", collectionName, true)
+ doMount(t, rootCtx, estr, "a1/b1", collectionName, nil, true)
ft.advance(time.Duration(ttlSecs/2+4) * time.Second)
checkMatch(t, []string{"a1", "a1/b1"}, doGlob(t, rootCtx, estr, "", "*/..."))
checkMatch(t, []string{"a1/b1"}, doGlob(t, rootCtx, estr, "", "*/b1/..."))
}
func TestBadACLs(t *testing.T) {
- _, err := NewMountTable("testdata/invalid.acl")
+ _, err := NewMountTableDispatcher("testdata/invalid.acl")
if err == nil {
boom(t, "Expected json parse error in acl file")
}
- _, err = NewMountTable("testdata/doesntexist.acl")
+ _, err = NewMountTableDispatcher("testdata/doesntexist.acl")
if err == nil {
boom(t, "Expected error from missing acl file")
}
}
+func TestBlessingPatterns(t *testing.T) {
+ // TODO(ashankar): Change this test to use a variant of checkContents
+ // that will ensure that the client call to the resolved name fails if
+ // the blessing patterns in the mount entry is not consistent with the
+ // blessings presented by the end server (once the namespace library
+ // changes to respect VDLMountedServer.BlessingPatterns is in place).
+ rootCtx, aliceCtx, bobCtx, shutdown := initTest()
+ defer shutdown()
+
+ mt, mtAddr := newMT(t, "testdata/test.acl", rootCtx)
+ defer mt.Stop()
+
+ // collection server run by alice
+ collection, collectionAddr := newCollection(t, "testdata/test.acl", aliceCtx)
+ defer collection.Stop()
+ suffix := "users/bob"
+
+ // But mounted by bob, and since bob didn't specify an explicit set of
+ // blessing patterns, it will be thought of as bob's server.
+ doMount(t, bobCtx, mtAddr, suffix, collectionAddr, nil, true)
+ if e, err := resolve(aliceCtx, naming.JoinAddressName(mtAddr, suffix)); err != nil {
+ t.Error(err)
+ } else if len(e.Servers) != 1 {
+ t.Errorf("Got %v, want exactly 1 server", e.Servers)
+ } else if got, want := e.Servers[0].BlessingPatterns, strslice("bob"); !reflect.DeepEqual(got, want) {
+ t.Errorf("Got blessing patterns %v, want %v", got, want)
+ }
+ doUnmount(t, bobCtx, mtAddr, suffix, "", true)
+
+ // However, if bob explicitly says alice is running the server, then so be it.
+ doMount(t, bobCtx, mtAddr, suffix, collectionAddr, []security.BlessingPattern{"alice", "somebody"}, true)
+ if e, err := resolve(aliceCtx, naming.JoinAddressName(mtAddr, suffix)); err != nil {
+ t.Error(err)
+ } else if len(e.Servers) != 1 {
+ t.Errorf("Got %v, want exactly 1 server", e.Servers)
+ } else if got, want := e.Servers[0].BlessingPatterns, strslice("alice", "somebody"); !reflect.DeepEqual(got, want) {
+ t.Errorf("Got blessing patterns %v, want %v", got, want)
+ }
+}
+
func initTest() (rootCtx *context.T, aliceCtx *context.T, bobCtx *context.T, shutdown veyron2.Shutdown) {
testutil.Init()
ctx, shutdown := testutil.InitForTest()
-
var err error
if rootCtx, err = veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal("root")); err != nil {
panic("failed to set root principal")
@@ -670,38 +719,19 @@
if bobCtx, err = veyron2.SetPrincipal(ctx, tsecurity.NewPrincipal("bob")); err != nil {
panic("failed to set bob principal")
}
-
- // A hack to set the namespace roots to a value that won't work.
for _, r := range []*context.T{rootCtx, aliceCtx, bobCtx} {
+ // A hack to set the namespace roots to a value that won't work.
veyron2.GetNamespace(r).SetRoots()
- }
-
- // And setup their blessings so that they present "root", "alice" and "bob"
- // and these blessings are recognized by the others.
- principals := map[string]security.Principal{
- "root": veyron2.GetPrincipal(rootCtx),
- "alice": veyron2.GetPrincipal(aliceCtx),
- "bob": veyron2.GetPrincipal(bobCtx),
- }
- for name, p := range principals {
- blessing, err := p.BlessSelf(name)
- if err != nil {
- panic(fmt.Sprintf("BlessSelf(%q) failed: %v", name, err))
- }
- // Share this blessing with all servers and use it when serving clients.
- if err = p.BlessingStore().SetDefault(blessing); err != nil {
- panic(fmt.Sprintf("%v: %v", blessing, err))
- }
- if _, err = p.BlessingStore().Set(blessing, security.AllPrincipals); err != nil {
- panic(fmt.Sprintf("%v: %v", blessing, err))
- }
- // Have all principals trust the root of this blessing.
- for _, other := range principals {
- if err := other.AddToRoots(blessing); err != nil {
+ // And have all principals recognize each others blessings.
+ p1 := veyron2.GetPrincipal(r)
+ for _, other := range []*context.T{rootCtx, aliceCtx, bobCtx} {
+ // tsecurity.NewPrincipal has already setup each
+ // principal to use the same blessing for both server
+ // and client activities.
+ if err := p1.AddToRoots(veyron2.GetPrincipal(other).BlessingStore().Default()); err != nil {
panic(err)
}
}
}
-
return rootCtx, aliceCtx, bobCtx, shutdown
}
diff --git a/services/mounttable/lib/neighborhood.go b/services/mounttable/lib/neighborhood.go
index f915124..259aec2 100644
--- a/services/mounttable/lib/neighborhood.go
+++ b/services/mounttable/lib/neighborhood.go
@@ -65,7 +65,7 @@
return uint16(port)
}
-func newNeighborhoodServer(host string, addresses []string, loopback bool) (*neighborhood, error) {
+func newNeighborhood(host string, addresses []string, loopback bool) (*neighborhood, error) {
// Create the TXT contents with addresses to announce. Also pick up a port number.
var txt []string
var port uint16
@@ -115,14 +115,16 @@
return nh, nil
}
-// NewLoopbackNeighborhoodServer creates a new instance of a neighborhood server on loopback interfaces for testing.
-func NewLoopbackNeighborhoodServer(host string, addresses ...string) (*neighborhood, error) {
- return newNeighborhoodServer(host, addresses, true)
+// NewLoopbackNeighborhoodDispatcher creates a new instance of a dispatcher for
+// a neighborhood service provider on loopback interfaces (meant for testing).
+func NewLoopbackNeighborhoodDispatcher(host string, addresses ...string) (ipc.Dispatcher, error) {
+ return newNeighborhood(host, addresses, true)
}
-// NewNeighborhoodServer creates a new instance of a neighborhood server.
-func NewNeighborhoodServer(host string, addresses ...string) (*neighborhood, error) {
- return newNeighborhoodServer(host, addresses, false)
+// NewNeighborhoodDispatcher creates a new instance of a dispatcher for a
+// neighborhood service provider.
+func NewNeighborhoodDispatcher(host string, addresses ...string) (ipc.Dispatcher, error) {
+ return newNeighborhood(host, addresses, false)
}
// Lookup implements ipc.Dispatcher.Lookup.
@@ -173,7 +175,7 @@
}
}
for addr, ttl := range addrMap {
- reply = append(reply, naming.VDLMountedServer{addr, ttl})
+ reply = append(reply, naming.VDLMountedServer{addr, nil, ttl})
}
if reply != nil {
@@ -189,7 +191,7 @@
for _, ip := range ips {
addr := net.JoinHostPort(ip.String(), strconv.Itoa(int(rr.Port)))
ep := naming.FormatEndpoint("tcp", addr)
- reply = append(reply, naming.VDLMountedServer{naming.JoinAddressName(ep, ""), ttl})
+ reply = append(reply, naming.VDLMountedServer{naming.JoinAddressName(ep, ""), nil, ttl})
}
}
return reply
@@ -237,7 +239,10 @@
}
// Mount not implemented.
-func (*neighborhoodService) Mount(_ ipc.ServerContext, server string, ttlsecs uint32, opts naming.MountFlag) error {
+func (ns *neighborhoodService) Mount(ctx ipc.ServerContext, server string, ttlsecs uint32, opts naming.MountFlag) error {
+ return ns.MountX(ctx, server, nil, ttlsecs, opts)
+}
+func (ns *neighborhoodService) MountX(_ ipc.ServerContext, _ string, _ []security.BlessingPattern, _ uint32, _ naming.MountFlag) error {
return errors.New("this server does not implement Mount")
}
diff --git a/services/mounttable/lib/neighborhood_test.go b/services/mounttable/lib/neighborhood_test.go
index 9d673a9..c9b8293 100644
--- a/services/mounttable/lib/neighborhood_test.go
+++ b/services/mounttable/lib/neighborhood_test.go
@@ -53,11 +53,11 @@
serverName := fmt.Sprintf("nhtest%d", os.Getpid())
// Add neighborhood server.
- nhd, err := NewLoopbackNeighborhoodServer(serverName, addresses...)
+ nhd, err := NewLoopbackNeighborhoodDispatcher(serverName, addresses...)
if err != nil {
boom(t, "Failed to create neighborhood server: %s\n", err)
}
- defer nhd.Stop()
+ defer nhd.(*neighborhood).Stop()
if err := server.ServeDispatcher("", nhd); err != nil {
boom(t, "Failed to register neighborhood server: %s", err)
}
diff --git a/services/mounttable/lib/serverlist.go b/services/mounttable/lib/serverlist.go
index 02c7308..f74752f 100644
--- a/services/mounttable/lib/serverlist.go
+++ b/services/mounttable/lib/serverlist.go
@@ -6,6 +6,7 @@
"time"
"v.io/core/veyron2/naming"
+ "v.io/core/veyron2/security"
)
type serverListClock interface {
@@ -24,8 +25,9 @@
// server maintains the state of a single server. Unless expires is refreshed before the
// time is reached, the entry will be removed.
type server struct {
- expires time.Time
- oa string // object address of server
+ expires time.Time
+ oa string // object address of server
+ patterns []string // patterns that match the blessings presented by the server.
}
// serverList represents an ordered list of servers.
@@ -34,8 +36,8 @@
l *list.List // contains entries of type *server
}
-// NewServerList creates a synchronized list of servers.
-func NewServerList() *serverList {
+// newServerList creates a synchronized list of servers.
+func newServerList() *serverList {
return &serverList{l: list.New()}
}
@@ -59,8 +61,12 @@
// add to the front of the list if not already in the list, otherwise,
// update the expiration time and move to the front of the list. That
// way the most recently refreshed is always first.
-func (sl *serverList) add(oa string, ttl time.Duration) {
+func (sl *serverList) add(oa string, patterns []security.BlessingPattern, ttl time.Duration) {
expires := slc.now().Add(ttl)
+ strpats := make([]string, len(patterns))
+ for idx, pat := range patterns {
+ strpats[idx] = string(pat)
+ }
sl.Lock()
defer sl.Unlock()
for e := sl.l.Front(); e != nil; e = e.Next() {
@@ -72,8 +78,9 @@
}
}
s := &server{
- oa: oa,
- expires: expires,
+ oa: oa,
+ expires: expires,
+ patterns: strpats,
}
sl.l.PushFront(s) // innocent until proven guilty
}
@@ -118,7 +125,7 @@
for e := sl.l.Front(); e != nil; e = e.Next() {
s := e.Value.(*server)
ttl := uint32(s.expires.Sub(now).Seconds())
- ms := naming.VDLMountedServer{Server: s.oa, TTL: ttl}
+ ms := naming.VDLMountedServer{Server: s.oa, BlessingPatterns: s.patterns, TTL: ttl}
slice = append(slice, ms)
}
return slice
diff --git a/services/mounttable/lib/serverlist_test.go b/services/mounttable/lib/serverlist_test.go
index 66e31a4..7c1c135 100644
--- a/services/mounttable/lib/serverlist_test.go
+++ b/services/mounttable/lib/serverlist_test.go
@@ -1,8 +1,13 @@
package mounttable
import (
+ "fmt"
+ "reflect"
"testing"
"time"
+
+ "v.io/core/veyron2/naming"
+ "v.io/core/veyron2/security"
)
type fakeTime struct {
@@ -30,9 +35,10 @@
// Test adding entries.
ft := NewFakeTimeClock()
setServerListClock(ft)
- sl := NewServerList()
+ sl := newServerList()
for i, ep := range eps {
- sl.add(ep, time.Duration(5*i)*time.Second)
+ bp := security.BlessingPattern(fmt.Sprintf("ep%d", i))
+ sl.add(ep, []security.BlessingPattern{bp}, time.Duration(5*i)*time.Second)
}
if sl.len() != len(eps) {
t.Fatalf("got %d, want %d", sl.len(), len(eps))
@@ -49,4 +55,15 @@
if sl.len() != len(eps)-3 {
t.Fatalf("got %d, want %d", sl.len(), len(eps)-3)
}
+
+ // Test copyToSlice.
+ if got, want := sl.copyToSlice(), []naming.VDLMountedServer{
+ {
+ Server: "endpoint:dfgsfdg@@",
+ TTL: 9,
+ BlessingPatterns: []string{"ep3"},
+ },
+ }; !reflect.DeepEqual(got, want) {
+ t.Errorf("Got %v, want %v", got, want)
+ }
}
diff --git a/services/mounttable/mounttabled/mounttable.go b/services/mounttable/mounttabled/mounttable.go
index b6d60b9..c1d97bd 100644
--- a/services/mounttable/mounttabled/mounttable.go
+++ b/services/mounttable/mounttabled/mounttable.go
@@ -32,9 +32,9 @@
os.Exit(1)
}
defer mtServer.Stop()
- mt, err := mounttable.NewMountTable(*aclFile)
+ mtd, err := mounttable.NewMountTableDispatcher(*aclFile)
if err != nil {
- vlog.Errorf("r.NewMountTable failed: %v", err)
+ vlog.Errorf("r.NewMountTableDispatcher failed: %v", err)
os.Exit(1)
}
listenSpec := veyron2.GetListenSpec(ctx)
@@ -45,7 +45,7 @@
}
mtEndpoint := mtEndpoints[0]
name := *mountName
- if err := mtServer.ServeDispatcher(name, mt); err != nil {
+ if err := mtServer.ServeDispatcher(name, mtd); err != nil {
vlog.Errorf("ServeDispatcher(%v) failed: %v", name, err)
os.Exit(1)
}
@@ -72,12 +72,12 @@
myObjectName := mtEndpoint.Name()
- nh, err := mounttable.NewNeighborhoodServer(*nhName, myObjectName)
+ nhd, err := mounttable.NewNeighborhoodDispatcher(*nhName, myObjectName)
if err != nil {
vlog.Errorf("NewNeighborhoodServer failed: %v", err)
os.Exit(1)
}
- if err := nhServer.ServeDispatcher(naming.JoinAddressName(myObjectName, "nh"), nh); err != nil {
+ if err := nhServer.ServeDispatcher(naming.JoinAddressName(myObjectName, "nh"), nhd); err != nil {
vlog.Errorf("nhServer.ServeDispatcher failed to register neighborhood: %v", err)
os.Exit(1)
}
diff --git a/services/security/discharger.vdl b/services/security/discharger.vdl
index d43ed74..c1747cc 100644
--- a/services/security/discharger.vdl
+++ b/services/security/discharger.vdl
@@ -10,7 +10,7 @@
//
// Caveat and Discharge are of type ThirdPartyCaveat and Discharge
// 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?
+ // TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+ // we have to figure out an alternative to any for the return Discharge.
Discharge(Caveat any, Impetus security.DischargeImpetus) (Discharge any | error)
}
diff --git a/services/security/discharger.vdl.go b/services/security/discharger.vdl.go
index 771c5f1..f086448 100644
--- a/services/security/discharger.vdl.go
+++ b/services/security/discharger.vdl.go
@@ -24,8 +24,8 @@
//
// Caveat and Discharge are of type ThirdPartyCaveat and Discharge
// 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?
+ // TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+ // we have to figure out an alternative to any for the return Discharge.
Discharge(ctx *__context.T, Caveat __vdl.AnyRep, Impetus security.DischargeImpetus, opts ...__ipc.CallOpt) (Discharge __vdl.AnyRep, err error)
}
@@ -80,8 +80,8 @@
//
// Caveat and Discharge are of type ThirdPartyCaveat and Discharge
// 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?
+ // TODO(ataly,ashankar): The type of Caveat should become security.Caveat and
+ // we have to figure out an alternative to any for the return Discharge.
Discharge(ctx __ipc.ServerContext, Caveat __vdl.AnyRep, Impetus security.DischargeImpetus) (Discharge __vdl.AnyRep, err error)
}
@@ -143,7 +143,7 @@
Methods: []__ipc.MethodDesc{
{
Name: "Discharge",
- Doc: "// Discharge is called by a principal that holds a blessing with a third\n// party caveat and seeks to get a discharge that proves the fulfillment of\n// this caveat.\n//\n// Caveat and Discharge are of type ThirdPartyCaveat and Discharge\n// respectively. (not enforced here because vdl does not know these types)\n// TODO(ataly,ashankar): Figure out a VDL representation for ThirdPartyCaveat\n// and Discharge and use those here?",
+ Doc: "// Discharge is called by a principal that holds a blessing with a third\n// party caveat and seeks to get a discharge that proves the fulfillment of\n// this caveat.\n//\n// Caveat and Discharge are of type ThirdPartyCaveat and Discharge\n// respectively. (not enforced here because vdl does not know these types)\n// TODO(ataly,ashankar): The type of Caveat should become security.Caveat and\n// we have to figure out an alternative to any for the return Discharge.",
InArgs: []__ipc.ArgDesc{
{"Caveat", ``}, // __vdl.AnyRep
{"Impetus", ``}, // security.DischargeImpetus
diff --git a/tools/application/impl_test.go b/tools/application/impl_test.go
index 7b20e9f..e688c62 100644
--- a/tools/application/impl_test.go
+++ b/tools/application/impl_test.go
@@ -82,7 +82,7 @@
type dispatcher struct {
}
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
return &dispatcher{}
}
diff --git a/tools/binary/impl_test.go b/tools/binary/impl_test.go
index 0bfe953..d0b1788 100644
--- a/tools/binary/impl_test.go
+++ b/tools/binary/impl_test.go
@@ -86,7 +86,7 @@
type dispatcher struct {
}
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
return &dispatcher{}
}
diff --git a/tools/build/doc.go b/tools/build/doc.go
index d58afb3..40cd568 100644
--- a/tools/build/doc.go
+++ b/tools/build/doc.go
@@ -69,9 +69,9 @@
against all packages with that prefix.
The build build flags are:
- -arch=amd64
+ -arch=$GOARCH
Target architecture.
- -os=darwin
+ -os=$GOOS
Target operating system.
Build Help
diff --git a/tools/build/impl.go b/tools/build/impl.go
index b8e0b90..4b7e4af 100644
--- a/tools/build/impl.go
+++ b/tools/build/impl.go
@@ -6,7 +6,7 @@
"io/ioutil"
"os"
"path/filepath"
- goruntime "runtime"
+ "runtime"
"strings"
"time"
@@ -15,14 +15,30 @@
"v.io/lib/cmdline"
)
+const (
+ defaultArch = "$GOARCH"
+ defaultOS = "$GOOS"
+)
+
var (
flagArch string
flagOS string
)
func init() {
- cmdBuild.Flags.StringVar(&flagArch, "arch", goruntime.GOARCH, "Target architecture.")
- cmdBuild.Flags.StringVar(&flagOS, "os", goruntime.GOOS, "Target operating system.")
+ cmdBuild.Flags.StringVar(&flagArch, "arch", defaultArch, "Target architecture.")
+ cmdBuild.Flags.StringVar(&flagOS, "os", defaultOS, "Target operating system.")
+}
+
+// substituteVarsInFlags substitutes environment variables in default
+// values of relevant flags.
+func substituteVarsInFlags() {
+ if flagArch == defaultArch {
+ flagArch = runtime.GOARCH
+ }
+ if flagOS == defaultOS {
+ flagOS = runtime.GOOS
+ }
}
var cmdRoot = &cmdline.Command{
diff --git a/tools/build/main.go b/tools/build/main.go
index 65f7187..50b3224 100644
--- a/tools/build/main.go
+++ b/tools/build/main.go
@@ -17,6 +17,7 @@
func main() {
var shutdown veyron2.Shutdown
gctx, shutdown = veyron2.Init()
+ substituteVarsInFlags()
exitCode := root().Main()
shutdown()
os.Exit(exitCode)
diff --git a/tools/mgmt/device/impl/devicemanager_mock_test.go b/tools/mgmt/device/impl/devicemanager_mock_test.go
index 523c5e2..d0da827 100644
--- a/tools/mgmt/device/impl/devicemanager_mock_test.go
+++ b/tools/mgmt/device/impl/devicemanager_mock_test.go
@@ -200,7 +200,7 @@
t *testing.T
}
-func NewDispatcher(t *testing.T, tape *Tape) *dispatcher {
+func NewDispatcher(t *testing.T, tape *Tape) ipc.Dispatcher {
return &dispatcher{tape: tape, t: t}
}
diff --git a/tools/mounttable/impl_test.go b/tools/mounttable/impl_test.go
index 43c650e..71de1c8 100644
--- a/tools/mounttable/impl_test.go
+++ b/tools/mounttable/impl_test.go
@@ -25,8 +25,8 @@
func (s *server) Glob__(ctx ipc.ServerContext, pattern string) (<-chan naming.VDLMountEntry, error) {
vlog.VI(2).Infof("Glob() was called. suffix=%v pattern=%q", s.suffix, pattern)
ch := make(chan naming.VDLMountEntry, 2)
- ch <- naming.VDLMountEntry{"name1", []naming.VDLMountedServer{{"server1", 123}}, false}
- ch <- naming.VDLMountEntry{"name2", []naming.VDLMountedServer{{"server2", 456}, {"server3", 789}}, false}
+ ch <- naming.VDLMountEntry{"name1", []naming.VDLMountedServer{{"server1", nil, 123}}, false}
+ ch <- naming.VDLMountEntry{"name2", []naming.VDLMountedServer{{"server2", nil, 456}, {"server3", nil, 789}}, false}
close(ch)
return ch, nil
}
@@ -36,6 +36,11 @@
return nil
}
+func (s *server) MountX(_ ipc.ServerContext, server string, patterns []security.BlessingPattern, ttl uint32, flags naming.MountFlag) error {
+ vlog.VI(2).Infof("MountX() was called. suffix=%v servers=%q patterns=%v ttl=%d", s.suffix, server, patterns, ttl)
+ return nil
+}
+
func (s *server) Unmount(_ ipc.ServerContext, server string) error {
vlog.VI(2).Infof("Unmount() was called. suffix=%v server=%q", s.suffix, server)
return nil
@@ -43,14 +48,14 @@
func (s *server) ResolveStep(ipc.ServerContext) (entry naming.VDLMountEntry, err error) {
vlog.VI(2).Infof("ResolveStep() was called. suffix=%v", s.suffix)
- entry.Servers = []naming.VDLMountedServer{{"server1", 123}}
+ entry.Servers = []naming.VDLMountedServer{{"server1", nil, 123}}
entry.Name = s.suffix
return
}
func (s *server) ResolveStepX(ipc.ServerContext) (entry naming.VDLMountEntry, err error) {
vlog.VI(2).Infof("ResolveStepX() was called. suffix=%v", s.suffix)
- entry.Servers = []naming.VDLMountedServer{{"server1", 123}}
+ entry.Servers = []naming.VDLMountedServer{{"server1", nil, 123}}
entry.Name = s.suffix
return
}
@@ -148,7 +153,7 @@
if err := cmd.Execute([]string{"resolvestep", naming.JoinAddressName(endpoint.String(), "name")}); err != nil {
t.Fatalf("%v", err)
}
- if expected, got := `Servers: [{server1 123}] Suffix: "name" MT: false`, strings.TrimSpace(stdout.String()); got != expected {
+ if expected, got := `Servers: [{server1 [] 123}] Suffix: "name" MT: false`, strings.TrimSpace(stdout.String()); got != expected {
t.Errorf("Got %q, expected %q", got, expected)
}
stdout.Reset()
diff --git a/tools/naming/simulator/shell_functions.go b/tools/naming/simulator/shell_functions.go
index 5a8f899..ecbe56d 100644
--- a/tools/naming/simulator/shell_functions.go
+++ b/tools/naming/simulator/shell_functions.go
@@ -75,7 +75,7 @@
return err
}
disable := true
- switch args[1] {
+ switch args[0] {
case "on":
disable = false
case "off":
@@ -116,5 +116,5 @@
}
func setNamespaceRoots(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
- return veyron2.GetNamespace(ctx).SetRoots(args[1:]...)
+ return veyron2.GetNamespace(ctx).SetRoots(args...)
}
diff --git a/tools/naming/simulator/testdata/ambiguity.scr b/tools/naming/simulator/testdata/ambiguity.scr
index afa2c0a..a647015 100644
--- a/tools/naming/simulator/testdata/ambiguity.scr
+++ b/tools/naming/simulator/testdata/ambiguity.scr
@@ -21,19 +21,19 @@
set localaddr="--veyron.tcp.address=127.0.0.1:0"
-root -- $localaddr
+root $localaddr
set r=$_
read $r
eval $r
set s1=$MT_NAME
-root -- $localaddr
+root $localaddr
set r=$_
read $r
eval $r
set s2=$MT_NAME
-root -- $localaddr
+root $localaddr
set r=$_
read $r
eval $r
@@ -45,7 +45,7 @@
mount $s2/b $s3/c 1h
wait $_
-echoServer -- $localaddr "Echo" $s3/c
+echoServer $localaddr "Echo" $s3/c
set es_h=$_
# Returns the root and three mounts at s1/a.
diff --git a/tools/naming/simulator/testdata/echo.scr b/tools/naming/simulator/testdata/echo.scr
index fe4f59b..4ca7435 100644
--- a/tools/naming/simulator/testdata/echo.scr
+++ b/tools/naming/simulator/testdata/echo.scr
@@ -7,7 +7,7 @@
setRoots
# A 'stand-alone' server
-echoServer -- $localaddr $ws $localaddr "text" ""
+echoServer $localaddr $ws $localaddr "text" ""
set es=$_
read $es
eval $es
@@ -22,14 +22,14 @@
wait $ec
# now use a nameserver.
-root -- $localaddr
+root $localaddr
set r=$_
read $r
eval $r
set root=$MT_NAME
set NAMESPACE_ROOT=$root
-echoServer -- $localaddr $ws $localaddr "text2" "a/b"
+echoServer $localaddr $ws $localaddr "text2" "a/b"
set es=$_
read $es
eval $es
diff --git a/tools/naming/simulator/testdata/integration_test.go b/tools/naming/simulator/testdata/integration_test.go
index 9cee3bf..be038a7 100644
--- a/tools/naming/simulator/testdata/integration_test.go
+++ b/tools/naming/simulator/testdata/integration_test.go
@@ -1,6 +1,8 @@
package testdata
import (
+ "bufio"
+ "bytes"
"fmt"
"io/ioutil"
"os"
@@ -34,8 +36,10 @@
}
for _, script := range scripts {
invocation := binary.Start("--file", script)
- output, errorOutput := invocation.Output(), invocation.ErrorOutput()
- if err := invocation.Wait(nil, nil); err != nil {
+ output := invocation.Output()
+ var buf bytes.Buffer
+ if err := invocation.Wait(nil, bufio.NewWriter(&buf)); err != nil {
+ errorOutput := string(buf.Bytes())
fmt.Fprintf(os.Stderr, "Script %v failed\n", script)
fmt.Fprintln(os.Stderr, output)
fmt.Fprintln(os.Stderr, errorOutput)
diff --git a/tools/naming/simulator/testdata/json_example.scr b/tools/naming/simulator/testdata/json_example.scr
index e882725..d399a30 100644
--- a/tools/naming/simulator/testdata/json_example.scr
+++ b/tools/naming/simulator/testdata/json_example.scr
@@ -3,7 +3,7 @@
set localaddr=--veyron.tcp.address=127.0.0.1:0
-root -- $localaddr
+root $localaddr
set root=$_
eval $root
set ROOT_PID=$PID
@@ -12,7 +12,7 @@
json_set ROOT_NAME ROOT_PID
set PROXY_MOUNTPOINT=$ROOT_NAME/proxy/mp
-proxyd -- $localaddr $PROXY_MOUNTPOINT
+proxyd $localaddr $PROXY_MOUNTPOINT
set proxyd=$_
read $proxyd
eval $proxyd
diff --git a/tools/naming/simulator/testdata/mt_complex.scr b/tools/naming/simulator/testdata/mt_complex.scr
index 620dbc1..e7761d3 100644
--- a/tools/naming/simulator/testdata/mt_complex.scr
+++ b/tools/naming/simulator/testdata/mt_complex.scr
@@ -7,21 +7,21 @@
cache off
-root -- $localaddr
+root $localaddr
set root_h=$_
read $root_h
eval $root_h
set root=$MT_NAME
set NAMESPACE_ROOT=$root
-mt -- $localaddr tl/a
+mt $localaddr tl/a
set m=$_
set mt_a_h=$m
read $m
eval $m
set mt_a_name=$MT_NAME
-mt -- $localaddr tl/b
+mt $localaddr tl/b
set m=$_
set mt_b_h=$m
eval $m
@@ -73,7 +73,7 @@
#
# run an echo server on tl.
-echoServer -- $localaddr "E1" tl
+echoServer $localaddr "E1" tl
set es_E1=$_
read $es_E1
eval $es_E1
@@ -126,7 +126,7 @@
# run an echo server on tl/a - note that this currently doesn't seem to
# have any effect on the mount table - that is, I suspect the mount table
# refuses the mount.
-echoServer -- $localaddr "E2" tl/a
+echoServer $localaddr "E2" tl/a
set es_E2=$_
read $es_E2
eval $es_E2
@@ -207,7 +207,7 @@
# Create a mount table with a 'long' name
set long_name=tl/b/some/deep/name/that/is/a/mount/table
-mt -- $localaddr $long_name
+mt $localaddr $long_name
set m=$_
read $m
eval $m
@@ -216,14 +216,14 @@
# Create a second mount table with a 'long' name
set second_long_name=tl/a/some/deep/name/that/is/a/mount/table
-mt -- $localaddr $second_long_name
+mt $localaddr $second_long_name
set m=$_
read $m
eval $m
set mt_l2_name=$MT_NAME
# Run an echo server that uses that mount table
-echoServer -- $localaddr "E3" $long_name/echo
+echoServer $localaddr "E3" $long_name/echo
set es_E3=$_
eval $es_E3
set es_E3_name=$NAME
@@ -246,7 +246,7 @@
mount tl/b/symlink $mt_b_name/$symlink_target 1h M
wait $_
-ls -- -l tl/b/symlink
+ls -l tl/b/symlink
wait $_
resolve tl/b/symlink
diff --git a/tools/naming/simulator/testdata/mt_simple.scr b/tools/naming/simulator/testdata/mt_simple.scr
index ef648ec..9c5b5f2 100644
--- a/tools/naming/simulator/testdata/mt_simple.scr
+++ b/tools/naming/simulator/testdata/mt_simple.scr
@@ -3,19 +3,19 @@
set localaddr="--veyron.tcp.address=127.0.0.1:0"
set ws=--veyron.tcp.protocol=ws
-root -- $localaddr
+root $localaddr
set m=$_
read $m
eval $m
set root=$MT_NAME
set NAMESPACE_ROOT=$root
-mt -- $localaddr $ws $localaddr usa
+mt $localaddr $ws $localaddr usa
set m=$_
read $m
eval $m
set usa_mt=$MT_NAME
-mt -- $localaddr $ws $localaddr uk
+mt $localaddr $ws $localaddr uk
set m=$_
read $m
eval $m
@@ -28,14 +28,14 @@
wait $l
set NAMESPACE_ROOT=$usa_mt
-mt -- $localaddr $ws $localaddr "palo alto"
+mt $localaddr $ws $localaddr "palo alto"
set m=$_
read $m
eval $m
set pa_mt=$MT_NAME
set NAMESPACE_ROOT=$uk_mt
-mt -- $localaddr $ws $localaddr "cambridge"
+mt $localaddr $ws $localaddr "cambridge"
set m=$_
read $m
eval $m
@@ -47,7 +47,7 @@
assert $RN 7
wait $l
-ls -- -l $root/...
+ls -l $root/...
wait $_
resolve $root/usa
diff --git a/tools/naming/simulator/testdata/proxy.scr b/tools/naming/simulator/testdata/proxy.scr
index cb0d6bc..855879e 100644
--- a/tools/naming/simulator/testdata/proxy.scr
+++ b/tools/naming/simulator/testdata/proxy.scr
@@ -3,7 +3,7 @@
set localaddr=--veyron.tcp.address=127.0.0.1:0
set ws=--veyron.tcp.protocol=ws
-root -- $localaddr
+root $localaddr
set m=$_
read $m
eval $m
@@ -13,7 +13,7 @@
print $NAMESPACE_ROOT
# run a non-proxied echo server
-echoServer -- $localaddr $ws $localaddr noproxy echo/noproxy
+echoServer $localaddr $ws $localaddr noproxy echo/noproxy
set esnp=$_
read $esnp
eval $esnp
@@ -25,7 +25,7 @@
assert $l "noproxy: ohh"
# run a proxy server
-proxyd -- $localaddr $ws $localaddr p1
+proxyd $localaddr $ws $localaddr p1
set proxy=$_
read $proxy
# PROXY_NAME=<name of proxy>
@@ -44,7 +44,7 @@
#assert $RN 3
#wait $l
-echoServer -- $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
+echoServer $localaddr $ws $localaddr --veyron.proxy=p1 withproxy echo/withproxy
set eswp=$_
read $eswp
eval $eswp
@@ -104,9 +104,9 @@
# $ep4_addr
assert $rid $ECHOS_RID
-ls -- -l echo/withproxy
+ls -l echo/withproxy
wait $_
-ls -- -l echo/noproxy
+ls -l echo/noproxy
wait $_
echoClient echo/withproxy "ohh"
diff --git a/tools/naming/simulator/testdata/public_echo.scr b/tools/naming/simulator/testdata/public_echo.scr
index 4e508e9..5447fad 100644
--- a/tools/naming/simulator/testdata/public_echo.scr
+++ b/tools/naming/simulator/testdata/public_echo.scr
@@ -9,7 +9,7 @@
# now use the global nameserver.
set global_name=global/echo
-echoServer -- $localaddr "text2" $global_name
+echoServer $localaddr "text2" $global_name
set es=$_
read $es
eval $es
diff --git a/tools/profile/impl_test.go b/tools/profile/impl_test.go
index f334e31..8ae4621 100644
--- a/tools/profile/impl_test.go
+++ b/tools/profile/impl_test.go
@@ -76,7 +76,7 @@
type dispatcher struct {
}
-func NewDispatcher() *dispatcher {
+func NewDispatcher() ipc.Dispatcher {
return &dispatcher{}
}
diff --git a/tools/vrpc/test_base/test_base.vdl b/tools/vrpc/test_base/test_base.vdl
index e0406da..70e3b85 100644
--- a/tools/vrpc/test_base/test_base.vdl
+++ b/tools/vrpc/test_base/test_base.vdl
@@ -4,6 +4,8 @@
X,Y int32
}
+type Array2Int [2]int32
+
// TypeTester methods are listed in alphabetical order, to make it easier to
// test Signature output, which sorts methods alphabetically.
type TypeTester interface {
@@ -19,7 +21,7 @@
EchoUint64(I1 uint64) (O1 uint64 | error)
// Methods to test support for composite types.
- XEchoArray(I1 [2]int32) (O1 [2]int32 | error)
+ XEchoArray(I1 Array2Int) (O1 Array2Int | error)
XEchoMap(I1 map[int32]string) (O1 map[int32]string | error)
XEchoSet(I1 set[int32]) (O1 set[int32] | error)
XEchoSlice(I1 []int32) (O1 []int32 | error)
diff --git a/tools/vrpc/test_base/test_base.vdl.go b/tools/vrpc/test_base/test_base.vdl.go
index af0e095..11d7c40 100644
--- a/tools/vrpc/test_base/test_base.vdl.go
+++ b/tools/vrpc/test_base/test_base.vdl.go
@@ -22,8 +22,16 @@
}) {
}
+type Array2Int [2]int32
+
+func (Array2Int) __VDLReflect(struct {
+ Name string "v.io/core/veyron/tools/vrpc/test_base.Array2Int"
+}) {
+}
+
func init() {
__vdl.Register(Struct{})
+ __vdl.Register(Array2Int{})
}
// TypeTesterClientMethods is the client interface
@@ -43,7 +51,7 @@
EchoUint32(ctx *__context.T, I1 uint32, opts ...__ipc.CallOpt) (O1 uint32, err error)
EchoUint64(ctx *__context.T, I1 uint64, opts ...__ipc.CallOpt) (O1 uint64, err error)
// Methods to test support for composite types.
- XEchoArray(ctx *__context.T, I1 [2]int32, opts ...__ipc.CallOpt) (O1 [2]int32, err error)
+ XEchoArray(ctx *__context.T, I1 Array2Int, opts ...__ipc.CallOpt) (O1 Array2Int, err error)
XEchoMap(ctx *__context.T, I1 map[int32]string, opts ...__ipc.CallOpt) (O1 map[int32]string, err error)
XEchoSet(ctx *__context.T, I1 map[int32]struct{}, opts ...__ipc.CallOpt) (O1 map[int32]struct{}, err error)
XEchoSlice(ctx *__context.T, I1 []int32, opts ...__ipc.CallOpt) (O1 []int32, err error)
@@ -183,7 +191,7 @@
return
}
-func (c implTypeTesterClientStub) XEchoArray(ctx *__context.T, i0 [2]int32, opts ...__ipc.CallOpt) (o0 [2]int32, err error) {
+func (c implTypeTesterClientStub) XEchoArray(ctx *__context.T, i0 Array2Int, opts ...__ipc.CallOpt) (o0 Array2Int, err error) {
var call __ipc.Call
if call, err = c.c(ctx).StartCall(ctx, c.name, "XEchoArray", []interface{}{i0}, opts...); err != nil {
return
@@ -356,7 +364,7 @@
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.
- XEchoArray(ctx __ipc.ServerContext, I1 [2]int32) (O1 [2]int32, err error)
+ XEchoArray(ctx __ipc.ServerContext, I1 Array2Int) (O1 Array2Int, err error)
XEchoMap(ctx __ipc.ServerContext, I1 map[int32]string) (O1 map[int32]string, err error)
XEchoSet(ctx __ipc.ServerContext, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
XEchoSlice(ctx __ipc.ServerContext, I1 []int32) (O1 []int32, err error)
@@ -384,7 +392,7 @@
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.
- XEchoArray(ctx __ipc.ServerContext, I1 [2]int32) (O1 [2]int32, err error)
+ XEchoArray(ctx __ipc.ServerContext, I1 Array2Int) (O1 Array2Int, err error)
XEchoMap(ctx __ipc.ServerContext, I1 map[int32]string) (O1 map[int32]string, err error)
XEchoSet(ctx __ipc.ServerContext, I1 map[int32]struct{}) (O1 map[int32]struct{}, err error)
XEchoSlice(ctx __ipc.ServerContext, I1 []int32) (O1 []int32, err error)
@@ -461,7 +469,7 @@
return s.impl.EchoUint64(ctx, i0)
}
-func (s implTypeTesterServerStub) XEchoArray(ctx __ipc.ServerContext, i0 [2]int32) ([2]int32, error) {
+func (s implTypeTesterServerStub) XEchoArray(ctx __ipc.ServerContext, i0 Array2Int) (Array2Int, error) {
return s.impl.XEchoArray(ctx, i0)
}
@@ -605,10 +613,10 @@
Name: "XEchoArray",
Doc: "// Methods to test support for composite types.",
InArgs: []__ipc.ArgDesc{
- {"I1", ``}, // [2]int32
+ {"I1", ``}, // Array2Int
},
OutArgs: []__ipc.ArgDesc{
- {"O1", ``}, // [2]int32
+ {"O1", ``}, // Array2Int
{"err", ``}, // error
},
},
diff --git a/tools/vrpc/vrpc_test.go b/tools/vrpc/vrpc_test.go
index 429552f..05906ff 100644
--- a/tools/vrpc/vrpc_test.go
+++ b/tools/vrpc/vrpc_test.go
@@ -63,7 +63,7 @@
return i1, nil
}
-func (*server) XEchoArray(call ipc.ServerContext, i1 [2]int32) ([2]int32, error) {
+func (*server) XEchoArray(call ipc.ServerContext, i1 test_base.Array2Int) (test_base.Array2Int, error) {
vlog.VI(2).Info("XEchoArray(%v) was called.", i1)
return i1, nil
}
@@ -154,7 +154,7 @@
EchoUint32(I1 uint32) (O1 uint32 | error)
EchoUint64(I1 uint64) (O1 uint64 | error)
// Methods to test support for composite types.
- XEchoArray(I1 [2]int32) (O1 [2]int32 | error)
+ XEchoArray(I1 "v.io/core/veyron/tools/vrpc/test_base".Array2Int) (O1 "v.io/core/veyron/tools/vrpc/test_base".Array2Int | error)
XEchoMap(I1 map[int32]string) (O1 map[int32]string | error)
XEchoSet(I1 set[int32]) (O1 set[int32] | error)
XEchoSlice(I1 []int32) (O1 []int32 | error)
@@ -206,6 +206,8 @@
Tags []any
}
+type "v.io/core/veyron/tools/vrpc/test_base".Array2Int [2]int32
+
type "v.io/core/veyron/tools/vrpc/test_base".Struct struct {
X int32
Y int32
@@ -271,7 +273,7 @@
{"EchoByte", `33`, `byte(33)`},
{"EchoUint32", `44`, `uint32(44)`},
{"EchoUint64", `55`, `uint64(55)`},
- {"XEchoArray", `{1,2}`, `[2]int32{1, 2}`},
+ {"XEchoArray", `{1,2}`, `"v.io/core/veyron/tools/vrpc/test_base".Array2Int{1, 2}`},
{"XEchoMap", `{1:"a"}`, `map[int32]string{1: "a"}`},
{"XEchoSet", `{1}`, `set[int32]{1}`},
{"XEchoSlice", `{1,2}`, `[]int32{1, 2}`},