@@ -142,6 +142,10 @@ type Bucket struct {
142142 // introduces latency of segment availability, for the tradeoff of
143143 // ensuring segment files have integrity before reading them.
144144 enableChecksumValidation bool
145+
146+ // keep segments in memory for more performant search
147+ // (currently used by roaringsetrange inverted indexes)
148+ keepSegmentsInMemory bool
145149}
146150
147151func NewBucketCreator () * Bucket { return & Bucket {} }
@@ -205,6 +209,7 @@ func (*Bucket) NewBucket(ctx context.Context, dir, rootDir string, logger logrus
205209 maxSegmentSize : b .maxSegmentSize ,
206210 cleanupInterval : b .segmentsCleanupInterval ,
207211 enableChecksumValidation : b .enableChecksumValidation ,
212+ keepSegmentsInMemory : b .keepSegmentsInMemory ,
208213 }, b .allocChecker )
209214 if err != nil {
210215 return nil , fmt .Errorf ("init disk segments: %w" , err )
@@ -1343,23 +1348,34 @@ func (b *Bucket) FlushAndSwitch() error {
13431348 return fmt .Errorf ("precompute metadata: %w" , err )
13441349 }
13451350
1351+ flushing := b .flushing
13461352 if err := b .atomicallyAddDiskSegmentAndRemoveFlushing (segment ); err != nil {
13471353 return fmt .Errorf ("add segment and remove flushing: %w" , err )
13481354 }
13491355
1350- if b .strategy == StrategyInverted && ! tombstones .IsEmpty () {
1351- if err = func () error {
1352- b .disk .maintenanceLock .RLock ()
1353- defer b .disk .maintenanceLock .RUnlock ()
1354- // add flushing memtable tombstones to all segments
1355- for _ , seg := range b .disk .segments {
1356- if _ , err := seg .MergeTombstones (tombstones ); err != nil {
1357- return fmt .Errorf ("merge tombstones: %w" , err )
1356+ switch b .strategy {
1357+ case StrategyInverted :
1358+ if ! tombstones .IsEmpty () {
1359+ if err = func () error {
1360+ b .disk .maintenanceLock .RLock ()
1361+ defer b .disk .maintenanceLock .RUnlock ()
1362+ // add flushing memtable tombstones to all segments
1363+ for _ , seg := range b .disk .segments {
1364+ if _ , err := seg .MergeTombstones (tombstones ); err != nil {
1365+ return fmt .Errorf ("merge tombstones: %w" , err )
1366+ }
13581367 }
1368+ return nil
1369+ }(); err != nil {
1370+ return fmt .Errorf ("add tombstones: %w" , err )
1371+ }
1372+ }
1373+
1374+ case StrategyRoaringSetRange :
1375+ if b .keepSegmentsInMemory {
1376+ if err := b .disk .roaringSetRangeSegmentInMemory .MergeMemtable (flushing .roaringSetRange ); err != nil {
1377+ return fmt .Errorf ("merge roaringsetrange memtable to segment-in-memory: %w" , err )
13591378 }
1360- return nil
1361- }(); err != nil {
1362- return fmt .Errorf ("add tombstones: %w" , err )
13631379 }
13641380 }
13651381
0 commit comments