)
var (
- sharedFiles = sharedFilesType{
- m: make(map[string]*sharedFile),
- }
+ sharedFiles sharedFilesInterface = regularFsSharedFiles{}
+
+ wipSharedFilesPool = sharedFilesType{m: make(map[string]*sharedFile)}
)
+type regularFsSharedFiles struct{}
+
+func (r regularFsSharedFiles) Open(name string) (sharedFileIf, error) {
+ return os.Open(name)
+}
+
+type sharedFileIf interface {
+ io.ReaderAt
+ io.Closer
+}
+
+type sharedFilesInterface interface {
+ Open(name string) (sharedFileIf, error)
+}
+
func init() {
http.HandleFunc("/debug/shared-files", func(w http.ResponseWriter, r *http.Request) {
- sharedFiles.mu.Lock()
- defer sharedFiles.mu.Unlock()
- byRefs := slices.SortedFunc(maps.Keys(sharedFiles.m), func(a, b string) int {
- return cmp.Or(
- sharedFiles.m[b].refs-sharedFiles.m[a].refs,
- cmp.Compare(a, b))
- })
- for _, key := range byRefs {
- sf := sharedFiles.m[key]
- fmt.Fprintf(w, "%v: refs=%v, name=%v\n", key, sf.refs, sf.f.Name())
- }
+ wipSharedFilesPool.WriteDebug(w)
})
}
m map[string]*sharedFile
}
+func (sharedFiles *sharedFilesType) WriteDebug(w io.Writer) {
+ sharedFiles.mu.Lock()
+ defer sharedFiles.mu.Unlock()
+ byRefs := slices.SortedFunc(maps.Keys(sharedFiles.m), func(a, b string) int {
+ return cmp.Or(
+ sharedFiles.m[b].refs-sharedFiles.m[a].refs,
+ cmp.Compare(a, b))
+ })
+ for _, key := range byRefs {
+ sf := sharedFiles.m[key]
+ fmt.Fprintf(w, "%v: refs=%v, name=%v\n", key, sf.refs, sf.f.Name())
+ }
+}
+
// How many opens wouldn't have been needed with singleflight.
var sharedFilesWastedOpens = expvar.NewInt("sharedFilesWastedOpens")
// Returns EOF on short or missing file.
func (fst fileTorrentImplIO) readFileAt(file file, b []byte, off int64) (n int, err error) {
fst.fts.logger().Debug("readFileAt", "file.safeOsPath", file.safeOsPath)
- var f interface {
- io.ReaderAt
- io.Closer
- }
+ var f sharedFileIf
// Fine to open once under each name on a unix system. We could make the shared file keys more
// constrained but it shouldn't matter. TODO: Ensure at most one of the names exist.
if fst.fts.partFiles() {