storage/filestore: Monitor when we open files in trash
Change-Id: I817bf8349c2e1ba55e1490f06162af1099bebdb0
This commit is contained in:
parent
756b9b9e2b
commit
a6235d3962
@ -61,6 +61,7 @@ storj.io/storj/satellite/repair/checker."remote_segments_lost" IntVal
|
|||||||
storj.io/storj/satellite/repair/checker."remote_segments_needing_repair" IntVal
|
storj.io/storj/satellite/repair/checker."remote_segments_needing_repair" IntVal
|
||||||
storj.io/storj/satellite/satellitedb."audit_reputation_alpha" FloatVal
|
storj.io/storj/satellite/satellitedb."audit_reputation_alpha" FloatVal
|
||||||
storj.io/storj/satellite/satellitedb."audit_reputation_beta" FloatVal
|
storj.io/storj/satellite/satellitedb."audit_reputation_beta" FloatVal
|
||||||
|
storj.io/storj/storage/filestore."open_file_in_trash" Meter
|
||||||
storj.io/storj/storagenode/contact."satellite_contact_request" Meter
|
storj.io/storj/storagenode/contact."satellite_contact_request" Meter
|
||||||
storj.io/storj/storagenode/gracefulexit."satellite_gracefulexit_request" Meter
|
storj.io/storj/storagenode/gracefulexit."satellite_gracefulexit_request" Meter
|
||||||
storj.io/storj/storagenode/monitor."allocated_bandwidth" IntVal
|
storj.io/storj/storagenode/monitor."allocated_bandwidth" IntVal
|
||||||
|
@ -121,6 +121,18 @@ func (dir *Dir) refToDirPath(ref storage.BlobRef, subDir string) (string, error)
|
|||||||
return filepath.Join(subDir, namespace, key[:2], key[2:]), nil
|
return filepath.Join(subDir, namespace, key[:2], key[2:]), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// fileConfirmedInTrash returns true if it is able to confirm the file is in
|
||||||
|
// the trash. On errors, or if the file is not in the trash, it returns false.
|
||||||
|
func (dir *Dir) fileConfirmedInTrash(ctx context.Context, ref storage.BlobRef, formatVer storage.FormatVersion) bool {
|
||||||
|
trashBasePath, err := dir.refToDirPath(ref, dir.trashdir())
|
||||||
|
if err != nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
trashVerPath := blobPathForFormatVersion(trashBasePath, formatVer)
|
||||||
|
_, err = os.Stat(trashVerPath)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
// blobPathForFormatVersion adjusts a bare blob path (as might have been generated by a call to
|
// blobPathForFormatVersion adjusts a bare blob path (as might have been generated by a call to
|
||||||
// blobToBasePath()) to what it should be for the given storage format version.
|
// blobToBasePath()) to what it should be for the given storage format version.
|
||||||
func blobPathForFormatVersion(path string, formatVersion storage.FormatVersion) string {
|
func blobPathForFormatVersion(path string, formatVersion storage.FormatVersion) string {
|
||||||
@ -199,7 +211,12 @@ func (dir *Dir) Open(ctx context.Context, ref storage.BlobRef) (_ *os.File, _ st
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
return file, formatVer, nil
|
return file, formatVer, nil
|
||||||
}
|
}
|
||||||
if !os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
// Check and monitor if the file is in the trash
|
||||||
|
if dir.fileConfirmedInTrash(ctx, ref, formatVer) {
|
||||||
|
monFileInTrash.Mark(1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
return nil, FormatV0, Error.New("unable to open %q: %v", vPath, err)
|
return nil, FormatV0, Error.New("unable to open %q: %v", vPath, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -208,9 +225,9 @@ func (dir *Dir) Open(ctx context.Context, ref storage.BlobRef) (_ *os.File, _ st
|
|||||||
|
|
||||||
// OpenWithStorageFormat opens an already-located blob file with a known storage format version,
|
// OpenWithStorageFormat opens an already-located blob file with a known storage format version,
|
||||||
// which avoids the potential need to search through multiple storage formats to find the blob.
|
// which avoids the potential need to search through multiple storage formats to find the blob.
|
||||||
func (dir *Dir) OpenWithStorageFormat(ctx context.Context, blobRef storage.BlobRef, formatVer storage.FormatVersion) (_ *os.File, err error) {
|
func (dir *Dir) OpenWithStorageFormat(ctx context.Context, ref storage.BlobRef, formatVer storage.FormatVersion) (_ *os.File, err error) {
|
||||||
defer mon.Task()(&ctx)(&err)
|
defer mon.Task()(&ctx)(&err)
|
||||||
path, err := dir.blobToBasePath(blobRef)
|
path, err := dir.blobToBasePath(ref)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -220,6 +237,10 @@ func (dir *Dir) OpenWithStorageFormat(ctx context.Context, blobRef storage.BlobR
|
|||||||
return file, nil
|
return file, nil
|
||||||
}
|
}
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
|
// Check and monitor if the file is in the trash
|
||||||
|
if dir.fileConfirmedInTrash(ctx, ref, formatVer) {
|
||||||
|
monFileInTrash.Mark(1)
|
||||||
|
}
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return nil, Error.New("unable to open %q: %v", vPath, err)
|
return nil, Error.New("unable to open %q: %v", vPath, err)
|
||||||
|
@ -19,7 +19,8 @@ var (
|
|||||||
// Error is the default filestore error class
|
// Error is the default filestore error class
|
||||||
Error = errs.Class("filestore error")
|
Error = errs.Class("filestore error")
|
||||||
|
|
||||||
mon = monkit.Package()
|
mon = monkit.Package()
|
||||||
|
monFileInTrash = mon.Meter("open_file_in_trash") //locked
|
||||||
|
|
||||||
_ storage.Blobs = (*blobStore)(nil)
|
_ storage.Blobs = (*blobStore)(nil)
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user