Skip to content

Commit

Permalink
Add nonsigning rate threshold control to ejectorEjectorfilter (#601)
Browse files Browse the repository at this point in the history
  • Loading branch information
jianoaix authored Jun 7, 2024
1 parent e90cb74 commit edea390
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 17 deletions.
7 changes: 5 additions & 2 deletions disperser/cmd/dataapi/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ type Config struct {
ServerMode string
AllowOrigins []string
EjectionToken string
NonsigningRateThreshold int

BLSOperatorStateRetrieverAddr string
EigenDAServiceManagerAddr string
Expand Down Expand Up @@ -76,8 +77,10 @@ func NewConfig(ctx *cli.Context) (Config, error) {
Secret: ctx.GlobalString(flags.PrometheusServerSecretFlag.Name),
Cluster: ctx.GlobalString(flags.PrometheusMetricsClusterLabelFlag.Name),
},
AllowOrigins: ctx.GlobalStringSlice(flags.AllowOriginsFlag.Name),
EjectionToken: ejectionToken,
AllowOrigins: ctx.GlobalStringSlice(flags.AllowOriginsFlag.Name),
EjectionToken: ejectionToken,
NonsigningRateThreshold: ctx.GlobalInt(flags.NonsigningRateThresholdFlag.Name),

MetricsConfig: dataapi.MetricsConfig{
HTTPPort: ctx.GlobalString(flags.MetricsHTTPPort.Name),
EnableMetrics: ctx.GlobalBool(flags.EnableMetricsFlag.Name),
Expand Down
8 changes: 8 additions & 0 deletions disperser/cmd/dataapi/flags/flags.go
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,13 @@ var (
Value: 6 * time.Minute,
EnvVar: common.PrefixEnvVar(envVarPrefix, "TRANSACTION_TIMEOUT"),
}
NonsigningRateThresholdFlag = cli.IntFlag{
Name: common.PrefixFlag(FlagPrefix, "nonsigning-rate-threshold"),
Usage: "only operators with nonsigning rate >= this threshold are eligible for ejection, this value must be in range [10, 100], any value not in this range means disabling this flag",
Required: false,
Value: -1,
EnvVar: common.PrefixEnvVar(envVarPrefix, "NONSIGNING_RATE_THRESHOLD"),
}
)

var requiredFlags = []cli.Flag{
Expand All @@ -172,6 +179,7 @@ var requiredFlags = []cli.Flag{
var optionalFlags = []cli.Flag{
ServerModeFlag,
MetricsHTTPPort,
NonsigningRateThresholdFlag,
}

// Flags contains the list of configuration options available to the binary.
Expand Down
2 changes: 1 addition & 1 deletion disperser/cmd/dataapi/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ func RunDataApi(ctx *cli.Context) error {
subgraphClient,
tx,
chainState,
dataapi.NewEjector(wallet, client, logger, tx, metrics, config.TxnTimeout),
dataapi.NewEjector(wallet, client, logger, tx, metrics, config.TxnTimeout, config.NonsigningRateThreshold),
logger,
metrics,
nil,
Expand Down
33 changes: 20 additions & 13 deletions disperser/dataapi/ejector.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,25 +54,27 @@ func computePerfScore(metric *OperatorNonsigningPercentageMetrics) float64 {
}

type Ejector struct {
wallet walletsdk.Wallet
ethClient common.EthClient
logger logging.Logger
transactor core.Transactor
metrics *Metrics
txnTimeout time.Duration
wallet walletsdk.Wallet
ethClient common.EthClient
logger logging.Logger
transactor core.Transactor
metrics *Metrics
txnTimeout time.Duration
nonsigningRateThreshold int

// For serializing the ejection requests.
mu sync.Mutex
}

func NewEjector(wallet walletsdk.Wallet, ethClient common.EthClient, logger logging.Logger, tx core.Transactor, metrics *Metrics, txnTimeout time.Duration) *Ejector {
func NewEjector(wallet walletsdk.Wallet, ethClient common.EthClient, logger logging.Logger, tx core.Transactor, metrics *Metrics, txnTimeout time.Duration, nonsigningRateThreshold int) *Ejector {
return &Ejector{
wallet: wallet,
ethClient: ethClient,
logger: logger.With("component", "Ejector"),
transactor: tx,
metrics: metrics,
txnTimeout: txnTimeout,
wallet: wallet,
ethClient: ethClient,
logger: logger.With("component", "Ejector"),
transactor: tx,
metrics: metrics,
txnTimeout: txnTimeout,
nonsigningRateThreshold: nonsigningRateThreshold,
}
}

Expand All @@ -82,6 +84,11 @@ func (e *Ejector) Eject(ctx context.Context, nonsigningRate *OperatorsNonsigning

nonsigners := make([]*OperatorNonsigningPercentageMetrics, 0)
for _, metric := range nonsigningRate.Data {
// If nonsigningRateThreshold is set and valid, we will only eject operators with
// nonsigning rate >= nonsigningRateThreshold.
if e.nonsigningRateThreshold >= 10 && e.nonsigningRateThreshold <= 100 && metric.Percentage < float64(e.nonsigningRateThreshold) {
continue
}
// Collect only the nonsigners who violate the SLA.
if metric.Percentage/100.0 > 1-stakeShareToSLA(metric.StakePercentage/100.0) {
nonsigners = append(nonsigners, metric)
Expand Down
2 changes: 1 addition & 1 deletion disperser/dataapi/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -462,7 +462,7 @@ func getEjector(t *testing.T) *ejectorComponents {
ctrl := gomock.NewController(t)
w := sdkmock.NewMockWallet(ctrl)
ethClient := &commonmock.MockEthClient{}
ejector := dataapi.NewEjector(w, ethClient, mockLogger, mockTx, metrics, 100*time.Millisecond)
ejector := dataapi.NewEjector(w, ethClient, mockLogger, mockTx, metrics, 100*time.Millisecond, -1)
return &ejectorComponents{
wallet: w,
ethClient: ethClient,
Expand Down

0 comments on commit edea390

Please sign in to comment.