-
Notifications
You must be signed in to change notification settings - Fork 38
/
app.go
234 lines (193 loc) · 6.06 KB
/
app.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
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
package gfspapp
import (
"context"
"syscall"
"google.golang.org/grpc"
"github.com/bnb-chain/greenfield-storage-provider/base/gfspclient"
"github.com/bnb-chain/greenfield-storage-provider/core/consensus"
corelifecycle "github.com/bnb-chain/greenfield-storage-provider/core/lifecycle"
"github.com/bnb-chain/greenfield-storage-provider/core/module"
"github.com/bnb-chain/greenfield-storage-provider/core/piecestore"
coreprober "github.com/bnb-chain/greenfield-storage-provider/core/prober"
corercmgr "github.com/bnb-chain/greenfield-storage-provider/core/rcmgr"
"github.com/bnb-chain/greenfield-storage-provider/core/spdb"
"github.com/bnb-chain/greenfield-storage-provider/pkg/log"
"github.com/bnb-chain/greenfield-storage-provider/store/bsdb"
)
const (
BaseCodeSpace = "gfsp-base-app"
)
type GfSpBaseApp struct {
appID string
grpcAddress string
operatorAddress string
chainID string
server *grpc.Server
client gfspclient.GfSpClientAPI
gfSpDB spdb.SPDB
gfBsDB bsdb.BSDB
gfBsDBMaster bsdb.BSDB
pieceStore piecestore.PieceStore
pieceOp piecestore.PieceOp
rcmgr corercmgr.ResourceManager
chain consensus.Consensus
httpProbe coreprober.Prober
approver module.Approver
authenticator module.Authenticator
downloader module.Downloader
executor module.TaskExecutor
gater module.Modular
manager module.Manager
p2p module.P2P
receiver module.Receiver
signer module.Signer
uploader module.Uploader
metrics module.Modular
pprof module.Modular
probeSvr module.Modular
appCtx context.Context
appCancel context.CancelFunc
services []corelifecycle.Service
uploadSpeed int64
downloadSpeed int64
replicateSpeed int64
receiveSpeed int64
sealObjectTimeout int64
gcObjectTimeout int64
gcZombieTimeout int64
gcMetaTimeout int64
gcBucketMigrationTimeout int64
gcStaleVersionObjectTimeout int64
migrateGVGTimeout int64
sealObjectRetry int64
replicateRetry int64
receiveConfirmRetry int64
gcObjectRetry int64
gcZombieRetry int64
gcMetaRetry int64
gcBucketMigrationRetry int64
recoveryRetry int64
migrateGVGRetry int64
}
// AppID returns the GfSpBaseApp ID, the default value is prefix(gfsp) add
// started modules' name.
func (g *GfSpBaseApp) AppID() string {
return g.appID
}
// SetAppID sets appID
func (g *GfSpBaseApp) SetAppID(appID string) {
g.appID = appID
}
// GfSpClient returns the sp client that includes inner grpc and outer http protocol.
func (g *GfSpBaseApp) GfSpClient() gfspclient.GfSpClientAPI {
return g.client
}
// SetGfSpClient sets gfsp client
func (g *GfSpBaseApp) SetGfSpClient(clientAPI gfspclient.GfSpClientAPI) {
g.client = clientAPI
}
// PieceStore returns the piece store client.
func (g *GfSpBaseApp) PieceStore() piecestore.PieceStore {
return g.pieceStore
}
// SetPieceStore sets piece store
func (g *GfSpBaseApp) SetPieceStore(ps piecestore.PieceStore) {
g.pieceStore = ps
}
// PieceOp returns piece helper struct instance.
func (g *GfSpBaseApp) PieceOp() piecestore.PieceOp {
return g.pieceOp
}
// SetPieceOp sets piece op
func (g *GfSpBaseApp) SetPieceOp(pieceOp piecestore.PieceOp) {
g.pieceOp = pieceOp
}
// Consensus returns greenfield consensus query client.
func (g *GfSpBaseApp) Consensus() consensus.Consensus {
return g.chain
}
// SetConsensus sets greenfield consensus query client.
func (g *GfSpBaseApp) SetConsensus(chain consensus.Consensus) {
g.chain = chain
}
// OperatorAddress returns the sp operator address.
func (g *GfSpBaseApp) OperatorAddress() string {
return g.operatorAddress
}
// SetOperatorAddress sets operator address
func (g *GfSpBaseApp) SetOperatorAddress(operatorAddress string) {
g.operatorAddress = operatorAddress
}
// ChainID returns the chainID used by this sp instance
func (g *GfSpBaseApp) ChainID() string {
return g.chainID
}
// SetChainID sets chainID
func (g *GfSpBaseApp) SetChainID(chainID string) {
g.chainID = chainID
}
// GfSpDB returns the sp db client.
func (g *GfSpBaseApp) GfSpDB() spdb.SPDB {
return g.gfSpDB
}
// SetGfSpDB sets spdb
func (g *GfSpBaseApp) SetGfSpDB(db spdb.SPDB) {
g.gfSpDB = db
}
// GfBsDB returns the block syncer db client.
func (g *GfSpBaseApp) GfBsDB() bsdb.BSDB {
return g.gfBsDB
}
// GfBsDBMaster returns the master block syncer db client.
func (g *GfSpBaseApp) GfBsDBMaster() bsdb.BSDB {
return g.gfBsDBMaster
}
// SetGfBsDB sets the block syncer db client.
func (g *GfSpBaseApp) SetGfBsDB(setDB bsdb.BSDB) {
g.gfBsDB = setDB
}
// ServerForRegister returns the Grpc server for module register own service.
func (g *GfSpBaseApp) ServerForRegister() *grpc.Server {
return g.server
}
// ResourceManager returns the resource manager for module to open own resource span.
func (g *GfSpBaseApp) ResourceManager() corercmgr.ResourceManager {
return g.rcmgr
}
// SetResourceManager sets the resource manager for module to open own resource span.
func (g *GfSpBaseApp) SetResourceManager(rcmgr corercmgr.ResourceManager) {
g.rcmgr = rcmgr
}
// GetProbe returns the http probe.
func (g *GfSpBaseApp) GetProbe() coreprober.Prober {
return g.httpProbe
}
// SetProbe sets the http probe.
func (g *GfSpBaseApp) SetProbe(prober coreprober.Prober) {
g.httpProbe = prober
}
// Start the GfSpBaseApp and blocks the progress until signal.
func (g *GfSpBaseApp) Start(ctx context.Context) error {
g.httpProbe.Healthy()
err := g.StartRPCServer(ctx)
if err != nil {
log.Errorw("failed to start rpc server", "error", err)
g.httpProbe.Unhealthy(err)
return err
}
g.Signals(syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP).StartServices(ctx).Wait(ctx)
_ = g.close(ctx)
return nil
}
// close recycles the GfSpBaseApp resource on the stop time.
func (g *GfSpBaseApp) close(ctx context.Context) error {
_ = g.StopRPCServer(ctx)
_ = g.GfSpClient().Close()
_ = g.rcmgr.Close()
_ = g.chain.Close()
return nil
}
// EnableMetrics returns an indicator whether enable the metrics service.
func (g *GfSpBaseApp) EnableMetrics() bool {
return g.metrics != nil
}