@@ -35,10 +35,6 @@ type Active struct {
3535
3636 BaseFileName string
3737
38- useMu sync.RWMutex
39- suicided bool
40- released bool
41-
4238 infoMu sync.RWMutex
4339 info * common.Info
4440
@@ -270,40 +266,26 @@ func (f *Active) String() string {
270266}
271267
272268func (f * Active ) Fetch (ctx context.Context , ids []seq.ID ) ([][]byte , error ) {
273- dp , release := f .DataProvider (ctx )
274- defer release ()
275- if dp == nil {
276- return EmptyFraction .Fetch (ctx , ids )
269+ if f .Info ().DocsTotal == 0 { // it is empty active fraction state
270+ return nil , nil
277271 }
272+
273+ dp := f .createDataProvider (ctx )
274+ defer dp .release ()
275+
278276 return dp .Fetch (ids )
279277}
280278
281279func (f * Active ) Search (ctx context.Context , params processor.SearchParams ) (* seq.QPR , error ) {
282- dp , release := f .DataProvider (ctx )
283- defer release ()
284- if dp == nil {
285- return EmptyFraction .Search (ctx , params )
280+ if f .Info ().DocsTotal == 0 { // it is empty active fraction state
281+ metric .CountersTotal .WithLabelValues ("empty_data_provider" ).Inc ()
282+ return & seq.QPR {Aggs : make ([]seq.AggregatableSamples , len (params .AggQ ))}, nil
286283 }
287- return dp .Search (params )
288- }
289-
290- func (f * Active ) DataProvider (ctx context.Context ) (* activeDataProvider , func ()) {
291- f .useMu .RLock ()
292284
293- if f .suicided || f .released || f .Info ().DocsTotal == 0 { // it is empty active fraction state
294- if f .suicided {
295- metric .CountersTotal .WithLabelValues ("fraction_suicided" ).Inc ()
296- }
297- f .useMu .RUnlock ()
298- return nil , func () {}
299- }
300-
301- // it is ordinary active fraction state
302285 dp := f .createDataProvider (ctx )
303- return dp , func () {
304- dp .release ()
305- f .useMu .RUnlock ()
306- }
286+ defer dp .release ()
287+
288+ return dp .Search (params )
307289}
308290
309291func (f * Active ) createDataProvider (ctx context.Context ) * activeDataProvider {
@@ -339,49 +321,24 @@ func (f *Active) IsIntersecting(from, to seq.MID) bool {
339321}
340322
341323func (f * Active ) Release () {
342- f .useMu .Lock ()
343- f .released = true
344- f .useMu .Unlock ()
345-
346324 f .releaseMem ()
347325
348326 if ! f .Config .KeepMetaFile {
349- f . removeMetaFile ( )
327+ util . RemoveFile ( f . metaFile . Name () )
350328 }
351329
352330 if ! f .Config .SkipSortDocs {
353331 // we use sorted docs in sealed fraction so we can remove original docs of active fraction
354- f . removeDocsFiles ( )
332+ util . RemoveFile ( f . docsFile . Name () )
355333 }
356334}
357335
358- // Offload for [Active] fraction is no-op.
359- //
360- // Since search within [Active] fraction is too costly (we have to replay the whole index in memory),
361- // we decided to support offloading only for [Sealed] fractions.
362- func (f * Active ) Offload (context.Context , storage.Uploader ) (bool , error ) {
363- return false , nil
364- }
365-
366336func (f * Active ) Suicide () {
367- f .useMu .Lock ()
368- released := f .released
369- f .suicided = true
370- f .released = true
371- f .useMu .Unlock ()
372-
373- if released { // fraction can be suicided after release
374- if f .Config .KeepMetaFile {
375- f .removeMetaFile () // meta was not removed while release
376- }
377- if f .Config .SkipSortDocs {
378- f .removeDocsFiles () // docs was not removed while release
379- }
380- } else { // was not release
381- f .releaseMem ()
382- f .removeMetaFile ()
383- f .removeDocsFiles ()
384- }
337+ f .releaseMem ()
338+
339+ util .RemoveFile (f .metaFile .Name ())
340+ util .RemoveFile (f .docsFile .Name ())
341+ util .RemoveFile (f .BaseFileName + consts .SdocsFileSuffix )
385342}
386343
387344func (f * Active ) releaseMem () {
@@ -394,24 +351,12 @@ func (f *Active) releaseMem() {
394351 if err := f .metaFile .Close (); err != nil {
395352 logger .Error ("can't close meta file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
396353 }
354+ if err := f .docsFile .Close (); err != nil {
355+ logger .Error ("can't close docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
356+ }
397357
398358 f .RIDs = nil
399359 f .MIDs = nil
400360 f .TokenList = nil
401361 f .DocsPositions = nil
402362}
403-
404- func (f * Active ) removeDocsFiles () {
405- if err := f .docsFile .Close (); err != nil {
406- logger .Error ("can't close docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
407- }
408- if err := os .Remove (f .docsFile .Name ()); err != nil {
409- logger .Error ("can't delete docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
410- }
411- }
412-
413- func (f * Active ) removeMetaFile () {
414- if err := os .Remove (f .metaFile .Name ()); err != nil {
415- logger .Error ("can't delete metas file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
416- }
417- }
0 commit comments