From 4d65c62f775d4ece47cdb5af4b7bb6ba843165c8 Mon Sep 17 00:00:00 2001 From: Eric Lippmann Date: Mon, 4 Oct 2021 13:59:20 +0200 Subject: [PATCH] Handle contracts.Initer in common.NewSyncSubject() contracts.EntitiyFactoryFunc.WithInit() checked for contracts.Initer every time. Now it is only done once in common.NewSyncSubject(). --- cmd/icingadb/main.go | 4 ++-- pkg/common/sync_subject.go | 17 +++++++++++++++-- pkg/contracts/contracts.go | 11 ----------- pkg/icingadb/runtime_updates.go | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/cmd/icingadb/main.go b/cmd/icingadb/main.go index 0be0088c..f06b3d21 100644 --- a/cmd/icingadb/main.go +++ b/cmd/icingadb/main.go @@ -181,7 +181,7 @@ func run() int { g.Go(func() error { defer configInitSync.Done() - return s.SyncAfterDump(synctx, common.NewSyncSubject(factory.WithInit), dump) + return s.SyncAfterDump(synctx, common.NewSyncSubject(factory), dump) }) } @@ -192,7 +192,7 @@ func run() int { g.Go(func() error { defer stateInitSync.Done() - return s.SyncAfterDump(synctx, common.NewSyncSubject(factory.WithInit), dump) + return s.SyncAfterDump(synctx, common.NewSyncSubject(factory), dump) }) } diff --git a/pkg/common/sync_subject.go b/pkg/common/sync_subject.go index 11c1586a..f166b63b 100644 --- a/pkg/common/sync_subject.go +++ b/pkg/common/sync_subject.go @@ -15,11 +15,24 @@ type SyncSubject struct { // NewSyncSubject returns a new SyncSubject. func NewSyncSubject(factoryFunc contracts.EntityFactoryFunc) *SyncSubject { e := factoryFunc() + + var factory contracts.EntityFactoryFunc + if _, ok := e.(contracts.Initer); ok { + factory = func() contracts.Entity { + e := factoryFunc() + e.(contracts.Initer).Init() + + return e + } + } else { + factory = factoryFunc + } + _, withChecksum := e.(contracts.Checksumer) return &SyncSubject{ entity: e, - factory: factoryFunc, + factory: factory, withChecksum: withChecksum, } } @@ -29,7 +42,7 @@ func (s SyncSubject) Entity() contracts.Entity { return s.entity } -// Factory returns the entity factory function. +// Factory returns the entity factory function that calls Init() on the created contracts.Entity if applicable. func (s SyncSubject) Factory() contracts.EntityFactoryFunc { return s.factory } diff --git a/pkg/contracts/contracts.go b/pkg/contracts/contracts.go index 51594144..0589c249 100644 --- a/pkg/contracts/contracts.go +++ b/pkg/contracts/contracts.go @@ -49,17 +49,6 @@ type Checksumer interface { // EntityFactoryFunc knows how to create an Entity. type EntityFactoryFunc func() Entity -// WithInit calls Init() on the created Entity if applicable. -func (f EntityFactoryFunc) WithInit() Entity { - e := f() - - if initer, ok := e.(Initer); ok { - initer.Init() - } - - return e -} - // Waiter implements the Wait method, // which blocks until execution is complete. type Waiter interface { diff --git a/pkg/icingadb/runtime_updates.go b/pkg/icingadb/runtime_updates.go index 4d0ec1a0..5e08dc6e 100644 --- a/pkg/icingadb/runtime_updates.go +++ b/pkg/icingadb/runtime_updates.go @@ -61,7 +61,7 @@ func (r *RuntimeUpdates) Sync(ctx context.Context, factoryFuncs []contracts.Enti updateMessagesByKey := make(map[string]chan<- redis.XMessage) for _, factoryFunc := range factoryFuncs { - s := common.NewSyncSubject(factoryFunc.WithInit) + s := common.NewSyncSubject(factoryFunc) updateMessages := make(chan redis.XMessage, bulkSize) upsertEntities := make(chan contracts.Entity, bulkSize)