ref: dbe70e0ee435c2cced5537c72cd9270a2d80a0bb
parent: 262a17be0ea3508423ecc9be5dbd5479d91a39a9
author: penny <penny@limitedideas.org>
date: Mon Dec 1 11:59:17 EST 2025
fix long snarfs
--- a/main.go
+++ b/main.go
@@ -16,28 +16,44 @@
type snarfile struct {fs.BaseFile
snarfStream fs.Stream
- mu sync.Mutex
+ mu sync.Mutex
+ writemap map[uint64][]byte
}
func (f *snarfile) Write(fid uint64, offset uint64, data []byte) (uint32, error) {f.mu.Lock()
defer f.mu.Unlock()
- realwrite, err := os.OpenFile("/mnt/snarflog/rsnarf", os.O_WRONLY, 0644)- if err != nil {- fmt.Printf("Coudn't open snarf for writing: %s\n", err)- return 0, err
- }
+ f.writemap[fid] = append(f.writemap[fid], data...)
+ return uint32(len(data)), nil
+}
- defer realwrite.Close()
- realwrite.Write(data)
- _, err = f.snarfStream.Write(data)
- if err != nil {- return 0, err
+func (f *snarfile) Close(fid uint64) error {+ f.mu.Lock()
+ defer f.mu.Unlock()
+
+ if data, ok := f.writemap[fid]; ok {+ realwrite, err := os.OpenFile("/mnt/snarflog/rsnarf", os.O_WRONLY, 0644)+ if err != nil {+ fmt.Printf("Coudn't open snarf for writing: %s\n", err)+ delete(f.writemap, fid)
+ return err
+ }
+ defer realwrite.Close()
+ _, err = f.snarfStream.Write(data)
+ if err != nil {+ return err
+ }
+ if len(data) > 0 && data[len(data)-1] != '\n' {+ f.snarfStream.Write([]byte{'\n'})+ }
+
+ if _, err := realwrite.Write(data); err != nil {+ delete(f.writemap, fid)
+ return err
+ }
+ delete(f.writemap, fid)
}
- if len(data) > 0 && data[len(data)-1] != '\n' {- f.snarfStream.Write([]byte{'\n'})- }
- return uint32(len(data)), nil
+ return nil
}
func (f *snarfile) Read(fid uint64, offset uint64, count uint64) ([]byte, error) {@@ -58,8 +74,9 @@
func newSnarf(fsys *fs.FS, name, uid, gid string, perm uint32, stream fs.Stream) *snarfile {stat := fsys.NewStat(name, uid, gid, perm)
return &snarfile{- BaseFile: *fs.NewBaseFile(stat),
+ BaseFile: *fs.NewBaseFile(stat),
snarfStream: stream,
+ writemap: make(map[uint64][]byte),
}
}
--
⑨