diff --git a/core/chaincode/platforms/util/writer.go b/core/chaincode/platforms/util/writer.go index d69f2db487b..28ce24cd553 100644 --- a/core/chaincode/platforms/util/writer.go +++ b/core/chaincode/platforms/util/writer.go @@ -14,6 +14,7 @@ import ( "os" "path" "path/filepath" + "slices" "strings" "time" @@ -37,10 +38,8 @@ func WriteFolderToTarPackage(tw *tar.Writer, srcPath string, excludeDirs []strin } if info.Mode().IsDir() { - for _, excluded := range append(excludeDirs, ".git") { - if info.Name() == excluded { - return filepath.SkipDir - } + if slices.Contains(append(excludeDirs, ".git"), info.Name()) { + return filepath.SkipDir } return nil } diff --git a/core/common/privdata/membershipinfo.go b/core/common/privdata/membershipinfo.go index c94813961cb..0fecf1df1f1 100644 --- a/core/common/privdata/membershipinfo.go +++ b/core/common/privdata/membershipinfo.go @@ -36,19 +36,19 @@ func NewMembershipInfoProvider(mspID string, selfSignedData protoutil.SignedData // AmMemberOf checks whether the current peer is a member of the given collection config. // It is used when a chaincode is upgraded to see if the peer's org has become eligible after a collection change. -func (m *MembershipProvider) AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) (bool, error) { +func (m *MembershipProvider) AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) bool { deserializer := m.IdentityDeserializerFactory(channelName) // Do a simple check to see if the mspid matches any principal identities in the SignaturePolicy - FAB-17059 if collectionPolicyConfig.GetSignaturePolicy() == nil { logger.Warningf("collection membership policy is nil") - return false, nil + return false } memberOrgs := getMemberOrgs(collectionPolicyConfig.GetSignaturePolicy().GetIdentities(), deserializer) _, ok := memberOrgs[m.mspID] - return ok, nil + return ok } func (m *MembershipProvider) MyImplicitCollectionName() string { diff --git a/core/common/privdata/membershipinfo_test.go b/core/common/privdata/membershipinfo_test.go index ac532abfcba..3e3f530b844 100644 --- a/core/common/privdata/membershipinfo_test.go +++ b/core/common/privdata/membershipinfo_test.go @@ -32,25 +32,21 @@ func TestMembershipInfoProvider(t *testing.T) { // verify membership provider pass simple check returns true membershipProvider := NewMembershipInfoProvider(mspID, emptyPeerSelfSignedData, identityDeserializer) - res, err := membershipProvider.AmMemberOf("test1", getAccessPolicy([]string{"peer0", "peer1"})) + res := membershipProvider.AmMemberOf("test1", getAccessPolicy([]string{"peer0", "peer1"})) require.True(t, res) - require.Nil(t, err) // verify membership provider fall back to default access policy evaluation returns false membershipProvider = NewMembershipInfoProvider(mspID, peerSelfSignedData, identityDeserializer) - res, err = membershipProvider.AmMemberOf("test1", getAccessPolicy([]string{"peer2", "peer3"})) + res = membershipProvider.AmMemberOf("test1", getAccessPolicy([]string{"peer2", "peer3"})) require.False(t, res) - require.Nil(t, err) - // verify membership provider returns false and nil when collection policy config is nil - res, err = membershipProvider.AmMemberOf("test1", nil) + // verify membership provider returns false when collection policy config is nil + res = membershipProvider.AmMemberOf("test1", nil) require.False(t, res) - require.Nil(t, err) - // verify membership provider returns false and nil when collection policy config is invalid - res, err = membershipProvider.AmMemberOf("test1", getBadAccessPolicy([]string{"signer0"}, 1)) + // verify membership provider returns false when collection policy config is invalid + res = membershipProvider.AmMemberOf("test1", getBadAccessPolicy([]string{"signer0"}, 1)) require.False(t, res) - require.Nil(t, err) } func TestMyImplicitCollectionName(t *testing.T) { diff --git a/core/container/externalbuilder/externalbuilder.go b/core/container/externalbuilder/externalbuilder.go index 2e4eba812be..7dc085f47db 100644 --- a/core/container/externalbuilder/externalbuilder.go +++ b/core/container/externalbuilder/externalbuilder.go @@ -14,6 +14,7 @@ import ( "os/exec" "path/filepath" "regexp" + "slices" "time" "github.com/hyperledger/fabric-lib-go/common/flogging" @@ -410,18 +411,9 @@ func (b *Builder) NewCommand(name string, args ...string) *exec.Cmd { func appendDefaultPropagateEnvironment(propagateEnvironment []string) []string { for _, variable := range DefaultPropagateEnvironment { - if !contains(propagateEnvironment, variable) { + if !slices.Contains(propagateEnvironment, variable) { propagateEnvironment = append(propagateEnvironment, variable) } } return propagateEnvironment } - -func contains(propagateEnvironment []string, key string) bool { - for _, variable := range propagateEnvironment { - if key == variable { - return true - } - } - return false -} diff --git a/core/ledger/kvledger/coll_elg_notifier.go b/core/ledger/kvledger/coll_elg_notifier.go index ccd1212b4e1..a6e73ef4ddf 100644 --- a/core/ledger/kvledger/coll_elg_notifier.go +++ b/core/ledger/kvledger/coll_elg_notifier.go @@ -129,11 +129,11 @@ func (n *collElgNotifier) elgEnabledCollNames(ledgerID string, // elgEnabled returns true if the peer is not eligible for a collection as per 'existingPolicy' and is eligible as per 'postCommitPolicy' func (n *collElgNotifier) elgEnabled(ledgerID string, existingPolicy, postCommitPolicy *peer.CollectionPolicyConfig) (bool, error) { - existingMember, err := n.membershipInfoProvider.AmMemberOf(ledgerID, existingPolicy) - if err != nil || existingMember { - return false, err + existingMember := n.membershipInfoProvider.AmMemberOf(ledgerID, existingPolicy) + if existingMember { + return false, nil } - return n.membershipInfoProvider.AmMemberOf(ledgerID, postCommitPolicy) + return n.membershipInfoProvider.AmMemberOf(ledgerID, postCommitPolicy), nil } func extractPublicUpdates(stateUpdates ledger.StateUpdates) map[string][]*kvrwset.KVWrite { diff --git a/core/ledger/kvledger/coll_elg_notifier_test.go b/core/ledger/kvledger/coll_elg_notifier_test.go index 902a09d4ab5..96c99971dfb 100644 --- a/core/ledger/kvledger/coll_elg_notifier_test.go +++ b/core/ledger/kvledger/coll_elg_notifier_test.go @@ -38,8 +38,8 @@ func TestCollElgNotifier(t *testing.T) { }, nil) mockMembershipInfoProvider := &mock.MembershipInfoProvider{} - mockMembershipInfoProvider.AmMemberOfStub = func(channel string, p *peer.CollectionPolicyConfig) (bool, error) { - return testutilIsEligibleForMockPolicy(p), nil + mockMembershipInfoProvider.AmMemberOfStub = func(channel string, p *peer.CollectionPolicyConfig) bool { + return testutilIsEligibleForMockPolicy(p) } mockCollElgListener := &mockCollElgListener{} diff --git a/core/ledger/kvledger/pause_resume_test.go b/core/ledger/kvledger/pause_resume_test.go index a8f8ecf80d1..ae7708b15b3 100644 --- a/core/ledger/kvledger/pause_resume_test.go +++ b/core/ledger/kvledger/pause_resume_test.go @@ -7,6 +7,7 @@ SPDX-License-Identifier: Apache-2.0 package kvledger import ( + "slices" "testing" "github.com/hyperledger/fabric-protos-go-apiv2/common" @@ -115,7 +116,7 @@ func assertLedgerStatus(t *testing.T, provider *Provider, genesisBlocks []*commo require.NoError(t, err) require.Len(t, activeLedgerIDs, numLedgers-len(pausedLedgers)) for i := 0; i < numLedgers; i++ { - if !contains(pausedLedgers, i) { + if !slices.Contains(pausedLedgers, i) { require.Contains(t, activeLedgerIDs, constructTestLedgerID(i)) } } @@ -124,19 +125,10 @@ func assertLedgerStatus(t *testing.T, provider *Provider, genesisBlocks []*commo m, err := s.getLedgerMetadata(constructTestLedgerID(i)) require.NoError(t, err) require.NotNil(t, m) - if contains(pausedLedgers, i) { + if slices.Contains(pausedLedgers, i) { require.Equal(t, msgs.Status_INACTIVE, m.GetStatus()) } else { require.Equal(t, msgs.Status_ACTIVE, m.GetStatus()) } } } - -func contains(slice []int, val int) bool { - for _, item := range slice { - if item == val { - return true - } - } - return false -} diff --git a/core/ledger/kvledger/tests/env.go b/core/ledger/kvledger/tests/env.go index afcaf695b56..838c9f63271 100644 --- a/core/ledger/kvledger/tests/env.go +++ b/core/ledger/kvledger/tests/env.go @@ -10,6 +10,7 @@ import ( "fmt" "os" "path/filepath" + "slices" "testing" "time" @@ -315,15 +316,10 @@ type membershipInfoProvider struct { myOrgMSPID string } -func (p *membershipInfoProvider) AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) (bool, error) { +func (p *membershipInfoProvider) AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) bool { members := convertFromMemberOrgsPolicy(collectionPolicyConfig) fmt.Printf("members = %s\n", members) - for _, m := range members { - if m == p.myOrgMSPID { - return true, nil - } - } - return false, nil + return slices.Contains(members, p.myOrgMSPID) } func (p *membershipInfoProvider) MyImplicitCollectionName() string { diff --git a/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go b/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go index f5d97cdae7f..a74c51fcdcb 100644 --- a/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go +++ b/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go @@ -8,6 +8,7 @@ package commontests import ( "fmt" + "slices" "strings" "testing" @@ -1072,7 +1073,7 @@ func TestDataExportImport( verifyExportImport := func(destDBName string, skipNamespaces stringset) { fullScanItr, err := sourceDB.GetFullScanIterator( func(ns string) bool { - return skipNamespaces.contains(ns) + return slices.Contains(skipNamespaces, ns) }, ) require.NoError(t, err) @@ -1162,19 +1163,10 @@ func CreateTestData(t *testing.T, db statedb.VersionedDB, ns string, numKeys int type stringset []string -func (s stringset) contains(str string) bool { - for _, element := range s { - if element == str { - return true - } - } - return false -} - func (s stringset) minus(toMinus stringset) stringset { var final stringset for _, element := range s { - if toMinus.contains(element) { + if slices.Contains(toMinus, element) { continue } final = append(final, element) diff --git a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/cache.go b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/cache.go index d00ab336d08..2fe31a16150 100644 --- a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/cache.go +++ b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/cache.go @@ -7,6 +7,8 @@ SPDX-License-Identifier: Apache-2.0 package statecouchdb import ( + "slices" + "github.com/VictoriaMetrics/fastcache" "google.golang.org/protobuf/proto" ) @@ -45,10 +47,8 @@ func newCache(usrCacheSizeMBs int, sysNamespaces []string) *cache { // Namespace can be of two types: system namespace (such as lscc) and user // namespace (all user's chaincode states). func (c *cache) enabled(namespace string) bool { - for _, ns := range c.sysNamespaces { - if namespace == ns { - return true - } + if slices.Contains(c.sysNamespaces, namespace) { + return true } return c.usrCache != nil } @@ -152,10 +152,8 @@ func (c *cache) Reset() { } func (c *cache) getCache(namespace string) *fastcache.Cache { - for _, ns := range c.sysNamespaces { - if namespace == ns { - return c.sysCache - } + if slices.Contains(c.sysNamespaces, namespace) { + return c.sysCache } return c.usrCache } diff --git a/core/ledger/ledger_interface.go b/core/ledger/ledger_interface.go index 6b694451819..d1fed969e85 100644 --- a/core/ledger/ledger_interface.go +++ b/core/ledger/ledger_interface.go @@ -732,7 +732,7 @@ type ChaincodeLifecycleDetails struct { // a member of a collection. Gossip module is expected to provide the dependency to ledger type MembershipInfoProvider interface { // AmMemberOf checks whether the current peer is a member of the given collection - AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) (bool, error) + AmMemberOf(channelName string, collectionPolicyConfig *peer.CollectionPolicyConfig) bool // MyImplicitCollectionName returns the name of the implicit collection for the current peer MyImplicitCollectionName() string } diff --git a/core/ledger/mock/membership_info_provider.go b/core/ledger/mock/membership_info_provider.go index da9d5e0b309..4a5e601c596 100644 --- a/core/ledger/mock/membership_info_provider.go +++ b/core/ledger/mock/membership_info_provider.go @@ -9,7 +9,7 @@ import ( ) type MembershipInfoProvider struct { - AmMemberOfStub func(string, *peer.CollectionPolicyConfig) (bool, error) + AmMemberOfStub func(string, *peer.CollectionPolicyConfig) bool amMemberOfMutex sync.RWMutex amMemberOfArgsForCall []struct { arg1 string @@ -17,11 +17,9 @@ type MembershipInfoProvider struct { } amMemberOfReturns struct { result1 bool - result2 error } amMemberOfReturnsOnCall map[int]struct { result1 bool - result2 error } MyImplicitCollectionNameStub func() string myImplicitCollectionNameMutex sync.RWMutex @@ -37,23 +35,24 @@ type MembershipInfoProvider struct { invocationsMutex sync.RWMutex } -func (fake *MembershipInfoProvider) AmMemberOf(arg1 string, arg2 *peer.CollectionPolicyConfig) (bool, error) { +func (fake *MembershipInfoProvider) AmMemberOf(arg1 string, arg2 *peer.CollectionPolicyConfig) bool { fake.amMemberOfMutex.Lock() ret, specificReturn := fake.amMemberOfReturnsOnCall[len(fake.amMemberOfArgsForCall)] fake.amMemberOfArgsForCall = append(fake.amMemberOfArgsForCall, struct { arg1 string arg2 *peer.CollectionPolicyConfig }{arg1, arg2}) + stub := fake.AmMemberOfStub + fakeReturns := fake.amMemberOfReturns fake.recordInvocation("AmMemberOf", []interface{}{arg1, arg2}) fake.amMemberOfMutex.Unlock() - if fake.AmMemberOfStub != nil { - return fake.AmMemberOfStub(arg1, arg2) + if stub != nil { + return stub(arg1, arg2) } if specificReturn { - return ret.result1, ret.result2 + return ret.result1 } - fakeReturns := fake.amMemberOfReturns - return fakeReturns.result1, fakeReturns.result2 + return fakeReturns.result1 } func (fake *MembershipInfoProvider) AmMemberOfCallCount() int { @@ -62,7 +61,7 @@ func (fake *MembershipInfoProvider) AmMemberOfCallCount() int { return len(fake.amMemberOfArgsForCall) } -func (fake *MembershipInfoProvider) AmMemberOfCalls(stub func(string, *peer.CollectionPolicyConfig) (bool, error)) { +func (fake *MembershipInfoProvider) AmMemberOfCalls(stub func(string, *peer.CollectionPolicyConfig) bool) { fake.amMemberOfMutex.Lock() defer fake.amMemberOfMutex.Unlock() fake.AmMemberOfStub = stub @@ -75,30 +74,27 @@ func (fake *MembershipInfoProvider) AmMemberOfArgsForCall(i int) (string, *peer. return argsForCall.arg1, argsForCall.arg2 } -func (fake *MembershipInfoProvider) AmMemberOfReturns(result1 bool, result2 error) { +func (fake *MembershipInfoProvider) AmMemberOfReturns(result1 bool) { fake.amMemberOfMutex.Lock() defer fake.amMemberOfMutex.Unlock() fake.AmMemberOfStub = nil fake.amMemberOfReturns = struct { result1 bool - result2 error - }{result1, result2} + }{result1} } -func (fake *MembershipInfoProvider) AmMemberOfReturnsOnCall(i int, result1 bool, result2 error) { +func (fake *MembershipInfoProvider) AmMemberOfReturnsOnCall(i int, result1 bool) { fake.amMemberOfMutex.Lock() defer fake.amMemberOfMutex.Unlock() fake.AmMemberOfStub = nil if fake.amMemberOfReturnsOnCall == nil { fake.amMemberOfReturnsOnCall = make(map[int]struct { result1 bool - result2 error }) } fake.amMemberOfReturnsOnCall[i] = struct { result1 bool - result2 error - }{result1, result2} + }{result1} } func (fake *MembershipInfoProvider) MyImplicitCollectionName() string { @@ -106,15 +102,16 @@ func (fake *MembershipInfoProvider) MyImplicitCollectionName() string { ret, specificReturn := fake.myImplicitCollectionNameReturnsOnCall[len(fake.myImplicitCollectionNameArgsForCall)] fake.myImplicitCollectionNameArgsForCall = append(fake.myImplicitCollectionNameArgsForCall, struct { }{}) + stub := fake.MyImplicitCollectionNameStub + fakeReturns := fake.myImplicitCollectionNameReturns fake.recordInvocation("MyImplicitCollectionName", []interface{}{}) fake.myImplicitCollectionNameMutex.Unlock() - if fake.MyImplicitCollectionNameStub != nil { - return fake.MyImplicitCollectionNameStub() + if stub != nil { + return stub() } if specificReturn { return ret.result1 } - fakeReturns := fake.myImplicitCollectionNameReturns return fakeReturns.result1 } @@ -156,10 +153,6 @@ func (fake *MembershipInfoProvider) MyImplicitCollectionNameReturnsOnCall(i int, func (fake *MembershipInfoProvider) Invocations() map[string][][]interface{} { fake.invocationsMutex.RLock() defer fake.invocationsMutex.RUnlock() - fake.amMemberOfMutex.RLock() - defer fake.amMemberOfMutex.RUnlock() - fake.myImplicitCollectionNameMutex.RLock() - defer fake.myImplicitCollectionNameMutex.RUnlock() copiedInvocations := map[string][][]interface{}{} for key, value := range fake.invocations { copiedInvocations[key] = value diff --git a/core/ledger/pvtdatastorage/snapshot_data_importer.go b/core/ledger/pvtdatastorage/snapshot_data_importer.go index 7e3884b1e17..023ec5449ba 100644 --- a/core/ledger/pvtdatastorage/snapshot_data_importer.go +++ b/core/ledger/pvtdatastorage/snapshot_data_importer.go @@ -185,10 +185,7 @@ func (i *eligibilityAndBTLCache) loadDataFor(namespace string) error { for _, collection := range collections { staticCollection := collection.GetStaticCollectionConfig() - eligible, err := i.membershipProvider.AmMemberOf(i.ledgerID, staticCollection.MemberOrgsPolicy) - if err != nil { - return err - } + eligible := i.membershipProvider.AmMemberOf(i.ledgerID, staticCollection.MemberOrgsPolicy) key := nsColl{ ns: namespace, coll: staticCollection.Name, diff --git a/core/ledger/pvtdatastorage/snapshot_data_importer_test.go b/core/ledger/pvtdatastorage/snapshot_data_importer_test.go index f356823f3ec..5882c29c121 100644 --- a/core/ledger/pvtdatastorage/snapshot_data_importer_test.go +++ b/core/ledger/pvtdatastorage/snapshot_data_importer_test.go @@ -485,32 +485,7 @@ func TestSnapshotImporterErrorPropagation(t *testing.T) { require.EqualError(t, err, "unexpected error - no collection config found below block number [10] for ") }) - t.Run("error-when-membershipProvider-returns-error", func(t *testing.T) { - snapshotDataImporter, configHistoryMgr := setup() - err := configHistoryMgr.Setup( - ledgerID, "ns", - map[uint64][]*peer.StaticCollectionConfig{ - 15: { - { - Name: "coll", - MemberOrgsPolicy: iamIn.toMemberOrgPolicy(), - BlockToLive: 30, - }, - }, - }, - ) - require.NoError(t, err) - snapshotDataImporter.eligibilityAndBTLCache.membershipProvider.(*mock.MembershipInfoProvider).AmMemberOfReturns(false, fmt.Errorf("membership-error")) - err = snapshotDataImporter.ConsumeSnapshotData("ns", "coll", - []byte("key-hash"), []byte("value-hash"), - version.NewHeight(20, 300), - ) - require.NoError(t, err) - - err = snapshotDataImporter.Done() - require.EqualError(t, err, "membership-error") - }) t.Run("error-when-writing-pending-data-during-done", func(t *testing.T) { snapshotDataImporter, configHistoryMgr := setup() @@ -775,8 +750,8 @@ func TestEligibilityAndBTLCacheDataExpiry(t *testing.T) { func newMockMembershipProvider(myMspID string) *mock.MembershipInfoProvider { p := &mock.MembershipInfoProvider{} p.MyImplicitCollectionNameReturns(implicitcollection.NameForOrg("myOrg")) - p.AmMemberOfStub = func(namespace string, config *peer.CollectionPolicyConfig) (bool, error) { - return iamIn.sameAs(config), nil + p.AmMemberOfStub = func(namespace string, config *peer.CollectionPolicyConfig) bool { + return iamIn.sameAs(config) } return p } diff --git a/core/transientstore/store.go b/core/transientstore/store.go index 34de6260e99..98ab2837780 100644 --- a/core/transientstore/store.go +++ b/core/transientstore/store.go @@ -8,6 +8,7 @@ package transientstore import ( "path/filepath" + "slices" "github.com/hyperledger/fabric-lib-go/common/flogging" "github.com/hyperledger/fabric-protos-go-apiv2/ledger/rwset" @@ -156,11 +157,9 @@ func (provider *storeProvider) markStorageForDelete(ledgerID string) error { } // don't update if the storage is already marked for deletion. - for _, l := range marked.List { - if ledgerID == l { - logger.Infow("Transient storage was already marked for delete", "ledgerID", ledgerID) - return nil - } + if slices.Contains(marked.List, ledgerID) { + logger.Infow("Transient storage was already marked for delete", "ledgerID", ledgerID) + return nil } marked.List = append(marked.List, ledgerID)