@@ -224,16 +224,22 @@ func (s *store) checkPrevCompactionCompleted() bool {
224
224
defer tx .RUnlock ()
225
225
scheduledCompact , scheduledCompactFound := UnsafeReadScheduledCompact (tx )
226
226
finishedCompact , finishedCompactFound := UnsafeReadFinishedCompact (tx )
227
- return scheduledCompact == finishedCompact && scheduledCompactFound == finishedCompactFound
227
+ completed := scheduledCompact == finishedCompact && scheduledCompactFound == finishedCompactFound
228
+ s .lg .Info ("check prev compaction completed" , zap .Bool ("completed" , completed ), zap .Int64 ("scheduled-compact" , scheduledCompact ), zap .Int64 ("finished-compaction" , finishedCompact ))
229
+ return completed
228
230
}
229
231
230
- func (s * store ) compact (trace * traceutil.Trace , rev , prevCompactRev int64 , prevCompactionCompleted bool ) <- chan struct {} {
232
+ func (s * store ) compact (trace * traceutil.Trace , rev , prevCompactRev int64 ) <- chan struct {} {
231
233
ch := make (chan struct {})
232
234
j := schedule .NewJob ("kvstore_compact" , func (ctx context.Context ) {
233
235
if ctx .Err () != nil {
234
236
s .compactBarrier (ctx , ch )
235
237
return
236
238
}
239
+ tx := s .b .ReadTx ()
240
+ tx .RLock ()
241
+ finishedCompact , _ := UnsafeReadFinishedCompact (tx )
242
+ tx .RUnlock ()
237
243
hash , err := s .scheduleCompaction (rev , prevCompactRev )
238
244
if err != nil {
239
245
s .lg .Warn ("Failed compaction" , zap .Error (err ))
@@ -242,7 +248,7 @@ func (s *store) compact(trace *traceutil.Trace, rev, prevCompactRev int64, prevC
242
248
}
243
249
// Only store the hash value if the previous hash is completed, i.e. this compaction
244
250
// hashes every revision from last compaction. For more details, see #15919.
245
- if prevCompactionCompleted {
251
+ if finishedCompact == prevCompactRev {
246
252
s .hashes .Store (hash )
247
253
} else {
248
254
s .lg .Info ("previous compaction was interrupted, skip storing compaction hash value" )
@@ -256,18 +262,16 @@ func (s *store) compact(trace *traceutil.Trace, rev, prevCompactRev int64, prevC
256
262
}
257
263
258
264
func (s * store ) compactLockfree (rev int64 ) (<- chan struct {}, error ) {
259
- prevCompactionCompleted := s .checkPrevCompactionCompleted ()
260
265
ch , prevCompactRev , err := s .updateCompactRev (rev )
261
266
if err != nil {
262
267
return ch , err
263
268
}
264
269
265
- return s .compact (traceutil .TODO (), rev , prevCompactRev , prevCompactionCompleted ), nil
270
+ return s .compact (traceutil .TODO (), rev , prevCompactRev ), nil
266
271
}
267
272
268
273
func (s * store ) Compact (trace * traceutil.Trace , rev int64 ) (<- chan struct {}, error ) {
269
274
s .mu .Lock ()
270
- prevCompactionCompleted := s .checkPrevCompactionCompleted ()
271
275
ch , prevCompactRev , err := s .updateCompactRev (rev )
272
276
trace .Step ("check and update compact revision" )
273
277
if err != nil {
@@ -276,7 +280,7 @@ func (s *store) Compact(trace *traceutil.Trace, rev int64) (<-chan struct{}, err
276
280
}
277
281
s .mu .Unlock ()
278
282
279
- return s .compact (trace , rev , prevCompactRev , prevCompactionCompleted ), nil
283
+ return s .compact (trace , rev , prevCompactRev ), nil
280
284
}
281
285
282
286
func (s * store ) Commit () {
0 commit comments