From 06f482e4ef09d0dc1b53ebb1723cfafbdaf5c0e1 Mon Sep 17 00:00:00 2001
From: EL MASRI Chadi <celmasri@murex.com>
Date: Fri, 13 Dec 2019 18:26:50 +0100
Subject: [PATCH 1/9] Admin/Query: Log the real port instead of the provided
 one to enable the use of port 0.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 cmd/flags/admin.go           |  9 ++++++++-
 cmd/query/app/server.go      | 16 +++++++++++++---
 cmd/query/app/server_test.go | 20 ++++++++++++++++++++
 pkg/netutils/port.go         | 34 ++++++++++++++++++++++++++++++++++
 4 files changed, 75 insertions(+), 4 deletions(-)
 create mode 100644 pkg/netutils/port.go

diff --git a/cmd/flags/admin.go b/cmd/flags/admin.go
index 5f088b1d299..cda3f0447c4 100644
--- a/cmd/flags/admin.go
+++ b/cmd/flags/admin.go
@@ -26,6 +26,7 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/pkg/netutils"
 	"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
 	"github.com/jaegertracing/jaeger/pkg/version"
 )
@@ -97,9 +98,15 @@ func (s *AdminServer) Serve() error {
 		return err
 	}
 	s.serveWithListener(l)
+
+	tcpPort := s.adminPort
+	if port, err := netutils.GetPort(l.Addr()); err == nil {
+		tcpPort = port
+	}
+
 	s.logger.Info(
 		"Admin server started",
-		zap.Int("http-port", s.adminPort),
+		zap.Int("http-port", tcpPort),
 		zap.Stringer("health-status", s.hc.Get()))
 	return nil
 }
diff --git a/cmd/query/app/server.go b/cmd/query/app/server.go
index c53abd7d11d..4eda7d95597 100644
--- a/cmd/query/app/server.go
+++ b/cmd/query/app/server.go
@@ -29,6 +29,7 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/flags"
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/pkg/netutils"
 	"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
 	"github.com/jaegertracing/jaeger/proto-gen/api_v2"
 )
@@ -99,6 +100,15 @@ func (s *Server) Start() error {
 	}
 	s.conn = conn
 
+	tcpPort := s.queryOptions.Port
+	if port, err := netutils.GetPort(s.conn.Addr()); err == nil {
+		tcpPort = port
+	}
+
+	s.svc.Logger.Info(
+		"Query server started",
+		zap.Int("port", tcpPort))
+
 	// cmux server acts as a reverse-proxy between HTTP and GRPC backends.
 	cmuxServer := cmux.New(s.conn)
 
