Skip to content
This repository was archived by the owner on May 13, 2022. It is now read-only.

Commit c80f7be

Browse files
gregdhillSilas Davis
authored and
Silas Davis
committed
Ensure execution caches are reset after state is updated
Remove the Flush call that did not provide the appropriate behaviour. Also add resets to all caches not just some. This was a logical error but only actually caused an issues with the vaildatorCache which unlike other caches performs a copy on `Reset(backend)`. Getting the causality right here for the other caches should help avoid future bugs. Signed-off-by: Silas Davis <[email protected]>
1 parent d610247 commit c80f7be

File tree

15 files changed

+28
-74
lines changed

15 files changed

+28
-74
lines changed

acm/acmstate/metadata_cache.go

+2-6
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,9 @@ func (cache *MetadataCache) Sync(st MetadataWriter) error {
5555
return nil
5656
}
5757

58-
func (cache *MetadataCache) Flush(output MetadataWriter, backend MetadataReader) error {
59-
err := cache.Sync(output)
60-
if err != nil {
61-
return err
62-
}
58+
func (cache *MetadataCache) Reset(backend MetadataReader) {
59+
cache.backend = backend
6360
cache.m = sync.Map{}
64-
return nil
6561
}
6662

6763
// Get the cache accountInfo item creating it if necessary

acm/acmstate/state_cache.go

-10
Original file line numberDiff line numberDiff line change
@@ -250,16 +250,6 @@ func (cache *Cache) Reset(backend Reader) {
250250
cache.accounts = make(map[crypto.Address]*accountInfo, len(cache.accounts))
251251
}
252252

253-
// Syncs the Cache to output and Resets it to use backend as Reader
254-
func (cache *Cache) Flush(output Writer, backend Reader) error {
255-
err := cache.Sync(output)
256-
if err != nil {
257-
return err
258-
}
259-
cache.Reset(backend)
260-
return nil
261-
}
262-
263253
func (cache *Cache) String() string {
264254
if cache.name == "" {
265255
return fmt.Sprintf("StateCache{Length: %v}", len(cache.accounts))

acm/validator/cache.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"math/big"
55

66
"github.com/hyperledger/burrow/crypto"
7-
"github.com/hyperledger/burrow/util"
87
)
98

109
// Cache is just a Ring with no memory
@@ -22,15 +21,13 @@ func (vc *Cache) Reset(backend Iterable) {
2221
vc.Bucket = NewBucket(backend)
2322
}
2423

25-
func (vc *Cache) Flush(output Writer, backend Iterable) error {
26-
util.Debugf("Flushing validators...")
24+
func (vc *Cache) Sync(output Writer) error {
2725
err := vc.Delta.IterateValidators(func(id crypto.Addressable, power *big.Int) error {
2826
_, err := output.SetPower(id.GetPublicKey(), power)
2927
return err
3028
})
3129
if err != nil {
3230
return err
3331
}
34-
vc.Reset(backend)
3532
return nil
3633
}

cmd/burrow/commands/deploy.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ func Deploy(output Output) func(cmd *cli.Cmd) {
5050
addressOpt := cmd.StringOpt("a address", "",
5151
"default address (or account name) to use; operates the same way as the [account] job, only before the deploy file is ran")
5252

53-
defaultFeeOpt := cmd.StringOpt("n fee", "9999", "default fee to use")
53+
defaultFeeOpt := cmd.StringOpt("n fee", "99", "default fee to use")
5454

55-
defaultAmountOpt := cmd.StringOpt("m amount", "9999",
55+
defaultAmountOpt := cmd.StringOpt("m amount", "99",
5656
"default amount to use")
5757

5858
verboseOpt := cmd.BoolOpt("v verbose", false, "verbose output")
@@ -116,11 +116,11 @@ func Deploy(output Output) func(cmd *cli.Cmd) {
116116
args.ProposeVerify = *proposalVerify
117117
args.ProposeVote = *proposalVote
118118
args.ProposeCreate = *proposalCreate
119-
stderrLogger, err := loggers.NewStreamLogger(os.Stderr, loggers.TerminalFormat)
119+
stdoutLogger, err := loggers.NewStreamLogger(os.Stdout, loggers.TerminalFormat)
120120
if err != nil {
121121
output.Fatalf("Could not make logger: %v", err)
122122
}
123-
logger := logging.NewLogger(stderrLogger)
123+
logger := logging.NewLogger(stdoutLogger)
124124
handleTerm()
125125

126126
if !*debugOpt {

deploy/def/deploy.go

-1
Original file line numberDiff line numberDiff line change
@@ -38,4 +38,3 @@ func (args *DeployArgs) Validate() error {
3838
validation.Field(&args.DefaultGas, rule.Uint64),
3939
)
4040
}
41-

deploy/def/playbook.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package def
22

3-
import "github.com/go-ozzo/ozzo-validation"
3+
import validation "github.com/go-ozzo/ozzo-validation"
44

55
type Playbook struct {
66
Filename string

execution/contexts/bond_context.go

-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/hyperledger/burrow/execution/exec"
1111
"github.com/hyperledger/burrow/logging"
1212
"github.com/hyperledger/burrow/txs/payload"
13-
"github.com/hyperledger/burrow/util"
1413
)
1514

1615
type BondContext struct {
@@ -60,8 +59,6 @@ func (ctx *BondContext) Execute(txe *exec.TxExecution, p payload.Payload) error
6059
return err
6160
}
6261

63-
cache := ctx.ValidatorSet.(*validator.Cache)
64-
util.Debugf("%v", cache.Bucket)
6562
// assume public key is know as we update account from signatures
6663
err = validator.AddPower(ctx.ValidatorSet, account.PublicKey, power)
6764
if err != nil {

execution/contexts/call_context.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ func (ctx *CallContext) Precheck() (*acm.Account, *acm.Account, error) {
7272
err = inAcc.SubtractFromBalance(ctx.tx.Fee)
7373
if err != nil {
7474
return nil, nil, errors.Errorf(errors.Codes.InsufficientFunds,
75-
"Input account does not have sufficient balance to cover input amount: %v", ctx.tx.Input)
75+
"Input account %v (balance: %d) does not have sufficient balance to cover input amount: %v",
76+
inAcc.Address, inAcc.Balance, ctx.tx.Input)
7677
}
7778

7879
// Calling a nil destination is defined as requesting contract creation

execution/contexts/unbond_context.go

-4
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/hyperledger/burrow/execution/exec"
1010
"github.com/hyperledger/burrow/logging"
1111
"github.com/hyperledger/burrow/txs/payload"
12-
"github.com/hyperledger/burrow/util"
1312
)
1413

1514
type UnbondContext struct {
@@ -42,9 +41,6 @@ func (ctx *UnbondContext) Execute(txe *exec.TxExecution, p payload.Payload) erro
4241
return err
4342
}
4443

45-
util.Debugf("unbonding %v", power)
46-
cache := ctx.ValidatorSet.(*validator.Cache)
47-
util.Debugf("%v", cache.Bucket)
4844
err = validator.SubtractPower(ctx.ValidatorSet, account.PublicKey, power)
4945
if err != nil {
5046
return err

execution/execution.go

+14-6
Original file line numberDiff line numberDiff line change
@@ -355,27 +355,27 @@ func (exe *executor) Commit(header *abciTypes.Header) (stateHash []byte, err err
355355
// that nothing in the downstream commit process could have failed. At worst we go back one block.
356356
hash, version, err := exe.state.Update(func(ws state.Updatable) error {
357357
// flush the caches
358-
err := exe.stateCache.Flush(ws, exe.state)
358+
err := exe.stateCache.Sync(ws)
359359
if err != nil {
360360
return err
361361
}
362-
err = exe.metadataCache.Flush(ws, exe.state)
362+
err = exe.metadataCache.Sync(ws)
363363
if err != nil {
364364
return err
365365
}
366-
err = exe.nameRegCache.Flush(ws, exe.state)
366+
err = exe.nameRegCache.Sync(ws)
367367
if err != nil {
368368
return err
369369
}
370-
err = exe.nodeRegCache.Flush(ws, exe.state)
370+
err = exe.nodeRegCache.Sync(ws)
371371
if err != nil {
372372
return err
373373
}
374-
err = exe.proposalRegCache.Flush(ws, exe.state)
374+
err = exe.proposalRegCache.Sync(ws)
375375
if err != nil {
376376
return err
377377
}
378-
err = exe.validatorCache.Flush(ws, exe.state)
378+
err = exe.validatorCache.Sync(ws)
379379
if err != nil {
380380
return err
381381
}
@@ -388,6 +388,12 @@ func (exe *executor) Commit(header *abciTypes.Header) (stateHash []byte, err err
388388
if err != nil {
389389
return nil, err
390390
}
391+
// Complete flushing of caches by resetting them to the state we have just committed
392+
err = exe.Reset()
393+
if err != nil {
394+
return nil, err
395+
}
396+
391397
expectedHeight := HeightAtVersion(version)
392398
if expectedHeight != height {
393399
return nil, fmt.Errorf("expected height at state tree version %d is %d but actual height is %d",
@@ -401,7 +407,9 @@ func (exe *executor) Commit(header *abciTypes.Header) (stateHash []byte, err err
401407
func (exe *executor) Reset() error {
402408
// As with Commit() we do not take the write lock here
403409
exe.stateCache.Reset(exe.state)
410+
exe.metadataCache.Reset(exe.state)
404411
exe.nameRegCache.Reset(exe.state)
412+
exe.nodeRegCache.Reset(exe.state)
405413
exe.proposalRegCache.Reset(exe.state)
406414
exe.validatorCache.Reset(exe.state)
407415
return nil

execution/names/cache.go

-10
Original file line numberDiff line numberDiff line change
@@ -120,16 +120,6 @@ func (cache *Cache) Reset(backend Reader) {
120120
cache.names = make(map[string]*nameInfo)
121121
}
122122

123-
// Syncs the Cache and Resets it to use Writer as the backend Reader
124-
func (cache *Cache) Flush(output Writer, backend Reader) error {
125-
err := cache.Sync(output)
126-
if err != nil {
127-
return err
128-
}
129-
cache.Reset(backend)
130-
return nil
131-
}
132-
133123
func (cache *Cache) Backend() Reader {
134124
return cache.backend
135125
}

execution/proposal/cache.go

-10
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,6 @@ func (cache *Cache) Reset(backend Reader) {
145145
cache.proposals = make(map[[sha256.Size]byte]*proposalInfo)
146146
}
147147

148-
// Syncs the Cache and Resets it to use Writer as the backend Reader
149-
func (cache *Cache) Flush(output Writer, backend Reader) error {
150-
err := cache.Sync(output)
151-
if err != nil {
152-
return err
153-
}
154-
cache.Reset(backend)
155-
return nil
156-
}
157-
158148
func (cache *Cache) Backend() Reader {
159149
return cache.backend
160150
}

execution/registry/cache.go

-10
Original file line numberDiff line numberDiff line change
@@ -125,16 +125,6 @@ func (cache *Cache) Reset(backend Reader) {
125125
cache.registry = make(map[crypto.Address]*nodeInfo)
126126
}
127127

128-
// Syncs the Cache and Resets it to use Writer as the backend Reader
129-
func (cache *Cache) Flush(output Writer, backend Reader) error {
130-
err := cache.Sync(output)
131-
if err != nil {
132-
return err
133-
}
134-
cache.Reset(backend)
135-
return nil
136-
}
137-
138128
func (cache *Cache) Backend() Reader {
139129
return cache.backend
140130
}

logging/loggers/stream_logger.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,15 @@ func NewLogfmtLogger(writer io.Writer) log.Logger {
3838
}
3939

4040
func NewTerminalLogger(writer io.Writer) log.Logger {
41-
logger := term.NewLogger(writer, log.NewLogfmtLogger, func(keyvals ...interface{}) term.FgBgColor {
41+
logger := term.NewLogger(writer, log.NewLogfmtLogger, func(keyvals ...interface{}) term.FgBgColor {
4242
switch structure.Value(keyvals, structure.ChannelKey) {
4343
case structure.TraceChannelName:
4444
return term.FgBgColor{Fg: term.DarkGreen}
4545
default:
4646
return term.FgBgColor{Fg: term.Yellow}
4747
}
4848
})
49-
return interceptSync(writer,NewBurrowFormatLogger(logger, StringifyValues))
49+
return interceptSync(writer, NewBurrowFormatLogger(logger, StringifyValues))
5050
}
5151

5252
func NewTemplateLogger(writer io.Writer, textTemplate string, recordSeparator []byte) (log.Logger, error) {

util/debug.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import "fmt"
44

55
// If we ever want to ship some specific debug we could make this a string var and set it through -ldflags "-X ..."
66

7-
const debug = true
8-
//const debug = false
7+
//const debug = true
8+
const debug = false
99

1010
// Using this in place of Printf statements makes it easier to find any errant debug statements and the switch means
1111
// we can turn them off at minimal runtime cost.

0 commit comments

Comments
 (0)