forked from kaspanet/kaspad
/
pruning_staging_shard.go
81 lines (69 loc) · 2.29 KB
/
pruning_staging_shard.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
package pruningstore
import (
"github.com/Hoosat-Oy/HTND/domain/consensus/model"
"github.com/Hoosat-Oy/HTND/domain/consensus/model/externalapi"
)
type pruningStagingShard struct {
store *pruningStore
pruningPointByIndex map[uint64]*externalapi.DomainHash
currentPruningPointIndex *uint64
newPruningPointCandidate *externalapi.DomainHash
startUpdatingPruningPointUTXOSet bool
}
func (ps *pruningStore) stagingShard(stagingArea *model.StagingArea) *pruningStagingShard {
return stagingArea.GetOrCreateShard(ps.shardID, func() model.StagingShard {
return &pruningStagingShard{
store: ps,
pruningPointByIndex: map[uint64]*externalapi.DomainHash{},
newPruningPointCandidate: nil,
startUpdatingPruningPointUTXOSet: false,
}
}).(*pruningStagingShard)
}
func (mss *pruningStagingShard) Commit(dbTx model.DBTransaction) error {
for index, hash := range mss.pruningPointByIndex {
hashCopy := hash
hashBytes, err := mss.store.serializeHash(hash)
if err != nil {
return err
}
err = dbTx.Put(mss.store.indexAsKey(index), hashBytes)
if err != nil {
return err
}
mss.store.pruningPointByIndexCache.Add(index, hashCopy)
}
if mss.currentPruningPointIndex != nil {
indexBytes := mss.store.serializeIndex(*mss.currentPruningPointIndex)
err := dbTx.Put(mss.store.currentPruningPointIndexKey, indexBytes)
if err != nil {
return err
}
if mss.store.currentPruningPointIndexCache == nil {
var zero uint64
mss.store.currentPruningPointIndexCache = &zero
}
*mss.store.currentPruningPointIndexCache = *mss.currentPruningPointIndex
}
if mss.newPruningPointCandidate != nil {
candidateBytes, err := mss.store.serializeHash(mss.newPruningPointCandidate)
if err != nil {
return err
}
err = dbTx.Put(mss.store.candidatePruningPointHashKey, candidateBytes)
if err != nil {
return err
}
mss.store.pruningPointCandidateCache = mss.newPruningPointCandidate
}
if mss.startUpdatingPruningPointUTXOSet {
err := dbTx.Put(mss.store.updatingPruningPointUTXOSetKey, []byte{0})
if err != nil {
return err
}
}
return nil
}
func (mss *pruningStagingShard) isStaged() bool {
return len(mss.pruningPointByIndex) > 0 || mss.newPruningPointCandidate != nil || mss.startUpdatingPruningPointUTXOSet
}