From c80e6aa7a41079218cd78f2f3c574602911f9a29 Mon Sep 17 00:00:00 2001 From: Mathias Fredriksson Date: Sun, 24 Jan 2021 13:41:45 +0200 Subject: [PATCH] daemon: avoid math/rand race by using global source Unless we're using the global source for math/rand, (*rand.Rand).Read should not be called concurrently. We seed the rng in daemon.Run to avoid ambiguity or hiding global side effects inside packages. closes #414 --- daemon/daemon.go | 7 +++++++ daemon/logging/trace/trace_genID.go | 11 +---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/daemon/daemon.go b/daemon/daemon.go index 2da69bc..144d0c4 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -3,6 +3,7 @@ package daemon import ( "context" "fmt" + "math/rand" "os" "os/signal" "strings" @@ -38,6 +39,12 @@ func Run(ctx context.Context, conf *config.Config) error { cancel() }() + // The math/rand package is used presently for generating trace IDs, we + // seed it with the current time and pid so that the IDs are mostly + // unique. + rand.Seed(time.Now().UnixNano()) + rand.Seed(int64(os.Getpid())) + outlets, err := logging.OutletsFromConfig(*conf.Global.Logging) if err != nil { return errors.Wrap(err, "cannot build logging from config") diff --git a/daemon/logging/trace/trace_genID.go b/daemon/logging/trace/trace_genID.go index 0fcd043..908e3bd 100644 --- a/daemon/logging/trace/trace_genID.go +++ b/daemon/logging/trace/trace_genID.go @@ -3,20 +3,11 @@ package trace import ( "encoding/base64" "math/rand" - "os" "strings" - "time" "github.com/zrepl/zrepl/util/envconst" ) -var genIdPRNG = rand.New(rand.NewSource(1)) - -func init() { - genIdPRNG.Seed(time.Now().UnixNano()) - genIdPRNG.Seed(int64(os.Getpid())) -} - var genIdNumBytes = envconst.Int("ZREPL_TRACE_ID_NUM_BYTES", 3) func init() { @@ -30,7 +21,7 @@ func genID() string { enc := base64.NewEncoder(base64.RawStdEncoding, &out) buf := make([]byte, genIdNumBytes) for i := 0; i < len(buf); { - n, err := genIdPRNG.Read(buf[i:]) + n, err := rand.Read(buf[i:]) if err != nil { panic(err) }