@@ -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
@@ -269,40 +265,18 @@ func (f *Active) String() string {
269265}
270266
271267func (f * Active ) Fetch (ctx context.Context , ids []seq.ID ) ([][]byte , error ) {
272- dp , release := f .DataProvider (ctx )
273- defer release ()
274- if dp == nil {
275- return EmptyFraction .Fetch (ctx , ids )
268+ if f .Info ().DocsTotal == 0 { // it is empty active fraction state
269+ return nil , nil
276270 }
277- return dp .Fetch (ids )
271+ return f . createDataProvider ( ctx ) .Fetch (ids )
278272}
279273
280274func (f * Active ) Search (ctx context.Context , params processor.SearchParams ) (* seq.QPR , error ) {
281- dp , release := f .DataProvider (ctx )
282- defer release ()
283- if dp == nil {
284- return EmptyFraction .Search (ctx , params )
285- }
286- return dp .Search (params )
287- }
288-
289- func (f * Active ) DataProvider (ctx context.Context ) (* activeDataProvider , func ()) {
290- f .useMu .RLock ()
291-
292- if f .suicided || f .released || f .Info ().DocsTotal == 0 { // it is empty active fraction state
293- if f .suicided {
294- metric .CountersTotal .WithLabelValues ("fraction_suicided" ).Inc ()
295- }
296- f .useMu .RUnlock ()
297- return nil , func () {}
298- }
299-
300- // it is ordinary active fraction state
301- dp := f .createDataProvider (ctx )
302- return dp , func () {
303- dp .release ()
304- f .useMu .RUnlock ()
275+ if f .Info ().DocsTotal == 0 { // it is empty active fraction state
276+ metric .CountersTotal .WithLabelValues ("empty_data_provider" ).Inc ()
277+ return & seq.QPR {Aggs : make ([]seq.AggregatableSamples , len (params .AggQ ))}, nil
305278 }
279+ return f .createDataProvider (ctx ).Search (params )
306280}
307281
308282func (f * Active ) createDataProvider (ctx context.Context ) * activeDataProvider {
@@ -338,10 +312,6 @@ func (f *Active) IsIntersecting(from, to seq.MID) bool {
338312}
339313
340314func (f * Active ) Release () {
341- f .useMu .Lock ()
342- f .released = true
343- f .useMu .Unlock ()
344-
345315 f .releaseMem ()
346316
347317 if ! f .Config .KeepMetaFile {
@@ -354,33 +324,11 @@ func (f *Active) Release() {
354324 }
355325}
356326
357- // Offload for [Active] fraction is no-op.
358- //
359- // Since search within [Active] fraction is too costly (we have to replay the whole index in memory),
360- // we decided to support offloading only for [Sealed] fractions.
361- func (f * Active ) Offload (context.Context , storage.Uploader ) (bool , error ) {
362- return false , nil
363- }
364-
365327func (f * Active ) Suicide () {
366- f .useMu .Lock ()
367- released := f .released
368- f .suicided = true
369- f .released = true
370- f .useMu .Unlock ()
371-
372- if released { // fraction can be suicided after release
373- if f .Config .KeepMetaFile {
374- f .removeMetaFile () // meta was not removed while release
375- }
376- if f .Config .SkipSortDocs {
377- f .removeDocsFiles () // docs was not removed while release
378- }
379- } else { // was not release
380- f .releaseMem ()
381- f .removeMetaFile ()
382- f .removeDocsFiles ()
383- }
328+ f .releaseMem ()
329+ f .removeMetaFile ()
330+ f .removeDocsFiles ()
331+ f .removeSdocsFiles ()
384332}
385333
386334func (f * Active ) releaseMem () {
@@ -393,6 +341,9 @@ func (f *Active) releaseMem() {
393341 if err := f .metaFile .Close (); err != nil {
394342 logger .Error ("can't close meta file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
395343 }
344+ if err := f .docsFile .Close (); err != nil {
345+ logger .Error ("can't close docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
346+ }
396347
397348 f .RIDs = nil
398349 f .MIDs = nil
@@ -401,14 +352,18 @@ func (f *Active) releaseMem() {
401352}
402353
403354func (f * Active ) removeDocsFiles () {
404- if err := f .docsFile .Close (); err != nil {
405- logger .Error ("can't close docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
406- }
407355 if err := os .Remove (f .docsFile .Name ()); err != nil {
408356 logger .Error ("can't delete docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
409357 }
410358}
411359
360+ func (f * Active ) removeSdocsFiles () {
361+ name := f .BaseFileName + consts .SdocsFileSuffix
362+ if err := os .Remove (name ); err != nil && ! os .IsNotExist (err ) {
363+ logger .Error ("can't delete docs file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
364+ }
365+ }
366+
412367func (f * Active ) removeMetaFile () {
413368 if err := os .Remove (f .metaFile .Name ()); err != nil {
414369 logger .Error ("can't delete metas file" , zap .String ("frac" , f .BaseFileName ), zap .Error (err ))
0 commit comments