/
compact.go
102 lines (82 loc) · 2.05 KB
/
compact.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
// Copyright (c) 2017 Western Digital Corporation or its affiliates. All rights reserved.
// SPDX-License-Identifier: MIT
package state
/*
* If we have another bug where the database size blows up, this might be useful again.
*
import (
"os"
"github.com/boltdb/bolt"
log "github.com/golang/glog"
)
func maybeCompactDb(path string) {
const (
sizeToCompact = 15 << 30
txSize = 1 << 20
)
fi, err := os.Stat(path)
if err != nil || fi.Size() < sizeToCompact {
return
}
log.Infof("compacting state database...")
dstpath := path + ".compacted"
os.Remove(dstpath)
src, err := bolt.Open(path, mode, nil)
if err != nil {
log.Fatalf("couldn't open old db: %s", err)
}
dst, err := bolt.Open(dstpath, mode, nil)
if err != nil {
log.Fatalf("couldn't open new db: %s", err)
}
stx, err := src.Begin(false)
if err != nil {
log.Fatalf("couldn't get read tx: %s", err)
}
copyBucket := func(b []byte, fillPct float64) {
dtx, err := dst.Begin(true)
if err != nil {
log.Fatalf("couldn't get write tx: %s", err)
}
bkt, err := dtx.CreateBucket(b)
if err != nil {
log.Fatalf("create bucket error: %s", err)
}
bkt.FillPercent = fillPct
size := 0
stx.Bucket(b).ForEach(func(k, v []byte) error {
bkt.Put(k, v)
size += len(k) + len(v)
if size >= txSize {
// reopen transaction if we've added enough data
if err := dtx.Commit(); err != nil {
log.Fatalf("commit error: %s", err)
}
dtx, err = dst.Begin(true)
if err != nil {
log.Fatalf("couldn't get write tx: %s", err)
}
bkt = dtx.Bucket(b)
bkt.FillPercent = fillPct
size = 0
}
return nil
})
// final commit
if err := dtx.Commit(); err != nil {
log.Fatalf("commit error: %s", err)
}
}
copyBucket(partitionBucket, defaultFillPct)
copyBucket(metaBucket, defaultFillPct)
copyBucket(blobBucket, blobFillPct)
copyBucket(rschunkBucket, rsChunkFillPct)
stx.Rollback()
src.Close()
dst.Close()
if err := os.Rename(dstpath, path); err != nil {
log.Fatalf("rename error: %s", err)
}
log.Infof("compacting done")
}
*/