forked from influxdata/influxdb
/
snapshot.go
88 lines (73 loc) · 1.53 KB
/
snapshot.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
package main
import (
"cluster"
"encoding/json"
"fmt"
"hash/crc32"
"io/ioutil"
"os"
)
type Peer struct {
Name string `json:"name"`
ConnectionString string `json:"connectionString"`
}
type Snapshot struct {
LastIndex uint64 `json:"lastIndex"`
LastTerm uint64 `json:"lastTerm"`
// Cluster configuration.
Peers []*Peer `json:"peers"`
State []byte `json:"state"`
state *cluster.SavedConfiguration
Path string `json:"path"`
}
func (s *Snapshot) Load(path string) error {
// Open the file for writing.
file, err := os.OpenFile(path, os.O_RDONLY, 0600)
if err != nil {
return err
}
defer file.Close()
var checksum uint32
_, err = fmt.Scanf("%08x\n", &checksum)
if err != nil {
return err
}
b, err := ioutil.ReadAll(file)
// Serialize to JSON.
err = json.Unmarshal(b, s)
if err != nil {
return err
}
s.state = &cluster.SavedConfiguration{}
err = json.Unmarshal(s.State, s.state)
if err != nil {
return err
}
return nil
}
func (s *Snapshot) Save(path string) error {
b, err := json.Marshal(s.state)
if err != nil {
return err
}
s.State = b
b, err = json.Marshal(s.state)
if err != nil {
return err
}
file, err := os.OpenFile(path, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0600)
if err != nil {
return err
}
defer file.Close()
// Generate checksum and write it to disk.
checksum := crc32.ChecksumIEEE(b)
if _, err := fmt.Fprintf(file, "%08x\n", checksum); err != nil {
return err
}
// Write the snapshot to disk.
if _, err = file.Write(b); err != nil {
return err
}
return nil
}