@@ -19,7 +19,7 @@ import (
19
19
)
20
20
21
21
func (fd * fileDAOv2 ) populateStagingBuffer () (* stagingBuffer , error ) {
22
- buffer := newStagingBuffer (fd .header .BlockStoreSize , fd .deser )
22
+ buffer := newStagingBuffer (fd .header .BlockStoreSize , fd .header . Start )
23
23
blockStoreTip := fd .highestBlockOfStoreTip ()
24
24
for i := uint64 (0 ); i < fd .header .BlockStoreSize ; i ++ {
25
25
v , err := fd .kvStore .Get (_headerDataNs , byteutil .Uint64ToBytesBigEndian (i ))
@@ -42,7 +42,7 @@ func (fd *fileDAOv2) populateStagingBuffer() (*stagingBuffer, error) {
42
42
// populate to staging buffer, if the block is in latest round
43
43
height := info .Block .Height ()
44
44
if height > blockStoreTip {
45
- if _ , err = buffer .Put (stagingKey ( height , fd . header ), v ); err != nil {
45
+ if _ , err = buffer .Put (height , info ); err != nil {
46
46
return nil , err
47
47
}
48
48
} else {
@@ -87,12 +87,12 @@ func (fd *fileDAOv2) putBlock(blk *block.Block) error {
87
87
}
88
88
89
89
// add to staging buffer
90
- index := stagingKey (blk .Height (), fd .header )
91
- full , err := fd .blkBuffer .Put (index , ser )
90
+ full , err := fd .blkBuffer .Put (blk .Height (), blkInfo )
92
91
if err != nil {
93
92
return err
94
93
}
95
94
if ! full {
95
+ index := fd .blkBuffer .slot (blk .Height ())
96
96
fd .batch .Put (_headerDataNs , byteutil .Uint64ToBytesBigEndian (index ), blkBytes , "failed to put block" )
97
97
return nil
98
98
}
@@ -151,11 +151,6 @@ func blockStoreKey(height uint64, header *FileHeader) uint64 {
151
151
return (height - header .Start ) / header .BlockStoreSize
152
152
}
153
153
154
- // stagingKey is the position of block in the staging buffer
155
- func stagingKey (height uint64 , header * FileHeader ) uint64 {
156
- return (height - header .Start ) % header .BlockStoreSize
157
- }
158
-
159
154
// lowestBlockOfStoreTip is the lowest height of the tip of block storage
160
155
// used in DeleteTipBlock(), once new tip height drops below this, the tip of block storage can be deleted
161
156
func (fd * fileDAOv2 ) lowestBlockOfStoreTip () uint64 {
@@ -178,12 +173,7 @@ func (fd *fileDAOv2) getBlock(height uint64) (*block.Block, error) {
178
173
return nil , db .ErrNotExist
179
174
}
180
175
// check whether block in staging buffer or not
181
- storeKey := blockStoreKey (height , fd .header )
182
- if storeKey >= fd .blkStore .Size () {
183
- blkStore , err := fd .blkBuffer .Get (stagingKey (height , fd .header ))
184
- if err != nil {
185
- return nil , err
186
- }
176
+ if blkStore := fd .getFromStagingBuffer (height ); blkStore != nil {
187
177
return blkStore .Block , nil
188
178
}
189
179
// read from storage DB
@@ -199,12 +189,7 @@ func (fd *fileDAOv2) getReceipt(height uint64) ([]*action.Receipt, error) {
199
189
return nil , db .ErrNotExist
200
190
}
201
191
// check whether block in staging buffer or not
202
- storeKey := blockStoreKey (height , fd .header )
203
- if storeKey >= fd .blkStore .Size () {
204
- blkStore , err := fd .blkBuffer .Get (stagingKey (height , fd .header ))
205
- if err != nil {
206
- return nil , err
207
- }
192
+ if blkStore := fd .getFromStagingBuffer (height ); blkStore != nil {
208
193
return blkStore .Receipts , nil
209
194
}
210
195
// read from storage DB
@@ -215,12 +200,23 @@ func (fd *fileDAOv2) getReceipt(height uint64) ([]*action.Receipt, error) {
215
200
return fd .deser .ReceiptsFromBlockStoreProto (blockStore )
216
201
}
217
202
203
+ func (fd * fileDAOv2 ) getFromStagingBuffer (height uint64 ) * block.Store {
204
+ if fd .loadTip ().Height - height >= fd .header .BlockStoreSize {
205
+ return nil
206
+ }
207
+ blkStore := fd .blkBuffer .Get (height )
208
+ if blkStore == nil || blkStore .Block .Height () != height {
209
+ return nil
210
+ }
211
+ return blkStore
212
+ }
213
+
218
214
func (fd * fileDAOv2 ) getBlockStore (height uint64 ) (* iotextypes.BlockStore , error ) {
219
215
// check whether blockStore in read cache or not
220
216
storeKey := blockStoreKey (height , fd .header )
221
217
if value , ok := fd .blkStorePbCache .Get (storeKey ); ok {
222
218
pbInfos := value .(* iotextypes.BlockStores )
223
- return pbInfos .BlockStores [stagingKey ( height , fd .header )], nil
219
+ return pbInfos .BlockStores [fd .blkBuffer . slot ( height )], nil
224
220
}
225
221
// read from storage DB
226
222
value , err := fd .blkStore .Get (storeKey )
@@ -240,5 +236,5 @@ func (fd *fileDAOv2) getBlockStore(height uint64) (*iotextypes.BlockStore, error
240
236
}
241
237
// add to read cache
242
238
fd .blkStorePbCache .Add (storeKey , pbStores )
243
- return pbStores .BlockStores [stagingKey ( height , fd .header )], nil
239
+ return pbStores .BlockStores [fd .blkBuffer . slot ( height )], nil
244
240
}
0 commit comments