@@ -29,26 +29,17 @@ import (
2929type provider struct {
3030 st Settings
3131
32- fsDir vfs.File
33-
3432 tracer * objiotracing.Tracer
3533
34+ local localSubsystem
3635 remote remoteSubsystem
3736
3837 mu struct {
3938 sync.RWMutex
4039
40+ local localLockedState
4141 remote remoteLockedState
4242
43- // TODO(radu): move these fields to a localLockedState struct.
44- // localObjectsChanged is incremented whenever non-remote objects are created.
45- // The purpose of this counter is to avoid syncing the local filesystem when
46- // only remote objects are changed.
47- localObjectsChangeCounter uint64
48- // localObjectsChangeCounterSynced is the value of localObjectsChangeCounter
49- // value at the time the last completed sync was launched.
50- localObjectsChangeCounterSynced uint64
51-
5243 // knownObjects maintains information about objects that are known to the provider.
5344 // It is initialized with the list of files in the manifest when we open a DB.
5445 knownObjects map [base.DiskFileNum ]objstorage.ObjectMetadata
@@ -229,24 +220,12 @@ func Open(settings Settings) (objstorage.Provider, error) {
229220}
230221
231222func open (settings Settings ) (p * provider , _ error ) {
232- fsDir , err := settings .FS .OpenDir (settings .FSDirName )
233- if err != nil {
234- return nil , err
235- }
236-
237- defer func () {
238- if p == nil {
239- fsDir .Close ()
240- }
241- }()
242-
243223 if settings .Local .ReadaheadConfig == nil {
244224 settings .Local .ReadaheadConfig = NewReadaheadConfig ()
245225 }
246226
247227 p = & provider {
248- st : settings ,
249- fsDir : fsDir ,
228+ st : settings ,
250229 }
251230 p .mu .knownObjects = make (map [base.DiskFileNum ]objstorage.ObjectMetadata )
252231 p .mu .protectedObjects = make (map [base.DiskFileNum ]int )
@@ -255,13 +234,14 @@ func open(settings Settings) (p *provider, _ error) {
255234 p .tracer = objiotracing .Open (settings .FS , settings .FSDirName )
256235 }
257236
258- // Add local FS objects.
259- if err := p .vfsInit (); err != nil {
237+ // Initialize local subsystem and add local vfs. FS objects.
238+ if err := p .localInit (); err != nil {
260239 return nil , err
261240 }
262241
263242 // Initialize remote subsystem (if configured) and add remote objects.
264243 if err := p .remoteInit (); err != nil {
244+ _ = p .localClose ()
265245 return nil , err
266246 }
267247
@@ -271,10 +251,7 @@ func open(settings Settings) (p *provider, _ error) {
271251// Close is part of the objstorage.Provider interface.
272252func (p * provider ) Close () error {
273253 err := p .sharedClose ()
274- if p .fsDir != nil {
275- err = firstError (err , p .fsDir .Close ())
276- p .fsDir = nil
277- }
254+ err = firstError (err , p .localClose ())
278255 if objiotracing .Enabled {
279256 if p .tracer != nil {
280257 p .tracer .Close ()
@@ -301,7 +278,7 @@ func (p *provider) OpenForReading(
301278
302279 var r objstorage.Readable
303280 if ! meta .IsRemote () {
304- r , err = p .vfsOpenForReading (ctx , fileType , fileNum , opts )
281+ r , err = p .localOpenForReading (ctx , fileType , fileNum , opts )
305282 } else {
306283 r , err = p .remoteOpenForReading (ctx , meta , opts )
307284 if err != nil && p .isNotExistError (meta , err ) {
@@ -365,7 +342,7 @@ func (p *provider) Remove(fileType base.FileType, fileNum base.DiskFileNum) erro
365342 }
366343
367344 if ! meta .IsRemote () {
368- err = p .vfsRemove (fileType , fileNum )
345+ err = p .localRemove (fileType , fileNum )
369346 } else {
370347 // TODO(radu): implement remote object removal (i.e. deref).
371348 err = p .sharedUnref (meta )
@@ -401,7 +378,7 @@ func (p *provider) IsNotExistError(err error) bool {
401378
402379// Sync flushes the metadata from creation or removal of objects since the last Sync.
403380func (p * provider ) Sync () error {
404- if err := p .vfsSync (); err != nil {
381+ if err := p .localSync (); err != nil {
405382 return err
406383 }
407384 if err := p .sharedSync (); err != nil {
@@ -432,7 +409,7 @@ func (p *provider) LinkOrCopyFromLocal(
432409 NoSyncOnClose : p .st .NoSyncOnClose ,
433410 BytesPerSync : p .st .BytesPerSync ,
434411 })
435- dstPath := p .vfsPath (dstFileType , dstFileNum )
412+ dstPath := p .localPath (dstFileType , dstFileNum )
436413 if err := vfs .LinkOrCopy (fs , srcFilePath , dstPath ); err != nil {
437414 return objstorage.ObjectMetadata {}, err
438415 }
@@ -505,15 +482,15 @@ func (p *provider) Lookup(
505482// Path is part of the objstorage.Provider interface.
506483func (p * provider ) Path (meta objstorage.ObjectMetadata ) string {
507484 if ! meta .IsRemote () {
508- return p .vfsPath (meta .FileType , meta .DiskFileNum )
485+ return p .localPath (meta .FileType , meta .DiskFileNum )
509486 }
510487 return p .remotePath (meta )
511488}
512489
513490// Size returns the size of the object.
514491func (p * provider ) Size (meta objstorage.ObjectMetadata ) (int64 , error ) {
515492 if ! meta .IsRemote () {
516- return p .vfsSize (meta .FileType , meta .DiskFileNum )
493+ return p .localSize (meta .FileType , meta .DiskFileNum )
517494 }
518495 return p .remoteSize (meta )
519496}
@@ -587,7 +564,7 @@ func (p *provider) addMetadataLocked(meta objstorage.ObjectMetadata) {
587564 p .mu .remote .addExternalObject (meta )
588565 }
589566 } else {
590- p .mu .localObjectsChangeCounter ++
567+ p .mu .local . objChangeCounter ++
591568 }
592569}
593570
@@ -606,7 +583,7 @@ func (p *provider) removeMetadata(fileNum base.DiskFileNum) {
606583 if meta .IsRemote () {
607584 p .mu .remote .catalogBatch .DeleteObject (fileNum )
608585 } else {
609- p .mu .localObjectsChangeCounter ++
586+ p .mu .local . objChangeCounter ++
610587 }
611588}
612589
0 commit comments