Skip to content

Commit c9bed10

Browse files
Merge pull request #1586 from SamMayWork/contract-manager-fix
fix: Clean up manager creation to avoid NPEs during background start
2 parents dc97c73 + 4822087 commit c9bed10

File tree

5 files changed

+62
-6
lines changed

5 files changed

+62
-6
lines changed

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ ARG UI_TAG
7575
ARG UI_RELEASE
7676
RUN apk add --update --no-cache \
7777
sqlite=3.44.2-r0 \
78-
postgresql16-client=16.3-r0 \
78+
postgresql16-client=16.4-r0 \
7979
curl=8.9.1-r0 \
8080
jq=1.7.1-r0
8181
WORKDIR /firefly

internal/contracts/manager.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,12 @@ func NewContractManager(ctx context.Context, ns string, di database.Plugin, bi b
160160
// cause recreation of all the listeners (noting that listeners that were specified to start
161161
// from latest, will start from the new latest rather than replaying from the block they
162162
// started from before they were deleted).
163-
return cm, cm.verifyListeners(ctx)
163+
err = cm.verifyListeners(ctx)
164+
if err != nil {
165+
return nil, err
166+
}
167+
168+
return cm, nil
164169
}
165170

166171
func (cm *contractManager) Name() string {

internal/contracts/manager_test.go

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2023 Kaleido, Inc.
1+
// Copyright © 2024 Kaleido, Inc.
22
//
33
// SPDX-License-Identifier: Apache-2.0
44
//
@@ -98,6 +98,33 @@ func TestName(t *testing.T) {
9898
assert.Equal(t, "ContractManager", cm.Name())
9999
}
100100

101+
func TestNewContractManagerVerifyListenersFails(t *testing.T) {
102+
mdi := &databasemocks.Plugin{}
103+
mdm := &datamocks.Manager{}
104+
mbm := &broadcastmocks.Manager{}
105+
mpm := &privatemessagingmocks.Manager{}
106+
mbp := &batchmocks.Manager{}
107+
mim := &identitymanagermocks.Manager{}
108+
mbi := &blockchainmocks.Plugin{}
109+
mom := &operationmocks.Manager{}
110+
txw := &txwritermocks.Writer{}
111+
cmi := &cachemocks.Manager{}
112+
msa := &syncasyncmocks.Bridge{}
113+
114+
ctx := context.Background()
115+
116+
cmi.On("GetCache", mock.Anything).Return(cache.NewUmanagedCache(ctx, 100, 5*time.Minute), nil)
117+
txHelper, _ := txcommon.NewTransactionHelper(ctx, "ns1", mdi, mdm, cmi)
118+
mbi.On("GetFFIParamValidator", mock.Anything).Return(nil, nil)
119+
mom.On("RegisterHandler", mock.Anything, mock.Anything, mock.Anything)
120+
mbi.On("Name").Return("mockblockchain").Maybe()
121+
mdi.On("GetContractListeners", mock.Anything, "ns1", mock.Anything).Return(nil, nil, fmt.Errorf("KABOOM!")).Once()
122+
123+
cm, err := NewContractManager(context.Background(), "ns1", mdi, mbi, mdm, mbm, mpm, mbp, mim, mom, txHelper, txw, msa, cmi)
124+
assert.Nil(t, cm)
125+
assert.NotNil(t, err)
126+
}
127+
101128
func TestNewContractManagerFFISchemaLoaderFail(t *testing.T) {
102129
mdi := &databasemocks.Plugin{}
103130
mdm := &datamocks.Manager{}

internal/definitions/sender.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2023 Kaleido, Inc.
1+
// Copyright © 2024 Kaleido, Inc.
22
//
33
// SPDX-License-Identifier: Apache-2.0
44
//
@@ -93,8 +93,12 @@ func NewDefinitionSender(ctx context.Context, ns *core.Namespace, multiparty boo
9393
tokenBroadcastNames: tokenBroadcastNames,
9494
}
9595
dh, err := newDefinitionHandler(ctx, ns, multiparty, di, bi, dx, dm, im, am, cm, reverseMap(tokenBroadcastNames))
96+
if err != nil {
97+
return nil, nil, err
98+
}
99+
96100
ds.handler = dh
97-
return ds, dh, err
101+
return ds, dh, nil
98102
}
99103

100104
// reverseMap reverses the key/values of a given map

internal/definitions/sender_test.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright © 2021 Kaleido, Inc.
1+
// Copyright © 2024 Kaleido, Inc.
22
//
33
// SPDX-License-Identifier: Apache-2.0
44
//
@@ -105,6 +105,26 @@ func TestInitSenderFail(t *testing.T) {
105105
assert.Regexp(t, "FF10128", err)
106106
}
107107

108+
func TestNewDefinitionSenderHandlerThrows(t *testing.T) {
109+
mdi := &databasemocks.Plugin{}
110+
mbi := &blockchainmocks.Plugin{}
111+
mdx := &dataexchangemocks.Plugin{}
112+
mbm := &broadcastmocks.Manager{}
113+
mim := &identitymanagermocks.Manager{}
114+
mdm := &datamocks.Manager{}
115+
mcm := &contractmocks.Manager{}
116+
117+
tokenBroadcastNames := make(map[string]string)
118+
tokenBroadcastNames["connector1"] = "remote1"
119+
120+
ctx := context.Background()
121+
ns := &core.Namespace{Name: "ns1", NetworkName: "ns1"}
122+
ds, dh, err := NewDefinitionSender(ctx, ns, false, mdi, mbi, mdx, mbm, mim, mdm, nil, mcm, tokenBroadcastNames)
123+
assert.Nil(t, ds)
124+
assert.Nil(t, dh)
125+
assert.NotNil(t, err)
126+
}
127+
108128
func TestName(t *testing.T) {
109129
ds := newTestDefinitionSender(t)
110130
defer ds.cleanup(t)

0 commit comments

Comments
 (0)