-
Notifications
You must be signed in to change notification settings - Fork 45
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
MultiNode Integration: TOML Configurations #844
Open
DylanTinianov
wants to merge
39
commits into
develop
Choose a base branch
from
BCFR-302-multinode-toml
base: develop
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
39 commits
Select commit
Hold shift + click to select a range
60673aa
MultiNode integration setup
DylanTinianov dc85772
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov e6683e6
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov 1c68485
Update MultiNode files
DylanTinianov c44a6ce
Add MultiNode flag
DylanTinianov 64db86a
Remove internal dependency
DylanTinianov f7c1bc9
Fix build
DylanTinianov 9e91b47
Fix import cycle
DylanTinianov 354dc50
tidy
DylanTinianov 60c3352
Update client_test.go
DylanTinianov dcec343
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov 8e2306b
lint
DylanTinianov b8d6755
Fix duplicate metrics
DylanTinianov 2cb4d77
Add chain multinode flag
DylanTinianov 0b33b1f
Extend client
DylanTinianov 95e1c9a
Add defaults
DylanTinianov 6641bc9
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov d8d312c
Address comments
DylanTinianov aa3c068
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov 3c3756e
lint
DylanTinianov 7c8b55d
Merge branch 'develop' into BCI-2835-integrate-multinode
DylanTinianov 2521670
Fix lint overflow issues
DylanTinianov 5b5cfd6
Update transaction_sender.go
DylanTinianov 690f812
Fix lint
DylanTinianov fd3823b
Validate node config
DylanTinianov 4bf96b7
Update toml.go
DylanTinianov c1b83a5
Add SendOnly nodes
DylanTinianov c58dbc8
Merge branch 'BCI-2835-integrate-multinode' into BCFR-302-multinode-toml
DylanTinianov e0231b0
Use pointers on config
DylanTinianov 0122a5f
Fix conflicts
DylanTinianov 8aa39f6
Use test context
DylanTinianov 0e5a35e
Merge branch 'BCI-2835-integrate-multinode' into BCFR-302-multinode-toml
DylanTinianov b5ff16d
Use configured selection mode
DylanTinianov 1b3a101
Set defaults
DylanTinianov b7cc350
Merge branch 'develop' into BCFR-302-multinode-toml
DylanTinianov 0afd8da
lint
DylanTinianov b99b90c
Add nil check
DylanTinianov d7203f8
Merge branch 'develop' into BCFR-302-multinode-toml
DylanTinianov 98b0e9d
Update multinode.go
DylanTinianov File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,87 +1,161 @@ | ||
package config | ||
|
||
import "time" | ||
import ( | ||
"time" | ||
|
||
"github.com/smartcontractkit/chainlink-common/pkg/config" | ||
|
||
client "github.com/smartcontractkit/chainlink-solana/pkg/solana/client/multinode" | ||
) | ||
|
||
type MultiNode struct { | ||
// TODO: Determine current config overlap https://smartcontract-it.atlassian.net/browse/BCI-4065 | ||
// Feature flag | ||
multiNodeEnabled bool | ||
multiNodeEnabled *bool | ||
|
||
// Node Configs | ||
pollFailureThreshold uint32 | ||
pollInterval time.Duration | ||
selectionMode string | ||
syncThreshold uint32 | ||
nodeIsSyncingEnabled bool | ||
finalizedBlockPollInterval time.Duration | ||
enforceRepeatableRead bool | ||
deathDeclarationDelay time.Duration | ||
pollFailureThreshold *uint32 | ||
pollInterval *config.Duration | ||
selectionMode *string | ||
syncThreshold *uint32 | ||
nodeIsSyncingEnabled *bool | ||
leaseDuration *config.Duration | ||
finalizedBlockPollInterval *config.Duration | ||
enforceRepeatableRead *bool | ||
deathDeclarationDelay *config.Duration | ||
|
||
// Chain Configs | ||
nodeNoNewHeadsThreshold time.Duration | ||
noNewFinalizedHeadsThreshold time.Duration | ||
finalityDepth uint32 | ||
finalityTagEnabled bool | ||
finalizedBlockOffset uint32 | ||
nodeNoNewHeadsThreshold *config.Duration | ||
noNewFinalizedHeadsThreshold *config.Duration | ||
finalityDepth *uint32 | ||
finalityTagEnabled *bool | ||
finalizedBlockOffset *uint32 | ||
} | ||
|
||
func (c *MultiNode) MultiNodeEnabled() bool { | ||
return c.multiNodeEnabled | ||
return c.multiNodeEnabled != nil && *c.multiNodeEnabled | ||
} | ||
|
||
func (c *MultiNode) PollFailureThreshold() uint32 { | ||
return c.pollFailureThreshold | ||
return *c.pollFailureThreshold | ||
} | ||
|
||
func (c *MultiNode) PollInterval() time.Duration { | ||
return c.pollInterval | ||
return c.pollInterval.Duration() | ||
} | ||
|
||
func (c *MultiNode) SelectionMode() string { | ||
return c.selectionMode | ||
return *c.selectionMode | ||
} | ||
|
||
func (c *MultiNode) SyncThreshold() uint32 { | ||
return c.syncThreshold | ||
return *c.syncThreshold | ||
} | ||
|
||
func (c *MultiNode) NodeIsSyncingEnabled() bool { | ||
return c.nodeIsSyncingEnabled | ||
return *c.nodeIsSyncingEnabled | ||
} | ||
|
||
func (c *MultiNode) LeaseDuration() time.Duration { return c.leaseDuration.Duration() } | ||
|
||
func (c *MultiNode) FinalizedBlockPollInterval() time.Duration { | ||
return c.finalizedBlockPollInterval | ||
return c.finalizedBlockPollInterval.Duration() | ||
} | ||
|
||
func (c *MultiNode) EnforceRepeatableRead() bool { | ||
return c.enforceRepeatableRead | ||
} | ||
func (c *MultiNode) EnforceRepeatableRead() bool { return *c.enforceRepeatableRead } | ||
|
||
func (c *MultiNode) DeathDeclarationDelay() time.Duration { | ||
return c.deathDeclarationDelay | ||
} | ||
func (c *MultiNode) DeathDeclarationDelay() time.Duration { return c.deathDeclarationDelay.Duration() } | ||
|
||
func (c *MultiNode) NodeNoNewHeadsThreshold() time.Duration { | ||
return c.nodeNoNewHeadsThreshold | ||
return c.nodeNoNewHeadsThreshold.Duration() | ||
} | ||
|
||
func (c *MultiNode) NoNewFinalizedHeadsThreshold() time.Duration { | ||
return c.noNewFinalizedHeadsThreshold | ||
return c.noNewFinalizedHeadsThreshold.Duration() | ||
} | ||
|
||
func (c *MultiNode) FinalityDepth() uint32 { | ||
return c.finalityDepth | ||
} | ||
func (c *MultiNode) FinalityDepth() uint32 { return *c.finalityDepth } | ||
|
||
func (c *MultiNode) FinalityTagEnabled() bool { | ||
return c.finalityTagEnabled | ||
} | ||
func (c *MultiNode) FinalityTagEnabled() bool { return *c.finalityTagEnabled } | ||
|
||
func (c *MultiNode) FinalizedBlockOffset() uint32 { | ||
return c.finalizedBlockOffset | ||
} | ||
func (c *MultiNode) FinalizedBlockOffset() uint32 { return *c.finalizedBlockOffset } | ||
|
||
func (c *MultiNode) SetDefaults() { | ||
// TODO: Set defaults for MultiNode config https://smartcontract-it.atlassian.net/browse/BCI-4065 | ||
c.multiNodeEnabled = false | ||
// Default disabled | ||
c.multiNodeEnabled = ptr(false) | ||
|
||
// Node Configs | ||
c.pollFailureThreshold = ptr(uint32(5)) | ||
c.pollInterval = config.MustNewDuration(10 * time.Second) | ||
|
||
c.selectionMode = ptr(client.NodeSelectionModePriorityLevel) | ||
|
||
c.syncThreshold = ptr(uint32(5)) | ||
|
||
c.leaseDuration = config.MustNewDuration(time.Minute) | ||
|
||
c.nodeIsSyncingEnabled = ptr(false) | ||
c.finalizedBlockPollInterval = config.MustNewDuration(5 * time.Second) | ||
c.enforceRepeatableRead = ptr(true) | ||
c.deathDeclarationDelay = config.MustNewDuration(10 * time.Second) | ||
|
||
// Chain Configs | ||
c.nodeNoNewHeadsThreshold = config.MustNewDuration(10 * time.Second) | ||
c.noNewFinalizedHeadsThreshold = config.MustNewDuration(10 * time.Second) | ||
c.finalityDepth = ptr(uint32(0)) | ||
DylanTinianov marked this conversation as resolved.
Show resolved
Hide resolved
|
||
c.finalityTagEnabled = ptr(true) | ||
c.finalizedBlockOffset = ptr(uint32(0)) | ||
} | ||
|
||
func (c *MultiNode) SetFrom(f *MultiNode) { | ||
if f.multiNodeEnabled != nil { | ||
c.multiNodeEnabled = f.multiNodeEnabled | ||
} | ||
|
||
// TODO: Try using reflection here to loop through each one | ||
|
||
// Node Configs | ||
if f.pollFailureThreshold != nil { | ||
c.pollFailureThreshold = f.pollFailureThreshold | ||
} | ||
if f.pollInterval != nil { | ||
c.pollInterval = f.pollInterval | ||
} | ||
if f.selectionMode != nil { | ||
c.selectionMode = f.selectionMode | ||
} | ||
if f.syncThreshold != nil { | ||
c.syncThreshold = f.syncThreshold | ||
} | ||
if f.nodeIsSyncingEnabled != nil { | ||
c.nodeIsSyncingEnabled = f.nodeIsSyncingEnabled | ||
} | ||
if f.leaseDuration != nil { | ||
c.leaseDuration = f.leaseDuration | ||
} | ||
if f.finalizedBlockPollInterval != nil { | ||
c.finalizedBlockPollInterval = f.finalizedBlockPollInterval | ||
} | ||
if f.enforceRepeatableRead != nil { | ||
c.enforceRepeatableRead = f.enforceRepeatableRead | ||
} | ||
if f.deathDeclarationDelay != nil { | ||
c.deathDeclarationDelay = f.deathDeclarationDelay | ||
} | ||
|
||
// Chain Configs | ||
if f.nodeNoNewHeadsThreshold != nil { | ||
c.nodeNoNewHeadsThreshold = f.nodeNoNewHeadsThreshold | ||
} | ||
if f.noNewFinalizedHeadsThreshold != nil { | ||
c.noNewFinalizedHeadsThreshold = f.noNewFinalizedHeadsThreshold | ||
} | ||
if f.finalityDepth != nil { | ||
c.finalityDepth = f.finalityDepth | ||
} | ||
if f.finalityTagEnabled != nil { | ||
c.finalityTagEnabled = f.finalityTagEnabled | ||
} | ||
if f.finalizedBlockOffset != nil { | ||
c.finalizedBlockOffset = f.finalizedBlockOffset | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The default values here - where are they coming from? For example, the 5 for syncThreshold or the 10 for pollInterval. Could these come from another source or if they are to be hardcoded, could we provide some documentation as to why these are the best default values for these fields?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I had a meeting with Dmytro and Aaron where we discussed what default values make sense for each config. I can for sure add some comments though!