From 05aa5f2d385c85ff8cdf9ffd8ce20149d446ea85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Mon, 14 Sep 2020 13:01:03 +0100 Subject: [PATCH] allow customizing disabled journal events + tests. --- journal/registry_test.go | 49 ++++++++++++++++++++++++++++++++++++++++ journal/types.go | 21 +++++++++++++++++ node/builder.go | 15 +++++++++++- 3 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 journal/registry_test.go diff --git a/journal/registry_test.go b/journal/registry_test.go new file mode 100644 index 000000000..9d2085c12 --- /dev/null +++ b/journal/registry_test.go @@ -0,0 +1,49 @@ +package journal + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestDisabledEvents(t *testing.T) { + req := require.New(t) + + test := func(dis DisabledEvents) func(*testing.T) { + return func(t *testing.T) { + registry := NewEventTypeRegistry(dis) + + reg1 := registry.RegisterEventType("system1", "disabled1") + reg2 := registry.RegisterEventType("system2", "disabled2") + + req.False(reg1.Enabled()) + req.False(reg2.Enabled()) + req.True(reg1.safe) + req.True(reg2.safe) + + reg3 := registry.RegisterEventType("system3", "enabled3") + req.True(reg3.Enabled()) + req.True(reg3.safe) + } + } + + t.Run("direct", test(DisabledEvents{ + EventType{System: "system1", Event: "disabled1"}, + EventType{System: "system2", Event: "disabled2"}, + })) + + dis, err := ParseDisabledEvents("system1:disabled1,system2:disabled2") + req.NoError(err) + + t.Run("parsed", test(dis)) + + dis, err = ParseDisabledEvents(" system1:disabled1 , system2:disabled2 ") + req.NoError(err) + + t.Run("parsed_spaces", test(dis)) +} + +func TestParseDisableEvents(t *testing.T) { + _, err := ParseDisabledEvents("system1:disabled1:failed,system2:disabled2") + require.Error(t, err) +} diff --git a/journal/types.go b/journal/types.go index c81fb8c89..56c7d4bc0 100644 --- a/journal/types.go +++ b/journal/types.go @@ -1,6 +1,8 @@ package journal import ( + "fmt" + "strings" "time" logging "github.com/ipfs/go-log" @@ -20,6 +22,25 @@ var ( // DisabledEvents is the set of event types whose journaling is suppressed. type DisabledEvents []EventType +// ParseDisabledEvents parses a string of the form: "system1:event1,system2:event2[,...]" +// into a DisabledEvents object, returning an error if the string failed to parse. +// +// It sanitizes strings via strings.TrimSpace. +func ParseDisabledEvents(s string) (DisabledEvents, error) { + s = strings.TrimSpace(s) // sanitize + evts := strings.Split(s, ",") + ret := make(DisabledEvents, 0, len(evts)) + for _, evt := range evts { + evt = strings.TrimSpace(evt) // sanitize + s := strings.Split(evt, ":") + if len(s) != 2 { + return nil, fmt.Errorf("invalid event type: %s", s) + } + ret = append(ret, EventType{System: s[0], Event: s[1]}) + } + return ret, nil +} + // EventType represents the signature of an event. type EventType struct { System string diff --git a/node/builder.go b/node/builder.go index 08c48d408..028c9212e 100644 --- a/node/builder.go +++ b/node/builder.go @@ -3,6 +3,7 @@ package node import ( "context" "errors" + "os" "time" logging "github.com/ipfs/go-log" @@ -68,6 +69,10 @@ import ( "github.com/filecoin-project/lotus/storage/sectorblocks" ) +// EnvJournalDisabledEvents is the environment variable through which disabled +// journal events can be customized. +const EnvJournalDisabledEvents = "LOTUS_JOURNAL_DISABLED_EVENTS" + //nolint:deadcode,varcheck var log = logging.Logger("builder") @@ -157,7 +162,15 @@ type Settings struct { func defaults() []Option { return []Option{ // global system journal. - Override(new(journal.DisabledEvents), journal.DefaultDisabledEvents), + Override(new(journal.DisabledEvents), func() journal.DisabledEvents { + if env, ok := os.LookupEnv(EnvJournalDisabledEvents); ok { + if ret, err := journal.ParseDisabledEvents(env); err == nil { + return ret + } + } + // fallback if env variable is not set, or if it failed to parse. + return journal.DefaultDisabledEvents + }), Override(new(journal.Journal), modules.OpenFilesystemJournal), Override(InitJournalKey, func(j journal.Journal) { journal.J = j // eagerly sets the global journal through fx.Invoke.