diff --git a/core/capabilities/ccip/launcher/integration_test.go b/core/capabilities/ccip/launcher/integration_test.go index f0a4bd46bb3..954fda03969 100644 --- a/core/capabilities/ccip/launcher/integration_test.go +++ b/core/capabilities/ccip/launcher/integration_test.go @@ -1,6 +1,7 @@ package launcher import ( + "context" "testing" "time" @@ -115,7 +116,7 @@ type oracleCreatorPrints struct { t *testing.T } -func (o *oracleCreatorPrints) Create(_ uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { +func (o *oracleCreatorPrints) Create(ctx context.Context, _ uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { pluginType := cctypes.PluginType(config.Config.PluginType) o.t.Logf("Creating plugin oracle (pluginType: %s) with config %+v\n", pluginType, config) return &oraclePrints{pluginType: pluginType, config: config, t: o.t}, nil diff --git a/core/capabilities/ccip/launcher/launcher.go b/core/capabilities/ccip/launcher/launcher.go index bc351291dc0..ba21a306b78 100644 --- a/core/capabilities/ccip/launcher/launcher.go +++ b/core/capabilities/ccip/launcher/launcher.go @@ -60,7 +60,7 @@ type launcher struct { p2pID ragep2ptypes.PeerID lggr logger.Logger homeChainReader ccipreader.HomeChain - stopChan chan struct{} + stopChan services.StopChan // latestState is the latest capability registry state received from the syncer. latestState registrysyncer.LocalRegistry // regState is the latest capability registry state that we have successfully processed. @@ -131,19 +131,23 @@ func (l *launcher) Start(context.Context) error { func (l *launcher) monitor() { defer l.wg.Done() ticker := time.NewTicker(l.tickInterval) + + ctx, cancel := l.stopChan.NewCtx() + defer cancel() + for { select { - case <-l.stopChan: + case <-ctx.Done(): return case <-ticker.C: - if err := l.tick(); err != nil { + if err := l.tick(ctx); err != nil { l.lggr.Errorw("Failed to tick", "err", err) } } } } -func (l *launcher) tick() error { +func (l *launcher) tick(ctx context.Context) error { // Ensure that the home chain reader is healthy. // For new jobs it may be possible that the home chain reader is not yet ready // so we won't be able to fetch configs and start any OCR instances. @@ -160,7 +164,7 @@ func (l *launcher) tick() error { return fmt.Errorf("failed to diff capability registry states: %w", err) } - err = l.processDiff(diffRes) + err = l.processDiff(ctx, diffRes) if err != nil { return fmt.Errorf("failed to process diff: %w", err) } @@ -172,15 +176,15 @@ func (l *launcher) tick() error { // for any added OCR instances, it will launch them. // for any removed OCR instances, it will shut them down. // for any updated OCR instances, it will restart them with the new configuration. -func (l *launcher) processDiff(diff diffResult) error { +func (l *launcher) processDiff(ctx context.Context, diff diffResult) error { err := l.processRemoved(diff.removed) - err = multierr.Append(err, l.processAdded(diff.added)) - err = multierr.Append(err, l.processUpdate(diff.updated)) + err = multierr.Append(err, l.processAdded(ctx, diff.added)) + err = multierr.Append(err, l.processUpdate(ctx, diff.updated)) return err } -func (l *launcher) processUpdate(updated map[registrysyncer.DonID]registrysyncer.DON) error { +func (l *launcher) processUpdate(ctx context.Context, updated map[registrysyncer.DonID]registrysyncer.DON) error { l.lock.Lock() defer l.lock.Unlock() @@ -191,6 +195,7 @@ func (l *launcher) processUpdate(updated map[registrysyncer.DonID]registrysyncer } futDeployment, err := updateDON( + ctx, l.lggr, l.p2pID, l.homeChainReader, @@ -216,12 +221,13 @@ func (l *launcher) processUpdate(updated map[registrysyncer.DonID]registrysyncer return nil } -func (l *launcher) processAdded(added map[registrysyncer.DonID]registrysyncer.DON) error { +func (l *launcher) processAdded(ctx context.Context, added map[registrysyncer.DonID]registrysyncer.DON) error { l.lock.Lock() defer l.lock.Unlock() for donID, don := range added { dep, err := createDON( + ctx, l.lggr, l.p2pID, l.homeChainReader, @@ -281,6 +287,7 @@ func (l *launcher) processRemoved(removed map[registrysyncer.DonID]registrysynce // It returns a new ccipDeployment that can then be used to perform the active-candidate deployment, // based on the previous deployment. func updateDON( + ctx context.Context, lggr logger.Logger, p2pID ragep2ptypes.PeerID, homeChainReader ccipreader.HomeChain, @@ -294,24 +301,24 @@ func updateDON( } // this should be a retryable error. - commitOCRConfigs, err := homeChainReader.GetOCRConfigs(context.Background(), don.ID, uint8(cctypes.PluginTypeCCIPCommit)) + commitOCRConfigs, err := homeChainReader.GetOCRConfigs(ctx, don.ID, uint8(cctypes.PluginTypeCCIPCommit)) if err != nil { return nil, fmt.Errorf("failed to fetch OCR configs for CCIP commit plugin (don id: %d) from home chain config contract: %w", don.ID, err) } - execOCRConfigs, err := homeChainReader.GetOCRConfigs(context.Background(), don.ID, uint8(cctypes.PluginTypeCCIPExec)) + execOCRConfigs, err := homeChainReader.GetOCRConfigs(ctx, don.ID, uint8(cctypes.PluginTypeCCIPExec)) if err != nil { return nil, fmt.Errorf("failed to fetch OCR configs for CCIP exec plugin (don id: %d) from home chain config contract: %w", don.ID, err) } - commitBgd, err := createFutureActiveCandidateDeployment(don.ID, prevDeployment, commitOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPCommit) + commitBgd, err := createFutureActiveCandidateDeployment(ctx, don.ID, prevDeployment, commitOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPCommit) if err != nil { return nil, fmt.Errorf("failed to create future active-candidate deployment for CCIP commit plugin: %w, don id: %d", err, don.ID) } - execBgd, err := createFutureActiveCandidateDeployment(don.ID, prevDeployment, execOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPExec) + execBgd, err := createFutureActiveCandidateDeployment(ctx, don.ID, prevDeployment, execOCRConfigs, oracleCreator, cctypes.PluginTypeCCIPExec) if err != nil { return nil, fmt.Errorf("failed to create future active-candidate deployment for CCIP exec plugin: %w, don id: %d", err, don.ID) } @@ -327,6 +334,7 @@ func updateDON( // b) len(ocrConfigs) == 1 && prevDeployment.HasCandidateInstance(): this is a promotion of candidate->active. // All other cases are invalid. This is enforced in the ccip config contract. func createFutureActiveCandidateDeployment( + ctx context.Context, donID uint32, prevDeployment ccipDeployment, ocrConfigs []ccipreader.OCR3ConfigWithMeta, @@ -336,7 +344,7 @@ func createFutureActiveCandidateDeployment( var deployment activeCandidateDeployment if isNewCandidateInstance(pluginType, ocrConfigs, prevDeployment) { // this is a new candidate instance. - greenOracle, err := oracleCreator.Create(donID, cctypes.OCR3ConfigWithMeta(ocrConfigs[1])) + greenOracle, err := oracleCreator.Create(ctx, donID, cctypes.OCR3ConfigWithMeta(ocrConfigs[1])) if err != nil { return activeCandidateDeployment{}, fmt.Errorf("failed to create CCIP commit oracle: %w", err) } @@ -356,6 +364,7 @@ func createFutureActiveCandidateDeployment( // createDON is a pure function that handles the case where a new DON is added to the capability registry. // It returns a new ccipDeployment that can then be used to start the active instance. func createDON( + ctx context.Context, lggr logger.Logger, p2pID ragep2ptypes.PeerID, homeChainReader ccipreader.HomeChain, @@ -363,13 +372,13 @@ func createDON( oracleCreator cctypes.OracleCreator, ) (*ccipDeployment, error) { // this should be a retryable error. - commitOCRConfigs, err := homeChainReader.GetOCRConfigs(context.Background(), don.ID, uint8(cctypes.PluginTypeCCIPCommit)) + commitOCRConfigs, err := homeChainReader.GetOCRConfigs(ctx, don.ID, uint8(cctypes.PluginTypeCCIPCommit)) if err != nil { return nil, fmt.Errorf("failed to fetch OCR configs for CCIP commit plugin (don id: %d) from home chain config contract: %w", don.ID, err) } - execOCRConfigs, err := homeChainReader.GetOCRConfigs(context.Background(), don.ID, uint8(cctypes.PluginTypeCCIPExec)) + execOCRConfigs, err := homeChainReader.GetOCRConfigs(ctx, don.ID, uint8(cctypes.PluginTypeCCIPExec)) if err != nil { return nil, fmt.Errorf("failed to fetch OCR configs for CCIP exec plugin (don id: %d) from home chain config contract: %w", don.ID, err) @@ -391,12 +400,12 @@ func createDON( // at this point we know we are either a member of the DON or a bootstrap node. // the injected oracleCreator will create the appropriate oracle. - commitOracle, err := oracleCreator.Create(don.ID, cctypes.OCR3ConfigWithMeta(commitOCRConfigs[0])) + commitOracle, err := oracleCreator.Create(ctx, don.ID, cctypes.OCR3ConfigWithMeta(commitOCRConfigs[0])) if err != nil { return nil, fmt.Errorf("failed to create CCIP commit oracle: %w", err) } - execOracle, err := oracleCreator.Create(don.ID, cctypes.OCR3ConfigWithMeta(execOCRConfigs[0])) + execOracle, err := oracleCreator.Create(ctx, don.ID, cctypes.OCR3ConfigWithMeta(execOCRConfigs[0])) if err != nil { return nil, fmt.Errorf("failed to create CCIP exec oracle: %w", err) } diff --git a/core/capabilities/ccip/launcher/launcher_test.go b/core/capabilities/ccip/launcher/launcher_test.go index 48bdeda4cde..27b1786d65d 100644 --- a/core/capabilities/ccip/launcher/launcher_test.go +++ b/core/capabilities/ccip/launcher/launcher_test.go @@ -7,6 +7,7 @@ import ( cctypes "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types/mocks" + "github.com/smartcontractkit/chainlink/v2/core/internal/testutils" ragep2ptypes "github.com/smartcontractkit/libocr/ragep2p/types" "github.com/stretchr/testify/mock" @@ -96,7 +97,7 @@ func Test_createDON(t *testing.T) { }, }}, nil) oracleCreator.EXPECT().Type().Return(cctypes.OracleTypeBootstrap).Once() - oracleCreator.EXPECT().Create(mock.Anything, mock.Anything).Return(mocks.NewCCIPOracle(t), nil).Twice() + oracleCreator.EXPECT().Create(mock.Anything, mock.Anything, mock.Anything).Return(mocks.NewCCIPOracle(t), nil).Twice() }, false, }, @@ -127,11 +128,11 @@ func Test_createDON(t *testing.T) { }, }}, nil) - oracleCreator.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + oracleCreator.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPCommit) })). Return(mocks.NewCCIPOracle(t), nil) - oracleCreator.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + oracleCreator.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPExec) })). Return(mocks.NewCCIPOracle(t), nil) @@ -145,7 +146,7 @@ func Test_createDON(t *testing.T) { tt.expect(t, tt.args, tt.args.oracleCreator, tt.args.homeChainReader) } - _, err := createDON(tt.args.lggr, tt.args.p2pID, tt.args.homeChainReader, tt.args.don, tt.args.oracleCreator) + _, err := createDON(testutils.Context(t), tt.args.lggr, tt.args.p2pID, tt.args.homeChainReader, tt.args.don, tt.args.oracleCreator) if tt.wantErr { require.Error(t, err) } else { @@ -173,7 +174,7 @@ func Test_createFutureBlueGreenDeployment(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := createFutureActiveCandidateDeployment(tt.args.donID, tt.args.prevDeployment, tt.args.ocrConfigs, tt.args.oracleCreator, tt.args.pluginType) + got, err := createFutureActiveCandidateDeployment(testutils.Context(t), tt.args.donID, tt.args.prevDeployment, tt.args.ocrConfigs, tt.args.oracleCreator, tt.args.pluginType) if (err != nil) != tt.wantErr { t.Errorf("createFutureActiveCandidateDeployment() error = %v, wantErr %v", err, tt.wantErr) return @@ -204,7 +205,7 @@ func Test_updateDON(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - gotFutDeployment, err := updateDON(tt.args.lggr, tt.args.p2pID, tt.args.homeChainReader, tt.args.prevDeployment, tt.args.don, tt.args.oracleCreator) + gotFutDeployment, err := updateDON(testutils.Context(t), tt.args.lggr, tt.args.p2pID, tt.args.homeChainReader, tt.args.prevDeployment, tt.args.don, tt.args.oracleCreator) if (err != nil) != tt.wantErr { t.Errorf("updateDON() error = %v, wantErr %v", err, tt.wantErr) return @@ -303,11 +304,11 @@ func Test_launcher_processDiff(t *testing.T) { commitOracle.On("Start").Return(nil) execOracle := mocks.NewCCIPOracle(t) execOracle.On("Start").Return(nil) - m.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + m.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPCommit) })). Return(commitOracle, nil) - m.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + m.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPExec) })). Return(execOracle, nil) @@ -366,11 +367,11 @@ func Test_launcher_processDiff(t *testing.T) { commitOracle.On("Start").Return(nil) execOracle := mocks.NewCCIPOracle(t) execOracle.On("Start").Return(nil) - m.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + m.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPCommit) })). Return(commitOracle, nil) - m.EXPECT().Create(mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { + m.EXPECT().Create(mock.Anything, mock.Anything, mock.MatchedBy(func(cfg cctypes.OCR3ConfigWithMeta) bool { return cfg.Config.PluginType == uint8(cctypes.PluginTypeCCIPExec) })). Return(execOracle, nil) @@ -424,7 +425,7 @@ func Test_launcher_processDiff(t *testing.T) { homeChainReader: tt.fields.homeChainReader, oracleCreator: tt.fields.oracleCreator, } - err := l.processDiff(tt.args.diff) + err := l.processDiff(testutils.Context(t), tt.args.diff) if tt.wantErr { require.Error(t, err) } else { diff --git a/core/capabilities/ccip/oraclecreator/bootstrap.go b/core/capabilities/ccip/oraclecreator/bootstrap.go index 22de4ae9486..51a51f51ab8 100644 --- a/core/capabilities/ccip/oraclecreator/bootstrap.go +++ b/core/capabilities/ccip/oraclecreator/bootstrap.go @@ -54,7 +54,7 @@ func (i *bootstrapOracleCreator) Type() cctypes.OracleType { } // Create implements types.OracleCreator. -func (i *bootstrapOracleCreator) Create(_ uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { +func (i *bootstrapOracleCreator) Create(ctx context.Context, _ uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { // Assuming that the chain selector is referring to an evm chain for now. // TODO: add an api that returns chain family. // NOTE: this doesn't really matter for the bootstrap node, it doesn't do anything on-chain. diff --git a/core/capabilities/ccip/oraclecreator/plugin.go b/core/capabilities/ccip/oraclecreator/plugin.go index 117e1fe1bcd..73d7b63aabd 100644 --- a/core/capabilities/ccip/oraclecreator/plugin.go +++ b/core/capabilities/ccip/oraclecreator/plugin.go @@ -118,7 +118,7 @@ func (i *pluginOracleCreator) Type() cctypes.OracleType { } // Create implements types.OracleCreator. -func (i *pluginOracleCreator) Create(donID uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { +func (i *pluginOracleCreator) Create(ctx context.Context, donID uint32, config cctypes.OCR3ConfigWithMeta) (cctypes.CCIPOracle, error) { pluginType := cctypes.PluginType(config.Config.PluginType) // Assuming that the chain selector is referring to an evm chain for now. @@ -137,6 +137,7 @@ func (i *pluginOracleCreator) Create(donID uint32, config cctypes.OCR3ConfigWith } contractReaders, chainWriters, err := i.createReadersAndWriters( + ctx, destChainID, pluginType, config, @@ -284,6 +285,7 @@ func (i *pluginOracleCreator) createFactoryAndTransmitter( } func (i *pluginOracleCreator) createReadersAndWriters( + ctx context.Context, destChainID uint64, pluginType cctypes.PluginType, config cctypes.OCR3ConfigWithMeta, @@ -330,15 +332,14 @@ func (i *pluginOracleCreator) createReadersAndWriters( return nil, nil, fmt.Errorf("failed to get chain reader config: %w", err1) } - // TODO: context. - cr, err1 := relayer.NewContractReader(context.Background(), chainReaderConfig) + cr, err1 := relayer.NewContractReader(ctx, chainReaderConfig) if err1 != nil { return nil, nil, err1 } if chainID.Uint64() == destChainID { offrampAddressHex := common.BytesToAddress(config.Config.OfframpAddress).Hex() - err2 := cr.Bind(context.Background(), []types.BoundContract{ + err2 := cr.Bind(ctx, []types.BoundContract{ { Address: offrampAddressHex, Name: consts.ContractNameOffRamp, @@ -349,11 +350,12 @@ func (i *pluginOracleCreator) createReadersAndWriters( } } - if err2 := cr.Start(context.Background()); err2 != nil { + if err2 := cr.Start(ctx); err2 != nil { return nil, nil, fmt.Errorf("failed to start contract reader for chain %s: %w", chainID.String(), err2) } cw, err1 := createChainWriter( + ctx, chainID, i.evmConfigs, relayer, @@ -363,7 +365,7 @@ func (i *pluginOracleCreator) createReadersAndWriters( return nil, nil, err1 } - if err4 := cw.Start(context.Background()); err4 != nil { + if err4 := cw.Start(ctx); err4 != nil { return nil, nil, fmt.Errorf("failed to start chain writer for chain %s: %w", chainID.String(), err4) } @@ -466,6 +468,7 @@ func isUSDCEnabled(chainID uint64, destChainID uint64, ofc offChainConfig) bool } func createChainWriter( + ctx context.Context, chainID *big.Int, evmConfigs toml.EVMConfigs, relayer loop.Relayer, @@ -499,8 +502,7 @@ func createChainWriter( return nil, fmt.Errorf("failed to marshal chain writer config: %w", err) } - // TODO: context. - cw, err := relayer.NewChainWriter(context.Background(), chainWriterConfig) + cw, err := relayer.NewChainWriter(ctx, chainWriterConfig) if err != nil { return nil, fmt.Errorf("failed to create chain writer for chain %s: %w", chainID.String(), err) } diff --git a/core/capabilities/ccip/types/mocks/oracle_creator.go b/core/capabilities/ccip/types/mocks/oracle_creator.go index 362a89a94d9..b5bc64ac36b 100644 --- a/core/capabilities/ccip/types/mocks/oracle_creator.go +++ b/core/capabilities/ccip/types/mocks/oracle_creator.go @@ -3,6 +3,8 @@ package mocks import ( + context "context" + types "github.com/smartcontractkit/chainlink/v2/core/capabilities/ccip/types" mock "github.com/stretchr/testify/mock" ) @@ -20,9 +22,9 @@ func (_m *OracleCreator) EXPECT() *OracleCreator_Expecter { return &OracleCreator_Expecter{mock: &_m.Mock} } -// Create provides a mock function with given fields: donID, config -func (_m *OracleCreator) Create(donID uint32, config types.OCR3ConfigWithMeta) (types.CCIPOracle, error) { - ret := _m.Called(donID, config) +// Create provides a mock function with given fields: ctx, donID, config +func (_m *OracleCreator) Create(ctx context.Context, donID uint32, config types.OCR3ConfigWithMeta) (types.CCIPOracle, error) { + ret := _m.Called(ctx, donID, config) if len(ret) == 0 { panic("no return value specified for Create") @@ -30,19 +32,19 @@ func (_m *OracleCreator) Create(donID uint32, config types.OCR3ConfigWithMeta) ( var r0 types.CCIPOracle var r1 error - if rf, ok := ret.Get(0).(func(uint32, types.OCR3ConfigWithMeta) (types.CCIPOracle, error)); ok { - return rf(donID, config) + if rf, ok := ret.Get(0).(func(context.Context, uint32, types.OCR3ConfigWithMeta) (types.CCIPOracle, error)); ok { + return rf(ctx, donID, config) } - if rf, ok := ret.Get(0).(func(uint32, types.OCR3ConfigWithMeta) types.CCIPOracle); ok { - r0 = rf(donID, config) + if rf, ok := ret.Get(0).(func(context.Context, uint32, types.OCR3ConfigWithMeta) types.CCIPOracle); ok { + r0 = rf(ctx, donID, config) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(types.CCIPOracle) } } - if rf, ok := ret.Get(1).(func(uint32, types.OCR3ConfigWithMeta) error); ok { - r1 = rf(donID, config) + if rf, ok := ret.Get(1).(func(context.Context, uint32, types.OCR3ConfigWithMeta) error); ok { + r1 = rf(ctx, donID, config) } else { r1 = ret.Error(1) } @@ -56,15 +58,16 @@ type OracleCreator_Create_Call struct { } // Create is a helper method to define mock.On call +// - ctx context.Context // - donID uint32 // - config types.OCR3ConfigWithMeta -func (_e *OracleCreator_Expecter) Create(donID interface{}, config interface{}) *OracleCreator_Create_Call { - return &OracleCreator_Create_Call{Call: _e.mock.On("Create", donID, config)} +func (_e *OracleCreator_Expecter) Create(ctx interface{}, donID interface{}, config interface{}) *OracleCreator_Create_Call { + return &OracleCreator_Create_Call{Call: _e.mock.On("Create", ctx, donID, config)} } -func (_c *OracleCreator_Create_Call) Run(run func(donID uint32, config types.OCR3ConfigWithMeta)) *OracleCreator_Create_Call { +func (_c *OracleCreator_Create_Call) Run(run func(ctx context.Context, donID uint32, config types.OCR3ConfigWithMeta)) *OracleCreator_Create_Call { _c.Call.Run(func(args mock.Arguments) { - run(args[0].(uint32), args[1].(types.OCR3ConfigWithMeta)) + run(args[0].(context.Context), args[1].(uint32), args[2].(types.OCR3ConfigWithMeta)) }) return _c } @@ -74,7 +77,7 @@ func (_c *OracleCreator_Create_Call) Return(_a0 types.CCIPOracle, _a1 error) *Or return _c } -func (_c *OracleCreator_Create_Call) RunAndReturn(run func(uint32, types.OCR3ConfigWithMeta) (types.CCIPOracle, error)) *OracleCreator_Create_Call { +func (_c *OracleCreator_Create_Call) RunAndReturn(run func(context.Context, uint32, types.OCR3ConfigWithMeta) (types.CCIPOracle, error)) *OracleCreator_Create_Call { _c.Call.Return(run) return _c } diff --git a/core/capabilities/ccip/types/types.go b/core/capabilities/ccip/types/types.go index 04da1157b33..8341adf2030 100644 --- a/core/capabilities/ccip/types/types.go +++ b/core/capabilities/ccip/types/types.go @@ -1,6 +1,8 @@ package types import ( + "context" + ccipreaderpkg "github.com/smartcontractkit/chainlink-ccip/pkg/reader" ) @@ -46,7 +48,7 @@ type OracleCreator interface { // Create creates a new oracle that will run either the commit or exec ccip plugin, // if its a plugin oracle, or a bootstrap oracle if its a bootstrap oracle. // The oracle must be returned unstarted. - Create(donID uint32, config OCR3ConfigWithMeta) (CCIPOracle, error) + Create(ctx context.Context, donID uint32, config OCR3ConfigWithMeta) (CCIPOracle, error) // Type returns the type of oracle that this creator creates. // The only valid values are OracleTypePlugin and OracleTypeBootstrap. diff --git a/core/chains/evm/monitor/balance.go b/core/chains/evm/monitor/balance.go index 1f5275c13fb..b6cb9adb875 100644 --- a/core/chains/evm/monitor/balance.go +++ b/core/chains/evm/monitor/balance.go @@ -65,13 +65,13 @@ func NewBalanceMonitor(ethClient evmclient.Client, ethKeyStore keystore.Eth, lgg Start: bm.start, Close: bm.close, }.NewServiceEngine(lggr) - bm.sleeperTask = utils.NewSleeperTask(&worker{bm: bm}) + bm.sleeperTask = utils.NewSleeperTaskCtx(&worker{bm: bm}) return bm } func (bm *balanceMonitor) start(ctx context.Context) error { // Always query latest balance on start - (&worker{bm}).WorkCtx(ctx) + (&worker{bm}).Work(ctx) return nil } @@ -146,12 +146,7 @@ func (*worker) Name() string { return "BalanceMonitorWorker" } -func (w *worker) Work() { - // Used with SleeperTask - w.WorkCtx(context.Background()) -} - -func (w *worker) WorkCtx(ctx context.Context) { +func (w *worker) Work(ctx context.Context) { enabledAddresses, err := w.bm.ethKeyStore.EnabledAddressesForChain(ctx, w.bm.chainID) if err != nil { w.bm.eng.Error("BalanceMonitor: error getting keys", err) diff --git a/core/scripts/go.mod b/core/scripts/go.mod index 2392f85be45..c5d6e081a69 100644 --- a/core/scripts/go.mod +++ b/core/scripts/go.mod @@ -24,7 +24,7 @@ require ( github.com/prometheus/client_golang v1.20.0 github.com/shopspring/decimal v1.4.0 github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837-8c05ee9b97d5 - github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 + github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd github.com/smartcontractkit/chainlink/integration-tests v0.0.0-00010101000000-000000000000 github.com/smartcontractkit/chainlink/v2 v2.0.0-00010101000000-000000000000 github.com/smartcontractkit/libocr v0.0.0-20241007185508-adbe57025f12 @@ -339,20 +339,23 @@ require ( go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.30.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/ratelimit v0.3.0 // indirect @@ -372,8 +375,8 @@ require ( golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/grpc v1.66.2 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect diff --git a/core/scripts/go.sum b/core/scripts/go.sum index 4bd6aaca14c..7860ad00d25 100644 --- a/core/scripts/go.sum +++ b/core/scripts/go.sum @@ -1074,8 +1074,8 @@ github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837 github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837-8c05ee9b97d5/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 h1:kyOANlbz29uaevkjRaXlO1750A43xAvwAOKXiVNWpFQ= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47/go.mod h1:4adKaHNaxFsRvV/lYfqtbsWyyvIPUMLR0FdOJN/ljis= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 h1:qx5p01fqee86cj6EUOCzFc2zILw56v1Q3c5DUuEQWLs= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286/go.mod h1:tsGgeEJc5SUSlfVGSX0wR0EkRU3pM58D6SKF97V68ko= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd h1:2/APOOKt3JxKtHGq2mN67stM8x/uP0aFlXhVCTWQbDk= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd/go.mod h1:TQ9/KKXZ9vr8QAlUquqGpSvDCpR+DtABKPXZY4CiRns= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f h1:BwrIaQIx5Iy6eT+DfLhFfK2XqjxRm74mVdlX8gbu4dw= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f/go.mod h1:wHtwSR3F1CQSJJZDQKuqaqFYnvkT+kMyget7dl8Clvo= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241018134907-a00ba3729b5e h1:JiETqdNM0bktAUGMc62COwXIaw3rR3M77Me6bBLG0Fg= @@ -1273,37 +1273,41 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1: go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= -go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= -go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= -go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1665,10 +1669,10 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/core/services/chainlink/application.go b/core/services/chainlink/application.go index a0a50477614..78ab5e1fa42 100644 --- a/core/services/chainlink/application.go +++ b/core/services/chainlink/application.go @@ -370,7 +370,9 @@ func NewApplication(opts ApplicationOpts) (Application, error) { if err != nil { return nil, errors.Wrap(err, "NewApplication: failed to initialize LDAP Authentication module") } - sessionReaper = ldapauth.NewLDAPServerStateSync(opts.DS, cfg.WebServer().LDAP(), globalLogger) + syncer := ldapauth.NewLDAPServerStateSyncer(opts.DS, cfg.WebServer().LDAP(), globalLogger) + srvcs = append(srvcs, syncer) + sessionReaper = utils.NewSleeperTaskCtx(syncer) case sessions.LocalAuth: authenticationProvider = localauth.NewORM(opts.DS, cfg.WebServer().SessionTimeout().Duration(), globalLogger, auditLogger) sessionReaper = localauth.NewSessionReaper(opts.DS, cfg.WebServer(), globalLogger) diff --git a/core/services/llo/mercurytransmitter/persistence_manager.go b/core/services/llo/mercurytransmitter/persistence_manager.go index eb36a7d1b80..ffa82493c9c 100644 --- a/core/services/llo/mercurytransmitter/persistence_manager.go +++ b/core/services/llo/mercurytransmitter/persistence_manager.go @@ -78,7 +78,7 @@ func (pm *persistenceManager) Load(ctx context.Context) ([]*Transmission, error) func (pm *persistenceManager) runFlushDeletesLoop() { defer pm.wg.Done() - ctx, cancel := pm.stopCh.Ctx(context.Background()) + ctx, cancel := pm.stopCh.NewCtx() defer cancel() ticker := services.NewTicker(pm.flushDeletesFrequency) diff --git a/core/services/llo/mercurytransmitter/server.go b/core/services/llo/mercurytransmitter/server.go index 72ff8b669ba..08e9387b16f 100644 --- a/core/services/llo/mercurytransmitter/server.go +++ b/core/services/llo/mercurytransmitter/server.go @@ -106,7 +106,7 @@ func (s *server) HealthReport() map[string]error { func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup) { defer wg.Done() - runloopCtx, cancel := stopCh.Ctx(context.Background()) + ctx, cancel := stopCh.NewCtx() defer cancel() // Exponential backoff for very rarely occurring errors (DB disconnect etc) @@ -121,8 +121,8 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup select { case hash := <-s.deleteQueue: for { - if err := s.pm.orm.Delete(runloopCtx, [][32]byte{hash}); err != nil { - s.lggr.Errorw("Failed to delete transmission record", "err", err, "transmissionHash", fmt.Sprintf("%x", hash)) + if err := s.pm.orm.Delete(ctx, [][32]byte{hash}); err != nil { + s.lggr.Errorw("Failed to delete transmission record", "err", err, "transmissionHash", hash) s.transmitQueueDeleteErrorCount.Inc() select { case <-time.After(b.Duration()): @@ -154,7 +154,7 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, donI Factor: 2, Jitter: true, } - runloopCtx, cancel := stopCh.Ctx(context.Background()) + ctx, cancel := stopCh.NewCtx() defer cancel() for { t := s.q.BlockingPop() @@ -162,12 +162,13 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, donI // queue was closed return } - ctx, cancel := context.WithTimeout(runloopCtx, utils.WithJitter(s.transmitTimeout)) - res, err := s.transmit(ctx, t) - cancel() - if runloopCtx.Err() != nil { - // runloop context is only canceled on transmitter close so we can - // exit the runloop here + res, err := func(ctx context.Context) (*pb.TransmitResponse, error) { + ctx, cancel := context.WithTimeout(ctx, utils.WithJitter(s.transmitTimeout)) + cancel() + return s.transmit(ctx, t) + }(ctx) + if ctx.Err() != nil { + // only canceled on transmitter close so we can exit return } else if err != nil { s.transmitConnectionErrorCount.Inc() diff --git a/core/services/llo/onchain_channel_definition_cache.go b/core/services/llo/onchain_channel_definition_cache.go index 31b3d87bb41..b0a0dab1b14 100644 --- a/core/services/llo/onchain_channel_definition_cache.go +++ b/core/services/llo/onchain_channel_definition_cache.go @@ -108,7 +108,7 @@ type channelDefinitionCache struct { persistedVersion uint32 wg sync.WaitGroup - chStop chan struct{} + chStop services.StopChan } type HTTPClient interface { @@ -180,7 +180,7 @@ func (c *channelDefinitionCache) Start(ctx context.Context) error { func (c *channelDefinitionCache) pollChainLoop() { defer c.wg.Done() - ctx, cancel := services.StopChan(c.chStop).NewCtx() + ctx, cancel := c.chStop.NewCtx() defer cancel() pollT := services.NewTicker(c.logPollInterval) @@ -306,7 +306,7 @@ func (c *channelDefinitionCache) fetchLoop(closeCh chan struct{}, log *channel_c b := utils.NewHTTPFetchBackoff() var attemptCnt int - ctx, cancel := services.StopChan(c.chStop).NewCtx() + ctx, cancel := c.chStop.NewCtx() defer cancel() err := c.fetchAndSetChannelDefinitions(ctx, log) @@ -355,7 +355,7 @@ func (c *channelDefinitionCache) fetchAndSetChannelDefinitions(ctx context.Conte c.definitionsVersion = log.Version c.definitionsMu.Unlock() - if memoryVersion, persistedVersion, err := c.persist(context.Background()); err != nil { + if memoryVersion, persistedVersion, err := c.persist(ctx); err != nil { // If this fails, the failedPersistLoop will try again c.lggr.Warnw("Failed to persist channel definitions", "err", err, "memoryVersion", memoryVersion, "persistedVersion", persistedVersion) } @@ -459,7 +459,7 @@ func (c *channelDefinitionCache) persist(ctx context.Context) (memoryVersion, pe func (c *channelDefinitionCache) failedPersistLoop() { defer c.wg.Done() - ctx, cancel := services.StopChan(c.chStop).NewCtx() + ctx, cancel := c.chStop.NewCtx() defer cancel() for { diff --git a/core/services/ocr2/plugins/ccip/internal/cache/chain_health.go b/core/services/ocr2/plugins/ccip/internal/cache/chain_health.go index 00f90615eb2..b029ee02132 100644 --- a/core/services/ocr2/plugins/ccip/internal/cache/chain_health.go +++ b/core/services/ocr2/plugins/ccip/internal/cache/chain_health.go @@ -57,15 +57,12 @@ type chainHealthcheck struct { commitStore ccipdata.CommitStoreReader services.StateMachine - wg *sync.WaitGroup - backgroundCtx context.Context //nolint:containedctx - backgroundCancel context.CancelFunc + wg sync.WaitGroup + stopChan services.StopChan } func NewChainHealthcheck(lggr logger.Logger, onRamp ccipdata.OnRampReader, commitStore ccipdata.CommitStoreReader) *chainHealthcheck { - ctx, cancel := context.WithCancel(context.Background()) - - ch := &chainHealthcheck{ + return &chainHealthcheck{ // Different keys use different expiration times, so we don't need to worry about the default value cache: cache.New(cache.NoExpiration, 0), rmnStatusKey: rmnStatusKey, @@ -76,18 +73,12 @@ func NewChainHealthcheck(lggr logger.Logger, onRamp ccipdata.OnRampReader, commi lggr: lggr, onRamp: onRamp, commitStore: commitStore, - - wg: new(sync.WaitGroup), - backgroundCtx: ctx, - backgroundCancel: cancel, + stopChan: make(services.StopChan), } - return ch } // newChainHealthcheckWithCustomEviction is used for testing purposes only. It doesn't start background worker func newChainHealthcheckWithCustomEviction(lggr logger.Logger, onRamp ccipdata.OnRampReader, commitStore ccipdata.CommitStoreReader, globalStatusDuration time.Duration, rmnStatusRefreshInterval time.Duration) *chainHealthcheck { - ctx, cancel := context.WithCancel(context.Background()) - return &chainHealthcheck{ cache: cache.New(rmnStatusRefreshInterval, 0), rmnStatusKey: rmnStatusKey, @@ -98,10 +89,7 @@ func newChainHealthcheckWithCustomEviction(lggr logger.Logger, onRamp ccipdata.O lggr: lggr, onRamp: onRamp, commitStore: commitStore, - - wg: new(sync.WaitGroup), - backgroundCtx: ctx, - backgroundCancel: cancel, + stopChan: make(services.StopChan), } } @@ -145,7 +133,6 @@ func (c *chainHealthcheck) IsHealthy(ctx context.Context) (bool, error) { func (c *chainHealthcheck) Start(context.Context) error { return c.StateMachine.StartOnce("ChainHealthcheck", func() error { c.lggr.Info("Starting ChainHealthcheck") - c.wg.Add(1) c.run() return nil }) @@ -154,7 +141,7 @@ func (c *chainHealthcheck) Start(context.Context) error { func (c *chainHealthcheck) Close() error { return c.StateMachine.StopOnce("ChainHealthcheck", func() error { c.lggr.Info("Closing ChainHealthcheck") - c.backgroundCancel() + close(c.stopChan) c.wg.Wait() return nil }) @@ -162,17 +149,20 @@ func (c *chainHealthcheck) Close() error { func (c *chainHealthcheck) run() { ticker := time.NewTicker(c.rmnStatusRefreshInterval) + c.wg.Add(1) go func() { defer c.wg.Done() + ctx, cancel := c.stopChan.NewCtx() + defer cancel() // Refresh the RMN state immediately after starting the background refresher - _, _ = c.refresh(c.backgroundCtx) + _, _ = c.refresh(ctx) for { select { - case <-c.backgroundCtx.Done(): + case <-ctx.Done(): return case <-ticker.C: - _, err := c.refresh(c.backgroundCtx) + _, err := c.refresh(ctx) if err != nil { c.lggr.Errorw("Failed to refresh RMN state in the background", "err", err) } diff --git a/core/services/ocr2/plugins/ccip/internal/ccipdb/price_service.go b/core/services/ocr2/plugins/ccip/internal/ccipdb/price_service.go index e8b9a4de721..b5e8853d67c 100644 --- a/core/services/ocr2/plugins/ccip/internal/ccipdb/price_service.go +++ b/core/services/ocr2/plugins/ccip/internal/ccipdb/price_service.go @@ -68,10 +68,9 @@ type priceService struct { destPriceRegistryReader ccipdata.PriceRegistryReader services.StateMachine - wg *sync.WaitGroup - backgroundCtx context.Context //nolint:containedctx - backgroundCancel context.CancelFunc - dynamicConfigMu *sync.RWMutex + wg sync.WaitGroup + stopChan services.StopChan + dynamicConfigMu sync.RWMutex } func NewPriceService( @@ -85,8 +84,6 @@ func NewPriceService( priceGetter pricegetter.AllTokensPriceGetter, offRampReader ccipdata.OffRampReader, ) PriceService { - ctx, cancel := context.WithCancel(context.Background()) - pw := &priceService{ gasUpdateInterval: gasPriceUpdateInterval, tokenUpdateInterval: tokenPriceUpdateInterval, @@ -100,11 +97,7 @@ func NewPriceService( sourceNative: sourceNative, priceGetter: priceGetter, offRampReader: offRampReader, - - wg: new(sync.WaitGroup), - backgroundCtx: ctx, - backgroundCancel: cancel, - dynamicConfigMu: &sync.RWMutex{}, + stopChan: make(services.StopChan), } return pw } @@ -121,13 +114,16 @@ func (p *priceService) Start(context.Context) error { func (p *priceService) Close() error { return p.StateMachine.StopOnce("PriceService", func() error { p.lggr.Info("Closing PriceService") - p.backgroundCancel() + close(p.stopChan) p.wg.Wait() return nil }) } func (p *priceService) run() { + ctx, cancel := p.stopChan.NewCtx() + defer cancel() + gasUpdateTicker := time.NewTicker(utils.WithJitter(p.gasUpdateInterval)) tokenUpdateTicker := time.NewTicker(utils.WithJitter(p.tokenUpdateInterval)) @@ -138,15 +134,15 @@ func (p *priceService) run() { for { select { - case <-p.backgroundCtx.Done(): + case <-ctx.Done(): return case <-gasUpdateTicker.C: - err := p.runGasPriceUpdate(p.backgroundCtx) + err := p.runGasPriceUpdate(ctx) if err != nil { p.lggr.Errorw("Error when updating gas prices in the background", "err", err) } case <-tokenUpdateTicker.C: - err := p.runTokenPriceUpdate(p.backgroundCtx) + err := p.runTokenPriceUpdate(ctx) if err != nil { p.lggr.Errorw("Error when updating token prices in the background", "err", err) } diff --git a/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle.go b/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle.go index d2851e3a079..053cddabcd9 100644 --- a/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle.go +++ b/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle.go @@ -6,128 +6,23 @@ import ( "sync/atomic" "time" + commonservices "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink/v2/core/services" "go.uber.org/multierr" - "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/services/job" ) -type BackfilledOracle struct { - srcStartBlock, dstStartBlock uint64 - oracleStarted atomic.Bool - cancelFn context.CancelFunc - src, dst logpoller.LogPoller - oracle job.ServiceCtx - lggr logger.Logger -} - -func NewBackfilledOracle(lggr logger.Logger, src, dst logpoller.LogPoller, srcStartBlock, dstStartBlock uint64, oracle job.ServiceCtx) *BackfilledOracle { - return &BackfilledOracle{ - srcStartBlock: srcStartBlock, - dstStartBlock: dstStartBlock, - oracleStarted: atomic.Bool{}, - cancelFn: nil, - src: src, - dst: dst, - oracle: oracle, - lggr: lggr, - } -} - -func (r *BackfilledOracle) Start(_ context.Context) error { - go r.Run() - return nil -} - -func (r *BackfilledOracle) IsRunning() bool { - return r.oracleStarted.Load() -} - -func (r *BackfilledOracle) Run() { - ctx, cancelFn := context.WithCancel(context.Background()) - r.cancelFn = cancelFn - var err error - var errMu sync.Mutex - var wg sync.WaitGroup - // Replay in parallel if both requested. - if r.srcStartBlock != 0 { - wg.Add(1) - go func() { - defer wg.Done() - s := time.Now() - r.lggr.Infow("start replaying src chain", "fromBlock", r.srcStartBlock) - srcReplayErr := r.src.Replay(ctx, int64(r.srcStartBlock)) - errMu.Lock() - err = multierr.Combine(err, srcReplayErr) - errMu.Unlock() - r.lggr.Infow("finished replaying src chain", "time", time.Since(s)) - }() - } - if r.dstStartBlock != 0 { - wg.Add(1) - go func() { - defer wg.Done() - s := time.Now() - r.lggr.Infow("start replaying dst chain", "fromBlock", r.dstStartBlock) - dstReplayErr := r.dst.Replay(ctx, int64(r.dstStartBlock)) - errMu.Lock() - err = multierr.Combine(err, dstReplayErr) - errMu.Unlock() - r.lggr.Infow("finished replaying dst chain", "time", time.Since(s)) - }() - } - wg.Wait() - if err != nil { - r.lggr.Criticalw("unexpected error replaying, continuing plugin boot without all the logs backfilled", "err", err) - } - if err := ctx.Err(); err != nil { - r.lggr.Errorw("context already cancelled", "err", err) - return - } - // Start oracle with all logs present from dstStartBlock on dst and - // all logs from srcStartBlock on src. - if err := r.oracle.Start(ctx); err != nil { - // Should never happen. - r.lggr.Errorw("unexpected error starting oracle", "err", err) - } else { - r.oracleStarted.Store(true) - } -} - -func (r *BackfilledOracle) Close() error { - if r.oracleStarted.Load() { - // If the oracle is running, it must be Closed/stopped - if err := r.oracle.Close(); err != nil { - r.lggr.Errorw("unexpected error stopping oracle", "err", err) - return err - } - // Flag the oracle as closed with our internal variable that keeps track - // of its state. This will allow to re-start the process - r.oracleStarted.Store(false) - } - if r.cancelFn != nil { - // This is useful to step the previous tasks that are spawned in - // parallel before starting the Oracle. This will use the context to - // signal them to exit immediately. - // - // It can be possible this is the only way to stop the Start() async - // flow, specially when the previusly task are running (the replays) and - // `oracleStarted` would be false in that example. Calling `cancelFn()` - // will stop the replays and will prevent the oracle to start - r.cancelFn() - } - return nil -} - func NewChainAgnosticBackFilledOracle(lggr logger.Logger, srcProvider services.ServiceCtx, dstProvider services.ServiceCtx, oracle job.ServiceCtx) *ChainAgnosticBackFilledOracle { return &ChainAgnosticBackFilledOracle{ srcProvider: srcProvider, dstProvider: dstProvider, oracle: oracle, lggr: lggr, + stopCh: make(chan struct{}), + done: make(chan struct{}), } } @@ -137,7 +32,8 @@ type ChainAgnosticBackFilledOracle struct { oracle job.ServiceCtx lggr logger.Logger oracleStarted atomic.Bool - cancelFn context.CancelFunc + stopCh commonservices.StopChan + done chan struct{} } func (r *ChainAgnosticBackFilledOracle) Start(_ context.Context) error { @@ -146,8 +42,10 @@ func (r *ChainAgnosticBackFilledOracle) Start(_ context.Context) error { } func (r *ChainAgnosticBackFilledOracle) run() { - ctx, cancelFn := context.WithCancel(context.Background()) - r.cancelFn = cancelFn + defer close(r.done) + ctx, cancel := r.stopCh.NewCtx() + defer cancel() + var err error var errMu sync.Mutex var wg sync.WaitGroup @@ -192,6 +90,8 @@ func (r *ChainAgnosticBackFilledOracle) run() { } func (r *ChainAgnosticBackFilledOracle) Close() error { + close(r.stopCh) + <-r.done if r.oracleStarted.Load() { // If the oracle is running, it must be Closed/stopped // TODO: Close should be safe to call in either case? @@ -203,16 +103,5 @@ func (r *ChainAgnosticBackFilledOracle) Close() error { // of its state. This will allow to re-start the process r.oracleStarted.Store(false) } - if r.cancelFn != nil { - // This is useful to step the previous tasks that are spawned in - // parallel before starting the Oracle. This will use the context to - // signal them to exit immediately. - // - // It can be possible this is the only way to stop the Start() async - // flow, specially when the previusly task are running (the replays) and - // `oracleStarted` would be false in that example. Calling `cancelFn()` - // will stop the replays and will prevent the oracle to start - r.cancelFn() - } return nil } diff --git a/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle_test.go b/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle_test.go deleted file mode 100644 index 6db1ebbadd9..00000000000 --- a/core/services/ocr2/plugins/ccip/internal/oraclelib/backfilled_oracle_test.go +++ /dev/null @@ -1,56 +0,0 @@ -package oraclelib - -import ( - "testing" - - "github.com/pkg/errors" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - lpmocks "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller/mocks" - "github.com/smartcontractkit/chainlink/v2/core/logger" - jobmocks "github.com/smartcontractkit/chainlink/v2/core/services/job/mocks" -) - -func TestBackfilledOracle(t *testing.T) { - // First scenario: Start() fails, check that all Replay are being called. - lp1 := lpmocks.NewLogPoller(t) - lp2 := lpmocks.NewLogPoller(t) - lp1.On("Replay", mock.Anything, int64(1)).Return(nil) - lp2.On("Replay", mock.Anything, int64(2)).Return(nil) - oracle1 := jobmocks.NewServiceCtx(t) - oracle1.On("Start", mock.Anything).Return(errors.New("Failed to start")).Twice() - job := NewBackfilledOracle(logger.TestLogger(t), lp1, lp2, 1, 2, oracle1) - - job.Run() - assert.False(t, job.IsRunning()) - job.Run() - assert.False(t, job.IsRunning()) - - /// Start -> Stop -> Start - oracle2 := jobmocks.NewServiceCtx(t) - oracle2.On("Start", mock.Anything).Return(nil).Twice() - oracle2.On("Close").Return(nil).Once() - - job2 := NewBackfilledOracle(logger.TestLogger(t), lp1, lp2, 1, 2, oracle2) - job2.Run() - assert.True(t, job2.IsRunning()) - assert.Nil(t, job2.Close()) - assert.False(t, job2.IsRunning()) - assert.Nil(t, job2.Close()) - assert.False(t, job2.IsRunning()) - job2.Run() - assert.True(t, job2.IsRunning()) - - /// Replay fails, but it starts anyway - lp11 := lpmocks.NewLogPoller(t) - lp12 := lpmocks.NewLogPoller(t) - lp11.On("Replay", mock.Anything, int64(1)).Return(errors.New("Replay failed")).Once() - lp12.On("Replay", mock.Anything, int64(2)).Return(errors.New("Replay failed")).Once() - - oracle := jobmocks.NewServiceCtx(t) - oracle.On("Start", mock.Anything).Return(nil).Once() - job3 := NewBackfilledOracle(logger.NullLogger, lp11, lp12, 1, 2, oracle) - job3.Run() - assert.True(t, job3.IsRunning()) -} diff --git a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go index 8410e6ff938..d69be750253 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/ccip_contracts.go @@ -22,6 +22,7 @@ import ( ocr2types "github.com/smartcontractkit/libocr/offchainreporting2plus/types" "github.com/smartcontractkit/chainlink-common/pkg/config" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink-common/pkg/hashutil" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" @@ -438,7 +439,7 @@ func (c *CCIPContracts) SetNopsOnRamp(t *testing.T, nopsAndWeights []evm_2_evm_o tx, err := c.Source.OnRamp.SetNops(c.Source.User, nopsAndWeights) require.NoError(t, err) c.Source.Chain.Commit() - _, err = bind.WaitMined(context.Background(), c.Source.Chain, tx) + _, err = bind.WaitMined(tests.Context(t), c.Source.Chain, tx) require.NoError(t, err) } @@ -578,7 +579,7 @@ func (c *CCIPContracts) SetupExecOCR2Config(t *testing.T, execOnchainConfig, exe func (c *CCIPContracts) SetupOnchainConfig(t *testing.T, commitOnchainConfig, commitOffchainConfig, execOnchainConfig, execOffchainConfig []byte) int64 { // Note We do NOT set the payees, payment is done in the OCR2Base implementation - blockBeforeConfig, err := c.Dest.Chain.BlockByNumber(context.Background(), nil) + blockBeforeConfig, err := c.Dest.Chain.BlockByNumber(tests.Context(t), nil) require.NoError(t, err) c.SetupCommitOCR2Config(t, commitOnchainConfig, commitOffchainConfig) @@ -1292,8 +1293,8 @@ type ManualExecArgs struct { // if the block located has a timestamp greater than the timestamp of mentioned source block // it just returns the first block found with lesser timestamp of the source block // providing a value of args.DestDeployedAt ensures better performance by reducing the range of block numbers to be traversed -func (args *ManualExecArgs) ApproxDestStartBlock() error { - sourceBlockHdr, err := args.SourceChain.HeaderByNumber(context.Background(), args.SourceStartBlock) +func (args *ManualExecArgs) ApproxDestStartBlock(ctx context.Context) error { + sourceBlockHdr, err := args.SourceChain.HeaderByNumber(ctx, args.SourceStartBlock) if err != nil { return err } @@ -1303,7 +1304,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { minBlockNum := args.DestDeployedAt closestBlockNum := uint64(math.Floor((float64(maxBlockNum) + float64(minBlockNum)) / 2)) var closestBlockHdr *types.Header - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1324,7 +1325,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { minBlockNum = blockNum + 1 } closestBlockNum = uint64(math.Floor((float64(maxBlockNum) + float64(minBlockNum)) / 2)) - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1335,7 +1336,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { if closestBlockNum <= 0 { return fmt.Errorf("approx destination blocknumber not found") } - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1371,7 +1372,7 @@ func (args *ManualExecArgs) FindSeqNrFromCCIPSendRequested() (uint64, error) { return seqNr, nil } -func (args *ManualExecArgs) ExecuteManually() (*types.Transaction, error) { +func (args *ManualExecArgs) ExecuteManually(ctx context.Context) (*types.Transaction, error) { if args.SourceChainID == 0 || args.DestChainID == 0 || args.DestUser == nil { @@ -1404,7 +1405,7 @@ func (args *ManualExecArgs) ExecuteManually() (*types.Transaction, error) { return nil, err } if args.DestStartBlock < 1 { - err = args.ApproxDestStartBlock() + err = args.ApproxDestStartBlock(ctx) if err != nil { return nil, err } @@ -1571,7 +1572,7 @@ func (c *CCIPContracts) ExecuteMessage( destStartBlock uint64, ) uint64 { t.Log("Executing request manually") - sendReqReceipt, err := c.Source.Chain.TransactionReceipt(context.Background(), txHash) + sendReqReceipt, err := c.Source.Chain.TransactionReceipt(tests.Context(t), txHash) require.NoError(t, err) args := ManualExecArgs{ SourceChainID: c.Source.ChainID, @@ -1588,11 +1589,12 @@ func (c *CCIPContracts) ExecuteMessage( OnRamp: c.Source.OnRamp.Address().String(), OffRamp: c.Dest.OffRamp.Address().String(), } - tx, err := args.ExecuteManually() + ctx := tests.Context(t) + tx, err := args.ExecuteManually(ctx) require.NoError(t, err) c.Dest.Chain.Commit() c.Source.Chain.Commit() - rec, err := c.Dest.Chain.TransactionReceipt(context.Background(), tx.Hash()) + rec, err := c.Dest.Chain.TransactionReceipt(ctx, tx.Hash()) require.NoError(t, err) require.Equal(t, uint64(1), rec.Status, "manual execution failed") t.Logf("Manual Execution completed for seqNum %d", args.SeqNr) diff --git a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go index d0d502e8673..0b7f0de4d25 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/integration/chainlink.go @@ -35,6 +35,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks" @@ -342,7 +343,7 @@ func (node *Node) AddJob(t *testing.T, spec *OCR2TaskJobSpec) { nil, ) require.NoError(t, err) - err = node.App.AddJobV2(context.Background(), &ccipJob) + err = node.App.AddJobV2(tests.Context(t), &ccipJob) require.NoError(t, err) } @@ -351,7 +352,7 @@ func (node *Node) AddBootstrapJob(t *testing.T, spec *OCR2TaskJobSpec) { require.NoError(t, err) ccipJob, err := ocrbootstrap.ValidatedBootstrapSpecToml(specString) require.NoError(t, err) - err = node.App.AddJobV2(context.Background(), &ccipJob) + err = node.App.AddJobV2(tests.Context(t), &ccipJob) require.NoError(t, err) } @@ -512,13 +513,13 @@ func setupNodeCCIP( lggr.Debug(fmt.Sprintf("Transmitter address %s chainID %s", transmitter, s.EVMChainID.String())) // Fund the commitTransmitter address with some ETH - n, err := destChain.NonceAt(context.Background(), owner.From, nil) + n, err := destChain.NonceAt(tests.Context(t), owner.From, nil) require.NoError(t, err) tx := types3.NewTransaction(n, transmitter, big.NewInt(1000000000000000000), 21000, big.NewInt(1000000000), nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = destChain.SendTransaction(context.Background(), signedTx) + err = destChain.SendTransaction(tests.Context(t), signedTx) require.NoError(t, err) destChain.Commit() @@ -998,7 +999,7 @@ func (c *CCIPIntegrationTestHarness) SetupAndStartNodes(ctx context.Context, t * func (c *CCIPIntegrationTestHarness) SetUpNodesAndJobs(t *testing.T, pricePipeline string, priceGetterConfig string, usdcAttestationAPI string) CCIPJobSpecParams { // setup Jobs - ctx := context.Background() + ctx := tests.Context(t) // Starts nodes and configures them in the OCR contracts. bootstrapNode, _, configBlock := c.SetupAndStartNodes(ctx, t, int64(freeport.GetOne(t))) @@ -1011,7 +1012,7 @@ func (c *CCIPIntegrationTestHarness) SetUpNodesAndJobs(t *testing.T, pricePipeli // Replay for bootstrap. bc, err := bootstrapNode.App.GetRelayers().LegacyEVMChains().Get(strconv.FormatUint(c.Dest.ChainID, 10)) require.NoError(t, err) - require.NoError(t, bc.LogPoller().Replay(context.Background(), configBlock)) + require.NoError(t, bc.LogPoller().Replay(ctx, configBlock)) c.Dest.Chain.Commit() return jobParams diff --git a/core/services/ocr2/plugins/ccip/testhelpers/simulated_backend.go b/core/services/ocr2/plugins/ccip/testhelpers/simulated_backend.go index ea91362aaae..f48027545ad 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/simulated_backend.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/simulated_backend.go @@ -1,20 +1,19 @@ package testhelpers import ( - "context" "math/big" "testing" "time" "github.com/ethereum/go-ethereum/accounts/abi/bind" "github.com/ethereum/go-ethereum/accounts/abi/bind/backends" - "github.com/ethereum/go-ethereum/common" "github.com/ethereum/go-ethereum/core" ethtypes "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/eth/ethconfig" "github.com/stretchr/testify/require" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/v2/core/services/keystore" ) @@ -54,21 +53,13 @@ func (ks EthKeyStoreSim) Eth() keystore.Eth { return ks.ETHKS } -func (ks EthKeyStoreSim) SignTx(address common.Address, tx *ethtypes.Transaction, chainID *big.Int) (*ethtypes.Transaction, error) { - if chainID.String() == "1000" { - // A terrible hack, just for the multichain test. All simulation clients run on chainID 1337. - // We let the DestChainSelector actually use 1337 to make sure the offchainConfig digests are properly generated. - return ks.ETHKS.SignTx(context.Background(), address, tx, big.NewInt(1337)) - } - return ks.ETHKS.SignTx(context.Background(), address, tx, chainID) -} - var _ keystore.Eth = EthKeyStoreSim{}.ETHKS func ConfirmTxs(t *testing.T, txs []*ethtypes.Transaction, chain *backends.SimulatedBackend) { chain.Commit() + ctx := tests.Context(t) for _, tx := range txs { - rec, err := bind.WaitMined(context.Background(), chain, tx) + rec, err := bind.WaitMined(ctx, chain, tx) require.NoError(t, err) require.Equal(t, uint64(1), rec.Status) } diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go index 952cfe2c9e2..c796d40931a 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/ccip_contracts_1_4_0.go @@ -25,6 +25,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/hashutil" "github.com/smartcontractkit/chainlink-common/pkg/merklemulti" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/logpoller" "github.com/smartcontractkit/chainlink/v2/core/chains/evm/utils" @@ -443,7 +444,7 @@ func (c *CCIPContracts) SetNopsOnRamp(t *testing.T, nopsAndWeights []evm_2_evm_o tx, err := c.Source.OnRamp.SetNops(c.Source.User, nopsAndWeights) require.NoError(t, err) c.Source.Chain.Commit() - _, err = bind.WaitMined(context.Background(), c.Source.Chain, tx) + _, err = bind.WaitMined(tests.Context(t), c.Source.Chain, tx) require.NoError(t, err) } @@ -583,7 +584,7 @@ func (c *CCIPContracts) SetupExecOCR2Config(t *testing.T, execOnchainConfig, exe func (c *CCIPContracts) SetupOnchainConfig(t *testing.T, commitOnchainConfig, commitOffchainConfig, execOnchainConfig, execOffchainConfig []byte) int64 { // Note We do NOT set the payees, payment is done in the OCR2Base implementation - blockBeforeConfig, err := c.Dest.Chain.BlockByNumber(context.Background(), nil) + blockBeforeConfig, err := c.Dest.Chain.BlockByNumber(tests.Context(t), nil) require.NoError(t, err) c.SetupCommitOCR2Config(t, commitOnchainConfig, commitOffchainConfig) @@ -1304,8 +1305,8 @@ type ManualExecArgs struct { // if the block located has a timestamp greater than the timestamp of mentioned source block // it just returns the first block found with lesser timestamp of the source block // providing a value of args.DestDeployedAt ensures better performance by reducing the range of block numbers to be traversed -func (args *ManualExecArgs) ApproxDestStartBlock() error { - sourceBlockHdr, err := args.SourceChain.HeaderByNumber(context.Background(), args.SourceStartBlock) +func (args *ManualExecArgs) ApproxDestStartBlock(ctx context.Context) error { + sourceBlockHdr, err := args.SourceChain.HeaderByNumber(ctx, args.SourceStartBlock) if err != nil { return err } @@ -1315,7 +1316,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { minBlockNum := args.DestDeployedAt closestBlockNum := uint64(math.Floor((float64(maxBlockNum) + float64(minBlockNum)) / 2)) var closestBlockHdr *types.Header - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1336,7 +1337,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { minBlockNum = blockNum + 1 } closestBlockNum = uint64(math.Floor((float64(maxBlockNum) + float64(minBlockNum)) / 2)) - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1347,7 +1348,7 @@ func (args *ManualExecArgs) ApproxDestStartBlock() error { if closestBlockNum <= 0 { return fmt.Errorf("approx destination blocknumber not found") } - closestBlockHdr, err = args.DestChain.HeaderByNumber(context.Background(), big.NewInt(int64(closestBlockNum))) + closestBlockHdr, err = args.DestChain.HeaderByNumber(ctx, new(big.Int).SetUint64(closestBlockNum)) if err != nil { return err } @@ -1383,7 +1384,7 @@ func (args *ManualExecArgs) FindSeqNrFromCCIPSendRequested() (uint64, error) { return seqNr, nil } -func (args *ManualExecArgs) ExecuteManually() (*types.Transaction, error) { +func (args *ManualExecArgs) ExecuteManually(ctx context.Context) (*types.Transaction, error) { if args.SourceChainID == 0 || args.DestChainID == 0 || args.DestUser == nil { @@ -1416,7 +1417,7 @@ func (args *ManualExecArgs) ExecuteManually() (*types.Transaction, error) { return nil, err } if args.DestStartBlock < 1 { - err = args.ApproxDestStartBlock() + err = args.ApproxDestStartBlock(ctx) if err != nil { return nil, err } @@ -1553,7 +1554,8 @@ func (c *CCIPContracts) ExecuteMessage( destStartBlock uint64, ) uint64 { t.Log("Executing request manually") - sendReqReceipt, err := c.Source.Chain.TransactionReceipt(context.Background(), txHash) + ctx := tests.Context(t) + sendReqReceipt, err := c.Source.Chain.TransactionReceipt(ctx, txHash) require.NoError(t, err) args := ManualExecArgs{ SourceChainID: c.Source.ChainID, @@ -1570,11 +1572,11 @@ func (c *CCIPContracts) ExecuteMessage( OnRamp: c.Source.OnRamp.Address().String(), OffRamp: c.Dest.OffRamp.Address().String(), } - tx, err := args.ExecuteManually() + tx, err := args.ExecuteManually(ctx) require.NoError(t, err) c.Dest.Chain.Commit() c.Source.Chain.Commit() - rec, err := c.Dest.Chain.TransactionReceipt(context.Background(), tx.Hash()) + rec, err := c.Dest.Chain.TransactionReceipt(tests.Context(t), tx.Hash()) require.NoError(t, err) require.Equal(t, uint64(1), rec.Status, "manual execution failed") t.Logf("Manual Execution completed for seqNum %d", args.SeqNr) diff --git a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go index a69e284e548..b897d565bae 100644 --- a/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go +++ b/core/services/ocr2/plugins/ccip/testhelpers/testhelpers_1_4_0/chainlink.go @@ -34,6 +34,7 @@ import ( "github.com/smartcontractkit/chainlink-common/pkg/config" "github.com/smartcontractkit/chainlink-common/pkg/loop" "github.com/smartcontractkit/chainlink-common/pkg/utils/mailbox" + "github.com/smartcontractkit/chainlink-common/pkg/utils/tests" cciptypes "github.com/smartcontractkit/chainlink-common/pkg/types/ccip" coretypes "github.com/smartcontractkit/chainlink-common/pkg/types/core/mocks" @@ -339,7 +340,7 @@ func (node *Node) AddJob(t *testing.T, spec *integrationtesthelpers.OCR2TaskJobS nil, ) require.NoError(t, err) - err = node.App.AddJobV2(context.Background(), &ccipJob) + err = node.App.AddJobV2(tests.Context(t), &ccipJob) require.NoError(t, err) } @@ -348,7 +349,7 @@ func (node *Node) AddBootstrapJob(t *testing.T, spec *integrationtesthelpers.OCR require.NoError(t, err) ccipJob, err := ocrbootstrap.ValidatedBootstrapSpecToml(specString) require.NoError(t, err) - err = node.App.AddJobV2(context.Background(), &ccipJob) + err = node.App.AddJobV2(tests.Context(t), &ccipJob) require.NoError(t, err) } @@ -508,13 +509,13 @@ func setupNodeCCIP( lggr.Debug(fmt.Sprintf("Transmitter address %s chainID %s", transmitter, s.EVMChainID.String())) // Fund the commitTransmitter address with some ETH - n, err := destChain.NonceAt(context.Background(), owner.From, nil) + n, err := destChain.NonceAt(tests.Context(t), owner.From, nil) require.NoError(t, err) tx := types3.NewTransaction(n, transmitter, big.NewInt(1000000000000000000), 21000, big.NewInt(1000000000), nil) signedTx, err := owner.Signer(owner.From, tx) require.NoError(t, err) - err = destChain.SendTransaction(context.Background(), signedTx) + err = destChain.SendTransaction(tests.Context(t), signedTx) require.NoError(t, err) destChain.Commit() @@ -944,7 +945,7 @@ func (c *CCIPIntegrationTestHarness) SetupAndStartNodes(ctx context.Context, t * func (c *CCIPIntegrationTestHarness) SetUpNodesAndJobs(t *testing.T, pricePipeline string, priceGetterConfig string, usdcAttestationAPI string) integrationtesthelpers.CCIPJobSpecParams { // setup Jobs - ctx := context.Background() + ctx := tests.Context(t) // Starts nodes and configures them in the OCR contracts. bootstrapNode, _, configBlock := c.SetupAndStartNodes(ctx, t, int64(freeport.GetOne(t))) @@ -957,7 +958,7 @@ func (c *CCIPIntegrationTestHarness) SetUpNodesAndJobs(t *testing.T, pricePipeli // Replay for bootstrap. bc, err := bootstrapNode.App.GetRelayers().LegacyEVMChains().Get(strconv.FormatUint(c.Dest.ChainID, 10)) require.NoError(t, err) - require.NoError(t, bc.LogPoller().Replay(context.Background(), configBlock)) + require.NoError(t, bc.LogPoller().Replay(tests.Context(t), configBlock)) c.Dest.Chain.Commit() return jobParams diff --git a/core/services/ocr2/plugins/ccip/tokendata/bgworker.go b/core/services/ocr2/plugins/ccip/tokendata/bgworker.go index 1a74ab2305b..b3066aa4a06 100644 --- a/core/services/ocr2/plugins/ccip/tokendata/bgworker.go +++ b/core/services/ocr2/plugins/ccip/tokendata/bgworker.go @@ -41,9 +41,8 @@ type BackgroundWorker struct { timeoutDur time.Duration services.StateMachine - wg *sync.WaitGroup - backgroundCtx context.Context //nolint:containedctx - backgroundCancel context.CancelFunc + wg sync.WaitGroup + stopChan services.StopChan } func NewBackgroundWorker( @@ -56,17 +55,13 @@ func NewBackgroundWorker( expirationDur = 24 * time.Hour } - ctx, cancel := context.WithCancel(context.Background()) return &BackgroundWorker{ tokenDataReaders: tokenDataReaders, numWorkers: numWorkers, jobsChan: make(chan cciptypes.EVM2EVMOnRampCCIPSendRequestedWithMeta, numWorkers*100), resultsCache: cache.New(expirationDur, expirationDur/2), timeoutDur: timeoutDur, - - wg: new(sync.WaitGroup), - backgroundCtx: ctx, - backgroundCancel: cancel, + stopChan: make(services.StopChan), } } @@ -82,7 +77,7 @@ func (w *BackgroundWorker) Start(context.Context) error { func (w *BackgroundWorker) Close() error { return w.StateMachine.StopOnce("Token BackgroundWorker", func() error { - w.backgroundCancel() + close(w.stopChan) w.wg.Wait() return nil }) @@ -92,10 +87,12 @@ func (w *BackgroundWorker) AddJobsFromMsgs(ctx context.Context, msgs []cciptypes w.wg.Add(1) go func() { defer w.wg.Done() + var cancel context.CancelFunc + ctx, cancel = w.stopChan.Ctx(ctx) + defer cancel() + for _, msg := range msgs { select { - case <-w.backgroundCtx.Done(): - return case <-ctx.Done(): return default: @@ -134,12 +131,15 @@ func (w *BackgroundWorker) GetMsgTokenData(ctx context.Context, msg cciptypes.EV func (w *BackgroundWorker) run() { go func() { defer w.wg.Done() + ctx, cancel := w.stopChan.NewCtx() + defer cancel() + for { select { - case <-w.backgroundCtx.Done(): + case <-ctx.Done(): return case msg := <-w.jobsChan: - w.workOnMsg(w.backgroundCtx, msg) + w.workOnMsg(ctx, msg) } } }() diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/request.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/request.go index c02b7c10de5..4adef132aab 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/request.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v02/request.go @@ -70,8 +70,7 @@ func (c *client) DoRequest(ctx context.Context, streamsLookup *mercury.StreamsLo }) } - // TODO (AUTO 9090): Understand and fix the use of context.Background() here - reqTimeoutCtx, cancel := context.WithTimeout(context.Background(), mercury.RequestTimeout) + ctx, cancel := context.WithTimeout(ctx, mercury.RequestTimeout) defer cancel() state := encoding.NoPipelineError @@ -86,7 +85,7 @@ func (c *client) DoRequest(ctx context.Context, streamsLookup *mercury.StreamsLo // if no execution errors, then check if any feed returned an error code, if so use the last error code for i := 0; i < resultLen; i++ { select { - case <-reqTimeoutCtx.Done(): + case <-ctx.Done(): // Request Timed out, return timeout error c.lggr.Errorf("at block %s upkeep %s, streams lookup v0.2 timed out", streamsLookup.Time.String(), streamsLookup.UpkeepId.String()) return encoding.NoPipelineError, nil, encoding.ErrCodeStreamsTimeout, false, 0 * time.Second, nil diff --git a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go index c2ffb2172b0..1cd83660c52 100644 --- a/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go +++ b/core/services/ocr2/plugins/ocr2keeper/evmregistry/v21/mercury/v03/request.go @@ -74,11 +74,10 @@ func (c *client) DoRequest(ctx context.Context, streamsLookup *mercury.StreamsLo c.multiFeedsRequest(ctx, ch, streamsLookup) }) - // TODO (AUTO 9090): Understand and fix the use of context.Background() here - reqTimeoutCtx, cancel := context.WithTimeout(context.Background(), mercury.RequestTimeout) + ctx, cancel := context.WithTimeout(ctx, mercury.RequestTimeout) defer cancel() select { - case <-reqTimeoutCtx.Done(): + case <-ctx.Done(): // Request Timed out, return timeout error c.lggr.Errorf("at timestamp %s upkeep %s, streams lookup v0.3 timed out", streamsLookup.Time.String(), streamsLookup.UpkeepId.String()) return encoding.NoPipelineError, nil, encoding.ErrCodeStreamsTimeout, false, 0 * time.Second, nil diff --git a/core/services/relay/evm/mercury/persistence_manager.go b/core/services/relay/evm/mercury/persistence_manager.go index dfe75e7c3ce..68137d04c14 100644 --- a/core/services/relay/evm/mercury/persistence_manager.go +++ b/core/services/relay/evm/mercury/persistence_manager.go @@ -87,7 +87,7 @@ func (pm *PersistenceManager) Load(ctx context.Context) ([]*Transmission, error) func (pm *PersistenceManager) runFlushDeletesLoop() { defer pm.wg.Done() - ctx, cancel := pm.stopCh.Ctx(context.Background()) + ctx, cancel := pm.stopCh.NewCtx() defer cancel() ticker := services.NewTicker(pm.flushDeletesFrequency) diff --git a/core/services/relay/evm/mercury/transmitter.go b/core/services/relay/evm/mercury/transmitter.go index 90b5c7965e5..dac858c837e 100644 --- a/core/services/relay/evm/mercury/transmitter.go +++ b/core/services/relay/evm/mercury/transmitter.go @@ -179,7 +179,7 @@ func (s *server) HealthReport() map[string]error { func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup) { defer wg.Done() - runloopCtx, cancel := stopCh.Ctx(context.Background()) + ctx, cancel := stopCh.NewCtx() defer cancel() // Exponential backoff for very rarely occurring errors (DB disconnect etc) @@ -194,7 +194,7 @@ func (s *server) runDeleteQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup select { case req := <-s.deleteQueue: for { - if err := s.pm.Delete(runloopCtx, req); err != nil { + if err := s.pm.Delete(ctx, req); err != nil { s.lggr.Errorw("Failed to delete transmit request record", "err", err, "req.Payload", req.Payload) s.transmitQueueDeleteErrorCount.Inc() select { @@ -227,7 +227,7 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, feed Factor: 2, Jitter: true, } - runloopCtx, cancel := stopCh.Ctx(context.Background()) + ctx, cancel := stopCh.NewCtx() defer cancel() for { t := s.q.BlockingPop() @@ -235,12 +235,13 @@ func (s *server) runQueueLoop(stopCh services.StopChan, wg *sync.WaitGroup, feed // queue was closed return } - ctx, cancel := context.WithTimeout(runloopCtx, utils.WithJitter(s.transmitTimeout)) - res, err := s.c.Transmit(ctx, t.Req) - cancel() - if runloopCtx.Err() != nil { - // runloop context is only canceled on transmitter close so we can - // exit the runloop here + res, err := func(ctx context.Context) (*pb.TransmitResponse, error) { + ctx, cancel := context.WithTimeout(ctx, utils.WithJitter(s.transmitTimeout)) + cancel() + return s.c.Transmit(ctx, t.Req) + }(ctx) + if ctx.Err() != nil { + // only canceled on transmitter close so we can exit return } else if err != nil { s.transmitConnectionErrorCount.Inc() diff --git a/core/services/relay/evm/mercury/wsrpc/client.go b/core/services/relay/evm/mercury/wsrpc/client.go index 37207510655..c87b555e6a5 100644 --- a/core/services/relay/evm/mercury/wsrpc/client.go +++ b/core/services/relay/evm/mercury/wsrpc/client.go @@ -189,7 +189,7 @@ func (w *client) resetTransport() { if !ok { panic("resetTransport should never be called unless client is in 'started' state") } - ctx, cancel := w.chStop.Ctx(context.Background()) + ctx, cancel := w.chStop.NewCtx() defer cancel() b := utils.NewRedialBackoff() for { diff --git a/core/sessions/ldapauth/sync.go b/core/sessions/ldapauth/sync.go index 5eeaf051526..e3ac8898101 100644 --- a/core/sessions/ldapauth/sync.go +++ b/core/sessions/ldapauth/sync.go @@ -9,8 +9,8 @@ import ( "github.com/go-ldap/ldap/v3" "github.com/lib/pq" + "github.com/smartcontractkit/chainlink-common/pkg/services" "github.com/smartcontractkit/chainlink-common/pkg/sqlutil" - "github.com/smartcontractkit/chainlink-common/pkg/utils" "github.com/smartcontractkit/chainlink/v2/core/config" "github.com/smartcontractkit/chainlink/v2/core/logger" "github.com/smartcontractkit/chainlink/v2/core/sessions" @@ -22,110 +22,135 @@ type LDAPServerStateSyncer struct { config config.LDAP lggr logger.Logger nextSyncTime time.Time + done chan struct{} + stopCh services.StopChan } -// NewLDAPServerStateSync creates a reaper that cleans stale sessions from the store. -func NewLDAPServerStateSync( +// NewLDAPServerStateSyncer creates a reaper that cleans stale sessions from the store. +func NewLDAPServerStateSyncer( ds sqlutil.DataSource, config config.LDAP, lggr logger.Logger, -) *utils.SleeperTask { - namedLogger := lggr.Named("LDAPServerStateSync") - serverSync := LDAPServerStateSyncer{ - ds: ds, - ldapClient: newLDAPClient(config), - config: config, - lggr: namedLogger, - nextSyncTime: time.Time{}, +) *LDAPServerStateSyncer { + return &LDAPServerStateSyncer{ + ds: ds, + ldapClient: newLDAPClient(config), + config: config, + lggr: lggr.Named("LDAPServerStateSync"), + done: make(chan struct{}), + stopCh: make(services.StopChan), } +} + +func (l *LDAPServerStateSyncer) Name() string { + return l.lggr.Name() +} + +func (l *LDAPServerStateSyncer) Ready() error { return nil } + +func (l *LDAPServerStateSyncer) HealthReport() map[string]error { + return map[string]error{l.Name(): nil} +} + +func (l *LDAPServerStateSyncer) Start(ctx context.Context) error { // If enabled, start a background task that calls the Sync/Work function on an // interval without needing an auth event to trigger it // Use IsInstant to check 0 value to omit functionality. - if !config.UpstreamSyncInterval().IsInstant() { - lggr.Info("LDAP Config UpstreamSyncInterval is non-zero, sync functionality will be called on a timer, respecting the UpstreamSyncRateLimit value") - serverSync.StartWorkOnTimer() + if !l.config.UpstreamSyncInterval().IsInstant() { + l.lggr.Info("LDAP Config UpstreamSyncInterval is non-zero, sync functionality will be called on a timer, respecting the UpstreamSyncRateLimit value") + go l.run() } else { // Ensure upstream server state is synced on startup manually if interval check not set - serverSync.Work() + l.Work(ctx) } - - // Start background Sync call task reactive to auth related events - serverSyncSleeperTask := utils.NewSleeperTask(&serverSync) - return serverSyncSleeperTask + return nil } -func (ldSync *LDAPServerStateSyncer) Name() string { - return "LDAPServerStateSync" +func (l *LDAPServerStateSyncer) Close() error { + close(l.stopCh) + <-l.done + return nil } -func (ldSync *LDAPServerStateSyncer) StartWorkOnTimer() { - time.AfterFunc(ldSync.config.UpstreamSyncInterval().Duration(), ldSync.StartWorkOnTimer) - ldSync.Work() +func (l *LDAPServerStateSyncer) run() { + defer close(l.done) + ctx, cancel := l.stopCh.NewCtx() + defer cancel() + ticker := time.NewTicker(l.config.UpstreamSyncInterval().Duration()) + defer ticker.Stop() + + for { + select { + case <-ctx.Done(): + return + case <-ticker.C: + l.Work(ctx) + } + } } -func (ldSync *LDAPServerStateSyncer) Work() { - ctx := context.Background() // TODO https://smartcontract-it.atlassian.net/browse/BCF-2887 +func (l *LDAPServerStateSyncer) Work(ctx context.Context) { // Purge expired ldap_sessions and ldap_user_api_tokens - recordCreationStaleThreshold := ldSync.config.SessionTimeout().Before(time.Now()) - err := ldSync.deleteStaleSessions(ctx, recordCreationStaleThreshold) + recordCreationStaleThreshold := l.config.SessionTimeout().Before(time.Now()) + err := l.deleteStaleSessions(ctx, recordCreationStaleThreshold) if err != nil { - ldSync.lggr.Error("unable to expire local LDAP sessions: ", err) + l.lggr.Error("unable to expire local LDAP sessions: ", err) } - recordCreationStaleThreshold = ldSync.config.UserAPITokenDuration().Before(time.Now()) - err = ldSync.deleteStaleAPITokens(ctx, recordCreationStaleThreshold) + recordCreationStaleThreshold = l.config.UserAPITokenDuration().Before(time.Now()) + err = l.deleteStaleAPITokens(ctx, recordCreationStaleThreshold) if err != nil { - ldSync.lggr.Error("unable to expire user API tokens: ", err) + l.lggr.Error("unable to expire user API tokens: ", err) } // Optional rate limiting check to limit the amount of upstream LDAP server queries performed - if !ldSync.config.UpstreamSyncRateLimit().IsInstant() { - if !time.Now().After(ldSync.nextSyncTime) { + if !l.config.UpstreamSyncRateLimit().IsInstant() { + if !time.Now().After(l.nextSyncTime) { return } // Enough time has elapsed to sync again, store the time for when next sync is allowed and begin sync - ldSync.nextSyncTime = time.Now().Add(ldSync.config.UpstreamSyncRateLimit().Duration()) + l.nextSyncTime = time.Now().Add(l.config.UpstreamSyncRateLimit().Duration()) } - ldSync.lggr.Info("Begin Upstream LDAP provider state sync after checking time against config UpstreamSyncInterval and UpstreamSyncRateLimit") + l.lggr.Info("Begin Upstream LDAP provider state sync after checking time against config UpstreamSyncInterval and UpstreamSyncRateLimit") // For each defined role/group, query for the list of group members to gather the full list of possible users users := []sessions.User{} - conn, err := ldSync.ldapClient.CreateEphemeralConnection() + conn, err := l.ldapClient.CreateEphemeralConnection() if err != nil { - ldSync.lggr.Error("Failed to Dial LDAP Server: ", err) + l.lggr.Error("Failed to Dial LDAP Server: ", err) return } // Root level root user auth with credentials provided from config - bindStr := ldSync.config.BaseUserAttr() + "=" + ldSync.config.ReadOnlyUserLogin() + "," + ldSync.config.BaseDN() - if err = conn.Bind(bindStr, ldSync.config.ReadOnlyUserPass()); err != nil { - ldSync.lggr.Error("Unable to login as initial root LDAP user: ", err) + bindStr := l.config.BaseUserAttr() + "=" + l.config.ReadOnlyUserLogin() + "," + l.config.BaseDN() + if err = conn.Bind(bindStr, l.config.ReadOnlyUserPass()); err != nil { + l.lggr.Error("Unable to login as initial root LDAP user: ", err) } defer conn.Close() // Query for list of uniqueMember IDs present in Admin group - adminUsers, err := ldSync.ldapGroupMembersListToUser(conn, ldSync.config.AdminUserGroupCN(), sessions.UserRoleAdmin) + adminUsers, err := l.ldapGroupMembersListToUser(conn, l.config.AdminUserGroupCN(), sessions.UserRoleAdmin) if err != nil { - ldSync.lggr.Error("Error in ldapGroupMembersListToUser: ", err) + l.lggr.Error("Error in ldapGroupMembersListToUser: ", err) return } // Query for list of uniqueMember IDs present in Edit group - editUsers, err := ldSync.ldapGroupMembersListToUser(conn, ldSync.config.EditUserGroupCN(), sessions.UserRoleEdit) + editUsers, err := l.ldapGroupMembersListToUser(conn, l.config.EditUserGroupCN(), sessions.UserRoleEdit) if err != nil { - ldSync.lggr.Error("Error in ldapGroupMembersListToUser: ", err) + l.lggr.Error("Error in ldapGroupMembersListToUser: ", err) return } // Query for list of uniqueMember IDs present in Edit group - runUsers, err := ldSync.ldapGroupMembersListToUser(conn, ldSync.config.RunUserGroupCN(), sessions.UserRoleRun) + runUsers, err := l.ldapGroupMembersListToUser(conn, l.config.RunUserGroupCN(), sessions.UserRoleRun) if err != nil { - ldSync.lggr.Error("Error in ldapGroupMembersListToUser: ", err) + l.lggr.Error("Error in ldapGroupMembersListToUser: ", err) return } // Query for list of uniqueMember IDs present in Edit group - readUsers, err := ldSync.ldapGroupMembersListToUser(conn, ldSync.config.ReadUserGroupCN(), sessions.UserRoleView) + readUsers, err := l.ldapGroupMembersListToUser(conn, l.config.ReadUserGroupCN(), sessions.UserRoleView) if err != nil { - ldSync.lggr.Error("Error in ldapGroupMembersListToUser: ", err) + l.lggr.Error("Error in ldapGroupMembersListToUser: ", err) return } @@ -147,9 +172,9 @@ func (ldSync *LDAPServerStateSyncer) Work() { // For each unique user in list of active sessions, check for 'Is Active' propery if defined in the config. Some LDAP providers // list group members that are no longer marked as active - usersActiveFlags, err := ldSync.validateUsersActive(dedupedEmails, conn) + usersActiveFlags, err := l.validateUsersActive(dedupedEmails, conn) if err != nil { - ldSync.lggr.Error("Error validating supplied user list: ", err) + l.lggr.Error("Error validating supplied user list: ", err) } // Remove users in the upstreamUserStateMap source of truth who are part of groups but marked as deactivated/no-active for i, active := range usersActiveFlags { @@ -160,7 +185,7 @@ func (ldSync *LDAPServerStateSyncer) Work() { // upstreamUserStateMap is now the most up to date source of truth // Now sync database sessions and roles with new data - err = sqlutil.TransactDataSource(ctx, ldSync.ds, nil, func(tx sqlutil.DataSource) error { + err = sqlutil.TransactDataSource(ctx, l.ds, nil, func(tx sqlutil.DataSource) error { // First, purge users present in the local ldap_sessions table but not in the upstream server type LDAPSession struct { UserEmail string @@ -248,36 +273,36 @@ func (ldSync *LDAPServerStateSyncer) Work() { } } - ldSync.lggr.Info("local ldap_sessions and ldap_user_api_tokens table successfully synced with upstream LDAP state") + l.lggr.Info("local ldap_sessions and ldap_user_api_tokens table successfully synced with upstream LDAP state") return nil }) if err != nil { - ldSync.lggr.Error("Error syncing local database state: ", err) + l.lggr.Error("Error syncing local database state: ", err) } - ldSync.lggr.Info("Upstream LDAP sync complete") + l.lggr.Info("Upstream LDAP sync complete") } // deleteStaleSessions deletes all ldap_sessions before the passed time. -func (ldSync *LDAPServerStateSyncer) deleteStaleSessions(ctx context.Context, before time.Time) error { - _, err := ldSync.ds.ExecContext(ctx, "DELETE FROM ldap_sessions WHERE created_at < $1", before) +func (l *LDAPServerStateSyncer) deleteStaleSessions(ctx context.Context, before time.Time) error { + _, err := l.ds.ExecContext(ctx, "DELETE FROM ldap_sessions WHERE created_at < $1", before) return err } // deleteStaleAPITokens deletes all ldap_user_api_tokens before the passed time. -func (ldSync *LDAPServerStateSyncer) deleteStaleAPITokens(ctx context.Context, before time.Time) error { - _, err := ldSync.ds.ExecContext(ctx, "DELETE FROM ldap_user_api_tokens WHERE created_at < $1", before) +func (l *LDAPServerStateSyncer) deleteStaleAPITokens(ctx context.Context, before time.Time) error { + _, err := l.ds.ExecContext(ctx, "DELETE FROM ldap_user_api_tokens WHERE created_at < $1", before) return err } // ldapGroupMembersListToUser queries the LDAP server given a conn for a list of uniqueMember who are part of the parameterized group -func (ldSync *LDAPServerStateSyncer) ldapGroupMembersListToUser(conn LDAPConn, groupNameCN string, roleToAssign sessions.UserRole) ([]sessions.User, error) { +func (l *LDAPServerStateSyncer) ldapGroupMembersListToUser(conn LDAPConn, groupNameCN string, roleToAssign sessions.UserRole) ([]sessions.User, error) { users, err := ldapGroupMembersListToUser( - conn, groupNameCN, roleToAssign, ldSync.config.GroupsDN(), - ldSync.config.BaseDN(), ldSync.config.QueryTimeout(), - ldSync.lggr, + conn, groupNameCN, roleToAssign, l.config.GroupsDN(), + l.config.BaseDN(), l.config.QueryTimeout(), + l.lggr, ) if err != nil { - ldSync.lggr.Errorf("Error listing members of group (%s): %v", groupNameCN, err) + l.lggr.Errorf("Error listing members of group (%s): %v", groupNameCN, err) return users, errors.New("error searching group members in LDAP directory") } return users, nil @@ -286,10 +311,10 @@ func (ldSync *LDAPServerStateSyncer) ldapGroupMembersListToUser(conn LDAPConn, g // validateUsersActive performs an additional LDAP server query for the supplied emails, checking the // returned user data for an 'active' property defined optionally in the config. // Returns same length bool 'valid' array, order preserved -func (ldSync *LDAPServerStateSyncer) validateUsersActive(emails []string, conn LDAPConn) ([]bool, error) { +func (l *LDAPServerStateSyncer) validateUsersActive(emails []string, conn LDAPConn) ([]bool, error) { validUsers := make([]bool, len(emails)) // If active attribute to check is not defined in config, skip - if ldSync.config.ActiveAttribute() == "" { + if l.config.ActiveAttribute() == "" { // pre fill with valids for i := range emails { validUsers[i] = true @@ -301,22 +326,22 @@ func (ldSync *LDAPServerStateSyncer) validateUsersActive(emails []string, conn L filterQuery := "(|" for _, email := range emails { escapedEmail := ldap.EscapeFilter(email) - filterQuery = fmt.Sprintf("%s(%s=%s)", filterQuery, ldSync.config.BaseUserAttr(), escapedEmail) + filterQuery = fmt.Sprintf("%s(%s=%s)", filterQuery, l.config.BaseUserAttr(), escapedEmail) } filterQuery = fmt.Sprintf("(&%s))", filterQuery) - searchBaseDN := fmt.Sprintf("%s,%s", ldSync.config.UsersDN(), ldSync.config.BaseDN()) + searchBaseDN := fmt.Sprintf("%s,%s", l.config.UsersDN(), l.config.BaseDN()) searchRequest := ldap.NewSearchRequest( searchBaseDN, ldap.ScopeWholeSubtree, ldap.NeverDerefAliases, - 0, int(ldSync.config.QueryTimeout().Seconds()), false, + 0, int(l.config.QueryTimeout().Seconds()), false, filterQuery, - []string{ldSync.config.BaseUserAttr(), ldSync.config.ActiveAttribute()}, + []string{l.config.BaseUserAttr(), l.config.ActiveAttribute()}, nil, ) // Query LDAP server for the ActiveAttribute property of each specified user results, err := conn.Search(searchRequest) if err != nil { - ldSync.lggr.Errorf("Error searching user in LDAP query: %v", err) + l.lggr.Errorf("Error searching user in LDAP query: %v", err) return validUsers, errors.New("error searching users in LDAP directory") } // Ensure user response entries @@ -328,9 +353,9 @@ func (ldSync *LDAPServerStateSyncer) validateUsersActive(emails []string, conn L // keyed on email for final step to return flag bool list where order is preserved emailToActiveMap := make(map[string]bool) for _, result := range results.Entries { - isActiveAttribute := result.GetAttributeValue(ldSync.config.ActiveAttribute()) - uidAttribute := result.GetAttributeValue(ldSync.config.BaseUserAttr()) - emailToActiveMap[uidAttribute] = isActiveAttribute == ldSync.config.ActiveAttributeAllowedValue() + isActiveAttribute := result.GetAttributeValue(l.config.ActiveAttribute()) + uidAttribute := result.GetAttributeValue(l.config.BaseUserAttr()) + emailToActiveMap[uidAttribute] = isActiveAttribute == l.config.ActiveAttributeAllowedValue() } for i, email := range emails { active, ok := emailToActiveMap[email] diff --git a/core/sessions/localauth/reaper.go b/core/sessions/localauth/reaper.go index 7b91e4ce2c0..6f2bfe732c5 100644 --- a/core/sessions/localauth/reaper.go +++ b/core/sessions/localauth/reaper.go @@ -23,19 +23,16 @@ type SessionReaperConfig interface { // NewSessionReaper creates a reaper that cleans stale sessions from the store. func NewSessionReaper(ds sqlutil.DataSource, config SessionReaperConfig, lggr logger.Logger) *utils.SleeperTask { - return utils.NewSleeperTask(&sessionReaper{ + return utils.NewSleeperTaskCtx(&sessionReaper{ ds, config, lggr.Named("SessionReaper"), }) } -func (sr *sessionReaper) Name() string { - return "SessionReaper" -} +func (sr *sessionReaper) Name() string { return sr.lggr.Name() } -func (sr *sessionReaper) Work() { - ctx := context.Background() //TODO https://smartcontract-it.atlassian.net/browse/BCF-2887 +func (sr *sessionReaper) Work(ctx context.Context) { recordCreationStaleThreshold := sr.config.SessionReaperExpiration().Before( sr.config.SessionTimeout().Before(time.Now())) err := sr.deleteStaleSessions(ctx, recordCreationStaleThreshold) diff --git a/go.mod b/go.mod index 7cb5f85c03b..8efd6680001 100644 --- a/go.mod +++ b/go.mod @@ -76,7 +76,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.27 github.com/smartcontractkit/chainlink-automation v0.8.1 github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 - github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 + github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241018134907-a00ba3729b5e github.com/smartcontractkit/chainlink-feeds v0.1.1 @@ -101,9 +101,9 @@ require ( go.dedis.ch/fixbuf v1.0.3 go.dedis.ch/kyber/v3 v3.1.0 go.opentelemetry.io/contrib/instrumentation/github.com/gin-gonic/gin/otelgin v0.49.0 - go.opentelemetry.io/otel v1.28.0 - go.opentelemetry.io/otel/metric v1.28.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel v1.30.0 + go.opentelemetry.io/otel/metric v1.30.0 + go.opentelemetry.io/otel/trace v1.30.0 go.uber.org/multierr v1.11.0 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.27.0 @@ -116,7 +116,7 @@ require ( golang.org/x/time v0.6.0 golang.org/x/tools v0.25.0 gonum.org/v1/gonum v0.15.0 - google.golang.org/grpc v1.65.0 + google.golang.org/grpc v1.66.1 google.golang.org/protobuf v1.35.1 gopkg.in/guregu/null.v4 v4.0.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 @@ -337,24 +337,27 @@ require ( go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk v1.30.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/ratelimit v0.3.0 // indirect golang.org/x/arch v0.8.0 // indirect golang.org/x/sys v0.25.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/guregu/null.v2 v2.1.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 4ae7f7c1c94..48f37774dbf 100644 --- a/go.sum +++ b/go.sum @@ -1057,8 +1057,8 @@ github.com/smartcontractkit/chainlink-automation v0.8.1 h1:sTc9LKpBvcKPc1JDYAmgB github.com/smartcontractkit/chainlink-automation v0.8.1/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 h1:kyOANlbz29uaevkjRaXlO1750A43xAvwAOKXiVNWpFQ= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47/go.mod h1:4adKaHNaxFsRvV/lYfqtbsWyyvIPUMLR0FdOJN/ljis= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 h1:qx5p01fqee86cj6EUOCzFc2zILw56v1Q3c5DUuEQWLs= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286/go.mod h1:tsGgeEJc5SUSlfVGSX0wR0EkRU3pM58D6SKF97V68ko= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd h1:2/APOOKt3JxKtHGq2mN67stM8x/uP0aFlXhVCTWQbDk= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd/go.mod h1:TQ9/KKXZ9vr8QAlUquqGpSvDCpR+DtABKPXZY4CiRns= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f h1:BwrIaQIx5Iy6eT+DfLhFfK2XqjxRm74mVdlX8gbu4dw= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f/go.mod h1:wHtwSR3F1CQSJJZDQKuqaqFYnvkT+kMyget7dl8Clvo= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241018134907-a00ba3729b5e h1:JiETqdNM0bktAUGMc62COwXIaw3rR3M77Me6bBLG0Fg= @@ -1253,35 +1253,41 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1: go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= -go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= -go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= -go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -1648,10 +1654,10 @@ google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEY google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -1667,8 +1673,8 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.1 h1:hO5qAXR19+/Z44hmvIM4dQFMSYX9XcWsByfoxutBpAM= +google.golang.org/grpc v1.66.1/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/integration-tests/ccip-tests/actions/ccip_helpers.go b/integration-tests/ccip-tests/actions/ccip_helpers.go index da2e870f3ec..952f71c1e4c 100644 --- a/integration-tests/ccip-tests/actions/ccip_helpers.go +++ b/integration-tests/ccip-tests/actions/ccip_helpers.go @@ -3072,7 +3072,7 @@ func (lane *CCIPLane) ExecuteManually(options ...ManualExecutionOption) error { GasLimit: big.NewInt(DefaultDestinationGasLimit), } timeNow := time.Now().UTC() - tx, err := args.ExecuteManually() + tx, err := args.ExecuteManually(lane.Context) if err != nil { return fmt.Errorf("could not execute manually: %w seqNum %d", err, seqNum) } diff --git a/integration-tests/go.mod b/integration-tests/go.mod index 4eae80919bd..b008dd46e66 100644 --- a/integration-tests/go.mod +++ b/integration-tests/go.mod @@ -40,7 +40,7 @@ require ( github.com/smartcontractkit/chain-selectors v1.0.27 github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837-8c05ee9b97d5 github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 - github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 + github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd github.com/smartcontractkit/chainlink-protos/job-distributor v0.4.0 github.com/smartcontractkit/chainlink-testing-framework/havoc v1.50.0 github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.12 @@ -465,20 +465,23 @@ require ( go.opentelemetry.io/collector/semconv v0.105.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.30.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/goleak v1.3.0 // indirect @@ -496,8 +499,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/integration-tests/go.sum b/integration-tests/go.sum index cda1230764f..693b3083124 100644 --- a/integration-tests/go.sum +++ b/integration-tests/go.sum @@ -1404,8 +1404,8 @@ github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837 github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837-8c05ee9b97d5/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 h1:kyOANlbz29uaevkjRaXlO1750A43xAvwAOKXiVNWpFQ= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47/go.mod h1:4adKaHNaxFsRvV/lYfqtbsWyyvIPUMLR0FdOJN/ljis= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 h1:qx5p01fqee86cj6EUOCzFc2zILw56v1Q3c5DUuEQWLs= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286/go.mod h1:tsGgeEJc5SUSlfVGSX0wR0EkRU3pM58D6SKF97V68ko= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd h1:2/APOOKt3JxKtHGq2mN67stM8x/uP0aFlXhVCTWQbDk= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd/go.mod h1:TQ9/KKXZ9vr8QAlUquqGpSvDCpR+DtABKPXZY4CiRns= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f h1:BwrIaQIx5Iy6eT+DfLhFfK2XqjxRm74mVdlX8gbu4dw= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f/go.mod h1:wHtwSR3F1CQSJJZDQKuqaqFYnvkT+kMyget7dl8Clvo= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241018134907-a00ba3729b5e h1:JiETqdNM0bktAUGMc62COwXIaw3rR3M77Me6bBLG0Fg= @@ -1636,36 +1636,40 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= -go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= -go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= -go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -2114,10 +2118,10 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= diff --git a/integration-tests/load/go.mod b/integration-tests/load/go.mod index fdd2550486b..a9f9863e024 100644 --- a/integration-tests/load/go.mod +++ b/integration-tests/load/go.mod @@ -15,7 +15,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.33.0 github.com/slack-go/slack v0.15.0 - github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 + github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd github.com/smartcontractkit/chainlink-testing-framework/lib v1.50.12 github.com/smartcontractkit/chainlink-testing-framework/seth v1.50.1 github.com/smartcontractkit/chainlink-testing-framework/wasp v1.50.0 @@ -63,13 +63,16 @@ require ( github.com/smartcontractkit/grpc-proxy v0.0.0-20240830132753-a7e17fec5ab7 // indirect github.com/sourcegraph/conc v0.3.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 // indirect go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 // indirect - go.opentelemetry.io/otel/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/log v0.4.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.28.0 // indirect + go.opentelemetry.io/otel/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/log v0.6.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.30.0 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect k8s.io/apimachinery v0.31.1 // indirect ) @@ -467,12 +470,12 @@ require ( go.opentelemetry.io/collector/semconv v0.105.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect + go.opentelemetry.io/otel v1.30.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/otel/metric v1.30.0 // indirect + go.opentelemetry.io/otel/sdk v1.30.0 // indirect + go.opentelemetry.io/otel/trace v1.30.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect go.uber.org/atomic v1.11.0 // indirect @@ -496,8 +499,8 @@ require ( gomodules.xyz/jsonpatch/v2 v2.4.0 // indirect gonum.org/v1/gonum v0.15.0 // indirect google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 // indirect google.golang.org/grpc v1.66.2 // indirect google.golang.org/protobuf v1.35.1 // indirect gopkg.in/guregu/null.v4 v4.0.0 // indirect diff --git a/integration-tests/load/go.sum b/integration-tests/load/go.sum index 02cf6954ef2..c75441cd816 100644 --- a/integration-tests/load/go.sum +++ b/integration-tests/load/go.sum @@ -1381,8 +1381,8 @@ github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837 github.com/smartcontractkit/chainlink-automation v1.0.0-alpha.0.0.20241023165837-8c05ee9b97d5/go.mod h1:Iij36PvWZ6blrdC5A/nrQUBuf3MH3JvsBB9sSyc9W08= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47 h1:kyOANlbz29uaevkjRaXlO1750A43xAvwAOKXiVNWpFQ= github.com/smartcontractkit/chainlink-ccip v0.0.0-20241022184834-e8564a286a47/go.mod h1:4adKaHNaxFsRvV/lYfqtbsWyyvIPUMLR0FdOJN/ljis= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286 h1:qx5p01fqee86cj6EUOCzFc2zILw56v1Q3c5DUuEQWLs= -github.com/smartcontractkit/chainlink-common v0.3.1-0.20241021103500-39a6e78c0286/go.mod h1:tsGgeEJc5SUSlfVGSX0wR0EkRU3pM58D6SKF97V68ko= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd h1:2/APOOKt3JxKtHGq2mN67stM8x/uP0aFlXhVCTWQbDk= +github.com/smartcontractkit/chainlink-common v0.3.1-0.20241023205601-221839275fbd/go.mod h1:TQ9/KKXZ9vr8QAlUquqGpSvDCpR+DtABKPXZY4CiRns= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f h1:BwrIaQIx5Iy6eT+DfLhFfK2XqjxRm74mVdlX8gbu4dw= github.com/smartcontractkit/chainlink-cosmos v0.5.2-0.20241017133723-5277829bd53f/go.mod h1:wHtwSR3F1CQSJJZDQKuqaqFYnvkT+kMyget7dl8Clvo= github.com/smartcontractkit/chainlink-data-streams v0.1.1-0.20241018134907-a00ba3729b5e h1:JiETqdNM0bktAUGMc62COwXIaw3rR3M77Me6bBLG0Fg= @@ -1611,36 +1611,40 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.5 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.30.0 h1:F2t8sK4qf1fAmY9ua4ohFS/K+FUuOPemHUIXHtktrts= +go.opentelemetry.io/otel v1.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9 h1:UiRNKd1OgqsLbFwE+wkAWTdiAxXtCBqKIHeBIse4FUA= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240823153156-2a54df7bffb9/go.mod h1:eqZlW3pJWhjyexnDPrdQxix1pn0wwhI4AO4GKpP/bMI= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0 h1:QSKmLBzbFULSyHzOdO9JsN9lpE4zkrz1byYGmJecdVE= +go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.6.0/go.mod h1:sTQ/NH8Yrirf0sJ5rWqVu+oT82i4zL9FaF6rWcqnptM= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0/go.mod h1:yeGZANgEcpdx/WK0IvvRFC+2oLiMS2u4L/0Rj2M2Qr0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0 h1:VrMAbeJz4gnVDg2zEzjHG4dEH86j4jO6VYB+NgtGD8s= +go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.30.0/go.mod h1:qqN/uFdpeitTvm+JDqqnjm517pmQRYxTORbETHq5tOc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0 h1:lsInsfvhVIfOI6qHVyysXMNDnjO9Npvl7tlDPJFBVd4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.30.0/go.mod h1:KQsVNh4OjgjTG0G6EiNi1jVpnaeeKsKMRwbLN+f1+8M= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0 h1:umZgi92IyxfXd/l4kaDhnKgY8rnN/cZcF1LKc6I8OQ8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.30.0/go.mod h1:4lVs6obhSVRb1EW5FhOuBTyiQhtRtAnnva9vD3yRfq8= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= -go.opentelemetry.io/otel/log v0.4.0 h1:/vZ+3Utqh18e8TPjuc3ecg284078KWrR8BRz+PQAj3o= -go.opentelemetry.io/otel/log v0.4.0/go.mod h1:DhGnQvky7pHy82MIRV43iXh3FlKN8UUKftn0KbLOq6I= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/sdk/log v0.4.0 h1:1mMI22L82zLqf6KtkjrRy5BbagOTWdJsqMY/HSqILAA= -go.opentelemetry.io/otel/sdk/log v0.4.0/go.mod h1:AYJ9FVF0hNOgAVzUG/ybg/QttnXhUePWAupmCqtdESo= -go.opentelemetry.io/otel/sdk/metric v1.28.0 h1:OkuaKgKrgAbYrrY0t92c+cC+2F6hsFNnCQArXCKlg08= -go.opentelemetry.io/otel/sdk/metric v1.28.0/go.mod h1:cWPjykihLAPvXKi4iZc1dpER3Jdq2Z0YLse3moQUCpg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/log v0.6.0 h1:nH66tr+dmEgW5y+F9LanGJUBYPrRgP4g2EkmPE3LeK8= +go.opentelemetry.io/otel/log v0.6.0/go.mod h1:KdySypjQHhP069JX0z/t26VHwa8vSwzgaKmXtIB3fJM= +go.opentelemetry.io/otel/metric v1.30.0 h1:4xNulvn9gjzo4hjg+wzIKG7iNFEaBMX00Qd4QIZs7+w= +go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= +go.opentelemetry.io/otel/sdk v1.30.0 h1:cHdik6irO49R5IysVhdn8oaiR9m8XluDaJAs4DfOrYE= +go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk/log v0.6.0 h1:4J8BwXY4EeDE9Mowg+CyhWVBhTSLXVXodiXxS/+PGqI= +go.opentelemetry.io/otel/sdk/log v0.6.0/go.mod h1:L1DN8RMAduKkrwRAFDEX3E3TLOq46+XMGSbUfHU/+vE= +go.opentelemetry.io/otel/sdk/metric v1.30.0 h1:QJLT8Pe11jyHBHfSAgYH7kEmT24eX792jZO1bo4BXkM= +go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= +go.opentelemetry.io/otel/trace v1.30.0 h1:7UBkkYzeg3C7kQX8VAidWh2biiQbtAKjyIML8dQ9wmc= +go.opentelemetry.io/otel/trace v1.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -2087,10 +2091,10 @@ google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20210401141331-865547bb08e2/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d h1:/hmn0Ku5kWij/kjGsrcJeC1T/MrJi2iNWwgAqrihFwc= google.golang.org/genproto v0.0.0-20240711142825-46eb208f015d/go.mod h1:FfBgJBJg9GcpPvKIuHSZ/aE1g2ecGL74upMzGZjiGEY= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd h1:BBOTEWLuuEGQy9n1y9MhVJ9Qt0BDu21X8qZs71/uPZo= -google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd h1:6TEm2ZxXoQmFWFlt1vNxvVOa1Q0dXFQD1m/rYjXmS0E= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1 h1:hjSy6tcFQZ171igDaN5QHOw2n6vx40juYbC/x67CEhc= +google.golang.org/genproto/googleapis/api v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:qpvKtACPCQhAdu3PyQgV4l3LMXZEtft7y8QcarRsp9I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=