@@ -109,7 +119,7 @@ func (s *Server) Start() error {
 	httpListener := cmuxServer.Match(cmux.Any())
 
 	go func() {
-		s.svc.Logger.Info("Starting HTTP server", zap.Int("port", s.queryOptions.Port))
+		s.svc.Logger.Info("Starting HTTP server", zap.Int("port", tcpPort))
 
 		switch err := s.httpServer.Serve(httpListener); err {
 		case nil, http.ErrServerClosed, cmux.ErrListenerClosed:
@@ -122,7 +132,7 @@ func (s *Server) Start() error {
 
 	// Start GRPC server concurrently
 	go func() {
-		s.svc.Logger.Info("Starting GRPC server", zap.Int("port", s.queryOptions.Port))
+		s.svc.Logger.Info("Starting GRPC server", zap.Int("port", tcpPort))
 
 		if err := s.grpcServer.Serve(grpcListener); err != nil {
 			s.svc.Logger.Error("Could not start GRPC server", zap.Error(err))
@@ -132,7 +142,7 @@ func (s *Server) Start() error {
 
 	// Start cmux server concurrently.
 	go func() {
-		s.svc.Logger.Info("Starting CMUX server", zap.Int("port", s.queryOptions.Port))
+		s.svc.Logger.Info("Starting CMUX server", zap.Int("port", tcpPort))
 
 		err := cmuxServer.Serve()
 		// TODO: Remove string comparison when https://github.com/soheilhy/cmux/pull/69 is merged
diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index c32aeb43160..c5053edbcc9 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -103,3 +103,23 @@ func TestServerGracefulExit(t *testing.T) {
 			"Error log found on server exit: %v", logEntry)
 	}
 }
+
+func TestServerHandlesPortZero(t *testing.T) {
+	flagsSvc := flags.NewService(ports.QueryAdminHTTP)
+	zapCore, logs := observer.New(zap.InfoLevel)
+	flagsSvc.Logger = zap.New(zapCore)
+
+	querySvc := &querysvc.QueryService{}
+	tracer := opentracing.NoopTracer{}
+	server := NewServer(flagsSvc, querySvc, &QueryOptions{Port: 0}, tracer)
+	assert.NoError(t, server.Start())
+	server.Close()
+
+	message := logs.FilterMessage("Query server started")
+	assert.Equal(t, 1, message.Len(), "Expected query started log message.")
+
+	onlyEntry := message.All()[0]
+	port := onlyEntry.ContextMap()["port"].(int)
+	assert.True(t, port > 0,
+		"Expected a non-zero port in the logs, got instead: %d", port)
+}
diff --git a/pkg/netutils/port.go b/pkg/netutils/port.go
new file mode 100644
index 00000000000..77637a7e6fe
--- /dev/null
+++ b/pkg/netutils/port.go
@@ -0,0 +1,34 @@
+// Copyright (c) 2019 The Jaeger Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package netutils
+
+import (
+	"net"
+	"strconv"
+)
+
+func GetPort(addr net.Addr) (int, error) {
+	_, port, err := net.SplitHostPort(addr.String())
+	if err != nil {
+		return -1, err
+	}
+
+	parsedPort, err := strconv.Atoi(port)
+	if err != nil {
+		return -1, err
+	}
+
+	return parsedPort, nil
+}

From 6b99d1ae0696d886eecac9646eef3532a393385e Mon Sep 17 00:00:00 2001
From: EL MASRI Chadi <celmasri@murex.com>
Date: Mon, 6 Jan 2020 17:53:46 +0100
Subject: [PATCH 2/9] Added comment on GetPort.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 pkg/netutils/port.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pkg/netutils/port.go b/pkg/netutils/port.go
index 77637a7e6fe..af6fac42aff 100644
--- a/pkg/netutils/port.go
+++ b/pkg/netutils/port.go
@@ -1,4 +1,4 @@
-// Copyright (c) 2019 The Jaeger Authors.
+// Copyright (c) 2020 The Jaeger Authors.
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -19,6 +19,7 @@ import (
 	"strconv"
 )
 
+// GetPort returns the port of an endpoint address
 func GetPort(addr net.Addr) (int, error) {
 	_, port, err := net.SplitHostPort(addr.String())
 	if err != nil {

From 632758267074a104a724b0a3c4c455e872790c31 Mon Sep 17 00:00:00 2001
From: EL MASRI Chadi <celmasri@murex.com>
Date: Tue, 7 Jan 2020 01:05:35 +0100
Subject: [PATCH 3/9] Use assert.Greater.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 cmd/query/app/server_test.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index c5053edbcc9..577fc4395b1 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -119,7 +119,7 @@ func TestServerHandlesPortZero(t *testing.T) {
 	assert.Equal(t, 1, message.Len(), "Expected query started log message.")
 
 	onlyEntry := message.All()[0]
-	port := onlyEntry.ContextMap()["port"].(int)
-	assert.True(t, port > 0,
+	port := onlyEntry.ContextMap()["port"].(int64)
+	assert.Greater(t, port, int64(0),
 		"Expected a non-zero port in the logs, got instead: %d", port)
 }

From 0fe8c884386be8f2b65af516feefd4faafe5bb99 Mon Sep 17 00:00:00 2001
From: Chadi El Masri <celmasri@murex.com>
Date: Tue, 7 Jan 2020 01:33:20 +0100
Subject: [PATCH 4/9] End comment with a period.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 pkg/netutils/port.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pkg/netutils/port.go b/pkg/netutils/port.go
index af6fac42aff..79d8ca7aceb 100644
--- a/pkg/netutils/port.go
+++ b/pkg/netutils/port.go
@@ -19,7 +19,7 @@ import (
 	"strconv"
 )
 
-// GetPort returns the port of an endpoint address
+// GetPort returns the port of an endpoint address.
 func GetPort(addr net.Addr) (int, error) {
 	_, port, err := net.SplitHostPort(addr.String())
 	if err != nil {

From 7883c4730f426f78825c84d60c4056b5ed78a445 Mon Sep 17 00:00:00 2001
From: Chadi El Masri <celmasri@murex.com>
Date: Tue, 7 Jan 2020 01:45:21 +0100
Subject: [PATCH 5/9] Added unit test for port.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 pkg/netutils/port_test.go | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
 create mode 100644 pkg/netutils/port_test.go

diff --git a/pkg/netutils/port_test.go b/pkg/netutils/port_test.go
new file mode 100644
index 00000000000..debad6ccbc0
--- /dev/null
+++ b/pkg/netutils/port_test.go
@@ -0,0 +1,35 @@
+// Copyright (c) 2020 The Jaeger Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package netutils
+
+import (
+	"net"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+)
+
+func TestPortZero(t *testing.T) {
+	lis, err := net.Listen("tcp", "localhost:0")
+	require.NoError(t, err)
+	defer lis.Close()
+
+	port, err := GetPort(lis.Addr())
+	require.NoError(t, err)
+
+	assert.Greater(t, port, 0,
+		"Expected a non-zero port, got instead: %d", port)
+}

From 77d0b5eeaf618be18a040db5e557aadc66130fbe Mon Sep 17 00:00:00 2001
From: Chadi El Masri <celmasri@murex.com>
Date: Tue, 7 Jan 2020 11:15:54 +0100
Subject: [PATCH 6/9] Removed redundant error message.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 cmd/query/app/server_test.go | 3 +--
 pkg/netutils/port_test.go    | 3 +--
 2 files changed, 2 insertions(+), 4 deletions(-)

diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index 577fc4395b1..2afa1460d52 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -120,6 +120,5 @@ func TestServerHandlesPortZero(t *testing.T) {
 
 	onlyEntry := message.All()[0]
 	port := onlyEntry.ContextMap()["port"].(int64)
-	assert.Greater(t, port, int64(0),
-		"Expected a non-zero port in the logs, got instead: %d", port)
+	assert.Greater(t, port, int64(0))
 }
diff --git a/pkg/netutils/port_test.go b/pkg/netutils/port_test.go
index debad6ccbc0..d4e8020b3b7 100644
--- a/pkg/netutils/port_test.go
+++ b/pkg/netutils/port_test.go
@@ -30,6 +30,5 @@ func TestPortZero(t *testing.T) {
 	port, err := GetPort(lis.Addr())
 	require.NoError(t, err)
 
-	assert.Greater(t, port, 0,
-		"Expected a non-zero port, got instead: %d", port)
+	assert.Greater(t, port, 0)
 }

From 74f53b248ce15a2ff60b4dac4fe3c5d9de5ff654 Mon Sep 17 00:00:00 2001
From: Chadi El Masri <celmasri@murex.com>
Date: Wed, 8 Jan 2020 10:28:41 +0100
Subject: [PATCH 7/9] Added unit test for admin.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 cmd/flags/admin_test.go | 45 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 45 insertions(+)
 create mode 100644 cmd/flags/admin_test.go

diff --git a/cmd/flags/admin_test.go b/cmd/flags/admin_test.go
new file mode 100644
index 00000000000..ce09d4819a3
--- /dev/null
+++ b/cmd/flags/admin_test.go
@@ -0,0 +1,45 @@
+// Copyright (c) 2020 The Jaeger Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package flags
+
+import (
+	"testing"
+
+	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/stretchr/testify/assert"
+	"go.uber.org/zap"
+	"go.uber.org/zap/zaptest/observer"
+)
+
+func TestAdminServerHandlesPortZero(t *testing.T) {
+	adminServer := NewAdminServer(0)
+
+	v, _ := config.Viperize(adminServer.AddFlags)
+
+	zapCore, logs := observer.New(zap.InfoLevel)
+	logger := zap.New(zapCore)
+
+	adminServer.initFromViper(v, logger)
+
+	assert.NoError(t, adminServer.Serve())
+	defer adminServer.Close()
+
+	message := logs.FilterMessage("Admin server started")
+	assert.Equal(t, 1, message.Len(), "Expected Admin server started log message.")
+
+	onlyEntry := message.All()[0]
+	port := onlyEntry.ContextMap()["http-port"].(int64)
+	assert.Greater(t, port, int64(0))
+}

From ed3812fca06bc3ab1438b8fa66232f61e6ad0fff Mon Sep 17 00:00:00 2001
From: Chadi El Masri <celmasri@murex.com>
Date: Wed, 8 Jan 2020 12:13:52 +0100
Subject: [PATCH 8/9] Added tests to launch two servers at port 0.

Signed-off-by: Chadi El Masri <celmasri@murex.com>
---
 Gopkg.lock                   |  9 +++++++++
 Gopkg.toml                   |  4 ++++
 cmd/flags/admin_test.go      | 36 +++++++++++++++++++++++++++++++++++-
 cmd/query/app/server_test.go | 32 ++++++++++++++++++++++++++++++++
 4 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/Gopkg.lock b/Gopkg.lock
index f1df8cac07a..8d300ced1e5 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -580,6 +580,14 @@
   revision = "1b2b06f5f209fea48ff5922d8bfb2b9ed5d8f00b"
   version = "v0.7.0"
 
+[[projects]]
+  digest = "1:e6cc30a1c1ffbc1e422e1cebecbdc3bdf2d11bf492fc614446b480af2d73a8e8"
+  name = "github.com/marusama/cyclicbarrier"
+  packages = ["."]
+  pruneopts = "UT"
+  revision = "08d457ab265cd9b97264ea3f933c16354e15fb06"
+  version = "1.0.2"
+
 [[projects]]
   digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc"
   name = "github.com/matttproud/golang_protobuf_extensions"
@@ -1362,6 +1370,7 @@
     "github.com/hashicorp/go-hclog",
     "github.com/hashicorp/go-plugin",
     "github.com/kr/pretty",
+    "github.com/marusama/cyclicbarrier",
     "github.com/olivere/elastic",
     "github.com/opentracing-contrib/go-stdlib/nethttp",
     "github.com/opentracing/opentracing-go",
diff --git a/Gopkg.toml b/Gopkg.toml
index 7f53b7c2096..9ed1c0291eb 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -187,3 +187,7 @@ required = [
 [[override]]
   name = "github.com/Shopify/sarama"
   revision = "cd910a683f9faa57222e5120d17b60d2e65f7fa9"
+
+[[constraint]]
+  name = "github.com/marusama/cyclicbarrier"
+  version = "1.0.2"
diff --git a/cmd/flags/admin_test.go b/cmd/flags/admin_test.go
index ce09d4819a3..187d6a3cd97 100644
--- a/cmd/flags/admin_test.go
+++ b/cmd/flags/admin_test.go
@@ -15,12 +15,17 @@
 package flags
 
 import (
+	"context"
+	"sync"
 	"testing"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/marusama/cyclicbarrier"
 	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest/observer"
+
+	"github.com/jaegertracing/jaeger/pkg/config"
 )
 
 func TestAdminServerHandlesPortZero(t *testing.T) {
@@ -43,3 +48,32 @@ func TestAdminServerHandlesPortZero(t *testing.T) {
 	port := onlyEntry.ContextMap()["http-port"].(int64)
 	assert.Greater(t, port, int64(0))
 }
+
+func TestAdminServerHandlesSimultaneousStartupOnPortZero(t *testing.T) {
+	const parallelInstances = 2
+
+	var wg sync.WaitGroup
+	barrier := cyclicbarrier.New(parallelInstances)
+
+	for i := 0; i < parallelInstances; i++ {
+		wg.Add(1)
+
+		go func() {
+			defer wg.Done()
+
+			adminServer := NewAdminServer(0)
+
+			v, _ := config.Viperize(adminServer.AddFlags)
+			logger := zap.NewNop()
+			adminServer.initFromViper(v, logger)
+
+			if assert.NoError(t, adminServer.Serve(), "Failed to start two Admin servers at port 0") {
+				defer adminServer.Close()
+			}
+
+			require.NoError(t, barrier.Await(context.Background()))
+		}()
+	}
+
+	wg.Wait()
+}
diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index 2afa1460d52..6cbba9a9d60 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -17,12 +17,15 @@ package app
 import (
 	"context"
 	"fmt"
+	"sync"
 	"testing"
 	"time"
 
+	"github.com/marusama/cyclicbarrier"
 	opentracing "github.com/opentracing/opentracing-go"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
+	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest/observer"
 
@@ -122,3 +125,32 @@ func TestServerHandlesPortZero(t *testing.T) {
 	port := onlyEntry.ContextMap()["port"].(int64)
 	assert.Greater(t, port, int64(0))
 }
+
+func TestServerHandlesSimultaneousStartupOnPortZero(t *testing.T) {
+	const parallelInstances = 2
+
+	var wg sync.WaitGroup
+	barrier := cyclicbarrier.New(parallelInstances)
+
+	for i := 0; i < parallelInstances; i++ {
+		wg.Add(1)
+
+		go func() {
+			defer wg.Done()
+
+			flagsSvc := flags.NewService(ports.QueryAdminHTTP)
+			flagsSvc.Logger = zap.NewNop()
+
+			querySvc := &querysvc.QueryService{}
+			tracer := opentracing.NoopTracer{}
+			server := NewServer(flagsSvc, querySvc, &QueryOptions{Port: 0}, tracer)
+			if assert.NoError(t, server.Start(), "Failed to start two Query services at port 0") {
+				defer server.Close()
+			}
+
+			require.NoError(t, barrier.Await(context.Background()))
+		}()
+	}
+
+	wg.Wait()
+}

From 162eee039ad57908563e9a4edbd1e266dc9f8ebf Mon Sep 17 00:00:00 2001
From: Yuri Shkuro <ys@uber.com>
Date: Fri, 10 Jan 2020 21:26:04 -0500
Subject: [PATCH 9/9] Remove unnecessary tests and 3rd party deps

Signed-off-by: Yuri Shkuro <ys@uber.com>
---
 Gopkg.lock                   | 178 +++++++++++++++++------------------
 Gopkg.toml                   |   4 -
 cmd/flags/admin_test.go      |  33 -------
 cmd/query/app/server_test.go |  32 -------
 4 files changed, 89 insertions(+), 158 deletions(-)

diff --git a/Gopkg.lock b/Gopkg.lock
index 8d300ced1e5..70ea399e660 100644
--- a/Gopkg.lock
+++ b/Gopkg.lock
@@ -68,12 +68,12 @@
   version = "0.9.3"
 
 [[projects]]
-  digest = "1:320e7ead93de9fd2b0e59b50fd92a4d50c1f8ab455d96bc2eb083267453a9709"
+  digest = "1:c68aba66f5db6052fd838d9a7d60d8859f8c11b8c1d9ac9758f69c7a51efc07a"
   name = "github.com/asaskevich/govalidator"
   packages = ["."]
   pruneopts = "UT"
-  revision = "ccb8e960c48f04d6935e72476ae4a51028f9e22f"
-  version = "v9"
+  revision = "475eaeb164960a651e97470412a7d3b0c5036105"
+  version = "v10"
 
 [[projects]]
   digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d"
@@ -144,11 +144,11 @@
 
 [[projects]]
   branch = "master"
-  digest = "1:6e8109ce247a59ab1eeb5330166c12735f6590de99c9647b6162d11518d32c9a"
+  digest = "1:7b5b445d4d7b8d18eb794783e7559e90d1f1fca4bf3c2f1c249f11b582e6f546"
   name = "github.com/dgryski/go-farm"
   packages = ["."]
   pruneopts = "UT"
-  revision = "6a90982ecee230ff6cba02d5bd386acc030be9d3"
+  revision = "c2139c5d712b01d0410c2e51d4bdc588b4eb6ca3"
 
 [[projects]]
   digest = "1:1f0c7ab489b407a7f8f9ad16c25a504d28ab461517a971d341388a56156c1bd7"
@@ -204,23 +204,23 @@
   version = "v0.9.0"
 
 [[projects]]
-  digest = "1:ec1763a0b23c3c610dc2a0310c9afd01513c9b95091c05a9207718a61181c276"
+  digest = "1:59e98a91b61e51b9457ee4e13a128f207bd66871cc84bef92a779a7d82711e93"
   name = "github.com/go-openapi/analysis"
   packages = [
     ".",
     "internal",
   ]
   pruneopts = "UT"
-  revision = "1024f3482ddc2c381cc918eb9eca596d51a70272"
-  version = "v0.19.6"
+  revision = "01a3bdad024cd0b80f267b070347538b6edb1c77"
+  version = "v0.19.7"
 
 [[projects]]
-  digest = "1:3bca1e4623bc7e1f9849a14fe730c093953727991f0592be3dad0168cb67758e"
+  digest = "1:dd9d7a334e7d246a8501ac0cf5d408024c91ff8b8308930cd98916629970da97"
   name = "github.com/go-openapi/errors"
   packages = ["."]
   pruneopts = "UT"
-  revision = "0b2a0a1f89aa2eec2d13e03cd80ab0fdaf01f8ce"
-  version = "v0.19.2"
+  revision = "9b273e805998abc751853b4e1574d66e5df888b4"
+  version = "v0.19.3"
 
 [[projects]]
   digest = "1:ed15647db08b6d63666bf9755d337725960c302bbfa5e23754b4b915a4797e42"
@@ -247,7 +247,7 @@
   version = "v0.19.4"
 
 [[projects]]
-  digest = "1:dce067db51b765f24e2588aff417b306c61fcacfca7f3fd71e129e67ef2e1e5f"
+  digest = "1:b2254eaaff849ab98571fd3c8800c110e23e4f17013a841a9d118547d458d969"
   name = "github.com/go-openapi/runtime"
   packages = [
     ".",
@@ -259,40 +259,40 @@
     "security",
   ]
   pruneopts = "UT"
-  revision = "553c9d1fb273d9550562d9f76949a413af265138"
-  version = "v0.19.7"
+  revision = "cc90213cf1bd091201a1f7ee230feeb7662c4a48"
+  version = "v0.19.9"
 
 [[projects]]
-  digest = "1:55d1c09fc8b3320b6842565249a9e4d0f363bead6f9b8be05c3b47f2c4264eda"
+  digest = "1:a60f47e736cc96075451c3c3502274d86ec6d96588c03d1ab56142ccbb8a5364"
   name = "github.com/go-openapi/spec"
   packages = ["."]
   pruneopts = "UT"
-  revision = "8557d72e4f077c2dbe1e48df09e596b6fb9b7991"
-  version = "v0.19.4"
+  revision = "772572fd19ebcc983369e53bfaed4bde2077fe0c"
+  version = "v0.19.5"
 
 [[projects]]
-  digest = "1:787b399bfeddd801aca6144bd9928f4fe1d40eadcb09c59fcbd421cc528ea11c"
+  digest = "1:97d14436dd6f314edfd1cff0caae50342c5435718f0adfd7490db353342bfca4"
   name = "github.com/go-openapi/strfmt"
   packages = ["."]
   pruneopts = "UT"
-  revision = "6faa644e1cdafc07f7b38eb06c1af5f92128f289"
-  version = "v0.19.3"
+  revision = "1940fb2f8aba2045ae5493bd64b76ad4af8b5856"
+  version = "v0.19.4"
 
 [[projects]]
-  digest = "1:43d0f99f53acce97119181dcd592321084690c2d462c57680ccb4472ae084949"
+  digest = "1:d79ccf65d7721efa48200dc7fc827f8fb29e1fba4db4d55be675fdec84e7cfe1"
   name = "github.com/go-openapi/swag"
   packages = ["."]
   pruneopts = "UT"
-  revision = "c3d0f7896d589f3babb99eea24bbc7de98108e72"
-  version = "v0.19.5"
+  revision = "8a84ec635f1b280a7062edeab609f0667a053248"
+  version = "v0.19.6"
 
 [[projects]]
-  digest = "1:683e8ed8f90886b6338ab90d12aa8f4111383506313173ef02ad0724608512b5"
+  digest = "1:313e98ecd90b82d00c6b480c7458602f2c669b93c396772680fd3a9bb9ad13c0"
   name = "github.com/go-openapi/validate"
   packages = ["."]
   pruneopts = "UT"
-  revision = "80d596e2af47cef147b636dfd76abce249d2b847"
-  version = "v0.19.4"
+  revision = "08232b6614a50c4f62d1efa77e966421d327d3d3"
+  version = "v0.19.5"
 
 [[projects]]
   digest = "1:586ea76dbd0374d6fb649a91d70d652b7fe0ccffb8910a77468e7702e7901f3d"
@@ -544,12 +544,12 @@
   version = "v1.0.0"
 
 [[projects]]
-  digest = "1:ca955a9cd5b50b0f43d2cc3aeb35c951473eeca41b34eb67507f1dbcc0542394"
+  digest = "1:4cc7748b74453830951f95ddc3fd980387e7c13f77cc33d7cba54cd6b96dad26"
   name = "github.com/kr/pretty"
   packages = ["."]
   pruneopts = "UT"
-  revision = "73f6ac0b30a98e433b289500d779f50c1a6f0712"
-  version = "v0.1.0"
+  revision = "4e0886370c3a67530192c6a238cff68f56c141b0"
+  version = "v0.2.0"
 
 [[projects]]
   digest = "1:15b5cc79aad436d47019f814fde81a10221c740dc8ddf769221a65097fb6c2e9"
@@ -580,14 +580,6 @@
   revision = "1b2b06f5f209fea48ff5922d8bfb2b9ed5d8f00b"
   version = "v0.7.0"
 
-[[projects]]
-  digest = "1:e6cc30a1c1ffbc1e422e1cebecbdc3bdf2d11bf492fc614446b480af2d73a8e8"
-  name = "github.com/marusama/cyclicbarrier"
-  packages = ["."]
-  pruneopts = "UT"
-  revision = "08d457ab265cd9b97264ea3f933c16354e15fb06"
-  version = "1.0.2"
-
 [[projects]]
   digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc"
   name = "github.com/matttproud/golang_protobuf_extensions"
@@ -632,7 +624,7 @@
     "x86",
   ]
   pruneopts = "UT"
-  revision = "15d6a9a17e5386cb169227dd4dea9a23100a5029"
+  revision = "205fc6a3d76b01529817bc64d037340b558d2c05"
 
 [[projects]]
   digest = "1:66b0a65aba488ca6c72f77132d5b8d7e2c5baf07d577dee64502b69a2c90c791"
@@ -653,15 +645,15 @@
   version = "v0.1"
 
 [[projects]]
-  digest = "1:9ec6cf1df5ad1d55cf41a43b6b1e7e118a91bade4f68ff4303379343e40c0e25"
+  digest = "1:109a4e5eccbcaea2e63f89e2eccecbd7f427a893a8712defce705e14c1d51d3c"
   name = "github.com/oklog/run"
   packages = ["."]
   pruneopts = "UT"
-  revision = "4dadeb3030eda0273a12382bb2348ffc7c9d1a39"
-  version = "v1.0.0"
+  revision = "9c53bcd6fefd554246da88d55efcc283aff63659"
+  version = "v1.1.0"
 
 [[projects]]
-  digest = "1:4753e9dba3c4dea247a1b65b638d74561c2f3df47fbac74b704d2603bbb41974"
+  digest = "1:55222c9ad95811b5e0217a53bc4808a06549589b0026f0fdaf020ff34dd0c967"
   name = "github.com/olivere/elastic"
   packages = [
     ".",
@@ -669,8 +661,8 @@
     "uritemplates",
   ]
   pruneopts = "UT"
-  revision = "dc1492fc8d9d981e6a2e927933aac5546e473452"
-  version = "v6.2.26"
+  revision = "d7ed85d223ef32bd5ca4c324c444faf5001236fb"
+  version = "v6.2.27"
 
 [[projects]]
   branch = "master"
@@ -701,15 +693,15 @@
   version = "v1.6.0"
 
 [[projects]]
-  digest = "1:cef870622e603ac1305922eb5d380455cad27e354355ae7a855d8633ffa66197"
+  digest = "1:d843e9c8e27913780ac7a3d9014a19a4b2752d1dda1250e6fdba48bafe75fa6e"
   name = "github.com/pierrec/lz4"
   packages = [
     ".",
     "internal/xxh32",
   ]
   pruneopts = "UT"
-  revision = "645f9b948eee34cbcc335c70999f79c29c420fbf"
-  version = "v2.3.0"
+  revision = "9085dacd1e1eca033047a5514195779360363ced"
+  version = "v2.4.0"
 
 [[projects]]
   digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b"
@@ -740,12 +732,12 @@
   version = "v1.1.0"
 
 [[projects]]
-  branch = "master"
-  digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4"
+  digest = "1:982be0b5396e16a663697899ce69cc7b1e71ddcae4153af157578d4dc9bc3f88"
   name = "github.com/prometheus/client_model"
   packages = ["go"]
   pruneopts = "UT"
-  revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016"
+  revision = "d1d2010b5beead3fa1c5f271a5cf626e40b3ad6e"
+  version = "v0.1.0"
 
 [[projects]]
   digest = "1:f119e3205d3a1f0f19dbd7038eb37528e2c6f0933269dc344e305951fb87d632"
@@ -760,7 +752,7 @@
   version = "v0.7.0"
 
 [[projects]]
-  digest = "1:a210815b437763623ecca8eb91e6a0bf4f2d6773c5a6c9aec0e28f19e5fd6deb"
+  digest = "1:ec0ff4bd619a67065e34d6477711ed0117e335f99059a4c508e0fe21cfe7b304"
   name = "github.com/prometheus/procfs"
   packages = [
     ".",
@@ -768,8 +760,8 @@
     "internal/util",
   ]
   pruneopts = "UT"
-  revision = "499c85531f756d1129edd26485a5f73871eeb308"
-  version = "v0.0.5"
+  revision = "6d489fc7f1d9cd890a250f3ea3431b1744b9623f"
+  version = "v0.0.8"
 
 [[projects]]
   branch = "master"
@@ -836,12 +828,12 @@
   version = "v1.2.2"
 
 [[projects]]
-  digest = "1:08d65904057412fc0270fc4812a1c90c594186819243160dc779a402d4b6d0bc"
+  digest = "1:ff4cd55a3666b6ea3a876c9e133bfb54d6c812e725409a773f2c94a0b3a92f4f"
   name = "github.com/spf13/cast"
   packages = ["."]
   pruneopts = "UT"
-  revision = "8c9545af88b134710ab1cd196795e7f2388358d7"
-  version = "v1.3.0"
+  revision = "1ffadf551085444af981432dd0f6d1160c11ec64"
+  version = "v1.3.1"
 
 [[projects]]
   digest = "1:654214e86a044cfb1815afd41ff2a8e34402bdfafa0dd79fec5452ca1dc1f779"
@@ -871,12 +863,12 @@
   version = "v1.0.5"
 
 [[projects]]
-  digest = "1:0b60fc944fb6a7b6c985832bd341bdb7ed8fe894fea330414e7774bb24652962"
+  digest = "1:8d0b79a29be9946ea00b2f2b778ec5b36db07453d97abe9d754b25bc2cc49a0e"
   name = "github.com/spf13/viper"
   packages = ["."]
   pruneopts = "UT"
-  revision = "72b022eb357a56469725dcd03918449e2278d02e"
-  version = "v1.5.0"
+  revision = "eabbc68a3ecd5cf8c11a2f84dbda5e7a38493b2f"
+  version = "v1.6.1"
 
 [[projects]]
   digest = "1:ac83cf90d08b63ad5f7e020ef480d319ae890c208f8524622a2f3136e2686b02"
@@ -908,7 +900,7 @@
   version = "v1.2.0"
 
 [[projects]]
-  digest = "1:ea9632313cd7ceffb62188cd5e4bf940e9b91446fc310f9a62372ae536011fdb"
+  digest = "1:b2871caffbaef2e8f6d6f42318b985a16297626df8669be365da99e9d4bab10f"
   name = "github.com/uber/jaeger-client-go"
   packages = [
     ".",
@@ -932,8 +924,8 @@
     "utils",
   ]
   pruneopts = "UT"
-  revision = "54da50209f6acdcb06df61e60eeda5b52a4ef47c"
-  version = "v2.20.0"
+  revision = "f2e1f58485aacf2975cdde9c9f5396e6d98c35ba"
+  version = "v2.21.1"
 
 [[projects]]
   digest = "1:abbb7762b4200f8b1d82193dcc02a3d8a62efc0a0ffc8ec4f4e9ef8abf797a9c"
@@ -976,27 +968,28 @@
   version = "v1.16.0"
 
 [[projects]]
-  digest = "1:8458b1a19a304c09d8f109a9463a419f703e3d1a81615afcaf3593dcce6749b9"
+  digest = "1:f15085b9880b96dc2c043eb279a11f88d80d3e24e3ba8ccbf8391a9a7ed1ba0f"
   name = "go.mongodb.org/mongo-driver"
   packages = [
     "bson",
     "bson/bsoncodec",
+    "bson/bsonoptions",
     "bson/bsonrw",
     "bson/bsontype",
     "bson/primitive",
     "x/bsonx/bsoncore",
   ]
   pruneopts = "UT"
-  revision = "797e0a635920c291b1808180bf7249eaac5eafed"
-  version = "v1.1.3"
+  revision = "55b507b3e45a2ef5dc1d5a4cba3333c45dce443c"
+  version = "v1.2.1"
 
 [[projects]]
-  digest = "1:0bdcb0c740d79d400bd3f7946ac22a715c94db62b20bfd2e01cd50693aba0600"
+  digest = "1:c708d00d1097e62bf4f3a72f239efa7dafc257581421b0b7d3789e1ff5299f30"
   name = "go.uber.org/atomic"
   packages = ["."]
   pruneopts = "UT"
-  revision = "9dc4df04d0d1c39369750a9f6c32c39560672089"
-  version = "v1.5.0"
+  revision = "40ae6a40a970ef4cdbffa7b24b280e316db8accc"
+  version = "v1.5.1"
 
 [[projects]]
   digest = "1:a51a1c97b728b00cc514dfe5f78aad3354491792e69b881ea88176dd3fa30ef6"
@@ -1028,7 +1021,7 @@
   revision = "2cfd321de3ee5d5f8a5fda2521d1703478334d98"
 
 [[projects]]
-  digest = "1:d41c2589529fbacca8d78e18a7cc3e58304dc20735427838c25bb905a5a44e5d"
+  digest = "1:46ad3fed3cf8956a73166039328ab019c7ab9757a840488ee127d8b9b9a3178b"
   name = "go.uber.org/zap"
   packages = [
     ".",
@@ -1042,8 +1035,8 @@
     "zaptest/observer",
   ]
   pruneopts = "UT"
-  revision = "a6015e13fab9b744d96085308ce4e8f11bad1996"
-  version = "v1.12.0"
+  revision = "33e58d4d0120aa28d4df84cd244838c490846c9d"
+  version = "v1.13.0"
 
 [[projects]]
   branch = "master"
@@ -1054,22 +1047,22 @@
     "pbkdf2",
   ]
   pruneopts = "UT"
-  revision = "ed6320f186d4e69b2ba748dd0084746281301a8e"
+  revision = "5d647ca1575777a812e903a7e98177174d8c295a"
 
 [[projects]]
   branch = "master"
-  digest = "1:21d7bad9b7da270fd2d50aba8971a041bd691165c95096a2a4c68db823cbc86a"
+  digest = "1:334b27eac455cb6567ea28cd424230b07b1a64334a2f861a8075ac26ce10af43"
   name = "golang.org/x/lint"
   packages = [
     ".",
     "golint",
   ]
   pruneopts = "UT"
-  revision = "16217165b5de779cb6a5e4fc81fa9c1166fda457"
+  revision = "fdd1cda4f05fd1fd86124f0ef9ce31a0b72c8448"
 
 [[projects]]
   branch = "master"
-  digest = "1:ab87fcd483258ad8fb999dbd24d9175a7ce6b7630021a9a905bfbe6ef4783b96"
+  digest = "1:be532d3e419ae0a9001a05f78754b803473c76c55cfb94af715fc06eaf311b13"
   name = "golang.org/x/net"
   packages = [
     "bpf",
@@ -1089,18 +1082,18 @@
     "trace",
   ]
   pruneopts = "UT"
-  revision = "a882066a44e04a21d46e51451c71e131344e830e"
+  revision = "c0dbc17a35534bf2e581d7a942408dc936316da4"
 
 [[projects]]
   branch = "master"
-  digest = "1:1017834f19e0d987e8b1b928f016b0a1186a202ec1867fee7112efd4b4475bd1"
+  digest = "1:c8faf148023f13e62a93d3ed6c01fc586b3c6b52a40c5c9b0f2220bae71f390a"
   name = "golang.org/x/sys"
   packages = [
     "unix",
     "windows",
   ]
   pruneopts = "UT"
-  revision = "c1f44814a5cd81a6d1cb589ef1e528bc5d305e07"
+  revision = "548cf772de5052aa878ccb47cdeb7d262b75c8ec"
 
 [[projects]]
   digest = "1:66a2f252a58b4fbbad0e4e180e1d85a83c222b6bce09c3dcdef3dc87c72eda7c"
@@ -1130,7 +1123,7 @@
 
 [[projects]]
   branch = "master"
-  digest = "1:416b82a27fe1a8768ee1f2a143178cb5ca829b889081b66a096377e35fcdb6e4"
+  digest = "1:1025e9e880900028dc2ec8d648c486ba65e33c9bf1ce3498d3cc1984cd3a8a9c"
   name = "golang.org/x/tools"
   packages = [
     "go/analysis",
@@ -1149,10 +1142,9 @@
     "internal/fastwalk",
     "internal/gopathwalk",
     "internal/semver",
-    "internal/span",
   ]
   pruneopts = "UT"
-  revision = "0c330b00b1a74f19a7237de8f5c46b9483084fa2"
+  revision = "89082a3841783366cb82b3dc4ce9258fb3dad1a9"
 
 [[projects]]
   branch = "master"
@@ -1163,13 +1155,14 @@
     "googleapis/rpc/status",
   ]
   pruneopts = "UT"
-  revision = "919d9bdd9fe6f1a5dd95ce5d5e4cdb8fd3c516d0"
+  revision = "bd8f9a0ef82f9870cb10caef4f23c348069600cb"
 
 [[projects]]
-  digest = "1:55bc501ec595858b173f6bb7eb76af149c892a1708c1729204ccc80fd009015a"
+  digest = "1:b2c9ea388537a402c7f618e11eda34ec5358b67c3c6aef9df113c7022b46e0b1"
   name = "google.golang.org/grpc"
   packages = [
     ".",
+    "attributes",
     "backoff",
     "balancer",
     "balancer/base",
@@ -1211,8 +1204,8 @@
     "test/grpc_testing",
   ]
   pruneopts = "UT"
-  revision = "9d331e2b02dd47daeecae02790f61cc88dc75a64"
-  version = "v1.25.0"
+  revision = "f5b0812e6fe574d90da76b205e9eb51f6ddb1919"
+  version = "v1.26.0"
 
 [[projects]]
   digest = "1:2d1fbdc6777e5408cabeb02bf336305e724b925ff4546ded0fa8715a7267922a"
@@ -1222,6 +1215,14 @@
   revision = "d2d2541c53f18d2a059457998ce2876cc8e67cbf"
   version = "v0.9.1"
 
+[[projects]]
+  digest = "1:c4b5592c342f273e18de68e16957f536f6648f2e90c9d7ece653ac90c22079a9"
+  name = "gopkg.in/ini.v1"
+  packages = ["."]
+  pruneopts = "UT"
+  revision = "94291fffe2b14f4632ec0e67c1bfecfc1287a168"
+  version = "v1.51.1"
+
 [[projects]]
   digest = "1:c902038ee2d6f964d3b9f2c718126571410c5d81251cbab9fe58abd37803513c"
   name = "gopkg.in/jcmturner/aescts.v1"
@@ -1289,12 +1290,12 @@
   version = "v1.1.0"
 
 [[projects]]
-  digest = "1:f26a5d382387e03a40d1471dddfba85dfff9bf05352d7e42d37612677c4d3c5c"
+  digest = "1:b75b3deb2bce8bc079e16bb2aecfe01eb80098f5650f9e93e5643ca8b7b73737"
   name = "gopkg.in/yaml.v2"
   packages = ["."]
   pruneopts = "UT"
-  revision = "f90ceb4f409096b60e2e9076b38b304b8246e5fa"
-  version = "v2.2.5"
+  revision = "1f64d6156d11335c3f22d9330b0ad14fc1e789ce"
+  version = "v2.2.7"
 
 [[projects]]
   digest = "1:131158a88aad1f94854d0aa21a64af2802d0a470fb0f01cb33c04fafd2047111"
@@ -1370,7 +1371,6 @@
     "github.com/hashicorp/go-hclog",
     "github.com/hashicorp/go-plugin",
     "github.com/kr/pretty",
-    "github.com/marusama/cyclicbarrier",
     "github.com/olivere/elastic",
     "github.com/opentracing-contrib/go-stdlib/nethttp",
     "github.com/opentracing/opentracing-go",
diff --git a/Gopkg.toml b/Gopkg.toml
index 9ed1c0291eb..7f53b7c2096 100644
--- a/Gopkg.toml
+++ b/Gopkg.toml
@@ -187,7 +187,3 @@ required = [
 [[override]]
   name = "github.com/Shopify/sarama"
   revision = "cd910a683f9faa57222e5120d17b60d2e65f7fa9"
-
-[[constraint]]
-  name = "github.com/marusama/cyclicbarrier"
-  version = "1.0.2"
diff --git a/cmd/flags/admin_test.go b/cmd/flags/admin_test.go
index 187d6a3cd97..6d6cef71700 100644
--- a/cmd/flags/admin_test.go
+++ b/cmd/flags/admin_test.go
@@ -15,13 +15,9 @@
 package flags
 
 import (
-	"context"
-	"sync"
 	"testing"
 
-	"github.com/marusama/cyclicbarrier"
 	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest/observer"
 
@@ -48,32 +44,3 @@ func TestAdminServerHandlesPortZero(t *testing.T) {
 	port := onlyEntry.ContextMap()["http-port"].(int64)
 	assert.Greater(t, port, int64(0))
 }
-
-func TestAdminServerHandlesSimultaneousStartupOnPortZero(t *testing.T) {
-	const parallelInstances = 2
-
-	var wg sync.WaitGroup
-	barrier := cyclicbarrier.New(parallelInstances)
-
-	for i := 0; i < parallelInstances; i++ {
-		wg.Add(1)
-
-		go func() {
-			defer wg.Done()
-
-			adminServer := NewAdminServer(0)
-
-			v, _ := config.Viperize(adminServer.AddFlags)
-			logger := zap.NewNop()
-			adminServer.initFromViper(v, logger)
-
-			if assert.NoError(t, adminServer.Serve(), "Failed to start two Admin servers at port 0") {
-				defer adminServer.Close()
-			}
-
-			require.NoError(t, barrier.Await(context.Background()))
-		}()
-	}
-
-	wg.Wait()
-}
diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index 6cbba9a9d60..2afa1460d52 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -17,15 +17,12 @@ package app
 import (
 	"context"
 	"fmt"
-	"sync"
 	"testing"
 	"time"
 
-	"github.com/marusama/cyclicbarrier"
 	opentracing "github.com/opentracing/opentracing-go"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
-	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest/observer"
 
@@ -125,32 +122,3 @@ func TestServerHandlesPortZero(t *testing.T) {
 	port := onlyEntry.ContextMap()["port"].(int64)
 	assert.Greater(t, port, int64(0))
 }
-
-func TestServerHandlesSimultaneousStartupOnPortZero(t *testing.T) {
-	const parallelInstances = 2
-
-	var wg sync.WaitGroup
-	barrier := cyclicbarrier.New(parallelInstances)
-
-	for i := 0; i < parallelInstances; i++ {
-		wg.Add(1)
-
-		go func() {
-			defer wg.Done()
-
-			flagsSvc := flags.NewService(ports.QueryAdminHTTP)
-			flagsSvc.Logger = zap.NewNop()
-
-			querySvc := &querysvc.QueryService{}
-			tracer := opentracing.NoopTracer{}
-			server := NewServer(flagsSvc, querySvc, &QueryOptions{Port: 0}, tracer)
-			if assert.NoError(t, server.Start(), "Failed to start two Query services at port 0") {
-				defer server.Close()
-			}
-
-			require.NoError(t, barrier.Await(context.Background()))
-		}()
-	}
-
-	wg.Wait()
-}