-
Notifications
You must be signed in to change notification settings - Fork 2
/
compute_db_checksum.go
107 lines (93 loc) · 2.76 KB
/
compute_db_checksum.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
101
102
103
104
105
106
107
package main
import (
"context"
"fmt"
"github.com/deso-smart/deso-backend/v2/scripts/tools/toolslib"
"github.com/deso-smart/deso-core/v2/lib"
"github.com/pkg/errors"
"golang.org/x/sync/semaphore"
"sort"
"time"
)
func main() {
dirSnap := "$HOME/data_dirs/hypersync/final_nodes/runner_node"
time.Sleep(1 * time.Millisecond)
dbSnap, err := toolslib.OpenDataDir(dirSnap)
if err != nil {
fmt.Printf("Error reading db1 err: %v", err)
return
}
snap, err, _ := lib.NewSnapshot(dbSnap, dirSnap, lib.SnapshotBlockHeightPeriod, false, false, &lib.DeSoMainnetParams, false)
if err != nil {
fmt.Printf("Error reading snap err: %v", err)
return
}
snap.CurrentEpochSnapshotMetadata.SnapshotBlockHeight = 114000
snap.Checksum.ResetChecksum()
maxBytes := uint32(8 << 20)
var prefixes [][]byte
for prefix, isState := range lib.StatePrefixes.StatePrefixesMap {
if !isState {
continue
}
prefixes = append(prefixes, []byte{prefix})
}
sort.Slice(prefixes, func(ii, jj int) bool {
return prefixes[ii][0] < prefixes[jj][0]
})
fmt.Println(prefixes)
fmt.Printf("Checking prefixes: ")
numProcesses := int64(1)
sem := semaphore.NewWeighted(numProcesses)
ctx := context.Background()
lib.Mode = lib.EnableTimer
timer := lib.Timer{}
timer.Initialize()
timer.Start("Compute checksum")
for _, prefix := range prefixes {
fmt.Printf("%v \n", prefix)
if err := sem.Acquire(ctx, 1); err != nil {
panic(errors.Wrapf(err, "Problem acquiring semaphore in the routine"))
}
go func(prefix []byte) {
defer sem.Release(1)
lastPrefix := prefix
removeFirst := false
for {
entries, fullDb, err := lib.DBIteratePrefixKeys(dbSnap, prefix, lastPrefix, maxBytes)
if err != nil {
panic(fmt.Errorf("Problem fetching snapshot chunk (%v)", err))
}
if removeFirst {
entries = entries[1:]
}
for _, entry := range entries {
snap.AddChecksumBytes(entry.Key, entry.Value)
}
if len(entries) != 0 {
lastPrefix = entries[len(entries)-1].Key
removeFirst = true
} else if fullDb {
panic("Number of ancestral records should not be zero")
}
if !fullDb {
break
}
}
}(prefix[:])
//time.Sleep(1 * time.Second)
//fmt.Println("current operations:", snap.OperationChannel.GetStatus())
//snap.WaitForAllOperationsToFinish()
//checksumBytes, _ := snap.Checksum.ToBytes()
//fmt.Println("prefix", prefix, "checksum:", checksumBytes)
}
if err := sem.Acquire(ctx, numProcesses); err != nil {
panic(errors.Wrapf(err, "Problem acquiring semaphore after routines"))
}
fmt.Println("Finished iterating all prefixes")
snap.WaitForAllOperationsToFinish()
checksumBytes, _ := snap.Checksum.ToBytes()
fmt.Println("Final checksum:", checksumBytes)
timer.End("Compute checksum")
timer.Print("Compute checksum")
}