-
Notifications
You must be signed in to change notification settings - Fork 11
/
persist.go
119 lines (99 loc) · 3.18 KB
/
persist.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
108
109
110
111
112
113
114
115
116
117
118
119
// Copyright 2019 DxChain, All rights reserved.
// Use of this source code is governed by an Apache
// License 2.0 that can be found in the LICENSE file
package contractmanager
import (
"github.com/DxChainNetwork/godx/common"
"github.com/DxChainNetwork/godx/storage"
"os"
"path/filepath"
)
var settingsMetadata = common.Metadata{
Header: PersistContractManagerHeader,
Version: PersistContractManagerVersion,
}
type persistence struct {
Rent storage.RentPayment `json:"rentPayment"`
BlockHeight uint64 `json:"blockheight"`
CurrentPeriod uint64 `json:"currentperiod"`
ExpiredContracts []storage.ContractMetaData `json:"expiredcontracts"`
RenewedFrom map[string]storage.ContractID `json:"renewedfrom"`
RenewedTo map[string]storage.ContractID `json:"renewedto"`
}
func (cm *ContractManager) persistUpdate() (persist persistence) {
persist = persistence{
Rent: cm.rentPayment,
BlockHeight: cm.blockHeight,
CurrentPeriod: cm.currentPeriod,
RenewedFrom: make(map[string]storage.ContractID),
RenewedTo: make(map[string]storage.ContractID),
}
// update the renewedFrom
for key, value := range cm.renewedFrom {
persist.RenewedFrom[key.String()] = value
}
// update the renewedTo
for key, value := range cm.renewedTo {
persist.RenewedTo[key.String()] = value
}
// update the expiredContracts
for _, ec := range cm.expiredContracts {
persist.ExpiredContracts = append(persist.ExpiredContracts, ec)
}
return
}
// saveSettings will store all the persistence data into the JSON file
func (cm *ContractManager) saveSettings() (err error) {
cm.lock.Lock()
defer cm.lock.Unlock()
data := cm.persistUpdate()
return common.SaveDxJSON(settingsMetadata, filepath.Join(cm.persistDir, PersistFileName), data)
}
// loadSettings will load the storage contract manager settings saved
func (cm *ContractManager) loadSettings() (err error) {
// make directory
err = os.MkdirAll(cm.persistDir, 0700)
if err != nil {
return
}
// load data from the json file
var data persistence
err = common.LoadDxJSON(settingsMetadata, filepath.Join(cm.persistDir, PersistFileName), &data)
if err != nil {
return
}
// data initialization
cm.lock.Lock()
cm.rentPayment = data.Rent
cm.blockHeight = data.BlockHeight
cm.currentPeriod = data.CurrentPeriod
// update the RenewedFrom
for key, value := range data.RenewedFrom {
// convert the string to contract id
id, err := storage.StringToContractID(key)
if err != nil {
cm.log.Warn("contractmanager loadsettings renewedFrom", "err", err.Error())
continue
}
// update the renewedFrom
cm.renewedFrom[id] = value
}
// update the RenewedTo
for key, value := range data.RenewedTo {
// convert the string to contract id
id, err := storage.StringToContractID(key)
if err != nil {
cm.log.Warn("contractmanager loadsettings renewedTo", "err", err.Error())
continue
}
// update the renewedFrom
cm.renewedTo[id] = value
}
// update expired contract list and hostToContract mapping
for _, ec := range data.ExpiredContracts {
cm.expiredContracts[ec.ID] = ec
cm.hostToContract[ec.EnodeID] = ec.ID
}
cm.lock.Unlock()
return
}