Skip to content

Commit

Permalink
config: add sanity check to prevent non-negative worker counts
Browse files Browse the repository at this point in the history
  • Loading branch information
cfromknecht committed Mar 14, 2019
1 parent 76116f0 commit d81ce61
Show file tree
Hide file tree
Showing 3 changed files with 129 additions and 0 deletions.
6 changes: 6 additions & 0 deletions config.go
Original file line number Diff line number Diff line change
Expand Up @@ -990,6 +990,12 @@ func loadConfig() (*config, error) {
"minbackoff")
}

// Assert that all worker pools will have a positive number of
// workers, otherwise the pools will rendered useless.
if err := cfg.Workers.Validate(); err != nil {
return nil, err
}

// Finally, ensure that the user's color is correctly formatted,
// otherwise the server will not be able to start after the unlocking
// the wallet.
Expand Down
21 changes: 21 additions & 0 deletions lncfg/workers.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package lncfg

import "fmt"

const (
// DefaultReadWorkers is the default maximum number of concurrent
// workers used by the daemon's read pool.
Expand All @@ -26,3 +28,22 @@ type Workers struct {
// Sig is the maximum number of concurrent sig pool workers.
Sig int `long:"sig" description:"Maximum number of concurrent sig pool workers."`
}

// Validate checks the Workers configuration to ensure that the input values are
// sane.
func (w *Workers) Validate() error {
if w.Read <= 0 {
return fmt.Errorf("number of read workers (%d) must be "+
"positive", w.Read)
}
if w.Write <= 0 {
return fmt.Errorf("number of write workers (%d) must be "+
"positive", w.Write)
}
if w.Sig <= 0 {
return fmt.Errorf("number of sig workers (%d) must be "+
"positive", w.Sig)
}

return nil
}
102 changes: 102 additions & 0 deletions lncfg/workers_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
package lncfg_test

import (
"testing"

"github.com/lightningnetwork/lnd/lncfg"
)

const (
maxUint = ^uint(0)
maxInt = int(maxUint >> 1)
minInt = -maxInt - 1
)

// TestValidateWorkers asserts that validating the Workers config only succeeds
// if all fields specify a positive number of workers.
func TestValidateWorkers(t *testing.T) {
tests := []struct {
name string
cfg *lncfg.Workers
valid bool
}{
{
name: "min valid",
cfg: &lncfg.Workers{
Read: 1,
Write: 1,
Sig: 1,
},
valid: true,
},
{
name: "max valid",
cfg: &lncfg.Workers{
Read: maxInt,
Write: maxInt,
Sig: maxInt,
},
valid: true,
},
{
name: "read max invalid",
cfg: &lncfg.Workers{
Read: 0,
Write: 1,
Sig: 1,
},
},
{
name: "write max invalid",
cfg: &lncfg.Workers{
Read: 1,
Write: 0,
Sig: 1,
},
},
{
name: "sig max invalid",
cfg: &lncfg.Workers{
Read: 1,
Write: 1,
Sig: 0,
},
},
{
name: "read min invalid",
cfg: &lncfg.Workers{
Read: minInt,
Write: 1,
Sig: 1,
},
},
{
name: "write min invalid",
cfg: &lncfg.Workers{
Read: 1,
Write: minInt,
Sig: 1,
},
},
{
name: "sig min invalid",
cfg: &lncfg.Workers{
Read: 1,
Write: 1,
Sig: minInt,
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
err := test.cfg.Validate()
switch {
case test.valid && err != nil:
t.Fatalf("valid config was invalid: %v", err)
case !test.valid && err == nil:
t.Fatalf("invalid config was valid")
}
})
}
}

0 comments on commit d81ce61

Please sign in to comment.