1
1
package rosedb
2
2
3
3
import (
4
- "bytes"
5
4
"context"
6
5
"errors"
7
6
"fmt"
@@ -354,11 +353,10 @@ func (db *DB) Ascend(handleFn func(k []byte, v []byte) (bool, error)) {
354
353
if err != nil {
355
354
return false , err
356
355
}
357
- value , err := db .checkValue (chunk )
358
- if err != nil {
359
- return false , err
356
+ if value := db .checkValue (chunk ); value != nil {
357
+ return handleFn (key , value )
360
358
}
361
- return handleFn ( key , value )
359
+ return true , nil
362
360
})
363
361
}
364
362
@@ -372,11 +370,10 @@ func (db *DB) AscendRange(startKey, endKey []byte, handleFn func(k []byte, v []b
372
370
if err != nil {
373
371
return false , nil
374
372
}
375
- value , err := db .checkValue (chunk )
376
- if err != nil {
377
- return false , err
373
+ if value := db .checkValue (chunk ); value != nil {
374
+ return handleFn (key , value )
378
375
}
379
- return handleFn ( key , value )
376
+ return true , nil
380
377
})
381
378
}
382
379
@@ -390,11 +387,10 @@ func (db *DB) AscendGreaterOrEqual(key []byte, handleFn func(k []byte, v []byte)
390
387
if err != nil {
391
388
return false , nil
392
389
}
393
- value , err := db .checkValue (chunk )
394
- if err != nil {
395
- return false , err
390
+ if value := db .checkValue (chunk ); value != nil {
391
+ return handleFn (key , value )
396
392
}
397
- return handleFn ( key , value )
393
+ return true , nil
398
394
})
399
395
}
400
396
@@ -426,11 +422,10 @@ func (db *DB) Descend(handleFn func(k []byte, v []byte) (bool, error)) {
426
422
if err != nil {
427
423
return false , nil
428
424
}
429
- value , err := db .checkValue (chunk )
430
- if err != nil {
431
- return false , err
425
+ if value := db .checkValue (chunk ); value != nil {
426
+ return handleFn (key , value )
432
427
}
433
- return handleFn ( key , value )
428
+ return true , nil
434
429
})
435
430
}
436
431
@@ -444,11 +439,10 @@ func (db *DB) DescendRange(startKey, endKey []byte, handleFn func(k []byte, v []
444
439
if err != nil {
445
440
return false , nil
446
441
}
447
- value , err := db .checkValue (chunk )
448
- if err != nil {
449
- return false , err
442
+ if value := db .checkValue (chunk ); value != nil {
443
+ return handleFn (key , value )
450
444
}
451
- return handleFn ( key , value )
445
+ return true , nil
452
446
})
453
447
}
454
448
@@ -462,11 +456,10 @@ func (db *DB) DescendLessOrEqual(key []byte, handleFn func(k []byte, v []byte) (
462
456
if err != nil {
463
457
return false , nil
464
458
}
465
- value , err := db .checkValue (chunk )
466
- if err != nil {
467
- return false , err
459
+ if value := db .checkValue (chunk ); value != nil {
460
+ return handleFn (key , value )
468
461
}
469
- return handleFn ( key , value )
462
+ return true , nil
470
463
})
471
464
}
472
465
@@ -488,13 +481,13 @@ func (db *DB) DescendKeys(pattern []byte, handleFn func(k []byte) (bool, error))
488
481
})
489
482
}
490
483
491
- func (db * DB ) checkValue (chunk []byte ) ( []byte , error ) {
484
+ func (db * DB ) checkValue (chunk []byte ) []byte {
492
485
record := decodeLogRecord (chunk )
493
486
now := time .Now ().UnixNano ()
494
- if record .Type == LogRecordDeleted || record .IsExpired (now ) {
495
- return nil , ErrKeyNotFound
487
+ if record .Type != LogRecordDeleted && ! record .IsExpired (now ) {
488
+ return record . Value
496
489
}
497
- return record . Value , nil
490
+ return nil
498
491
}
499
492
500
493
func checkOptions (options Options ) error {
@@ -585,21 +578,18 @@ func (db *DB) DeleteExpiredKeys(timeout time.Duration) error {
585
578
db .mu .Lock ()
586
579
defer db .mu .Unlock ()
587
580
588
- // set expiration time
581
+ // set timeout
589
582
ctx , cancel := context .WithTimeout (context .Background (), timeout )
590
583
defer cancel ()
584
+ done := make (chan struct {}, 1 )
591
585
592
- innerErrs := make ([] error , 0 ) // record anonymous func error
586
+ var innerErr error
593
587
now := time .Now ().UnixNano ()
594
588
go func (ctx context.Context ) {
595
589
for {
596
- // get 100 key's positions
590
+ // select 100 keys from the db.index
597
591
positions := make ([]* wal.ChunkPosition , 0 , 100 )
598
592
db .index .AscendGreaterOrEqual (db .expiredCursorKey , func (k []byte , pos * wal.ChunkPosition ) (bool , error ) {
599
- // filter processed key
600
- if bytes .Compare (k , db .expiredCursorKey ) == 0 {
601
- return true , nil
602
- }
603
593
positions = append (positions , pos )
604
594
if len (positions ) >= 100 {
605
595
return false , nil
@@ -610,14 +600,16 @@ func (db *DB) DeleteExpiredKeys(timeout time.Duration) error {
610
600
// If keys in the db.index has been traversed, len(positions) will be 0.
611
601
if len (positions ) == 0 {
612
602
db .expiredCursorKey = nil
603
+ done <- struct {}{}
613
604
return
614
605
}
615
606
616
607
// delete from index if the key is expired.
617
608
for _ , pos := range positions {
618
609
chunk , err := db .dataFiles .Read (pos )
619
610
if err != nil {
620
- innerErrs = append (innerErrs , err )
611
+ innerErr = err
612
+ done <- struct {}{}
621
613
return
622
614
}
623
615
record := decodeLogRecord (chunk )
@@ -631,9 +623,8 @@ func (db *DB) DeleteExpiredKeys(timeout time.Duration) error {
631
623
632
624
select {
633
625
case <- ctx .Done ():
634
- if len (innerErrs ) > 0 {
635
- return innerErrs [0 ]
636
- }
626
+ return innerErr
627
+ case <- done :
637
628
return nil
638
629
}
639
630
}
0 commit comments