Skip to content
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

Automation Telemetry: Send BlockNumber and Node Version #9927

Merged
merged 49 commits into from
Nov 17, 2023
Merged
Show file tree
Hide file tree
Changes from 38 commits
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
b911c39
rebase on toml feature flag
JonWong203 Aug 1, 2023
3e737a2
fixes + send node version
JonWong203 Jul 26, 2023
4594c11
fixes
JonWong203 Jul 26, 2023
a998536
comments
JonWong203 Jul 26, 2023
b7a404a
minor changes
JonWong203 Jul 27, 2023
83564b4
lint
JonWong203 Jul 27, 2023
fd1f0f7
constant added
JonWong203 Jul 27, 2023
ab7157d
logger
JonWong203 Jul 27, 2023
ddc490d
toggle by feature flag
JonWong203 Aug 1, 2023
a37cce3
minor fixes
JonWong203 Aug 2, 2023
99d94e2
marshal error exits start()
JonWong203 Aug 3, 2023
4fe462f
marshal error fix
JonWong203 Aug 3, 2023
cc3f1bf
add automation custom telem to job
FelixFan1992 Aug 8, 2023
2270a87
rename toml tag
FelixFan1992 Aug 8, 2023
df24baf
test
FelixFan1992 Aug 8, 2023
5f20c03
removed print statement
JonWong203 Aug 9, 2023
7b5446b
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Aug 10, 2023
4dfa715
merge
JonWong203 Aug 10, 2023
3658eac
configDigest go routine getter
JonWong203 Aug 10, 2023
adfe685
configDigest var
JonWong203 Aug 10, 2023
d71f5c6
refactor1
JonWong203 Aug 10, 2023
9f3f74c
send NodeVersion msg every new ConfigDigest
JonWong203 Aug 11, 2023
2d81ffa
lint
JonWong203 Aug 11, 2023
8b4a91e
Merge branch 'develop' into auto-2.0-send-custom-telem
FelixFan1992 Sep 1, 2023
f8ab92a
refactor
JonWong203 Sep 1, 2023
a9aea4e
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Sep 11, 2023
d8c5f3c
move registry creation outside delegate.go
JonWong203 Sep 12, 2023
0d4dccf
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Sep 13, 2023
29d51c7
plugin config bool flag
JonWong203 Sep 19, 2023
2188922
custom telem for 2.1
JonWong203 Sep 19, 2023
24d8248
block subscriber + thread controller
JonWong203 Oct 17, 2023
1ef93c0
ContractConfigTracker
JonWong203 Oct 17, 2023
75aadbd
reset forge-std
JonWong203 Oct 18, 2023
cd183e0
use toml config flag
JonWong203 Oct 18, 2023
2db091c
set toml flag default to true
JonWong203 Oct 18, 2023
3dea05f
Merge remote-tracking branch 'origin/develop' into auto-2.0-send-cust…
JonWong203 Oct 18, 2023
6022007
plugin config bool flag
JonWong203 Oct 20, 2023
6a45523
make generate
JonWong203 Oct 20, 2023
aa72531
refactor
JonWong203 Oct 24, 2023
1b8eca1
hourly node version msg
JonWong203 Nov 2, 2023
870d3c7
resolve conflicts
FelixFan1992 Nov 9, 2023
08bbf07
fix tests
FelixFan1992 Nov 9, 2023
058114a
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Nov 9, 2023
223172c
lint fix
JonWong203 Nov 9, 2023
46ea2c9
goimports fixed
JonWong203 Nov 9, 2023
a9435af
goimport fix 2
JonWong203 Nov 9, 2023
0ad2846
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Nov 17, 2023
13bd944
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Nov 17, 2023
356cb9d
Merge branch 'develop' into auto-2.0-send-custom-telem
JonWong203 Nov 17, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion core/config/docs/core.toml
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,7 @@ KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000'
# CaptureEATelemetry toggles collecting extra information from External Adaptares
CaptureEATelemetry = false # Default
# CaptureAutomationCustomTelemetry toggles collecting automation specific telemetry
CaptureAutomationCustomTelemetry = false # Default
CaptureAutomationCustomTelemetry = true # Default
# DefaultTransactionQueueDepth controls the queue size for `DropOldestStrategy` in OCR2. Set to 0 to use `SendEvery` strategy instead.
DefaultTransactionQueueDepth = 1 # Default
# SimulateTransactions enables transaction simulation for OCR2.
Expand Down
2 changes: 1 addition & 1 deletion core/services/chainlink/config_ocr2_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func TestOCR2Config(t *testing.T) {
require.Equal(t, false, ocr2Cfg.TraceLogging())
require.Equal(t, uint32(1), ocr2Cfg.DefaultTransactionQueueDepth())
require.Equal(t, false, ocr2Cfg.CaptureEATelemetry())
require.Equal(t, false, ocr2Cfg.CaptureAutomationCustomTelemetry())
require.Equal(t, true, ocr2Cfg.CaptureAutomationCustomTelemetry())

keyBundleID, err := ocr2Cfg.KeyBundleID()
require.NoError(t, err)
Expand Down
4 changes: 2 additions & 2 deletions core/services/chainlink/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ func TestConfig_Marshal(t *testing.T) {
DatabaseTimeout: models.MustNewDuration(8 * time.Second),
KeyBundleID: ptr(models.MustSha256HashFromHex("7a5f66bbe6594259325bf2b4f5b1a9c9")),
CaptureEATelemetry: ptr(false),
CaptureAutomationCustomTelemetry: ptr(false),
CaptureAutomationCustomTelemetry: ptr(true),
DefaultTransactionQueueDepth: ptr[uint32](1),
SimulateTransactions: ptr(false),
TraceLogging: ptr(false),
Expand Down Expand Up @@ -789,7 +789,7 @@ ContractTransmitterTransmitTimeout = '1m0s'
DatabaseTimeout = '8s'
KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '10s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
2 changes: 1 addition & 1 deletion core/services/chainlink/testdata/config-full.toml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ ContractTransmitterTransmitTimeout = '1m0s'
DatabaseTimeout = '8s'
KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '20s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
28 changes: 24 additions & 4 deletions core/services/ocr2/delegate.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ type ocr2Config interface {
DatabaseTimeout() time.Duration
KeyBundleID() (string, error)
TraceLogging() bool
CaptureAutomationCustomTelemetry() bool
}

type insecureConfig interface {
Expand Down Expand Up @@ -1000,7 +1001,7 @@ func (d *Delegate) newServicesOCR2Keepers21(
d.cfg.JobPipeline().MaxSuccessfulRuns(),
)

return []job.ServiceCtx{
automationServices := []job.ServiceCtx{
runResultSaver,
keeperProvider,
services.Registry(),
Expand All @@ -1010,7 +1011,24 @@ func (d *Delegate) newServicesOCR2Keepers21(
services.UpkeepStateStore(),
services.TransmitEventProvider(),
pluginService,
}, nil
}

if cfg.CaptureAutomationCustomTelemetry != nil && *cfg.CaptureAutomationCustomTelemetry ||
cfg.CaptureAutomationCustomTelemetry == nil && d.cfg.OCR2().CaptureAutomationCustomTelemetry() {
endpoint := d.monitoringEndpointGen.GenMonitoringEndpoint(spec.ContractID, synchronization.AutomationCustom, rid.Network, rid.ChainID)
customTelemService, custErr := ocr2keeper.NewAutomationCustomTelemetryService(
endpoint,
lggr,
services.BlockSubscriber(),
keeperProvider.ContractConfigTracker(),
)
if custErr != nil {
return nil, errors.Wrap(custErr, "Error when creating AutomationCustomTelemetryService")
}
automationServices = append(automationServices, customTelemService)
}

return automationServices, nil
}

func (d *Delegate) newServicesOCR2Keepers20(
Expand Down Expand Up @@ -1137,14 +1155,16 @@ func (d *Delegate) newServicesOCR2Keepers20(
d.cfg.JobPipeline().MaxSuccessfulRuns(),
)

return []job.ServiceCtx{
automationServices := []job.ServiceCtx{
job.NewServiceAdapter(runr),
runResultSaver,
keeperProvider,
rgstry,
logProvider,
pluginService,
}, nil
}

return automationServices, nil
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}

func (d *Delegate) newServicesOCR2Functions(
Expand Down
2 changes: 2 additions & 0 deletions core/services/ocr2/plugins/ocr2keeper/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ type PluginConfig struct {
ServiceQueueLength int `json:"serviceQueueLength"`
// ContractVersion is the contract version
ContractVersion string `json:"contractVersion"`
// CaptureAutomationCustomTelemetry is a bool flag to toggle Custom Telemetry Service
CaptureAutomationCustomTelemetry *bool `json:"captureAutomationCustomTelemetry,omitempty"`
}

func ValidatePluginConfig(cfg PluginConfig) error {
Expand Down
152 changes: 152 additions & 0 deletions core/services/ocr2/plugins/ocr2keeper/custom_telemetry.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
package ocr2keeper
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved

import (
"context"
"encoding/hex"
"time"

"github.com/smartcontractkit/libocr/commontypes"
"github.com/smartcontractkit/libocr/offchainreporting2plus/types"
"google.golang.org/protobuf/proto"

"github.com/smartcontractkit/chainlink/v2/core/logger"
evm21 "github.com/smartcontractkit/chainlink/v2/core/services/ocr2/plugins/ocr2keeper/evm21"
"github.com/smartcontractkit/chainlink/v2/core/services/synchronization/telem"
"github.com/smartcontractkit/chainlink/v2/core/static"
"github.com/smartcontractkit/chainlink/v2/core/utils"
ocr2keepers "github.com/smartcontractkit/ocr2keepers/pkg/v3/types"
)

type AutomationCustomTelemetryService struct {
utils.StartStopOnce
monitoringEndpoint commontypes.MonitoringEndpoint
blockSubscriber *evm21.BlockSubscriber
blockSubChanID int
threadCtrl utils.ThreadControl
lggr logger.Logger
configDigest [32]byte
contractConfigTracker types.ContractConfigTracker
}

// NewAutomationCustomTelemetryService creates a telemetry service for new blocks and node version
func NewAutomationCustomTelemetryService(me commontypes.MonitoringEndpoint,
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
lggr logger.Logger, blocksub *evm21.BlockSubscriber, configTracker types.ContractConfigTracker) (*AutomationCustomTelemetryService, error) {
return &AutomationCustomTelemetryService{
monitoringEndpoint: me,
threadCtrl: utils.NewThreadControl(),
lggr: lggr.Named("AutomationCustomTelem"),
contractConfigTracker: configTracker,
blockSubscriber: blocksub,
}, nil
}

// Start starts Custom Telemetry Service, sends 1 NodeVersion message to endpoint at start and sends new BlockNumber messages
func (e *AutomationCustomTelemetryService) Start(ctx context.Context) error {
return e.StartOnce("AutomationCustomTelemetryService", func() error {
e.lggr.Infof("Starting: Custom Telemetry Service")
_, configDetails, err := e.contractConfigTracker.LatestConfigDetails(ctx)
if err != nil {
e.lggr.Errorf("Error occurred while getting newestConfigDetails for initialization %s", err)
} else {
e.configDigest = configDetails
e.sendNodeVersionMsg()
}
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
e.threadCtrl.Go(func(ctx context.Context) {
ticker := time.NewTicker(1 * time.Minute)
defer ticker.Stop()
for {
select {
case <-ticker.C:
_, newConfigDigest, err := e.contractConfigTracker.LatestConfigDetails(ctx)
if err != nil {
e.lggr.Errorf("Error occurred while getting newestConfigDetails in configDigest loop %s", err)
}
if newConfigDigest != e.configDigest {
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
e.configDigest = newConfigDigest
e.sendNodeVersionMsg()
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}
case <-ctx.Done():
return
}
}
})

chanID, blockSubscriberChan, blockSubErr := e.blockSubscriber.Subscribe()
if blockSubErr != nil {
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
e.lggr.Errorf("Block Subscriber Error: Subscribe(): %s", blockSubErr)
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved

} else {
e.blockSubChanID = chanID
e.threadCtrl.Go(func(ctx context.Context) {
e.lggr.Infof("Started: Sending BlockNumber Messages")
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
for {
select {
case blockHistory := <-blockSubscriberChan:
latestBlockKey, err := blockHistory.Latest()
if err != nil {
e.lggr.Errorf("BlockSubscriber BlockHistory.Latest() failed: %s", err)
continue
}
e.sendBlockNumberMsg(latestBlockKey)
case <-ctx.Done():
return
}
}
})
}
return nil
})
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}

// Close stops go routines and closes channels
func (e *AutomationCustomTelemetryService) Close() error {
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
// use utils
return e.StopOnce("AutomationCustomTelemetryService", func() error {
e.lggr.Infof("Stopping: custom telemetry service")
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
e.threadCtrl.Close()
e.blockSubscriber.Unsubscribe(e.blockSubChanID)
e.lggr.Infof("Stopped: Custom telemetry service")
return nil
})
}

func (e *AutomationCustomTelemetryService) sendNodeVersionMsg() {
vMsg := &telem.NodeVersion{
Timestamp: uint64(time.Now().UTC().UnixMilli()),
NodeVersion: static.Version,
ConfigDigest: e.configDigest[:],
}
wrappedVMsg := &telem.AutomationTelemWrapper{
Msg: &telem.AutomationTelemWrapper_NodeVersion{
NodeVersion: vMsg,
},
}
bytes, err := proto.Marshal(wrappedVMsg)
if err != nil {
e.lggr.Errorf("Error occurred while marshalling the Node Version Message %s: %v", wrappedVMsg.String(), err)
} else {
e.monitoringEndpoint.SendLog(bytes)
e.lggr.Infof("NodeVersion Message Sent to Endpoint: %d", vMsg.Timestamp)
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}
}

func (e *AutomationCustomTelemetryService) sendBlockNumberMsg(blockKey ocr2keepers.BlockKey) {
blockNumMsg := &telem.BlockNumber{
Timestamp: uint64(time.Now().UTC().UnixMilli()),
BlockNumber: uint64(blockKey.Number),
BlockHash: hex.EncodeToString(blockKey.Hash[:]),
ConfigDigest: e.configDigest[:],
}
wrappedBlockNumMsg := &telem.AutomationTelemWrapper{
Msg: &telem.AutomationTelemWrapper_BlockNumber{
BlockNumber: blockNumMsg,
},
}
b, err := proto.Marshal(wrappedBlockNumMsg)
if err != nil {
e.lggr.Errorf("Error occurred while marshalling the Block Num Message %s: %v", wrappedBlockNumMsg.String(), err)
} else {
e.monitoringEndpoint.SendLog(b)
e.lggr.Infof("BlockNumber Message Sent to Endpoint: %d", blockNumMsg.Timestamp)
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}
}
17 changes: 17 additions & 0 deletions core/services/ocr2/plugins/ocr2keeper/custom_telemetry_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ocr2keeper

import (
"testing"
)

func TestNewAutomationCustomTelemetryService(t *testing.T) {
// me := &MockMonitoringEndpoint{}
// lggr := &MockLogger{}
// blocksub := &MockBlockSubscriber{}
// configTracker := &MockContractConfigTracker{}

// service, err := NewAutomationCustomTelemetryService(me, lggr, blocksub, configTracker)
// if err != nil {
// t.Errorf("Expected no error, but got: %v", err)
// }
}
4 changes: 4 additions & 0 deletions core/web/presenters/job.go
Original file line number Diff line number Diff line change
Expand Up @@ -196,6 +196,8 @@ type OffChainReporting2Spec struct {
CreatedAt time.Time `json:"createdAt"`
UpdatedAt time.Time `json:"updatedAt"`
CollectTelemetry bool `json:"collectTelemetry"`
//HERE REMOVE THIS
CaptureAutomationCustomTelemetry bool `json:"captureAutomationCustomTelemetry"`
JonWong203 marked this conversation as resolved.
Show resolved Hide resolved
}

// NewOffChainReporting2Spec initializes a new OffChainReportingSpec from a
Expand All @@ -214,6 +216,8 @@ func NewOffChainReporting2Spec(spec *job.OCR2OracleSpec) *OffChainReporting2Spec
CreatedAt: spec.CreatedAt,
UpdatedAt: spec.UpdatedAt,
CollectTelemetry: spec.CaptureEATelemetry,
//HERE REMOVE THIS
CaptureAutomationCustomTelemetry: spec.CaptureAutomationCustomTelemetry,
}
}

Expand Down
2 changes: 1 addition & 1 deletion core/web/resolver/testdata/config-empty-effective.toml
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '10s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
2 changes: 1 addition & 1 deletion core/web/resolver/testdata/config-full.toml
Original file line number Diff line number Diff line change
Expand Up @@ -123,7 +123,7 @@ ContractTransmitterTransmitTimeout = '1m0s'
DatabaseTimeout = '8s'
KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -117,7 +117,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '20s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
4 changes: 2 additions & 2 deletions docs/CONFIG.md
Original file line number Diff line number Diff line change
Expand Up @@ -757,7 +757,7 @@ ContractTransmitterTransmitTimeout = '10s' # Default
DatabaseTimeout = '10s' # Default
KeyBundleID = '7a5f66bbe6594259325bf2b4f5b1a9c900000000000000000000000000000000' # Example
CaptureEATelemetry = false # Default
CaptureAutomationCustomTelemetry = false # Default
CaptureAutomationCustomTelemetry = true # Default
DefaultTransactionQueueDepth = 1 # Default
SimulateTransactions = false # Default
TraceLogging = false # Default
Expand Down Expand Up @@ -854,7 +854,7 @@ CaptureEATelemetry toggles collecting extra information from External Adaptares

### CaptureAutomationCustomTelemetry
```toml
CaptureAutomationCustomTelemetry = false # Default
CaptureAutomationCustomTelemetry = true # Default
```
CaptureAutomationCustomTelemetry toggles collecting automation specific telemetry

Expand Down
2 changes: 1 addition & 1 deletion testdata/scripts/node/validate/default.txtar
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '10s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '10s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ ContractTransmitterTransmitTimeout = '10s'
DatabaseTimeout = '10s'
KeyBundleID = '0000000000000000000000000000000000000000000000000000000000000000'
CaptureEATelemetry = false
CaptureAutomationCustomTelemetry = false
CaptureAutomationCustomTelemetry = true
DefaultTransactionQueueDepth = 1
SimulateTransactions = false
TraceLogging = false
Expand Down
Loading
Loading