-
Notifications
You must be signed in to change notification settings - Fork 4
/
restore.go
100 lines (81 loc) · 2.55 KB
/
restore.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
package cmds
import (
"context"
"github.com/pkg/errors"
"github.com/spikeekips/mitum-currency/digest"
"github.com/spikeekips/mitum/base"
"github.com/spikeekips/mitum/base/block"
mitumcmds "github.com/spikeekips/mitum/launch/cmds"
"github.com/spikeekips/mitum/launch/pm"
"github.com/spikeekips/mitum/launch/process"
"github.com/spikeekips/mitum/util"
)
var restoreCommandHooks = func(cmd *restoreCommand) []pm.Hook {
genesisOperationHandlers := map[string]process.HookHandlerGenesisOperations{
"genesis-currencies": nil,
}
for k, v := range process.DefaultHookHandlersGenesisOperations {
genesisOperationHandlers[k] = v
}
return []pm.Hook{
pm.NewHook(pm.HookPrefixPost, process.ProcessNameConfig,
process.HookNameConfigGenesisOperations, process.HookGenesisOperationFunc(genesisOperationHandlers)).
SetOverride(true),
pm.NewHook(pm.HookPrefixPost, ProcessNameDigestDatabase,
"set_digest_when_block_saved", func(ctx context.Context) (context.Context, error) {
var st *digest.Database
if err := LoadDigestDatabaseContextValue(ctx, &st); err != nil {
if errors.Is(err, util.ContextValueNotFoundError) {
return ctx, nil
}
return ctx, err
}
ctx = context.WithValue(ctx, mitumcmds.ContextValueWhenBlockSaved, func(blk block.Block) error {
return digest.DigestBlock(context.Background(), st, blk)
})
ctx = context.WithValue(ctx, mitumcmds.ContextValueWhenFinished, func(to base.Height) error {
return st.SetLastBlock(to)
})
ctx = context.WithValue(ctx, mitumcmds.ContextValueCleanDatabase, func() error {
return st.Clean()
})
ctx = context.WithValue(ctx, mitumcmds.ContextValueCleanDatabaseByHeight,
func(ctx context.Context, h base.Height) error {
return st.CleanByHeight(ctx, h)
})
return ctx, nil
}).
SetOverride(true),
}
}
type restoreCommand struct {
*mitumcmds.RestoreCommand
*BaseNodeCommand
}
func newRestoreCommand() (restoreCommand, error) {
co := mitumcmds.NewRestoreCommand()
cmd := restoreCommand{
RestoreCommand: &co,
BaseNodeCommand: NewBaseNodeCommand(co.Logging),
}
ps, err := cmd.BaseProcesses(co.Processes())
if err != nil {
return cmd, err
}
restoreCommandProcesses := []pm.Process{
ProcessorDigestDatabase,
}
for i := range restoreCommandProcesses {
if err := ps.AddProcess(restoreCommandProcesses[i], true); err != nil {
return cmd, err
}
}
hooks := restoreCommandHooks(&cmd)
for i := range hooks {
if err := hooks[i].Add(ps); err != nil {
return cmd, err
}
}
_ = cmd.SetProcesses(ps)
return cmd, nil
}