-
Notifications
You must be signed in to change notification settings - Fork 1
/
big.go
122 lines (107 loc) · 4.1 KB
/
big.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
120
121
122
package storage
import (
"fmt"
"io"
"strings"
"github.com/danielleontiev/neojhat/core"
)
type BigRecordsWriteStorage struct {
instanceDumpPersistent *IndexRecordsWriteStorage
objArrayDumpPersistent *IndexRecordsWriteStorage
primArrayDumpPersistent *IndexRecordsWriteStorage
}
func NewBigRecordsWriteStorage(
instanceDumpPersistent io.WriteCloser,
objArrayDumpPersistent io.WriteCloser,
primArrayDumpPersistent io.WriteCloser,
) *BigRecordsWriteStorage {
instanceStorage := NewIndexRecordsWriteStorage(instanceDumpPersistent, DefaultBatchSize)
objArrayStorage := NewIndexRecordsWriteStorage(objArrayDumpPersistent, DefaultBatchSize)
primArrayStorage := NewIndexRecordsWriteStorage(primArrayDumpPersistent, DefaultBatchSize)
return &BigRecordsWriteStorage{
instanceDumpPersistent: instanceStorage,
objArrayDumpPersistent: objArrayStorage,
primArrayDumpPersistent: primArrayStorage,
}
}
type BigRecordsReadStorage struct {
instanceDumpPersistent *IndexRecordsReadStorage
objArrayDumpPersistent *IndexRecordsReadStorage
primArrayDumpPersistent *IndexRecordsReadStorage
}
func NewBigRecordsReadStorage(
instanceDumpPersistent IndexRecordsReaderAtCloser,
instanceDumpPersistentSize int,
objArrayDumpPersistent IndexRecordsReaderAtCloser,
objArrayDumpPersistentSize int,
primArrayDumpPersistent IndexRecordsReaderAtCloser,
primArrayDumpPersistentSize int,
) (*BigRecordsReadStorage, error) {
instanceStorage, err := NewIndexRecordsReadStorage(instanceDumpPersistent, instanceDumpPersistentSize)
if err != nil {
return nil, fmt.Errorf("Cannot create bytestorage: %w", err)
}
objArrayStorage, err := NewIndexRecordsReadStorage(objArrayDumpPersistent, objArrayDumpPersistentSize)
if err != nil {
return nil, fmt.Errorf("Cannot create bytestorage: %w", err)
}
primArrayStorage, err := NewIndexRecordsReadStorage(primArrayDumpPersistent, primArrayDumpPersistentSize)
if err != nil {
return nil, fmt.Errorf("Cannot create bytestorage: %w", err)
}
return &BigRecordsReadStorage{
instanceDumpPersistent: instanceStorage,
objArrayDumpPersistent: objArrayStorage,
primArrayDumpPersistent: primArrayStorage,
}, nil
}
func (r *BigRecordsReadStorage) HprofGcInstanceDumpGetOffset(objectId core.Identifier) (int, error) {
offset, err := r.instanceDumpPersistent.Get(uint64(objectId))
return int(offset), err
}
func (r *BigRecordsReadStorage) HprofGcObjArrayDumpGetOffset(arrayObjectId core.Identifier) (int, error) {
offset, err := r.objArrayDumpPersistent.Get(uint64(arrayObjectId))
return int(offset), err
}
func (r *BigRecordsReadStorage) HprofGcPrimArrayDumpGetOffset(arrayObjectId core.Identifier) (int, error) {
offset, err := r.primArrayDumpPersistent.Get(uint64(arrayObjectId))
return int(offset), err
}
func (r *BigRecordsReadStorage) Close() error {
err1 := r.instanceDumpPersistent.Close()
err2 := r.objArrayDumpPersistent.Close()
err3 := r.primArrayDumpPersistent.Close()
err := combineErrors("Cannot close BigRecordsReadStorage", err1, err2, err3)
return err
}
func (w *BigRecordsWriteStorage) HprofGcInstanceDumpPutOffset(objectId core.Identifier, offset int) error {
err := w.instanceDumpPersistent.Put(uint64(objectId), uint64(offset))
return err
}
func (w *BigRecordsWriteStorage) HprofGcObjArrayDumpPutOffset(arrayObjectId core.Identifier, offset int) error {
err := w.objArrayDumpPersistent.Put(uint64(arrayObjectId), uint64(offset))
return err
}
func (w *BigRecordsWriteStorage) HprofGcPrimArrayDumpPutOffset(arrayObjectId core.Identifier, offset int) error {
err := w.primArrayDumpPersistent.Put(uint64(arrayObjectId), uint64(offset))
return err
}
func (w *BigRecordsWriteStorage) Close() error {
err1 := w.instanceDumpPersistent.Close()
err2 := w.objArrayDumpPersistent.Close()
err3 := w.primArrayDumpPersistent.Close()
err := combineErrors("Cannot close BigRecordsWriteStorage", err1, err2, err3)
return err
}
func combineErrors(label string, errors ...error) error {
var messages []string
for _, err := range errors {
if err != nil {
messages = append(messages, err.Error())
}
}
if len(messages) != 0 {
return fmt.Errorf("%s: %s", label, strings.Join(messages, ", "))
}
return nil
}