refactor torrent
This commit is contained in:
parent
99cdd5471e
commit
991c15fdef
33 changed files with 223 additions and 275 deletions
src/host/vfs
|
@ -21,7 +21,7 @@ import (
|
|||
|
||||
type ResolverFS struct {
|
||||
rootFS Filesystem
|
||||
resolver *resolver
|
||||
resolver *Resolver
|
||||
|
||||
log *rlog.Logger
|
||||
}
|
||||
|
@ -29,7 +29,7 @@ type ResolverFS struct {
|
|||
func NewResolveFS(rootFs Filesystem, factories map[string]FsFactory) *ResolverFS {
|
||||
return &ResolverFS{
|
||||
rootFS: rootFs,
|
||||
resolver: newResolver(factories),
|
||||
resolver: NewResolver(factories),
|
||||
log: rlog.Component("fs.resolverfs"),
|
||||
}
|
||||
}
|
||||
|
@ -77,10 +77,10 @@ func (r *ResolverFS) Open(ctx context.Context, filename string) (File, error) {
|
|||
defer span.End()
|
||||
|
||||
if path.Clean(filename) == Separator {
|
||||
return newDirFile(r.Name()), nil
|
||||
return NewDirFile(r.Name()), nil
|
||||
}
|
||||
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(ctx, filename, r.rootFS.Open)
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.ResolvePath(ctx, filename, r.rootFS.Open)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ func (r *ResolverFS) ReadDir(ctx context.Context, dir string) ([]fs.DirEntry, er
|
|||
)
|
||||
defer span.End()
|
||||
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(ctx, dir, r.rootFS.Open)
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.ResolvePath(ctx, dir, r.rootFS.Open)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ func (r *ResolverFS) ReadDir(ctx context.Context, dir string) ([]fs.DirEntry, er
|
|||
}
|
||||
out := make([]fs.DirEntry, 0, len(entries))
|
||||
for _, e := range entries {
|
||||
if r.resolver.isNestedFs(e.Name()) {
|
||||
if r.resolver.IsNestedFs(e.Name()) {
|
||||
filepath := path.Join("/", dir, e.Name())
|
||||
file, err := r.Open(ctx, filepath)
|
||||
if err != nil {
|
||||
|
@ -123,7 +123,7 @@ func (r *ResolverFS) ReadDir(ctx context.Context, dir string) ([]fs.DirEntry, er
|
|||
err = func() error {
|
||||
factoryCtx, cancel := subTimeout(ctx)
|
||||
defer cancel()
|
||||
nestedfs, err := r.resolver.nestedFs(factoryCtx, filepath, file)
|
||||
nestedfs, err := r.resolver.NestedFs(factoryCtx, filepath, file)
|
||||
if err != nil {
|
||||
if errors.Is(err, context.DeadlineExceeded) {
|
||||
r.log.Error(ctx, "creating fs timed out",
|
||||
|
@ -155,11 +155,11 @@ func (r *ResolverFS) Stat(ctx context.Context, filename string) (fs.FileInfo, er
|
|||
)
|
||||
defer span.End()
|
||||
|
||||
if isRoot(filename) {
|
||||
if IsRoot(filename) {
|
||||
return r, nil
|
||||
}
|
||||
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(ctx, filename, r.rootFS.Open)
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.ResolvePath(ctx, filename, r.rootFS.Open)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -175,7 +175,7 @@ func (r *ResolverFS) Stat(ctx context.Context, filename string) (fs.FileInfo, er
|
|||
|
||||
// Unlink implements Filesystem.
|
||||
func (r *ResolverFS) Unlink(ctx context.Context, filename string) error {
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.resolvePath(ctx, filename, r.rootFS.Open)
|
||||
fsPath, nestedFs, nestedFsPath, err := r.resolver.ResolvePath(ctx, filename, r.rootFS.Open)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -210,14 +210,14 @@ var _ Filesystem = &ResolverFS{}
|
|||
|
||||
type FsFactory func(ctx context.Context, f File) (Filesystem, error)
|
||||
|
||||
func newResolver(factories map[string]FsFactory) *resolver {
|
||||
return &resolver{
|
||||
func NewResolver(factories map[string]FsFactory) *Resolver {
|
||||
return &Resolver{
|
||||
factories: factories,
|
||||
fsmap: map[string]Filesystem{},
|
||||
}
|
||||
}
|
||||
|
||||
type resolver struct {
|
||||
type Resolver struct {
|
||||
m sync.Mutex
|
||||
factories map[string]FsFactory
|
||||
fsmap map[string]Filesystem // filesystem cache
|
||||
|
@ -226,7 +226,7 @@ type resolver struct {
|
|||
|
||||
type openFile func(ctx context.Context, path string) (File, error)
|
||||
|
||||
func (r *resolver) isNestedFs(f string) bool {
|
||||
func (r *Resolver) IsNestedFs(f string) bool {
|
||||
for ext := range r.factories {
|
||||
if strings.HasSuffix(f, ext) {
|
||||
return true
|
||||
|
@ -235,7 +235,7 @@ func (r *resolver) isNestedFs(f string) bool {
|
|||
return false
|
||||
}
|
||||
|
||||
func (r *resolver) nestedFs(ctx context.Context, fsPath string, file File) (Filesystem, error) {
|
||||
func (r *Resolver) NestedFs(ctx context.Context, fsPath string, file File) (Filesystem, error) {
|
||||
for ext, nestFactory := range r.factories {
|
||||
if !strings.HasSuffix(fsPath, ext) {
|
||||
continue
|
||||
|
@ -258,7 +258,7 @@ func (r *resolver) nestedFs(ctx context.Context, fsPath string, file File) (File
|
|||
}
|
||||
|
||||
// open requeue raw open, without resolver call
|
||||
func (r *resolver) resolvePath(ctx context.Context, name string, rawOpen openFile) (fsPath string, nestedFs Filesystem, nestedFsPath string, err error) {
|
||||
func (r *Resolver) ResolvePath(ctx context.Context, name string, rawOpen openFile) (fsPath string, nestedFs Filesystem, nestedFsPath string, err error) {
|
||||
ctx, span := tracer.Start(ctx, "resolvePath")
|
||||
defer span.End()
|
||||
|
||||
|
@ -321,9 +321,9 @@ PARTS_LOOP:
|
|||
|
||||
var ErrNotExist = fs.ErrNotExist
|
||||
|
||||
func getFile[F File](m map[string]F, name string) (File, error) {
|
||||
func GetFile[F File](m map[string]F, name string) (File, error) {
|
||||
if name == Separator {
|
||||
return newDirFile(name), nil
|
||||
return NewDirFile(name), nil
|
||||
}
|
||||
|
||||
f, ok := m[name]
|
||||
|
@ -333,21 +333,21 @@ func getFile[F File](m map[string]F, name string) (File, error) {
|
|||
|
||||
for p := range m {
|
||||
if strings.HasPrefix(p, name) {
|
||||
return newDirFile(name), nil
|
||||
return NewDirFile(name), nil
|
||||
}
|
||||
}
|
||||
|
||||
return nil, ErrNotExist
|
||||
}
|
||||
|
||||
func listDirFromFiles[F File](m map[string]F, name string) ([]fs.DirEntry, error) {
|
||||
func ListDirFromFiles[F File](m map[string]F, name string) ([]fs.DirEntry, error) {
|
||||
out := make([]fs.DirEntry, 0, len(m))
|
||||
name = AddTrailSlash(path.Clean(name))
|
||||
for p, f := range m {
|
||||
if strings.HasPrefix(p, name) {
|
||||
parts := strings.Split(trimRelPath(p, name), Separator)
|
||||
if len(parts) == 1 {
|
||||
out = append(out, newFileInfo(parts[0], f.Size()))
|
||||
out = append(out, NewFileInfo(parts[0], f.Size()))
|
||||
} else {
|
||||
out = append(out, newDirInfo(parts[0]))
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue