diff --git a/platform/common/core/generic/committer/finality.go b/platform/common/core/generic/committer/finality.go index b82f97c2c..78f29307b 100644 --- a/platform/common/core/generic/committer/finality.go +++ b/platform/common/core/generic/committer/finality.go @@ -8,7 +8,6 @@ package committer import ( "context" - "sync" "time" "github.com/hyperledger-labs/fabric-smart-client/platform/common/driver" @@ -44,9 +43,7 @@ type FinalityManager[V comparable] struct { eventQueue chan driver.FinalityEvent[V] vault Vault[V] postStatuses collections.Set[V] - txIDs collections.Set[string] tracer trace.Tracer - mutex sync.RWMutex eventQueueWorkers int } @@ -57,7 +54,6 @@ func NewFinalityManager[V comparable](listenerManager driver.ListenerManager[V], eventQueue: make(chan driver.FinalityEvent[V], defaultEventQueueSize), vault: vault, postStatuses: collections.NewSet(statuses...), - txIDs: collections.NewSet[string](), tracer: tracerProvider.Tracer("finality_manager", tracing.WithMetricsOpts(tracing.MetricsOpts{ Namespace: "core", })), @@ -66,19 +62,10 @@ func NewFinalityManager[V comparable](listenerManager driver.ListenerManager[V], } func (c *FinalityManager[V]) AddListener(txID driver.TxID, toAdd driver.FinalityListener[V]) error { - c.mutex.Lock() - defer c.mutex.Unlock() - if err := c.listenerManager.AddListener(txID, toAdd); err != nil { - return err - } - c.txIDs.Add(txID) - return nil + return c.listenerManager.AddListener(txID, toAdd) } func (c *FinalityManager[V]) RemoveListener(txID driver.TxID, toRemove driver.FinalityListener[V]) { - c.mutex.Lock() - defer c.mutex.Unlock() - c.txIDs.Remove(txID) c.listenerManager.RemoveListener(txID, toRemove) } @@ -112,9 +99,7 @@ func (c *FinalityManager[V]) runStatusListener(ctx context.Context) { case <-ctx.Done(): return case <-ticker.C: - c.mutex.RLock() - txIDs := c.txIDs.ToSlice() - c.mutex.RUnlock() + txIDs := c.listenerManager.TxIDs() if len(txIDs) == 0 { c.logger.Debugf("no transactions to check vault status") break diff --git a/platform/common/core/generic/committer/finality_test.go b/platform/common/core/generic/committer/finality_test.go index a07e12c11..2f8f286b6 100644 --- a/platform/common/core/generic/committer/finality_test.go +++ b/platform/common/core/generic/committer/finality_test.go @@ -45,13 +45,13 @@ func TestFinalityManager_AddListener(t *testing.T) { err := manager.AddListener("txID", listener) assert.NoError(t, err) - assert.Equal(t, manager.txIDs.Length(), 1) - assert.True(t, manager.txIDs.Contains("txID")) + assert.Equal(t, 1, len(manager.listenerManager.TxIDs())) + assert.Contains(t, manager.listenerManager.TxIDs(), "txID") // Adding listener with empty txID should return an error err = manager.AddListener("", listener) assert.Error(t, err) - assert.Equal(t, manager.txIDs.Length(), 1) + assert.Equal(t, 1, len(manager.listenerManager.TxIDs())) } func TestFinalityManager_RemoveListener(t *testing.T) { @@ -63,11 +63,11 @@ func TestFinalityManager_RemoveListener(t *testing.T) { assert.NoError(t, manager.AddListener("txID", listener)) manager.RemoveListener("txID", listener) - assert.True(t, manager.txIDs.Empty()) + assert.Empty(t, manager.listenerManager.TxIDs()) // Removing non-existing listener should do nothing manager.RemoveListener("non-existing", listener) - assert.True(t, manager.txIDs.Empty()) + assert.Empty(t, manager.listenerManager.TxIDs()) } func TestFinalityManager_Run(t *testing.T) { diff --git a/platform/common/core/generic/committer/listenermgr.go b/platform/common/core/generic/committer/listenermgr.go index 8da63bc49..b66684ecf 100644 --- a/platform/common/core/generic/committer/listenermgr.go +++ b/platform/common/core/generic/committer/listenermgr.go @@ -110,3 +110,9 @@ func (c *finalityListenerManager[V]) cloneListeners(txID driver.TxID) []driver.F return clone } + +func (c *finalityListenerManager[V]) TxIDs() []driver.TxID { + c.mutex.RLock() + defer c.mutex.RUnlock() + return collections.Keys(c.txIDListeners) +} diff --git a/platform/common/driver/finality.go b/platform/common/driver/finality.go index 1e9ae2ac4..2c6137acd 100644 --- a/platform/common/driver/finality.go +++ b/platform/common/driver/finality.go @@ -18,6 +18,7 @@ type ListenerManager[V comparable] interface { AddListener(txID TxID, toAdd FinalityListener[V]) error RemoveListener(txID TxID, toRemove FinalityListener[V]) InvokeListeners(event FinalityEvent[V]) + TxIDs() []TxID } // FinalityEvent contains information about the finality of a given transaction