From 8b5f39520ba4f7e869487662f4b7030b8b01508f Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Wed, 12 Jun 2024 08:42:03 -0700 Subject: [PATCH 01/37] initial commit with basicfs --- mft-fs/basicfs/basic_fs.go | 1032 ++++++++++++++++++++++++++++++++ mft-fs/datastructures/queue.go | 32 + mft-fs/go.sum | 9 + mft-fs/main/main.go | 34 ++ 4 files changed, 1107 insertions(+) create mode 100644 mft-fs/basicfs/basic_fs.go create mode 100644 mft-fs/datastructures/queue.go create mode 100644 mft-fs/go.sum create mode 100644 mft-fs/main/main.go diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go new file mode 100644 index 00000000..2354b2cd --- /dev/null +++ b/mft-fs/basicfs/basic_fs.go @@ -0,0 +1,1032 @@ +package basicfs + +import ( + "context" + "crypto/rand" + "fmt" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "mft-fs/datastructures" + "os" + "syscall" + "time" +) + +type NoImplementationError struct{} + +func (e NoImplementationError) Error() string { + return "No implementation" +} + +/* +The printer function prints messages to the terminal on behalf of FUSE operations. +*/ +func printer(message string) { + fmt.Println(message) + + file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + defer file.Close() + file.WriteString(fmt.Sprintf("%s\n", message)) +} + +func expireTime() time.Time { + return time.Now().Add(time.Minute) +} + +type BasicFS struct { + fuseutil.NotImplementedFileSystem + root string + // pathToInode map[string]fuseops.InodeID + inodeToPath map[fuseops.InodeID]string + handleToInode map[fuseops.HandleID]fuseops.InodeID +} + +/* +todo: + OS Operations: MkNode, SetINodeAttrs + Dir Operations: + File Operations: ReadSymLink, CreateSymLink, CreateLink, Unlink + Correctness + - atomicity checks + - sync vs flush + - buffer writing + Optimizations: + - update map when appropriate (mkdir, createfile, rmdir, etc.) + - store tree backing + - explore caching strategies +*/ + +// private helpers + +func (fs BasicFS) update() error { + q := datastructures.NewQueue() + q.Enqueue(fs.root) + for !q.IsEmpty() { + path := q.Dequeue().(string) + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + inode := fileInfo.Sys().(*syscall.Stat_t).Ino + fs.inodeToPath[fuseops.InodeID(inode)] = path + if fileInfo.IsDir() { + files, e := os.ReadDir(path) + if e != nil { + return e + } + for _, file := range files { + q.Enqueue(path + "/" + file.Name()) + } + } + } + return nil +} + +func (fs BasicFS) fillAttributes(path string, attributes *fuseops.InodeAttributes) error { + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + stats := fileInfo.Sys().(*syscall.Stat_t) + + attributes.Size = uint64(fileInfo.Size()) + + attributes.Nlink = 1 + + attributes.Mode = fileInfo.Mode() + + attributes.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) + attributes.Mtime = time.Unix(stats.Mtimespec.Sec, stats.Mtimespec.Nsec) + attributes.Ctime = time.Unix(stats.Ctimespec.Sec, stats.Ctimespec.Nsec) + attributes.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec) + + attributes.Uid = stats.Uid + attributes.Gid = stats.Gid + + return nil +} + +func (fs BasicFS) generateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + var buff [8]byte + _, e := rand.Read(buff[:]) + if e != nil { + return 0, e + } + var output uint64 = 0 + for i := 0; i < len(buff); i++ { + output = output | uint64(buff[i]<<(8*i)) + } + handle := fuseops.HandleID(output) + _, ok := fs.handleToInode[handle] + if ok { + return fs.generateHandle(inode) + } + fs.handleToInode[handle] = inode + return handle, nil +} + +// Public BasicFS specific methods + +func NewBasicFS(root string) (BasicFS, error) { + fs := BasicFS{ + root: root, + // pathToInode: make(map[string]fuseops.InodeID), + inodeToPath: make(map[fuseops.InodeID]string), + handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), + } + fs.inodeToPath[1] = fs.root + e := fs.update() + return fs, e +} + +// FUSE Operations Implementation + +func (fs BasicFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { + printer("StatFS") + + stat, _ := os.Stat(fs.root) + + op.BlockSize = 4096 + + op.Blocks = 64 + op.BlocksFree = uint64(64 - uint32(stat.Size())/op.BlockSize) + op.BlocksAvailable = op.BlocksFree + + op.IoSize = 4096 + + op.Inodes = 128 + op.InodesFree = op.Inodes - uint64(len(fs.inodeToPath)) + + return nil +} + +func (fs BasicFS) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) error { + printer("LookUpInode") + var path string + var ok bool + // find parent + if op.Parent == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Parent] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Parent] + // if parent does not exist + if !ok { + return fuse.ENOENT // FileDoesNotExistError{} + } + } + } + + // get parent information + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + // if parent is not a directory + if !fileInfo.IsDir() { + return fuse.ENOTDIR // not a directory error + } + + // get child information + fileInfo, e = os.Stat(path + "/" + op.Name) + + if e != nil { + // if child does not exist, return without updating op contents + return nil + } + + // if child exists, update op contents + stat := fileInfo.Sys().(*syscall.Stat_t) + + op.Entry.EntryExpiration = expireTime() + op.Entry.AttributesExpiration = expireTime() + + op.Entry.Child = fuseops.InodeID(stat.Ino) + + return fs.fillAttributes(path+"/"+op.Name, &op.Entry.Attributes) +} + +func (fs BasicFS) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) error { + printer("GetInodeAttributes") + var path string + var ok bool + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + } + + op.AttributesExpiration = expireTime() + return fs.fillAttributes(path, &op.Attributes) +} + +func (fs BasicFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) error { + printer("SetInodeAttributes") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + } + + var e error + + if op.Mode != nil { + e = os.Chmod(path, *op.Mode) + if e != nil { + return e + } + } + + uid := -1 + gid := -1 + if op.Uid != nil { + uid = int(*op.Uid) + } + if op.Gid != nil { + gid = int(*op.Gid) + } + e = os.Chown(path, uid, gid) + if e != nil { + return e + } + + atime := time.Time{} + mtime := time.Time{} + if op.Atime != nil { + atime = *op.Atime + } + if op.Mtime != nil { + mtime = *op.Mtime + } + e = os.Chtimes(path, atime, mtime) + if e != nil { + return e + } + + e = fs.fillAttributes(path, &op.Attributes) + if e != nil { + return e + } + + op.AttributesExpiration = expireTime() + + return nil +} + +// ForgetInode +// todo account for references and hard links +func (fs BasicFS) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) error { + printer("ForgetInode") + delete(fs.inodeToPath, op.Inode) + return nil +} + +func (fs BasicFS) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) error { + printer("BatchForget") + for _, entry := range op.Entries { + delete(fs.inodeToPath, entry.Inode) + } + return nil +} + +func (fs BasicFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error { + printer("MkDir") + + var path string + var ok bool + // find parent + if op.Parent == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Parent] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Parent] + // if parent does not exist + if !ok { + return fuse.ENOENT + } + } + } + + // get parent information + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + // if parent is not a directory + if !fileInfo.IsDir() { + return fuse.ENOTDIR + } + + childPath := path + "/" + op.Name + e = os.Mkdir(childPath, op.Mode) + switch e.(type) { + case nil: + break + case *os.PathError: + return fuse.EEXIST + default: + return e + } + + fileInfo, e = os.Stat(childPath) + if e != nil { + return e + } + + op.Entry.Child = fuseops.InodeID(fileInfo.Sys().(*syscall.Stat_t).Ino) + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + + return fs.fillAttributes(childPath, &op.Entry.Attributes) +} + +//func (fs BasicFS) MkNode(ctx context.Context, op *fuseops.MkNodeOp) error { +// printer("MkNode") +// return NoImplementationError{} +//} + +func (fs BasicFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) error { + printer("CreateFile") + + var path string + var ok bool + // find parent + if op.Parent == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Parent] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Parent] + // if parent does not exist + if !ok { + return fuse.ENOENT + } + } + } + + // get parent information + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + // if parent is not a directory + if !fileInfo.IsDir() { + return fuse.ENOTDIR // not a directory error + } + + childPath := path + "/" + op.Name + var file *os.File + file, e = os.Create(childPath) + defer file.Close() + switch e.(type) { + case nil: + break + case *os.PathError: + return fuse.EEXIST + default: + return e + } + e = file.Chmod(op.Mode) + if e != nil { + return e + } + + fileInfo, e = os.Stat(childPath) + if e != nil { + return e + } + + op.Entry.Child = fuseops.InodeID(fileInfo.Sys().(*syscall.Stat_t).Ino) + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + + var handle fuseops.HandleID + handle, e = fs.generateHandle(op.Entry.Child) + if e != nil { + return e + } + op.Handle = handle + + return fs.fillAttributes(childPath, &op.Entry.Attributes) +} + +//func (fs BasicFS) CreateLink(ctx context.Context, op *fuseops.CreateLinkOp) error { +// printer("CreateLink") +// return NoImplementationError{} +//} +// +//func (fs BasicFS) CreateSymlink(ctx context.Context, op *fuseops.CreateSymlinkOp) error { +// printer("CreateSymlink") +// return NoImplementationError{} +//} + +// Rename +//todo: verify atomicity requirements +/* +If the new name is an existing directory, the file system must ensure it is empty before replacing it, returning ENOTEMPTY otherwise. (This is per the posix spec: http://goo.gl/4XtT79) + +The rename must be atomic from the point of view of an observer of the new name. That is, if the new name already exists, there must be no point at which it doesn't exist. + +It is okay for the new name to be modified before the old name is removed; these need not be atomic. In fact, the Linux man page explicitly says this is likely (cf. https://goo.gl/Y1wVZc). + +Linux bends over backwards (https://goo.gl/pLDn3r) to ensure that neither the old nor the new parent can be concurrently modified. But it's not clear whether OS X does this, and in any case it doesn't matter for file systems that may be modified remotely. Therefore a careful file system implementor should probably ensure if possible that the unlink step in the "link new name, unlink old name" process doesn't unlink a different inode than the one that was linked to the new name. Still, posix and the man pages are imprecise about the actual semantics of a rename if it's not atomic, so it is probably not disastrous to be loose about this. +*/ +func (fs BasicFS) Rename(ctx context.Context, op *fuseops.RenameOp) error { + printer("Rename") + + e := fs.update() + if e != nil { + return e + } + + var path string + var newPath string + var oldPath string + var ok bool + + path, ok = fs.inodeToPath[op.OldParent] + if !ok { + return fuse.ENOENT + } + oldPath = path + "/" + op.OldName + + path, ok = fs.inodeToPath[op.NewParent] + if ok { + newPath = path + "/" + op.NewName + fileInfo, e := os.Stat(path) + if e == nil && fileInfo.IsDir() { + files, e := os.ReadDir(newPath) + if e != nil { + return e + } + if len(files) > 0 { + return fuse.ENOTEMPTY + } + } + } + + return os.Rename(oldPath, newPath) +} + +func (fs BasicFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error { + printer("RmDir") + + var path string + var ok bool + + path, ok = fs.inodeToPath[op.Parent] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Parent] + if !ok { + return fuse.ENOENT + } + } + + path = path + "/" + op.Name + return os.RemoveAll(path) +} + +//func (fs BasicFS) Unlink(ctx context.Context, op *fuseops.UnlinkOp) error { +// printer("Unlink") +// return NoImplementationError{} +//} + +func (fs BasicFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { + printer("OpenDir") + var ok bool + _, ok = fs.inodeToPath[op.Inode] + if !ok && op.Inode != 1 { + e := fs.update() + if e != nil { + return e + } + _, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + handle, e := fs.generateHandle(op.Inode) + if e != nil { + return e + } + op.Handle = handle + return nil +} + +// todo: handle offsets (see ReadDirOp documentation) +func (fs BasicFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { + printer("ReadDir") + + var path string + var ok bool + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + } + var inode fuseops.InodeID + inode, ok = fs.handleToInode[op.Handle] + if !ok || inode != op.Inode { + return fuse.ENOENT + } + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + if !fileInfo.IsDir() { + return fuse.ENOTDIR + } + + data, e := os.ReadDir(path) + if e != nil { + return e + } + + printer(fmt.Sprintf("Path: %v\tOffset: %v\n", path, op.Offset)) + + //if fuseops.DirOffset(len(data)) < op.Offset { + // return nil + //} + + op.BytesRead = 0 + bytesRead := 0 + currentBytesRead := 0 + buff := make([]byte, 1024) + for _, d := range data { + dirent := fuseutil.Dirent{} + fileInfo, e := d.Info() + if e != nil { + return e + } + dirent.Inode = fuseops.InodeID(fileInfo.Sys().(*syscall.Stat_t).Ino) + dirent.Name = d.Name() + if fileInfo.IsDir() { + dirent.Type = fuseutil.DT_Directory + } else { + dirent.Type = fuseutil.DT_File + } + dirent.Offset = fuseops.DirOffset(bytesRead) // - op.Offset + currentBytesRead = fuseutil.WriteDirent(buff, dirent) //op.Dst[bytesRead:], dirent) + if bytesRead >= int(op.Offset) { + copy(op.Dst[op.BytesRead:], buff) + op.BytesRead += currentBytesRead + printer(fmt.Sprintf("Inode: %v\tName: %v\tOffset: %v\n", dirent.Inode, dirent.Name, dirent.Offset)) + } + bytesRead += currentBytesRead + } + + if int(op.Offset) >= bytesRead { + return nil + } + + currentBytesRead = fuseutil.WriteDirent(op.Dst[op.BytesRead:], fuseutil.Dirent{ + Offset: fuseops.DirOffset(bytesRead), + Name: ".", + Type: fuseutil.DT_Directory, + Inode: inode, + }) + bytesRead += currentBytesRead + op.BytesRead += currentBytesRead + + // op.Dst = op.Dst[op.Offset:] + // op.BytesRead = bytesRead - int(op.Offset) + + printer(fmt.Sprintf("Bytes Read: %v\n", op.BytesRead)) + + fmt.Println("done") + + return nil +} + +func (fs BasicFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { + printer("ReleaseDirHandle") + + delete(fs.handleToInode, op.Handle) + + return nil +} + +func (fs BasicFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error { + printer("OpenFile") + var ok bool + _, ok = fs.inodeToPath[op.Inode] + if !ok && op.Inode != 1 { + e := fs.update() + if e != nil { + return e + } + _, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + handle, e := fs.generateHandle(op.Inode) + if e != nil { + return e + } + op.Handle = handle + return nil +} + +func (fs BasicFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { + printer("ReadFile") + + var path string + var ok bool + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + var inode fuseops.InodeID + inode, ok = fs.handleToInode[op.Handle] + if !ok || inode != op.Inode { + return fuse.ENOENT + } + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + var file *os.File + file, e = os.OpenFile(path, os.O_RDWR, fileInfo.Mode()) + defer file.Close() + if e != nil { + return e + } + + if op.Dst != nil { + buff := make([]byte, op.Size) + byteCount, e := file.ReadAt(buff, op.Offset) + if e != nil { + return e + } + op.BytesRead = int(min(int64(byteCount), op.Size)) + for i := 0; i < op.BytesRead; i++ { + op.Dst[i] = buff[i] //append(op.Dst, buff[i]) + } + printer(string(buff)) + printer(fmt.Sprintf("read requested at offset: %v\tbytes read: %v", op.Offset, byteCount)) + return nil + } + + fmt.Println("vector read requested") + + return NoImplementationError{} +} + +func (fs BasicFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) error { + printer("WriteFile") + + var path string + var ok bool + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + var inode fuseops.InodeID + inode, ok = fs.handleToInode[op.Handle] + if !ok || inode != op.Inode { + return fuse.ENOENT + } + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + var file *os.File + file, e = os.OpenFile(path, os.O_RDWR, fileInfo.Mode()) + defer file.Close() + if e != nil { + return e + } + + _, e = file.WriteAt(op.Data, op.Offset) + if e != nil { + return e + } + + return nil +} + +func (fs BasicFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error { + printer("SyncFile") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + if fs.handleToInode[op.Handle] != op.Inode { + return fuse.ENOENT + } + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + file, e := os.OpenFile(path, os.O_RDWR, fileInfo.Mode()) + defer file.Close() + if e != nil { + return e + } + + e = file.Sync() + if e != nil { + return e + } + + return nil +} + +func (fs BasicFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error { + printer("FlushFile") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + if fs.handleToInode[op.Handle] != op.Inode { + return fuse.ENOENT + } + + fileInfo, e := os.Stat(path) + if e != nil { + return e + } + file, e := os.OpenFile(path, os.O_RDWR, fileInfo.Mode()) + defer file.Close() + if e != nil { + return e + } + + e = file.Sync() + if e != nil { + return e + } + + return nil +} + +func (fs BasicFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { + printer("ReleaseFileHandle") + + delete(fs.handleToInode, op.Handle) + + return nil +} + +//func (fs BasicFS) ReadSymlink(ctx context.Context, op *fuseops.ReadSymlinkOp) error { +// printer("ReadSymLink") +// return NoImplementationError{} +//} + +/* +func (fs BasicFS) RemoveXattr(ctx context.Context, op *fuseops.RemoveXattrOp) error { + printer("RemoveXattr") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + e := xattr.Remove(path, op.Name) + if e != nil { + return fuse.ENOATTR + } + + return nil +} + +func (fs BasicFS) GetXattr(ctx context.Context, op *fuseops.GetXattrOp) error { + printer("GetXattr") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + val, e := xattr.Get(path, op.Name) + if e != nil { + return fuse.ENOATTR + } + + op.Dst = val + op.BytesRead = len(val) + + return nil +} + +func (fs BasicFS) ListXattr(ctx context.Context, op *fuseops.ListXattrOp) error { + printer("ListXattr") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + val, e := xattr.List(path) + if e != nil { + return e + } + + var output []byte + for _, v := range val { + output = append(output, []byte(v)...) + output = append(output, 0) + } + + op.Dst = output + op.BytesRead = len(output) + + return nil +} + +func (fs BasicFS) SetXattr(ctx context.Context, op *fuseops.SetXattrOp) error { + printer("SetXattr") + + var path string + var ok bool + + if op.Inode == 1 { + path = fs.root + } else { + path, ok = fs.inodeToPath[op.Inode] + if !ok { + e := fs.update() + if e != nil { + return e + } + } + path, ok = fs.inodeToPath[op.Inode] + if !ok { + return fuse.ENOENT + } + } + + _, e := xattr.Get(path, op.Name) + + if op.Flags == 0x1 && e == nil { + return fuse.EEXIST + } else if op.Flags == 0x2 && e != nil { + return fuse.ENOATTR + } + + e = xattr.Set(path, op.Name, op.Value) + if e != nil { + return e + } + + return nil +} + +func (fs BasicFS) Fallocate(ctx context.Context, op *fuseops.FallocateOp) error { + printer("Fallocate") + return NoImplementationError{} +} +*/ + +func (fs BasicFS) Destroy() { + printer("Destroy") + fuse.Unmount("./mount") +} diff --git a/mft-fs/datastructures/queue.go b/mft-fs/datastructures/queue.go new file mode 100644 index 00000000..07789ecc --- /dev/null +++ b/mft-fs/datastructures/queue.go @@ -0,0 +1,32 @@ +package datastructures + +type Queue struct { + backingArray []interface{} +} + +func NewQueue() *Queue { + output := new(Queue) + output.backingArray = make([]interface{}, 0) + return output +} + +func (q *Queue) IsEmpty() bool { + return len(q.backingArray) == 0 +} + +func (q *Queue) Size() int { + return len(q.backingArray) +} + +func (q *Queue) Enqueue(v interface{}) { + q.backingArray = append(q.backingArray, v) +} + +func (q *Queue) Dequeue() interface{} { + if len(q.backingArray) == 0 { + return nil + } + output := q.backingArray[0] + q.backingArray = q.backingArray[1:] + return output +} diff --git a/mft-fs/go.sum b/mft-fs/go.sum new file mode 100644 index 00000000..cc7731c5 --- /dev/null +++ b/mft-fs/go.sum @@ -0,0 +1,9 @@ +github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 h1:IWVMQZZvWN+9FeRwWnZAINYNrsr3yyCWI2BcddQBDvk= +github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0/go.mod h1:JYi9iIxdYNgxmMgLwtSHO/hmVnP2kfX1oc+mtx+XWLA= +github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd/go.mod h1:TlmyIZDpGmwRoTWiakdr+HA1Tukze6C6XbRVidYq02M= +github.com/jacobsa/timeutil v0.0.0-20170205232429-577e5acbbcf6/go.mod h1:JEWKD6V8xETMW+DEv+IQVz++f8Cn8O/X0HPeDY3qNis= +github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= +golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= +golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/mft-fs/main/main.go b/mft-fs/main/main.go new file mode 100644 index 00000000..0e54c0be --- /dev/null +++ b/mft-fs/main/main.go @@ -0,0 +1,34 @@ +package main + +import ( + "context" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" + "log" + "mft-fs/basicfs" + "os" +) + +func main() { + + // create an appropriate file system + // printer("started") + fs, _ := basicfs.NewBasicFS("./test") + server := fuseutil.NewFileSystemServer(&fs) + + // mount the filesystem + cfg := &fuse.MountConfig{ + ReadOnly: false, + DebugLogger: log.New(os.Stderr, "fuse: ", 0), + ErrorLogger: log.New(os.Stderr, "fuse: ", 0), + } + mfs, err := fuse.Mount("./mount", server, cfg) + if err != nil { + log.Fatalf("Mount: %v", err) + } + + // wait for it to be unmounted + if err = mfs.Join(context.Background()); err != nil { + log.Fatalf("Join: %v", err) + } +} From 9c1f6bed9f9c4c9041672797b9f973e64ec848f1 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 13 Jun 2024 16:23:09 -0400 Subject: [PATCH 02/37] added readme --- mft-fs/README.md | 38 ++++++++++++++++++++++++++++++++++++++ mft-fs/basicfs/basic_fs.go | 10 ++++++---- mft-fs/main/main.go | 8 +++++--- 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 mft-fs/README.md diff --git a/mft-fs/README.md b/mft-fs/README.md new file mode 100644 index 00000000..d8fff148 --- /dev/null +++ b/mft-fs/README.md @@ -0,0 +1,38 @@ +

MFT-FS

+ +
+ +MFT-FS is a FUSE-based extension to Airavata MFT. It provides the abstraction that unifies the different file I/O protocols into one filesystem. + +

Instructions

+ +go.mod (with go.sum file) file in the mft-fs directory + +To configure the mod and sum files: + +
    +
  1. Make the go.mod file: go mod init mft-fs
  2. +
  3. Install Dependencies +
      +
    • go get github.com/jacobsa/fuse
    • +
    +
  4. +
+ + +To build the project, run the build command from the main subfolder: + +go build + +Before running, ensure you have the mount and test directories in the main directory. + +``` +mkdir mount +mkdir test +``` + +Finally, run the executable file: + +./main + +Important Final Step: Enjoy and report any bugs! \ No newline at end of file diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index 2354b2cd..87e4bcaa 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -4,13 +4,15 @@ import ( "context" "crypto/rand" "fmt" - "github.com/jacobsa/fuse" - "github.com/jacobsa/fuse/fuseops" - "github.com/jacobsa/fuse/fuseutil" - "mft-fs/datastructures" "os" "syscall" "time" + + "mft-fs/datastructures" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" ) type NoImplementationError struct{} diff --git a/mft-fs/main/main.go b/mft-fs/main/main.go index 0e54c0be..a6b33879 100644 --- a/mft-fs/main/main.go +++ b/mft-fs/main/main.go @@ -2,11 +2,13 @@ package main import ( "context" - "github.com/jacobsa/fuse" - "github.com/jacobsa/fuse/fuseutil" "log" - "mft-fs/basicfs" "os" + + "mft-fs/basicfs" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" ) func main() { From 260f53e9a643f8be9154b50b72fdf1df9fad8f2f Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 09:54:04 -0700 Subject: [PATCH 03/37] parsing CL args --- mft-fs/go.sum | 7 ++----- mft-fs/main/main.go | 12 ++++++++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mft-fs/go.sum b/mft-fs/go.sum index cc7731c5..a5823005 100644 --- a/mft-fs/go.sum +++ b/mft-fs/go.sum @@ -1,9 +1,6 @@ github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 h1:IWVMQZZvWN+9FeRwWnZAINYNrsr3yyCWI2BcddQBDvk= github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0/go.mod h1:JYi9iIxdYNgxmMgLwtSHO/hmVnP2kfX1oc+mtx+XWLA= -github.com/jacobsa/oglematchers v0.0.0-20150720000706-141901ea67cd/go.mod h1:TlmyIZDpGmwRoTWiakdr+HA1Tukze6C6XbRVidYq02M= -github.com/jacobsa/timeutil v0.0.0-20170205232429-577e5acbbcf6/go.mod h1:JEWKD6V8xETMW+DEv+IQVz++f8Cn8O/X0HPeDY3qNis= -github.com/pkg/xattr v0.4.9/go.mod h1:di8WF84zAKk8jzR1UBTEWh9AUlIZZ7M/JNt8e9B6ktU= -golang.org/x/sys v0.0.0-20220408201424-a24fb2fb8a0f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= +github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/mft-fs/main/main.go b/mft-fs/main/main.go index a6b33879..a672784d 100644 --- a/mft-fs/main/main.go +++ b/mft-fs/main/main.go @@ -2,6 +2,8 @@ package main import ( "context" + "flag" + "fmt" "log" "os" @@ -13,9 +15,15 @@ import ( func main() { + // reading commandline args + mountDirectory := flag.String("mountDirectory", "", "mount directory") + rootDirectory := flag.String("rootDirectory", "", "root directory") + flag.Parse() + + fmt.Println(fmt.Sprintf("mountDirectory: %s, rootDirectory: %s", *mountDirectory, *rootDirectory)) // create an appropriate file system // printer("started") - fs, _ := basicfs.NewBasicFS("./test") + fs, _ := basicfs.NewBasicFS(*rootDirectory) server := fuseutil.NewFileSystemServer(&fs) // mount the filesystem @@ -24,7 +32,7 @@ func main() { DebugLogger: log.New(os.Stderr, "fuse: ", 0), ErrorLogger: log.New(os.Stderr, "fuse: ", 0), } - mfs, err := fuse.Mount("./mount", server, cfg) + mfs, err := fuse.Mount(*mountDirectory, server, cfg) if err != nil { log.Fatalf("Mount: %v", err) } From 810e18a4cfb2920cce64185a522ffd4cab89e256 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 09:59:54 -0700 Subject: [PATCH 04/37] added text placeholder for mod file --- mft-fs/gomod.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 mft-fs/gomod.txt diff --git a/mft-fs/gomod.txt b/mft-fs/gomod.txt new file mode 100644 index 00000000..1cad3123 --- /dev/null +++ b/mft-fs/gomod.txt @@ -0,0 +1,7 @@ +module mft-fs + +go 1.22 + +require github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 + +require golang.org/x/sys v0.21.0 // indirect From 3059d98a4db935fa253a5cdefe78c926c36aa5f0 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 10:36:45 -0700 Subject: [PATCH 05/37] fixed deprecated software errors --- mft-fs/basicfs/basic_fs.go | 15 +++++++++++++-- mft-fs/gomod.txt | 2 +- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index 87e4bcaa..bf93275f 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -4,6 +4,7 @@ import ( "context" "crypto/rand" "fmt" + "golang.org/x/sys/unix" "os" "syscall" "time" @@ -99,10 +100,20 @@ func (fs BasicFS) fillAttributes(path string, attributes *fuseops.InodeAttribute attributes.Mode = fileInfo.Mode() - attributes.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) + var timeStats unix.Stat_t + e = unix.Stat(path, &timeStats) + if e != nil { + return e + } + + /*attributes.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) attributes.Mtime = time.Unix(stats.Mtimespec.Sec, stats.Mtimespec.Nsec) attributes.Ctime = time.Unix(stats.Ctimespec.Sec, stats.Ctimespec.Nsec) - attributes.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec) + attributes.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec)*/ + attributes.Atime = time.Unix(timeStats.Atim.Sec, timeStats.Atim.Nsec) + attributes.Mtime = time.Unix(timeStats.Mtim.Sec, timeStats.Mtim.Nsec) + attributes.Ctime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + attributes.Crtime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) attributes.Uid = stats.Uid attributes.Gid = stats.Gid diff --git a/mft-fs/gomod.txt b/mft-fs/gomod.txt index 1cad3123..4b170bab 100644 --- a/mft-fs/gomod.txt +++ b/mft-fs/gomod.txt @@ -4,4 +4,4 @@ go 1.22 require github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 -require golang.org/x/sys v0.21.0 // indirect +require golang.org/x/sys v0.21.0 From d6915b115b1cfc82d64b763e444269d5e54abebd Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 19:44:49 -0700 Subject: [PATCH 06/37] removed logging and replaced builtin min --- mft-fs/Dockerfile | 22 ++++++++++++++++++++++ mft-fs/basicfs/basic_fs.go | 13 ++++++++++--- 2 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 mft-fs/Dockerfile diff --git a/mft-fs/Dockerfile b/mft-fs/Dockerfile new file mode 100644 index 00000000..4b781d4a --- /dev/null +++ b/mft-fs/Dockerfile @@ -0,0 +1,22 @@ +# Use the latest Ubuntu image +FROM ubuntu:latest + +# Install necessary packages +RUN apt-get update && apt-get install -y \ + fuse \ + kmod \ + wget \ + curl \ + git \ + build-essential + +# Download and install Go v1.22.3 +RUN wget https://go.dev/dl/go1.22.3.linux-amd64.tar.gz && \ + tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gz && \ + rm go1.22.3.linux-amd64.tar.gz + +# Set up Go environment +ENV PATH="/usr/local/go/bin:${PATH}" +ENV GOPATH="/go" +ENV PATH="${GOPATH}/bin:${PATH}" + diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index bf93275f..464f0883 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -28,15 +28,22 @@ The printer function prints messages to the terminal on behalf of FUSE operation func printer(message string) { fmt.Println(message) - file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + /*file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) defer file.Close() - file.WriteString(fmt.Sprintf("%s\n", message)) + file.WriteString(fmt.Sprintf("%s\n", message))*/ } func expireTime() time.Time { return time.Now().Add(time.Minute) } +func minimum(a int64, b int64) int64 { + if a < b { + return a + } + return b +} + type BasicFS struct { fuseutil.NotImplementedFileSystem root string @@ -736,7 +743,7 @@ func (fs BasicFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { if e != nil { return e } - op.BytesRead = int(min(int64(byteCount), op.Size)) + op.BytesRead = int(minimum(int64(byteCount), op.Size)) for i := 0; i < op.BytesRead; i++ { op.Dst[i] = buff[i] //append(op.Dst, buff[i]) } From 485d98033ab5b627db9908fbc9435086608cf659 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 20:14:46 -0700 Subject: [PATCH 07/37] updated readme --- mft-fs/README.md | 65 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 17 deletions(-) diff --git a/mft-fs/README.md b/mft-fs/README.md index d8fff148..f0304302 100644 --- a/mft-fs/README.md +++ b/mft-fs/README.md @@ -6,33 +6,64 @@ MFT-FS is a FUSE-based extension to Airavata MFT. It provides the abstraction th

Instructions

-go.mod (with go.sum file) file in the mft-fs directory +
    +
  1. -To configure the mod and sum files: +Code can be installed using -
      -
    1. Make the go.mod file: go mod init mft-fs
    2. -
    3. Install Dependencies -
        -
      • go get github.com/jacobsa/fuse
      • -
      -
    4. -
    +``` shell +git clone https://github.com/RohanPhadnis/airavata-mft.git +``` +Perform all the steps below from the airavata-mft/mft-fs directory. +
  2. -To build the project, run the build command from the main subfolder: +
  3. +
    +To get the go.mod file ready, use the following command: -go build +``` shell +cat gomod.txt > go.mod +``` +
    +
  4. -Before running, ensure you have the mount and test directories in the main directory. +
  5. +
    +To install all dependencies, run the following two commands: +``` shell +go mod tidy +go install ./... ``` +
    +
  6. + +
  7. +
    +Before running, ensure you have the mount and test directories in the main directory. + +``` shell mkdir mount -mkdir test +mkdir root +``` +
    +
  8. + +
  9. +
    +To run the project, use the command: + +``` shell +go run ./main/main.go --mountDirectory ./mount --rootDirectory ./root ``` -Finally, run the executable file: +This will mount the pass-through functions on the ./mount directory. All operations will be computed and performed on ./root -./main +
    +
  10. -Important Final Step: Enjoy and report any bugs! \ No newline at end of file +
  11. +Important Final Step: Enjoy and report any bugs! +
  12. +
\ No newline at end of file From 32a68ef11fc29cad748c640f8c6b4c7c30dab0f1 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 20:19:26 -0700 Subject: [PATCH 08/37] added testing clause --- mft-fs/basicfs/basic_fs.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index 464f0883..0d35156b 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -741,6 +741,7 @@ func (fs BasicFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { buff := make([]byte, op.Size) byteCount, e := file.ReadAt(buff, op.Offset) if e != nil { + fmt.Println("testing") return e } op.BytesRead = int(minimum(int64(byteCount), op.Size)) From 99502c671f94cb2743cfe4c318faf056124d1fdc Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 21:27:05 -0700 Subject: [PATCH 09/37] added print statements for debugging --- mft-fs/basicfs/basic_fs.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index 0d35156b..17ae02c2 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -741,7 +741,8 @@ func (fs BasicFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { buff := make([]byte, op.Size) byteCount, e := file.ReadAt(buff, op.Offset) if e != nil { - fmt.Println("testing") + fmt.Println("got an error") + fmt.Println(fmt.Sprintf("read requested for: %v, at offset: %v", path, op.Offset)) return e } op.BytesRead = int(minimum(int64(byteCount), op.Size)) From c566181744e404b1337003cb13e0b37fa0e535db Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 11 Jul 2024 21:34:20 -0700 Subject: [PATCH 10/37] ignoring readat error --- mft-fs/basicfs/basic_fs.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/basicfs/basic_fs.go index 17ae02c2..3733bb6e 100644 --- a/mft-fs/basicfs/basic_fs.go +++ b/mft-fs/basicfs/basic_fs.go @@ -739,12 +739,12 @@ func (fs BasicFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { if op.Dst != nil { buff := make([]byte, op.Size) - byteCount, e := file.ReadAt(buff, op.Offset) - if e != nil { + byteCount, _ := file.ReadAt(buff, op.Offset) + /*if e != nil { fmt.Println("got an error") fmt.Println(fmt.Sprintf("read requested for: %v, at offset: %v", path, op.Offset)) return e - } + }*/ op.BytesRead = int(minimum(int64(byteCount), op.Size)) for i := 0; i < op.BytesRead; i++ { op.Dst[i] = buff[i] //append(op.Dst, buff[i]) From ac39145a55829289c680489eb7bf762c5f252c67 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 12 Jul 2024 19:44:48 -0700 Subject: [PATCH 11/37] added abstraction files for testing --- mft-fs/README.md | 2 + mft-fs/abstractfs/abstract_fs_operations.go | 391 ++++++++++++++++++++ mft-fs/abstractfs/fs_manager.go | 56 +++ mft-fs/datastructures/slice_operations.go | 12 + mft-fs/main/main.go | 24 +- mft-fs/osfsmanager/os_fs_manager.go | 322 ++++++++++++++++ 6 files changed, 790 insertions(+), 17 deletions(-) create mode 100644 mft-fs/abstractfs/abstract_fs_operations.go create mode 100644 mft-fs/abstractfs/fs_manager.go create mode 100644 mft-fs/datastructures/slice_operations.go create mode 100644 mft-fs/osfsmanager/os_fs_manager.go diff --git a/mft-fs/README.md b/mft-fs/README.md index f0304302..21c1eaf0 100644 --- a/mft-fs/README.md +++ b/mft-fs/README.md @@ -6,6 +6,8 @@ MFT-FS is a FUSE-based extension to Airavata MFT. It provides the abstraction th

Instructions

+The following instructions assume Go v1.20.x and FUSE are installed on the system. +
  1. diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go new file mode 100644 index 00000000..d0ac2e50 --- /dev/null +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -0,0 +1,391 @@ +package abstractfs + +import ( + "context" + "fmt" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "os" + "time" +) + +type NoImplementationError struct{} + +func (e NoImplementationError) Error() string { + return "No implementation" +} + +/* +The printer function prints messages to the terminal on behalf of FUSE operations. +*/ +func printer(message string) { + fmt.Println(message) + + file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + defer file.Close() + file.WriteString(fmt.Sprintf("%s\n", message)) +} + +func minimum(a int64, b int64) int64 { + if a < b { + return a + } + return b +} + +func expireTime() time.Time { + return time.Now().Add(time.Minute) +} + +type AbstractFS struct { + fuseutil.NotImplementedFileSystem + manager FSManager +} + +// private helpers + +func (fs AbstractFS) fillAttributes(inode fuseops.InodeID, attributes *fuseops.InodeAttributes) error { + info, e := fs.manager.GetInfo(inode) + if e != nil { + return fuse.ENOENT + } + + attributes.Size = info.Size + + attributes.Nlink = info.Nlink + + attributes.Mode = info.Mode + + attributes.Atime = info.Atime + attributes.Mtime = info.Mtime + attributes.Ctime = info.Ctime + attributes.Crtime = info.Crtime + + attributes.Uid = info.Uid + attributes.Gid = info.Gid + + return nil +} + +// public methods + +func NewAbstractFS(manager FSManager) (AbstractFS, error) { + fs := AbstractFS{ + manager: manager, + } + return fs, nil +} + +// FUSE Operations + +func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { + printer("StatFS") + + op.BlockSize = 4096 + + op.Blocks = 64 + op.BlocksFree = uint64(64 - uint32(fs.manager.GetSize())/op.BlockSize) + op.BlocksAvailable = op.BlocksFree + + op.IoSize = 4096 + + op.Inodes = 128 + op.InodesFree = op.Inodes - fs.manager.GetLength() + + return nil +} + +func (fs AbstractFS) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) error { + printer("LookUpInode") + + // does parent exist? + parentInfo, e := fs.manager.GetInfo(op.Parent) + if e != nil { + return fuse.ENOENT + } + + // is parent a directory? + if parentInfo.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // does child exist in parent? + index, ok := parentInfo.ChildrenIndexMap[op.Name] + if !ok { + return nil // fuse.ENOENT + } + + // get child's inode + childInode := parentInfo.Children[index] + + // fill information + op.Entry.Child = childInode + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) error { + printer("GetInodeAttributes") + + op.AttributesExpiration = expireTime() + return fs.fillAttributes(op.Inode, &op.Attributes) +} + +func (fs AbstractFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) error { + printer("SetInodeAttributes") + op.AttributesExpiration = expireTime() + e := fs.manager.SetInfo(op.Inode, op.Uid, op.Gid, op.Size, op.Mode, op.Atime, op.Mtime) + if e != nil { + return e + } + return fs.fillAttributes(op.Inode, &op.Attributes) +} + +// ForgetInode +// todo account for references and hard links +func (fs AbstractFS) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) error { + printer("ForgetInode") + return fs.manager.Delete(op.Inode) +} + +func (fs AbstractFS) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) error { + printer("BatchForget") + var e error + for _, entry := range op.Entries { + e = fs.manager.Delete(entry.Inode) + if e != nil { + return e + } + } + return nil +} + +func (fs AbstractFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error { + printer("MkDir") + + // get parent information + info, e := fs.manager.GetInfo(op.Parent) + if e != nil { + return e + } + + // check if parent is a directory + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // already exists? + _, ok := info.ChildrenIndexMap[op.Name] + if ok { + return fuse.EEXIST + } + + childInode, e := fs.manager.MkDir(op.Parent, op.Name, op.Mode) + if e != nil { + return e + } + + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + op.Entry.Child = childInode + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) error { + printer("CreateFile") + + // get parent information + info, e := fs.manager.GetInfo(op.Parent) + if e != nil { + return e + } + + // check if parent is a directory + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // already exists? + _, ok := info.ChildrenIndexMap[op.Name] + if ok { + return fuse.EEXIST + } + + childInode, e := fs.manager.CreateFile(op.Parent, op.Name, op.Mode) + if e != nil { + return e + } + + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + op.Entry.Child = childInode + op.Handle, e = fs.manager.GenerateHandle(childInode) + if e != nil { + return e + } + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error { + printer("RmDir") + + info, e := fs.manager.GetInfo(op.Parent) + if e != nil { + return e + } + + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + inode := info.Children[info.ChildrenIndexMap[op.Name]] + return fs.manager.RmDir(inode) +} + +func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { + printer("OpenDir") + handle, e := fs.manager.GenerateHandle(op.Inode) + if e != nil { + return e + } + op.Handle = handle + return nil +} + +func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { + printer("ReleaseDirHandle") + + fs.manager.DeleteHandle(op.Handle) + + return nil +} + +func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error { + printer("OpenFile") + handle, e := fs.manager.GenerateHandle(op.Inode) + if e != nil { + return e + } + op.Handle = handle + return nil +} + +func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { + printer("ReadFile") + + info, e := fs.manager.GetInfo(op.Inode) + if e != nil { + return e + } + + if op.Handle != info.Handle { + return fuse.ENOENT + } + + file, e := fs.manager.GetFile(op.Inode) + defer fs.manager.CloseFile(op.Inode, file) + if e != nil { + return e + } + + if op.Dst != nil { + buff := make([]byte, op.Size) + byteCount, _ := file.ReadAt(buff, op.Offset) + /*if e != nil { + return e + }*/ + op.BytesRead = int(minimum(int64(byteCount), op.Size)) + for i := 0; i < op.BytesRead; i++ { + op.Dst[i] = buff[i] //append(op.Dst, buff[i]) + } + printer(string(buff)) + printer(fmt.Sprintf("read requested at offset: %v\tbytes read: %v", op.Offset, byteCount)) + return nil + } + + // todo implement vector read + fmt.Println("vector read requested") + + return NoImplementationError{} +} + +func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) error { + printer("WriteFile") + + info, e := fs.manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + file, e := fs.manager.GetFile(op.Inode) + defer fs.manager.CloseFile(op.Inode, file) + if e != nil { + return e + } + + _, e = file.WriteAt(op.Data, op.Offset) + if e != nil { + return e + } + + return nil +} + +func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error { + printer("SyncFile") + + info, e := fs.manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + file, e := fs.manager.GetFile(op.Inode) + defer fs.manager.CloseFile(op.Inode, file) + if e != nil { + return e + } + + return fs.manager.SyncFile(op.Inode, file) +} + +func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error { + printer("SyncFile") + + info, e := fs.manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + file, e := fs.manager.GetFile(op.Inode) + defer fs.manager.CloseFile(op.Inode, file) + if e != nil { + return e + } + + return fs.manager.SyncFile(op.Inode, file) +} + +func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { + printer("ReleaseFileHandle") + + fs.manager.DeleteHandle(op.Handle) + + return nil +} + +func (fs AbstractFS) Destroy() { + printer("Destroy") + fuse.Unmount("./mount") +} diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go new file mode 100644 index 00000000..e5a45548 --- /dev/null +++ b/mft-fs/abstractfs/fs_manager.go @@ -0,0 +1,56 @@ +package abstractfs + +import ( + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "os" + "time" +) + +type FSManager interface { + GetSize() uint64 + GetLength() uint64 + GetInfo(id fuseops.InodeID) (*FileInfo, error) + SetInfo(id fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error + Delete(inode fuseops.InodeID) error + MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + GenerateHandle(id fuseops.InodeID) (fuseops.HandleID, error) + CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + RmDir(inode fuseops.InodeID) error + DeleteHandle(handle fuseops.HandleID) + GetFile(inode fuseops.InodeID) (*os.File, error) + CloseFile(inode fuseops.InodeID, file *os.File) + SyncFile(inode fuseops.InodeID, file *os.File) error +} + +type FileInfo struct { + Name string + Path string + Inode fuseops.InodeID + Children []fuseops.InodeID + ChildrenIndexMap map[string]int + Parent fuseops.InodeID + Nlink uint32 + Size uint64 + Mode os.FileMode + Atime time.Time + Mtime time.Time + Ctime time.Time + Crtime time.Time + Uid uint32 + Gid uint32 + DirentType fuseutil.DirentType + Handle fuseops.HandleID +} + +func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { + return FileInfo{ + Name: name, + Children: make([]fuseops.InodeID, 0), + ChildrenIndexMap: make(map[string]int), + Parent: parent, + Inode: inode, + Path: path, + DirentType: direntType, + } +} diff --git a/mft-fs/datastructures/slice_operations.go b/mft-fs/datastructures/slice_operations.go new file mode 100644 index 00000000..0254c377 --- /dev/null +++ b/mft-fs/datastructures/slice_operations.go @@ -0,0 +1,12 @@ +package datastructures + +import ( + "github.com/jacobsa/fuse/fuseops" +) + +func Remove(slice []fuseops.InodeID, i int) []fuseops.InodeID { + if i+1 < len(slice) { + return append(slice[:i], slice[i+1:]...) + } + return slice[:i] +} diff --git a/mft-fs/main/main.go b/mft-fs/main/main.go index a672784d..64506920 100644 --- a/mft-fs/main/main.go +++ b/mft-fs/main/main.go @@ -2,28 +2,18 @@ package main import ( "context" - "flag" - "fmt" - "log" - "os" - - "mft-fs/basicfs" - "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseutil" + "log" + "mft-fs/abstractfs" + "mft-fs/osfsmanager" + "os" ) func main() { - // reading commandline args - mountDirectory := flag.String("mountDirectory", "", "mount directory") - rootDirectory := flag.String("rootDirectory", "", "root directory") - flag.Parse() - - fmt.Println(fmt.Sprintf("mountDirectory: %s, rootDirectory: %s", *mountDirectory, *rootDirectory)) - // create an appropriate file system - // printer("started") - fs, _ := basicfs.NewBasicFS(*rootDirectory) + manager := osfsmanager.NewOSFSManager("./test") + fs, _ := abstractfs.NewAbstractFS(manager) server := fuseutil.NewFileSystemServer(&fs) // mount the filesystem @@ -32,7 +22,7 @@ func main() { DebugLogger: log.New(os.Stderr, "fuse: ", 0), ErrorLogger: log.New(os.Stderr, "fuse: ", 0), } - mfs, err := fuse.Mount(*mountDirectory, server, cfg) + mfs, err := fuse.Mount("./mount", server, cfg) if err != nil { log.Fatalf("Mount: %v", err) } diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/osfsmanager/os_fs_manager.go new file mode 100644 index 00000000..6a347e98 --- /dev/null +++ b/mft-fs/osfsmanager/os_fs_manager.go @@ -0,0 +1,322 @@ +package osfsmanager + +import ( + "crypto/rand" + "fmt" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "golang.org/x/sys/unix" + "mft-fs/abstractfs" + "mft-fs/datastructures" + "os" + "syscall" + "time" +) + +type OSFSManager struct { + abstractfs.FSManager + root string + inodeInfo map[fuseops.InodeID]*abstractfs.FileInfo + handleToInode map[fuseops.HandleID]fuseops.InodeID + inodeCounter fuseops.InodeID +} + +type parentChildPair struct { + parent fuseops.InodeID + child string +} + +func (manager *OSFSManager) bfs(root string) { + q := datastructures.NewQueue() + q.Enqueue(&(parentChildPair{ + parent: 0, + child: root, + })) + for !q.IsEmpty() { + current := q.Dequeue().(*parentChildPair) + var direntType fuseutil.DirentType + stat, e := os.Stat(current.child) + if e != nil { + fmt.Println("error:") + fmt.Println(e.Error()) + continue + } + if stat.IsDir() { + dir, e := os.ReadDir(current.child) + if e != nil { + continue + } + for _, file := range dir { + q.Enqueue(&(parentChildPair{ + parent: manager.inodeCounter, + child: fmt.Sprintf("%s/%s", current.child, file.Name()), + })) + } + direntType = fuseutil.DT_Directory + } else { + direntType = fuseutil.DT_File + } + info := abstractfs.NewFileInfo(stat.Name(), current.child, manager.inodeCounter, current.parent, direntType) + manager.inodeInfo[manager.inodeCounter] = &info + parentInfo, ok := manager.inodeInfo[current.parent] + if ok { + parentInfo.ChildrenIndexMap[info.Name] = len(parentInfo.Children) + parentInfo.Children = append(parentInfo.Children, manager.inodeCounter) + } + manager.updateInfo(manager.inodeInfo[manager.inodeCounter]) + manager.inodeCounter++ + } +} + +func NewOSFSManager(root string) *OSFSManager { + manager := &OSFSManager{ + root: root, + inodeInfo: make(map[fuseops.InodeID]*abstractfs.FileInfo), + handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), + inodeCounter: 1, + } + manager.bfs(root) + return manager +} + +func (manager *OSFSManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + var buff [8]byte + _, e := rand.Read(buff[:]) + if e != nil { + return 0, e + } + var output uint64 = 0 + for i := 0; i < len(buff); i++ { + output = output | uint64(buff[i]<<(8*i)) + } + handle := fuseops.HandleID(output) + _, ok := manager.handleToInode[handle] + if ok { + return manager.GenerateHandle(inode) + } + info, ok := manager.inodeInfo[inode] + if !ok { + return 0, fuse.ENOENT + } + info.Handle = handle + manager.handleToInode[handle] = inode + return handle, nil +} + +/* + +todo + update + fillAttributes +*/ + +func (manager *OSFSManager) updateInfo(info *abstractfs.FileInfo) error { + + fileInfo, e := os.Stat(info.Path) + if e != nil { + return e + } + stats := fileInfo.Sys().(*syscall.Stat_t) + + info.Size = uint64(fileInfo.Size()) + + info.Nlink = 1 + + info.Mode = fileInfo.Mode() + + /*info.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) + info.Mtime = time.Unix(stats.Mtimespec.Sec, stats.Mtimespec.Nsec) + info.Ctime = time.Unix(stats.Ctimespec.Sec, stats.Ctimespec.Nsec) + info.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec)*/ + var timeStats unix.Stat_t + e = unix.Stat(info.Path, &timeStats) + if e != nil { + return e + } + info.Atime = time.Unix(timeStats.Atim.Sec, timeStats.Atim.Nsec) + info.Mtime = time.Unix(timeStats.Mtim.Sec, timeStats.Mtim.Nsec) + info.Ctime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + info.Crtime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + + info.Uid = stats.Uid + info.Gid = stats.Gid + + return nil +} + +func (manager *OSFSManager) GetSize() uint64 { + stat, _ := os.Stat(manager.root) + return uint64(stat.Size()) +} + +func (manager *OSFSManager) GetLength() uint64 { + return uint64(len(manager.inodeInfo)) +} + +func (manager *OSFSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + info, ok := manager.inodeInfo[inode] + if !ok { + return nil, fuse.ENOENT + } + return info, nil +} + +func (manager *OSFSManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + + if modeptr != nil { + e = os.Chmod(info.Path, *modeptr) + if e != nil { + return e + } + } + + uid := -1 + gid := -1 + if uidptr != nil { + uid = int(*uidptr) + } + if gidptr != nil { + gid = int(*gidptr) + } + e = os.Chown(info.Path, uid, gid) + if e != nil { + return e + } + + atime := time.Time{} + mtime := time.Time{} + if atimeptr != nil { + atime = *atimeptr + } + if mtimeptr != nil { + mtime = *mtimeptr + } + e = os.Chtimes(info.Path, atime, mtime) + if e != nil { + return e + } + + return manager.updateInfo(info) +} + +func (manager *OSFSManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + e = os.Mkdir(path, mode) + if e != nil { + return 0, e + } + + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewFileInfo(name, path, inode, parent, fuseutil.DT_Directory) + manager.inodeInfo[inode] = &infoObj + e = manager.updateInfo(&infoObj) + if e != nil { + return 0, e + } + + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + + return inode, nil +} + +func (manager *OSFSManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + file, e := os.Create(path) + defer file.Close() + if e != nil { + return 0, e + } + + e = file.Chmod(mode) + if e != nil { + return 0, e + } + + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewFileInfo(name, path, inode, parent, fuseutil.DT_File) + manager.inodeInfo[inode] = &infoObj + e = manager.updateInfo(&infoObj) + if e != nil { + return 0, e + } + + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + + return inode, nil +} + +func (manager *OSFSManager) RmDir(inode fuseops.InodeID) error { + return nil +} + +func (manager *OSFSManager) Delete(inode fuseops.InodeID) error { + + // first delete any reference in parents + // then delete self + + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + + parentInfo, e := manager.GetInfo(info.Parent) + if e != nil { + return e + } + + parentInfo.Children = datastructures.Remove(parentInfo.Children, parentInfo.ChildrenIndexMap[info.Name]) + target := parentInfo.ChildrenIndexMap[info.Name] + for name, index := range parentInfo.ChildrenIndexMap { + if index > target { + parentInfo.ChildrenIndexMap[name] = index - 1 + } + } + delete(parentInfo.ChildrenIndexMap, info.Name) + + delete(manager.inodeInfo, info.Inode) + + return nil +} + +func (manager *OSFSManager) DeleteHandle(handle fuseops.HandleID) { + delete(manager.handleToInode, handle) +} + +func (manager *OSFSManager) GetFile(inode fuseops.InodeID) (*os.File, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return nil, e + } + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return nil, e + } + return file, nil +} + +func (manager *OSFSManager) CloseFile(inode fuseops.InodeID, file *os.File) { + file.Close() +} + +func (manager *OSFSManager) SyncFile(inode fuseops.InodeID, file *os.File) error { + return file.Sync() +} From 834ec545805e67126aeb95b8ff42dbd7713eb3d8 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 12 Jul 2024 19:59:43 -0700 Subject: [PATCH 12/37] added CL flags --- mft-fs/main/main.go | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/mft-fs/main/main.go b/mft-fs/main/main.go index 64506920..495ec89f 100644 --- a/mft-fs/main/main.go +++ b/mft-fs/main/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "flag" "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseutil" "log" @@ -12,7 +13,12 @@ import ( func main() { - manager := osfsmanager.NewOSFSManager("./test") + // reading commandline args + mountDirectory := flag.String("mountDirectory", "", "mount directory") + rootDirectory := flag.String("rootDirectory", "", "root directory") + flag.Parse() + + manager := osfsmanager.NewOSFSManager(*rootDirectory) fs, _ := abstractfs.NewAbstractFS(manager) server := fuseutil.NewFileSystemServer(&fs) @@ -22,7 +28,7 @@ func main() { DebugLogger: log.New(os.Stderr, "fuse: ", 0), ErrorLogger: log.New(os.Stderr, "fuse: ", 0), } - mfs, err := fuse.Mount("./mount", server, cfg) + mfs, err := fuse.Mount(*mountDirectory, server, cfg) if err != nil { log.Fatalf("Mount: %v", err) } From af26f35da0cdf737dd64e43067eef6edeba0a123 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 12 Jul 2024 22:00:42 -0700 Subject: [PATCH 13/37] added readdir operation --- mft-fs/abstractfs/abstract_fs_operations.go | 66 +++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index d0ac2e50..12c6c199 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -255,6 +255,72 @@ func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { return nil } +func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { + printer("ReadDir") + + info, e := fs.manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + printer(fmt.Sprintf("Path: %v\tOffset: %v\n", info.Path, op.Offset)) + + //if fuseops.DirOffset(len(data)) < op.Offset { + // return nil + //} + + op.BytesRead = 0 + bytesRead := 0 + currentBytesRead := 0 + buff := make([]byte, 1024) + for _, childInode := range info.Children { + dirent := fuseutil.Dirent{} + childInfo, e := fs.manager.GetInfo(childInode) + if e != nil { + return e + } + dirent.Inode = childInfo.Inode + dirent.Name = childInfo.Name + dirent.Type = childInfo.DirentType + dirent.Offset = fuseops.DirOffset(bytesRead) // - op.Offset + currentBytesRead = fuseutil.WriteDirent(buff, dirent) //op.Dst[bytesRead:], dirent) + if bytesRead >= int(op.Offset) { + copy(op.Dst[op.BytesRead:], buff) + op.BytesRead += currentBytesRead + printer(fmt.Sprintf("Inode: %v\tName: %v\tOffset: %v\n", dirent.Inode, dirent.Name, dirent.Offset)) + } + bytesRead += currentBytesRead + } + + if int(op.Offset) >= bytesRead { + return nil + } + + currentBytesRead = fuseutil.WriteDirent(op.Dst[op.BytesRead:], fuseutil.Dirent{ + Offset: fuseops.DirOffset(bytesRead), + Name: ".", + Type: fuseutil.DT_Directory, + Inode: op.Inode, + }) + bytesRead += currentBytesRead + op.BytesRead += currentBytesRead + + // op.Dst = op.Dst[op.Offset:] + // op.BytesRead = bytesRead - int(op.Offset) + + printer(fmt.Sprintf("Bytes Read: %v\n", op.BytesRead)) + + fmt.Println("done") + + return nil +} + func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { printer("ReleaseDirHandle") From 25d237919c027fc71dc7b0c5c2fa61e28e70d3ee Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 18 Jul 2024 15:08:19 -0700 Subject: [PATCH 14/37] added s3fs prototype --- mft-fs/abstractfs/abstract_fs_operations.go | 8 +- mft-fs/abstractfs/fs_manager.go | 8 +- mft-fs/osfsmanager/os_fs_manager.go | 2 +- mft-fs/s3fs/s3_fs_manager.go | 136 ++++++++++++++++++++ 4 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 mft-fs/s3fs/s3_fs_manager.go diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index 12c6c199..c2755d55 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -352,7 +352,7 @@ func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error } file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file) + defer fs.manager.CloseFile(op.Inode, file, false) if e != nil { return e } @@ -390,7 +390,7 @@ func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) err } file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file) + defer fs.manager.CloseFile(op.Inode, file, true) if e != nil { return e } @@ -415,7 +415,7 @@ func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error } file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file) + defer fs.manager.CloseFile(op.Inode, file, false) if e != nil { return e } @@ -435,7 +435,7 @@ func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) err } file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file) + defer fs.manager.CloseFile(op.Inode, file, false) if e != nil { return e } diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go index e5a45548..8dea3d38 100644 --- a/mft-fs/abstractfs/fs_manager.go +++ b/mft-fs/abstractfs/fs_manager.go @@ -19,7 +19,7 @@ type FSManager interface { RmDir(inode fuseops.InodeID) error DeleteHandle(handle fuseops.HandleID) GetFile(inode fuseops.InodeID) (*os.File, error) - CloseFile(inode fuseops.InodeID, file *os.File) + CloseFile(inode fuseops.InodeID, file *os.File, write bool) SyncFile(inode fuseops.InodeID, file *os.File) error } @@ -41,6 +41,9 @@ type FileInfo struct { Gid uint32 DirentType fuseutil.DirentType Handle fuseops.HandleID + Cache bool + CacheTime time.Time + WriteTime time.Time } func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { @@ -52,5 +55,8 @@ func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops Inode: inode, Path: path, DirentType: direntType, + Cache: false, + CacheTime: time.Unix(0, 0), + WriteTime: time.Now(), } } diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/osfsmanager/os_fs_manager.go index 6a347e98..2ca7f041 100644 --- a/mft-fs/osfsmanager/os_fs_manager.go +++ b/mft-fs/osfsmanager/os_fs_manager.go @@ -313,7 +313,7 @@ func (manager *OSFSManager) GetFile(inode fuseops.InodeID) (*os.File, error) { return file, nil } -func (manager *OSFSManager) CloseFile(inode fuseops.InodeID, file *os.File) { +func (manager *OSFSManager) CloseFile(inode fuseops.InodeID, file *os.File, write bool) { file.Close() } diff --git a/mft-fs/s3fs/s3_fs_manager.go b/mft-fs/s3fs/s3_fs_manager.go new file mode 100644 index 00000000..11bac127 --- /dev/null +++ b/mft-fs/s3fs/s3_fs_manager.go @@ -0,0 +1,136 @@ +package main + +// package s3fs + +import ( + "encoding/json" + "fmt" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "mft-fs/abstractfs" + "net/http" + "os" + "time" +) + +func main() { + _, e := NewFSManager("./cache", "http://localhost:8000") + if e != nil { + fmt.Println(e) + } +} + +type FSManager struct { + abstractfs.FSManager + inodeInfo map[fuseops.InodeID]*abstractfs.FileInfo + handleToInode map[fuseops.HandleID]fuseops.InodeID + cacheDirectory string + updateTime time.Time + serverURL string + currentInode fuseops.InodeID + maxInode fuseops.InodeID +} + +func NewFSManager(cacheDirectory string, serverURL string) (*FSManager, error) { + output := &FSManager{ + inodeInfo: make(map[fuseops.InodeID]*abstractfs.FileInfo), + handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), + cacheDirectory: cacheDirectory, + serverURL: serverURL, + updateTime: time.Unix(0, 0), + } + e := output.update() + if e != nil { + return nil, e + } + output.allocateInodes() + return output, nil +} + +const addDeviceURI = "/add_device" +const getDirectoryInfoURI = "/get_directory_info" +const allocateInodesURI = "/allocate_inodes" +const addInodeURI = "/add_inode" +const removeInodeURI = "/remove_inode" +const requestReadURI = "/request_read" +const ackReadURI = "/ack_read" +const requestWriteURI = "/request_write" +const ackWriteURI = "/ack_write" + +type getResponseStruct struct { + Name string + Path string + Inode uint64 + Children []uint64 + ChildrenIndexMap map[string]uint64 + Parent uint64 + Nlink uint32 + Size uint64 + Mode int + Atime uint64 + Mtime uint64 + Ctime uint64 + Crtime uint64 + Uid uint32 + Gid uint32 + DirentType uint8 + WriteTime uint64 +} + +func (manager *FSManager) update() error { + fmt.Println(manager.serverURL + getDirectoryInfoURI) + response, e := http.Get(manager.serverURL + getDirectoryInfoURI) + defer response.Body.Close() + if e != nil { + return e + } + var buff []byte = make([]byte, 12000) + bytesRead, _ := response.Body.Read(buff) + fmt.Println(string(buff[:bytesRead])) + var data []getResponseStruct + e = json.Unmarshal(buff[:bytesRead], &data) + if e != nil { + return e + } + manager.updateTime = time.Now() + return nil +} + +func (manager *FSManager) uploadFile() {} +func (manager *FSManager) downloadFile() {} +func (manager *FSManager) allocateInodes() {} +func (manager *FSManager) requestRead() {} +func (manager *FSManager) ackRead() {} +func (manager *FSManager) requestWrite() {} +func (manager *FSManager) ackWrite() {} + +func (manager *FSManager) GetLength() uint64 { + return uint64(len(manager.inodeInfo)) +} + +func (manager *FSManager) GetSize() uint64 { + return uint64(4096) +} + +func (manager *FSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + e := manager.update() + if e != nil { + return nil, e + } + info, ok := manager.inodeInfo[inode] + if !ok { + return nil, fuse.ENOENT + } + return info, nil +} + +func (manager *FSManager) RmDir(inode fuseops.InodeID) error { + return nil +} + +func (manager *FSManager) CloseFile(inode fuseops.InodeID, file *os.File, write bool) { + defer file.Close() + if write { + manager.uploadFile() + } +} From af939e269cad98c763955225185b45d80798a79a Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 18 Jul 2024 15:58:30 -0700 Subject: [PATCH 15/37] increased abstractability by removing file dependance and adding explicit readat, writeat methods --- mft-fs/abstractfs/abstract_fs_operations.go | 32 ++------------- mft-fs/abstractfs/fs_manager.go | 6 +-- mft-fs/osfsmanager/os_fs_manager.go | 45 +++++++++++++++++---- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index c2755d55..b0feb819 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -351,15 +351,9 @@ func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error return fuse.ENOENT } - file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file, false) - if e != nil { - return e - } - if op.Dst != nil { buff := make([]byte, op.Size) - byteCount, _ := file.ReadAt(buff, op.Offset) + byteCount, _ := fs.manager.ReadAt(op.Inode, buff, op.Offset) /*if e != nil { return e }*/ @@ -389,13 +383,7 @@ func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) err return fuse.ENOENT } - file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file, true) - if e != nil { - return e - } - - _, e = file.WriteAt(op.Data, op.Offset) + _, e = fs.manager.WriteAt(op.Inode, op.Data, op.Offset) if e != nil { return e } @@ -414,13 +402,7 @@ func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error return fuse.ENOENT } - file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file, false) - if e != nil { - return e - } - - return fs.manager.SyncFile(op.Inode, file) + return fs.manager.SyncFile(op.Inode) } func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error { @@ -434,13 +416,7 @@ func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) err return fuse.ENOENT } - file, e := fs.manager.GetFile(op.Inode) - defer fs.manager.CloseFile(op.Inode, file, false) - if e != nil { - return e - } - - return fs.manager.SyncFile(op.Inode, file) + return fs.manager.SyncFile(op.Inode) } func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go index 8dea3d38..4d3d151b 100644 --- a/mft-fs/abstractfs/fs_manager.go +++ b/mft-fs/abstractfs/fs_manager.go @@ -18,9 +18,9 @@ type FSManager interface { CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) RmDir(inode fuseops.InodeID) error DeleteHandle(handle fuseops.HandleID) - GetFile(inode fuseops.InodeID) (*os.File, error) - CloseFile(inode fuseops.InodeID, file *os.File, write bool) - SyncFile(inode fuseops.InodeID, file *os.File) error + SyncFile(inode fuseops.InodeID) error + WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) } type FileInfo struct { diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/osfsmanager/os_fs_manager.go index 2ca7f041..1cb8848d 100644 --- a/mft-fs/osfsmanager/os_fs_manager.go +++ b/mft-fs/osfsmanager/os_fs_manager.go @@ -301,22 +301,51 @@ func (manager *OSFSManager) DeleteHandle(handle fuseops.HandleID) { delete(manager.handleToInode, handle) } -func (manager *OSFSManager) GetFile(inode fuseops.InodeID) (*os.File, error) { +func (manager *OSFSManager) SyncFile(inode fuseops.InodeID) error { info, e := manager.GetInfo(inode) if e != nil { - return nil, e + return e } file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) if e != nil { - return nil, e + return e + } + defer file.Close() + e = file.Sync() + if e != nil { + return e } - return file, nil + return nil } -func (manager *OSFSManager) CloseFile(inode fuseops.InodeID, file *os.File, write bool) { - file.Close() +func (manager *OSFSManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.ReadAt(data, off) + return n, e } -func (manager *OSFSManager) SyncFile(inode fuseops.InodeID, file *os.File) error { - return file.Sync() +func (manager *OSFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.WriteAt(data, off) + return n, e } From 0e560e42a31d2ae11f2f1f3ca1e54801e8fa72cf Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 18 Jul 2024 21:53:28 -0700 Subject: [PATCH 16/37] added client-side comms --- mft-fs/abstractfs/abstract_fs_operations.go | 18 +- mft-fs/abstractfs/fs_manager.go | 7 +- mft-fs/go.sum | 12 + mft-fs/osfsmanager/os_fs_manager.go | 13 +- mft-fs/remotefs/client/client_manager.go | 178 ++++ mft-fs/remotefs/comm.proto | 102 +++ mft-fs/remotefs/remotefscomms/comm.pb.go | 821 ++++++++++++++++++ mft-fs/remotefs/remotefscomms/comm_grpc.pb.go | 566 ++++++++++++ mft-fs/remotefs/remotefscomms/commutils.go | 57 ++ mft-fs/s3fs/s3_fs_manager.go | 136 --- 10 files changed, 1758 insertions(+), 152 deletions(-) create mode 100644 mft-fs/remotefs/client/client_manager.go create mode 100644 mft-fs/remotefs/comm.proto create mode 100644 mft-fs/remotefs/remotefscomms/comm.pb.go create mode 100644 mft-fs/remotefs/remotefscomms/comm_grpc.pb.go create mode 100644 mft-fs/remotefs/remotefscomms/commutils.go delete mode 100644 mft-fs/s3fs/s3_fs_manager.go diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index b0feb819..243b5b21 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -84,14 +84,19 @@ func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { op.BlockSize = 4096 + size, e := fs.manager.GetSize() op.Blocks = 64 - op.BlocksFree = uint64(64 - uint32(fs.manager.GetSize())/op.BlockSize) + op.BlocksFree = uint64(64 - uint32(size)/op.BlockSize) op.BlocksAvailable = op.BlocksFree op.IoSize = 4096 op.Inodes = 128 - op.InodesFree = op.Inodes - fs.manager.GetLength() + length, e := fs.manager.GetLength() + if e != nil { + return e + } + op.InodesFree = op.Inodes - length return nil } @@ -324,9 +329,7 @@ func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { printer("ReleaseDirHandle") - fs.manager.DeleteHandle(op.Handle) - - return nil + return fs.manager.DeleteHandle(op.Handle) } func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error { @@ -422,12 +425,11 @@ func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) err func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { printer("ReleaseFileHandle") - fs.manager.DeleteHandle(op.Handle) - - return nil + return fs.manager.DeleteHandle(op.Handle) } func (fs AbstractFS) Destroy() { printer("Destroy") + fs.manager.Destroy() fuse.Unmount("./mount") } diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go index 4d3d151b..90fe980b 100644 --- a/mft-fs/abstractfs/fs_manager.go +++ b/mft-fs/abstractfs/fs_manager.go @@ -8,8 +8,8 @@ import ( ) type FSManager interface { - GetSize() uint64 - GetLength() uint64 + GetSize() (uint64, error) + GetLength() (uint64, error) GetInfo(id fuseops.InodeID) (*FileInfo, error) SetInfo(id fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error Delete(inode fuseops.InodeID) error @@ -17,10 +17,11 @@ type FSManager interface { GenerateHandle(id fuseops.InodeID) (fuseops.HandleID, error) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) RmDir(inode fuseops.InodeID) error - DeleteHandle(handle fuseops.HandleID) + DeleteHandle(handle fuseops.HandleID) error SyncFile(inode fuseops.InodeID) error WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + Destroy() error } type FileInfo struct { diff --git a/mft-fs/go.sum b/mft-fs/go.sum index a5823005..df8f43a3 100644 --- a/mft-fs/go.sum +++ b/mft-fs/go.sum @@ -1,6 +1,18 @@ +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 h1:IWVMQZZvWN+9FeRwWnZAINYNrsr3yyCWI2BcddQBDvk= github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0/go.mod h1:JYi9iIxdYNgxmMgLwtSHO/hmVnP2kfX1oc+mtx+XWLA= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= +google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= +google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/osfsmanager/os_fs_manager.go index 1cb8848d..fd4ea2f2 100644 --- a/mft-fs/osfsmanager/os_fs_manager.go +++ b/mft-fs/osfsmanager/os_fs_manager.go @@ -145,13 +145,13 @@ func (manager *OSFSManager) updateInfo(info *abstractfs.FileInfo) error { return nil } -func (manager *OSFSManager) GetSize() uint64 { +func (manager *OSFSManager) GetSize() (uint64, error) { stat, _ := os.Stat(manager.root) - return uint64(stat.Size()) + return uint64(stat.Size()), nil } -func (manager *OSFSManager) GetLength() uint64 { - return uint64(len(manager.inodeInfo)) +func (manager *OSFSManager) GetLength() (uint64, error) { + return uint64(len(manager.inodeInfo)), nil } func (manager *OSFSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { @@ -297,8 +297,9 @@ func (manager *OSFSManager) Delete(inode fuseops.InodeID) error { return nil } -func (manager *OSFSManager) DeleteHandle(handle fuseops.HandleID) { +func (manager *OSFSManager) DeleteHandle(handle fuseops.HandleID) error { delete(manager.handleToInode, handle) + return nil } func (manager *OSFSManager) SyncFile(inode fuseops.InodeID) error { @@ -349,3 +350,5 @@ func (manager *OSFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int6 n, e := file.WriteAt(data, off) return n, e } + +func (manager *OSFSManager) Destroy() error { return nil } diff --git a/mft-fs/remotefs/client/client_manager.go b/mft-fs/remotefs/client/client_manager.go new file mode 100644 index 00000000..10418975 --- /dev/null +++ b/mft-fs/remotefs/client/client_manager.go @@ -0,0 +1,178 @@ +package client + +import ( + "context" + "github.com/jacobsa/fuse/fuseops" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/protobuf/types/known/timestamppb" + "mft-fs/abstractfs" + "mft-fs/remotefs/remotefscomms" + "os" + "time" +) + +type ClientManager struct { + abstractfs.FSManager + conn *grpc.ClientConn + client remotefscomms.RemoteFSCommsClient +} + +func NewClientManager() (*ClientManager, error) { + output := &ClientManager{} + e := output.init() + if e != nil { + return nil, e + } + return output, nil +} + +func (manager *ClientManager) init() error { + var opts []grpc.DialOption + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + var e error + manager.conn, e = grpc.NewClient("http://localhost:8000", opts...) + if e != nil { + return e + } + manager.client = remotefscomms.NewRemoteFSCommsClient(manager.conn) + return nil +} + +func (manager *ClientManager) GetSize() (uint64, error) { + resp, e := manager.client.GetSizeComm(context.Background(), &remotefscomms.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetLength() (uint64, error) { + resp, e := manager.client.GetLengthComm(context.Background(), &remotefscomms.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + resp, e := manager.client.GetInfoComm(context.Background(), &remotefscomms.UintMsg{ + Data: uint64(inode), + }) + if e != nil { + return nil, e + } + output := &abstractfs.FileInfo{} + remotefscomms.ConvertFromComm(resp, output) + return output, nil +} + +func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + request := &remotefscomms.SetInfoParamsMsg{ + Inode: uint64(inode), + Uid: -1, + Gid: -1, + Size: -1, + Mode: -1, + Atime: timestamppb.New(time.Time{}), + Mtime: timestamppb.New(time.Time{}), + } + if uidptr != nil { + request.Uid = int32(*uidptr) + } + if gidptr != nil { + request.Gid = int32(*gidptr) + } + if sizeptr != nil { + request.Size = int64(*sizeptr) + } + if modeptr != nil { + request.Mode = int32(*modeptr) + } + if atimeptr != nil { + request.Atime = timestamppb.New(*atimeptr) + } + if mtimeptr != nil { + request.Mtime = timestamppb.New(*mtimeptr) + } + _, e := manager.client.SetInfoComm(context.Background(), request) + return e +} + +func (manager *ClientManager) Delete(inode fuseops.InodeID) error { + _, e := manager.client.DeleteComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.MkDirComm(context.Background(), &remotefscomms.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + resp, e := manager.client.GenerateHandleComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + return fuseops.HandleID(resp.Data), nil +} +func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.CreateFileComm(context.Background(), &remotefscomms.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { + _, e := manager.client.RmDirComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { + _, e := manager.client.DeleteHandleComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(handle)}) + return e +} + +func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { + _, e := manager.client.SyncFileComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + resp, e := manager.client.WriteAtComm(context.Background(), &remotefscomms.ContentMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + return int(resp.Data), nil +} +func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + resp, e := manager.client.ReadAtComm(context.Background(), &remotefscomms.ContentMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + return int(resp.Data), nil +} + +func (manager *ClientManager) Destroy() error { + return manager.conn.Close() +} diff --git a/mft-fs/remotefs/comm.proto b/mft-fs/remotefs/comm.proto new file mode 100644 index 00000000..ca1ec35b --- /dev/null +++ b/mft-fs/remotefs/comm.proto @@ -0,0 +1,102 @@ +syntax = "proto3"; +package remotefscomms; + +option go_package="./remotefscomms"; + +import "google/protobuf/timestamp.proto"; + +/* +Complete FileInfo struct + - GetInfo (response) +*/ +message FileInfoMsg { + string name = 1; + string path = 2; + uint64 inode = 3; + repeated uint64 children = 4; + map childrenIndexMap = 5; + uint64 parent = 6; + uint32 nlink = 7; + uint64 size = 8; + uint32 mode = 9; + google.protobuf.Timestamp atime = 10; + google.protobuf.Timestamp mtime = 11; + google.protobuf.Timestamp ctime = 12; + google.protobuf.Timestamp crtime = 13; + uint32 uid = 14; + uint32 gid = 15; + uint32 direntType = 16; + uint64 handle = 17; +} + +/* +Sending a single uint64 + - GetSize (response) + - GetLength (response) + - GetInfo (request) + - Delete (request) + - MkDir (response) + - GenerateHandle (request, response) + - CreateFile (response) + - RmDir (request) + - DeleteHandle (request) + - SyncFile (request) +*/ +message UintMsg { + uint64 data = 1; +} + +/* +Sending file contents + - ReadAt + - WriteAt +*/ +message ContentMsg { + uint64 inode = 1; + bytes data = 2; + int64 off = 3; +} + +/* +SetInfoParamsMsg + - SetInfo (request) +*/ +message SetInfoParamsMsg { + uint64 inode = 1; + int32 uid = 2; + int32 gid = 3; + int64 size = 4; + int32 mode = 5; + google.protobuf.Timestamp atime = 6; + google.protobuf.Timestamp mtime = 7; +} + +/* +MkInodeMsg + - MkDir (request) + - CreateFile (request) +*/ +message MkInodeMsg { + uint64 parent = 1; + string name = 2; + uint32 mode = 3; +} + +/*Empty Message*/ +message Empty {} + +service RemoteFSComms { + rpc GetSizeComm(Empty) returns (UintMsg) {} + rpc GetLengthComm(Empty) returns (UintMsg) {} + rpc GetInfoComm(UintMsg) returns (FileInfoMsg) {} + rpc SetInfoComm(SetInfoParamsMsg) returns (Empty) {} + rpc DeleteComm(UintMsg) returns (Empty) {} + rpc MkDirComm(MkInodeMsg) returns (UintMsg) {} + rpc GenerateHandleComm(UintMsg) returns (UintMsg) {} + rpc CreateFileComm(MkInodeMsg) returns (UintMsg) {} + rpc RmDirComm(UintMsg) returns (Empty) {} + rpc DeleteHandleComm(UintMsg) returns (Empty) {} + rpc SyncFileComm(UintMsg) returns (Empty) {} + rpc WriteAtComm(ContentMsg) returns (UintMsg) {} + rpc ReadAtComm(ContentMsg) returns (UintMsg) {} +} diff --git a/mft-fs/remotefs/remotefscomms/comm.pb.go b/mft-fs/remotefs/remotefscomms/comm.pb.go new file mode 100644 index 00000000..2679e9ce --- /dev/null +++ b/mft-fs/remotefs/remotefscomms/comm.pb.go @@ -0,0 +1,821 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc v5.27.1 +// source: comm.proto + +package remotefscomms + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Complete FileInfo struct +// - GetInfo (response) +type FileInfoMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Inode uint64 `protobuf:"varint,3,opt,name=inode,proto3" json:"inode,omitempty"` + Children []uint64 `protobuf:"varint,4,rep,packed,name=children,proto3" json:"children,omitempty"` + ChildrenIndexMap map[string]uint32 `protobuf:"bytes,5,rep,name=childrenIndexMap,proto3" json:"childrenIndexMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Parent uint64 `protobuf:"varint,6,opt,name=parent,proto3" json:"parent,omitempty"` + Nlink uint32 `protobuf:"varint,7,opt,name=nlink,proto3" json:"nlink,omitempty"` + Size uint64 `protobuf:"varint,8,opt,name=size,proto3" json:"size,omitempty"` + Mode uint32 `protobuf:"varint,9,opt,name=mode,proto3" json:"mode,omitempty"` + Atime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=atime,proto3" json:"atime,omitempty"` + Mtime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=mtime,proto3" json:"mtime,omitempty"` + Ctime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=ctime,proto3" json:"ctime,omitempty"` + Crtime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=crtime,proto3" json:"crtime,omitempty"` + Uid uint32 `protobuf:"varint,14,opt,name=uid,proto3" json:"uid,omitempty"` + Gid uint32 `protobuf:"varint,15,opt,name=gid,proto3" json:"gid,omitempty"` + DirentType uint32 `protobuf:"varint,16,opt,name=direntType,proto3" json:"direntType,omitempty"` + Handle uint64 `protobuf:"varint,17,opt,name=handle,proto3" json:"handle,omitempty"` +} + +func (x *FileInfoMsg) Reset() { + *x = FileInfoMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileInfoMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileInfoMsg) ProtoMessage() {} + +func (x *FileInfoMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileInfoMsg.ProtoReflect.Descriptor instead. +func (*FileInfoMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{0} +} + +func (x *FileInfoMsg) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FileInfoMsg) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *FileInfoMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *FileInfoMsg) GetChildren() []uint64 { + if x != nil { + return x.Children + } + return nil +} + +func (x *FileInfoMsg) GetChildrenIndexMap() map[string]uint32 { + if x != nil { + return x.ChildrenIndexMap + } + return nil +} + +func (x *FileInfoMsg) GetParent() uint64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *FileInfoMsg) GetNlink() uint32 { + if x != nil { + return x.Nlink + } + return 0 +} + +func (x *FileInfoMsg) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *FileInfoMsg) GetMode() uint32 { + if x != nil { + return x.Mode + } + return 0 +} + +func (x *FileInfoMsg) GetAtime() *timestamppb.Timestamp { + if x != nil { + return x.Atime + } + return nil +} + +func (x *FileInfoMsg) GetMtime() *timestamppb.Timestamp { + if x != nil { + return x.Mtime + } + return nil +} + +func (x *FileInfoMsg) GetCtime() *timestamppb.Timestamp { + if x != nil { + return x.Ctime + } + return nil +} + +func (x *FileInfoMsg) GetCrtime() *timestamppb.Timestamp { + if x != nil { + return x.Crtime + } + return nil +} + +func (x *FileInfoMsg) GetUid() uint32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *FileInfoMsg) GetGid() uint32 { + if x != nil { + return x.Gid + } + return 0 +} + +func (x *FileInfoMsg) GetDirentType() uint32 { + if x != nil { + return x.DirentType + } + return 0 +} + +func (x *FileInfoMsg) GetHandle() uint64 { + if x != nil { + return x.Handle + } + return 0 +} + +// Sending a single uint64 +// - GetSize (response) +// - GetLength (response) +// - GetInfo (request) +// - Delete (request) +// - MkDir (response) +// - GenerateHandle (request, response) +// - CreateFile (response) +// - RmDir (request) +// - DeleteHandle (request) +// - SyncFile (request) +type UintMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data uint64 `protobuf:"varint,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *UintMsg) Reset() { + *x = UintMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UintMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UintMsg) ProtoMessage() {} + +func (x *UintMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UintMsg.ProtoReflect.Descriptor instead. +func (*UintMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{1} +} + +func (x *UintMsg) GetData() uint64 { + if x != nil { + return x.Data + } + return 0 +} + +// Sending file contents +// - ReadAt +// - WriteAt +type ContentMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Off int64 `protobuf:"varint,3,opt,name=off,proto3" json:"off,omitempty"` +} + +func (x *ContentMsg) Reset() { + *x = ContentMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContentMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentMsg) ProtoMessage() {} + +func (x *ContentMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContentMsg.ProtoReflect.Descriptor instead. +func (*ContentMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{2} +} + +func (x *ContentMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *ContentMsg) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *ContentMsg) GetOff() int64 { + if x != nil { + return x.Off + } + return 0 +} + +// SetInfoParamsMsg +// - SetInfo (request) +type SetInfoParamsMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Uid int32 `protobuf:"varint,2,opt,name=uid,proto3" json:"uid,omitempty"` + Gid int32 `protobuf:"varint,3,opt,name=gid,proto3" json:"gid,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + Mode int32 `protobuf:"varint,5,opt,name=mode,proto3" json:"mode,omitempty"` + Atime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=atime,proto3" json:"atime,omitempty"` + Mtime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=mtime,proto3" json:"mtime,omitempty"` +} + +func (x *SetInfoParamsMsg) Reset() { + *x = SetInfoParamsMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetInfoParamsMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetInfoParamsMsg) ProtoMessage() {} + +func (x *SetInfoParamsMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetInfoParamsMsg.ProtoReflect.Descriptor instead. +func (*SetInfoParamsMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{3} +} + +func (x *SetInfoParamsMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *SetInfoParamsMsg) GetUid() int32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *SetInfoParamsMsg) GetGid() int32 { + if x != nil { + return x.Gid + } + return 0 +} + +func (x *SetInfoParamsMsg) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *SetInfoParamsMsg) GetMode() int32 { + if x != nil { + return x.Mode + } + return 0 +} + +func (x *SetInfoParamsMsg) GetAtime() *timestamppb.Timestamp { + if x != nil { + return x.Atime + } + return nil +} + +func (x *SetInfoParamsMsg) GetMtime() *timestamppb.Timestamp { + if x != nil { + return x.Mtime + } + return nil +} + +// MkInodeMsg +// - MkDir (request) +// - CreateFile (request) +type MkInodeMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Parent uint64 `protobuf:"varint,1,opt,name=parent,proto3" json:"parent,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Mode uint32 `protobuf:"varint,3,opt,name=mode,proto3" json:"mode,omitempty"` +} + +func (x *MkInodeMsg) Reset() { + *x = MkInodeMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MkInodeMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MkInodeMsg) ProtoMessage() {} + +func (x *MkInodeMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MkInodeMsg.ProtoReflect.Descriptor instead. +func (*MkInodeMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{4} +} + +func (x *MkInodeMsg) GetParent() uint64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *MkInodeMsg) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MkInodeMsg) GetMode() uint32 { + if x != nil { + return x.Mode + } + return 0 +} + +// Empty Message +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{5} +} + +var File_comm_proto protoreflect.FileDescriptor + +var file_comm_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x05, 0x0a, + 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x2e, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4d, 0x61, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, + 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, + 0x0a, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x63, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1d, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, + 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, 0x66, 0x66, 0x22, 0xd8, + 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x4d, 0x6b, 0x49, + 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x32, 0xf3, 0x06, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x53, 0x43, 0x6f, 0x6d, + 0x6d, 0x73, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6f, + 0x6d, 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, + 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, + 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x1a, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1f, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, + 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, + 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, + 0x09, 0x4d, 0x6b, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, + 0x64, 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, + 0x46, 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, + 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, + 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, + 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x09, 0x52, 0x6d, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, + 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, + 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, + 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, + 0x67, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, + 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_comm_proto_rawDescOnce sync.Once + file_comm_proto_rawDescData = file_comm_proto_rawDesc +) + +func file_comm_proto_rawDescGZIP() []byte { + file_comm_proto_rawDescOnce.Do(func() { + file_comm_proto_rawDescData = protoimpl.X.CompressGZIP(file_comm_proto_rawDescData) + }) + return file_comm_proto_rawDescData +} + +var file_comm_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_comm_proto_goTypes = []any{ + (*FileInfoMsg)(nil), // 0: remotefscomms.FileInfoMsg + (*UintMsg)(nil), // 1: remotefscomms.UintMsg + (*ContentMsg)(nil), // 2: remotefscomms.ContentMsg + (*SetInfoParamsMsg)(nil), // 3: remotefscomms.SetInfoParamsMsg + (*MkInodeMsg)(nil), // 4: remotefscomms.MkInodeMsg + (*Empty)(nil), // 5: remotefscomms.Empty + nil, // 6: remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp +} +var file_comm_proto_depIdxs = []int32{ + 6, // 0: remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + 7, // 1: remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 2: remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp + 7, // 3: remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp + 7, // 4: remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp + 7, // 5: remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 6: remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp + 5, // 7: remotefscomms.RemoteFSComms.GetSizeComm:input_type -> remotefscomms.Empty + 5, // 8: remotefscomms.RemoteFSComms.GetLengthComm:input_type -> remotefscomms.Empty + 1, // 9: remotefscomms.RemoteFSComms.GetInfoComm:input_type -> remotefscomms.UintMsg + 3, // 10: remotefscomms.RemoteFSComms.SetInfoComm:input_type -> remotefscomms.SetInfoParamsMsg + 1, // 11: remotefscomms.RemoteFSComms.DeleteComm:input_type -> remotefscomms.UintMsg + 4, // 12: remotefscomms.RemoteFSComms.MkDirComm:input_type -> remotefscomms.MkInodeMsg + 1, // 13: remotefscomms.RemoteFSComms.GenerateHandleComm:input_type -> remotefscomms.UintMsg + 4, // 14: remotefscomms.RemoteFSComms.CreateFileComm:input_type -> remotefscomms.MkInodeMsg + 1, // 15: remotefscomms.RemoteFSComms.RmDirComm:input_type -> remotefscomms.UintMsg + 1, // 16: remotefscomms.RemoteFSComms.DeleteHandleComm:input_type -> remotefscomms.UintMsg + 1, // 17: remotefscomms.RemoteFSComms.SyncFileComm:input_type -> remotefscomms.UintMsg + 2, // 18: remotefscomms.RemoteFSComms.WriteAtComm:input_type -> remotefscomms.ContentMsg + 2, // 19: remotefscomms.RemoteFSComms.ReadAtComm:input_type -> remotefscomms.ContentMsg + 1, // 20: remotefscomms.RemoteFSComms.GetSizeComm:output_type -> remotefscomms.UintMsg + 1, // 21: remotefscomms.RemoteFSComms.GetLengthComm:output_type -> remotefscomms.UintMsg + 0, // 22: remotefscomms.RemoteFSComms.GetInfoComm:output_type -> remotefscomms.FileInfoMsg + 5, // 23: remotefscomms.RemoteFSComms.SetInfoComm:output_type -> remotefscomms.Empty + 5, // 24: remotefscomms.RemoteFSComms.DeleteComm:output_type -> remotefscomms.Empty + 1, // 25: remotefscomms.RemoteFSComms.MkDirComm:output_type -> remotefscomms.UintMsg + 1, // 26: remotefscomms.RemoteFSComms.GenerateHandleComm:output_type -> remotefscomms.UintMsg + 1, // 27: remotefscomms.RemoteFSComms.CreateFileComm:output_type -> remotefscomms.UintMsg + 5, // 28: remotefscomms.RemoteFSComms.RmDirComm:output_type -> remotefscomms.Empty + 5, // 29: remotefscomms.RemoteFSComms.DeleteHandleComm:output_type -> remotefscomms.Empty + 5, // 30: remotefscomms.RemoteFSComms.SyncFileComm:output_type -> remotefscomms.Empty + 1, // 31: remotefscomms.RemoteFSComms.WriteAtComm:output_type -> remotefscomms.UintMsg + 1, // 32: remotefscomms.RemoteFSComms.ReadAtComm:output_type -> remotefscomms.UintMsg + 20, // [20:33] is the sub-list for method output_type + 7, // [7:20] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_comm_proto_init() } +func file_comm_proto_init() { + if File_comm_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_comm_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FileInfoMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*UintMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ContentMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*SetInfoParamsMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*MkInodeMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_comm_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_comm_proto_goTypes, + DependencyIndexes: file_comm_proto_depIdxs, + MessageInfos: file_comm_proto_msgTypes, + }.Build() + File_comm_proto = out.File + file_comm_proto_rawDesc = nil + file_comm_proto_goTypes = nil + file_comm_proto_depIdxs = nil +} diff --git a/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go b/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go new file mode 100644 index 00000000..11916590 --- /dev/null +++ b/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go @@ -0,0 +1,566 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.4.0 +// - protoc v5.27.1 +// source: comm.proto + +package remotefscomms + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 + +const ( + RemoteFSComms_GetSizeComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetSizeComm" + RemoteFSComms_GetLengthComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetLengthComm" + RemoteFSComms_GetInfoComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetInfoComm" + RemoteFSComms_SetInfoComm_FullMethodName = "/remotefscomms.RemoteFSComms/SetInfoComm" + RemoteFSComms_DeleteComm_FullMethodName = "/remotefscomms.RemoteFSComms/DeleteComm" + RemoteFSComms_MkDirComm_FullMethodName = "/remotefscomms.RemoteFSComms/MkDirComm" + RemoteFSComms_GenerateHandleComm_FullMethodName = "/remotefscomms.RemoteFSComms/GenerateHandleComm" + RemoteFSComms_CreateFileComm_FullMethodName = "/remotefscomms.RemoteFSComms/CreateFileComm" + RemoteFSComms_RmDirComm_FullMethodName = "/remotefscomms.RemoteFSComms/RmDirComm" + RemoteFSComms_DeleteHandleComm_FullMethodName = "/remotefscomms.RemoteFSComms/DeleteHandleComm" + RemoteFSComms_SyncFileComm_FullMethodName = "/remotefscomms.RemoteFSComms/SyncFileComm" + RemoteFSComms_WriteAtComm_FullMethodName = "/remotefscomms.RemoteFSComms/WriteAtComm" + RemoteFSComms_ReadAtComm_FullMethodName = "/remotefscomms.RemoteFSComms/ReadAtComm" +) + +// RemoteFSCommsClient is the client API for RemoteFSComms service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RemoteFSCommsClient interface { + GetSizeComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) + GetLengthComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) + GetInfoComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*FileInfoMsg, error) + SetInfoComm(ctx context.Context, in *SetInfoParamsMsg, opts ...grpc.CallOption) (*Empty, error) + DeleteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + MkDirComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) + GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) + CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) + RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) + ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) +} + +type remoteFSCommsClient struct { + cc grpc.ClientConnInterface +} + +func NewRemoteFSCommsClient(cc grpc.ClientConnInterface) RemoteFSCommsClient { + return &remoteFSCommsClient{cc} +} + +func (c *remoteFSCommsClient) GetSizeComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetSizeComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GetLengthComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetLengthComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GetInfoComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*FileInfoMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(FileInfoMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetInfoComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) SetInfoComm(ctx context.Context, in *SetInfoParamsMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_SetInfoComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) DeleteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_DeleteComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) MkDirComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_MkDirComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GenerateHandleComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_CreateFileComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_RmDirComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_DeleteHandleComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_SyncFileComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_WriteAtComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_ReadAtComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RemoteFSCommsServer is the server API for RemoteFSComms service. +// All implementations must embed UnimplementedRemoteFSCommsServer +// for forward compatibility +type RemoteFSCommsServer interface { + GetSizeComm(context.Context, *Empty) (*UintMsg, error) + GetLengthComm(context.Context, *Empty) (*UintMsg, error) + GetInfoComm(context.Context, *UintMsg) (*FileInfoMsg, error) + SetInfoComm(context.Context, *SetInfoParamsMsg) (*Empty, error) + DeleteComm(context.Context, *UintMsg) (*Empty, error) + MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) + GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) + CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) + RmDirComm(context.Context, *UintMsg) (*Empty, error) + DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) + SyncFileComm(context.Context, *UintMsg) (*Empty, error) + WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) + ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) + mustEmbedUnimplementedRemoteFSCommsServer() +} + +// UnimplementedRemoteFSCommsServer must be embedded to have forward compatible implementations. +type UnimplementedRemoteFSCommsServer struct { +} + +func (UnimplementedRemoteFSCommsServer) GetSizeComm(context.Context, *Empty) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSizeComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GetLengthComm(context.Context, *Empty) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLengthComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GetInfoComm(context.Context, *UintMsg) (*FileInfoMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetInfoComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) SetInfoComm(context.Context, *SetInfoParamsMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetInfoComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) DeleteComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method MkDirComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateHandleComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateFileComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) RmDirComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RmDirComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteHandleComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) SyncFileComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SyncFileComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method WriteAtComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadAtComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) mustEmbedUnimplementedRemoteFSCommsServer() {} + +// UnsafeRemoteFSCommsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RemoteFSCommsServer will +// result in compilation errors. +type UnsafeRemoteFSCommsServer interface { + mustEmbedUnimplementedRemoteFSCommsServer() +} + +func RegisterRemoteFSCommsServer(s grpc.ServiceRegistrar, srv RemoteFSCommsServer) { + s.RegisterService(&RemoteFSComms_ServiceDesc, srv) +} + +func _RemoteFSComms_GetSizeComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetSizeComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetSizeComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetSizeComm(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GetLengthComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetLengthComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetLengthComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetLengthComm(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GetInfoComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetInfoComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetInfoComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetInfoComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_SetInfoComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetInfoParamsMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).SetInfoComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_SetInfoComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).SetInfoComm(ctx, req.(*SetInfoParamsMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_DeleteComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).DeleteComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_DeleteComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).DeleteComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_MkDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MkInodeMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).MkDirComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_MkDirComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).MkDirComm(ctx, req.(*MkInodeMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GenerateHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GenerateHandleComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_CreateFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MkInodeMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_CreateFileComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, req.(*MkInodeMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_RmDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).RmDirComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_RmDirComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).RmDirComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_DeleteHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_DeleteHandleComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_SyncFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_SyncFileComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_WriteAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ContentMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_WriteAtComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, req.(*ContentMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ContentMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_ReadAtComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, req.(*ContentMsg)) + } + return interceptor(ctx, in, info, handler) +} + +// RemoteFSComms_ServiceDesc is the grpc.ServiceDesc for RemoteFSComms service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "remotefscomms.RemoteFSComms", + HandlerType: (*RemoteFSCommsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSizeComm", + Handler: _RemoteFSComms_GetSizeComm_Handler, + }, + { + MethodName: "GetLengthComm", + Handler: _RemoteFSComms_GetLengthComm_Handler, + }, + { + MethodName: "GetInfoComm", + Handler: _RemoteFSComms_GetInfoComm_Handler, + }, + { + MethodName: "SetInfoComm", + Handler: _RemoteFSComms_SetInfoComm_Handler, + }, + { + MethodName: "DeleteComm", + Handler: _RemoteFSComms_DeleteComm_Handler, + }, + { + MethodName: "MkDirComm", + Handler: _RemoteFSComms_MkDirComm_Handler, + }, + { + MethodName: "GenerateHandleComm", + Handler: _RemoteFSComms_GenerateHandleComm_Handler, + }, + { + MethodName: "CreateFileComm", + Handler: _RemoteFSComms_CreateFileComm_Handler, + }, + { + MethodName: "RmDirComm", + Handler: _RemoteFSComms_RmDirComm_Handler, + }, + { + MethodName: "DeleteHandleComm", + Handler: _RemoteFSComms_DeleteHandleComm_Handler, + }, + { + MethodName: "SyncFileComm", + Handler: _RemoteFSComms_SyncFileComm_Handler, + }, + { + MethodName: "WriteAtComm", + Handler: _RemoteFSComms_WriteAtComm_Handler, + }, + { + MethodName: "ReadAtComm", + Handler: _RemoteFSComms_ReadAtComm_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "comm.proto", +} diff --git a/mft-fs/remotefs/remotefscomms/commutils.go b/mft-fs/remotefs/remotefscomms/commutils.go new file mode 100644 index 00000000..406720d1 --- /dev/null +++ b/mft-fs/remotefs/remotefscomms/commutils.go @@ -0,0 +1,57 @@ +package remotefscomms + +import ( + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "google.golang.org/protobuf/types/known/timestamppb" + "mft-fs/abstractfs" + "os" +) + +func ConvertFromComm(input *FileInfoMsg, output *abstractfs.FileInfo) { + output.Name = input.Name + output.Path = input.Path + output.Inode = fuseops.InodeID(input.Inode) + for _, child := range input.Children { + output.Children = append(output.Children, fuseops.InodeID(child)) + } + for name, index := range input.ChildrenIndexMap { + output.ChildrenIndexMap[name] = int(index) + } + output.Parent = fuseops.InodeID(input.Parent) + output.Nlink = input.Nlink + output.Size = input.Size + output.Mode = os.FileMode(input.Mode) + output.Atime = input.Atime.AsTime() + output.Mtime = input.Mtime.AsTime() + output.Ctime = input.Ctime.AsTime() + output.Crtime = input.Crtime.AsTime() + output.Uid = input.Uid + output.Gid = input.Gid + output.DirentType = fuseutil.DirentType(input.DirentType) + output.Handle = fuseops.HandleID(input.Handle) +} + +func ConvertToComm(input *abstractfs.FileInfo, output *FileInfoMsg) { + output.Name = input.Name + output.Path = input.Path + output.Inode = uint64(input.Inode) + for _, child := range input.Children { + output.Children = append(output.Children, uint64(child)) + } + for name, index := range input.ChildrenIndexMap { + output.ChildrenIndexMap[name] = uint32(index) + } + output.Parent = uint64(input.Parent) + output.Nlink = input.Nlink + output.Size = input.Size + output.Mode = uint32(input.Mode) + output.Atime = timestamppb.New(input.Atime) + output.Mtime = timestamppb.New(input.Mtime) + output.Ctime = timestamppb.New(input.Ctime) + output.Crtime = timestamppb.New(input.Crtime) + output.Uid = input.Uid + output.Gid = input.Gid + output.DirentType = uint32(input.DirentType) + output.Handle = uint64(input.Handle) +} diff --git a/mft-fs/s3fs/s3_fs_manager.go b/mft-fs/s3fs/s3_fs_manager.go deleted file mode 100644 index 11bac127..00000000 --- a/mft-fs/s3fs/s3_fs_manager.go +++ /dev/null @@ -1,136 +0,0 @@ -package main - -// package s3fs - -import ( - "encoding/json" - "fmt" - "github.com/jacobsa/fuse" - "github.com/jacobsa/fuse/fuseops" - "mft-fs/abstractfs" - "net/http" - "os" - "time" -) - -func main() { - _, e := NewFSManager("./cache", "http://localhost:8000") - if e != nil { - fmt.Println(e) - } -} - -type FSManager struct { - abstractfs.FSManager - inodeInfo map[fuseops.InodeID]*abstractfs.FileInfo - handleToInode map[fuseops.HandleID]fuseops.InodeID - cacheDirectory string - updateTime time.Time - serverURL string - currentInode fuseops.InodeID - maxInode fuseops.InodeID -} - -func NewFSManager(cacheDirectory string, serverURL string) (*FSManager, error) { - output := &FSManager{ - inodeInfo: make(map[fuseops.InodeID]*abstractfs.FileInfo), - handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), - cacheDirectory: cacheDirectory, - serverURL: serverURL, - updateTime: time.Unix(0, 0), - } - e := output.update() - if e != nil { - return nil, e - } - output.allocateInodes() - return output, nil -} - -const addDeviceURI = "/add_device" -const getDirectoryInfoURI = "/get_directory_info" -const allocateInodesURI = "/allocate_inodes" -const addInodeURI = "/add_inode" -const removeInodeURI = "/remove_inode" -const requestReadURI = "/request_read" -const ackReadURI = "/ack_read" -const requestWriteURI = "/request_write" -const ackWriteURI = "/ack_write" - -type getResponseStruct struct { - Name string - Path string - Inode uint64 - Children []uint64 - ChildrenIndexMap map[string]uint64 - Parent uint64 - Nlink uint32 - Size uint64 - Mode int - Atime uint64 - Mtime uint64 - Ctime uint64 - Crtime uint64 - Uid uint32 - Gid uint32 - DirentType uint8 - WriteTime uint64 -} - -func (manager *FSManager) update() error { - fmt.Println(manager.serverURL + getDirectoryInfoURI) - response, e := http.Get(manager.serverURL + getDirectoryInfoURI) - defer response.Body.Close() - if e != nil { - return e - } - var buff []byte = make([]byte, 12000) - bytesRead, _ := response.Body.Read(buff) - fmt.Println(string(buff[:bytesRead])) - var data []getResponseStruct - e = json.Unmarshal(buff[:bytesRead], &data) - if e != nil { - return e - } - manager.updateTime = time.Now() - return nil -} - -func (manager *FSManager) uploadFile() {} -func (manager *FSManager) downloadFile() {} -func (manager *FSManager) allocateInodes() {} -func (manager *FSManager) requestRead() {} -func (manager *FSManager) ackRead() {} -func (manager *FSManager) requestWrite() {} -func (manager *FSManager) ackWrite() {} - -func (manager *FSManager) GetLength() uint64 { - return uint64(len(manager.inodeInfo)) -} - -func (manager *FSManager) GetSize() uint64 { - return uint64(4096) -} - -func (manager *FSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { - e := manager.update() - if e != nil { - return nil, e - } - info, ok := manager.inodeInfo[inode] - if !ok { - return nil, fuse.ENOENT - } - return info, nil -} - -func (manager *FSManager) RmDir(inode fuseops.InodeID) error { - return nil -} - -func (manager *FSManager) CloseFile(inode fuseops.InodeID, file *os.File, write bool) { - defer file.Close() - if write { - manager.uploadFile() - } -} From f2877c1402f52510d26c22c7af3cc3a2b3d6790f Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 19 Jul 2024 08:50:49 -0700 Subject: [PATCH 17/37] working remotefs --- mft-fs/abstractfs/abstract_fs_operations.go | 5 +- mft-fs/gomod.txt | 16 ++- mft-fs/remotefs/client/client_manager.go | 27 +--- mft-fs/remotefs/clientmain/client_main.go | 54 +++++++ mft-fs/remotefs/server/server_manager.go | 148 ++++++++++++++++++++ mft-fs/remotefs/servermain/server_main.go | 26 ++++ 6 files changed, 250 insertions(+), 26 deletions(-) create mode 100644 mft-fs/remotefs/clientmain/client_main.go create mode 100644 mft-fs/remotefs/server/server_manager.go create mode 100644 mft-fs/remotefs/servermain/server_main.go diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index 243b5b21..5adcbdb3 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -6,7 +6,6 @@ import ( "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" - "os" "time" ) @@ -22,9 +21,9 @@ The printer function prints messages to the terminal on behalf of FUSE operation func printer(message string) { fmt.Println(message) - file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + /*file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) defer file.Close() - file.WriteString(fmt.Sprintf("%s\n", message)) + file.WriteString(fmt.Sprintf("%s\n", message))*/ } func minimum(a int64, b int64) int64 { diff --git a/mft-fs/gomod.txt b/mft-fs/gomod.txt index 4b170bab..4463839c 100644 --- a/mft-fs/gomod.txt +++ b/mft-fs/gomod.txt @@ -1,7 +1,19 @@ module mft-fs -go 1.22 +go 1.21 + +toolchain go1.22.3 require github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 -require golang.org/x/sys v0.21.0 +require ( + golang.org/x/sys v0.21.0 + google.golang.org/grpc v1.65.0 +) + +require ( + golang.org/x/net v0.25.0 // indirect + golang.org/x/text v0.15.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect + google.golang.org/protobuf v1.34.1 // indirect +) diff --git a/mft-fs/remotefs/client/client_manager.go b/mft-fs/remotefs/client/client_manager.go index 10418975..f1a6dce6 100644 --- a/mft-fs/remotefs/client/client_manager.go +++ b/mft-fs/remotefs/client/client_manager.go @@ -4,7 +4,6 @@ import ( "context" "github.com/jacobsa/fuse/fuseops" "google.golang.org/grpc" - "google.golang.org/grpc/credentials/insecure" "google.golang.org/protobuf/types/known/timestamppb" "mft-fs/abstractfs" "mft-fs/remotefs/remotefscomms" @@ -14,31 +13,15 @@ import ( type ClientManager struct { abstractfs.FSManager - conn *grpc.ClientConn client remotefscomms.RemoteFSCommsClient } -func NewClientManager() (*ClientManager, error) { +func NewClientManager(conn *grpc.ClientConn) (*ClientManager, error) { output := &ClientManager{} - e := output.init() - if e != nil { - return nil, e - } + output.client = remotefscomms.NewRemoteFSCommsClient(conn) return output, nil } -func (manager *ClientManager) init() error { - var opts []grpc.DialOption - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - var e error - manager.conn, e = grpc.NewClient("http://localhost:8000", opts...) - if e != nil { - return e - } - manager.client = remotefscomms.NewRemoteFSCommsClient(manager.conn) - return nil -} - func (manager *ClientManager) GetSize() (uint64, error) { resp, e := manager.client.GetSizeComm(context.Background(), &remotefscomms.Empty{}) if e != nil { @@ -62,7 +45,9 @@ func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileIn if e != nil { return nil, e } - output := &abstractfs.FileInfo{} + output := &abstractfs.FileInfo{ + ChildrenIndexMap: make(map[string]int), + } remotefscomms.ConvertFromComm(resp, output) return output, nil } @@ -174,5 +159,5 @@ func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int } func (manager *ClientManager) Destroy() error { - return manager.conn.Close() + return nil } diff --git a/mft-fs/remotefs/clientmain/client_main.go b/mft-fs/remotefs/clientmain/client_main.go new file mode 100644 index 00000000..122cd6ab --- /dev/null +++ b/mft-fs/remotefs/clientmain/client_main.go @@ -0,0 +1,54 @@ +package main + +import ( + "context" + "flag" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "log" + "mft-fs/abstractfs" + "mft-fs/remotefs/client" + "os" +) + +func main() { + + // reading commandline args + mountDirectory := flag.String("mountDirectory", "", "mount directory") + flag.Parse() + + // setting up gRPC communicators + var opts []grpc.DialOption + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, e := grpc.NewClient(":8000", opts...) + if e != nil { + log.Fatalf("Error: %v\n", e) + } + defer conn.Close() + + // setting up FUSE + manager, e := client.NewClientManager(conn) + if e != nil { + log.Fatalf("Error: %v\n", e) + } + fs, _ := abstractfs.NewAbstractFS(manager) + server := fuseutil.NewFileSystemServer(&fs) + + // mount the filesystem + cfg := &fuse.MountConfig{ + ReadOnly: false, + DebugLogger: log.New(os.Stderr, "fuse: ", 0), + ErrorLogger: log.New(os.Stderr, "fuse: ", 0), + } + mfs, err := fuse.Mount(*mountDirectory, server, cfg) + if err != nil { + log.Fatalf("Mount: %v", err) + } + + // wait for it to be unmounted + if err = mfs.Join(context.Background()); err != nil { + log.Fatalf("Join: %v", err) + } +} diff --git a/mft-fs/remotefs/server/server_manager.go b/mft-fs/remotefs/server/server_manager.go new file mode 100644 index 00000000..55bd3d76 --- /dev/null +++ b/mft-fs/remotefs/server/server_manager.go @@ -0,0 +1,148 @@ +package server + +import ( + "context" + "github.com/jacobsa/fuse/fuseops" + "mft-fs/osfsmanager" + "mft-fs/remotefs/remotefscomms" + "os" + "time" +) + +type Server struct { + remotefscomms.UnimplementedRemoteFSCommsServer + manager *osfsmanager.OSFSManager +} + +func NewServerHandler(root string) *Server { + output := &Server{ + manager: osfsmanager.NewOSFSManager(root), + } + return output +} + +func (server *Server) GetSizeComm(ctx context.Context, in *remotefscomms.Empty) (*remotefscomms.UintMsg, error) { + size, e := server.manager.GetSize() + if e != nil { + return nil, e + } + return &remotefscomms.UintMsg{Data: size}, nil +} + +func (server *Server) GetLengthComm(ctx context.Context, in *remotefscomms.Empty) (*remotefscomms.UintMsg, error) { + length, e := server.manager.GetLength() + if e != nil { + return nil, e + } + return &remotefscomms.UintMsg{Data: length}, nil +} + +func (server *Server) GetInfoComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.FileInfoMsg, error) { + info, e := server.manager.GetInfo(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + output := &remotefscomms.FileInfoMsg{ + ChildrenIndexMap: make(map[string]uint32), + } + remotefscomms.ConvertToComm(info, output) + return output, nil +} + +func (server *Server) SetInfoComm(ctx context.Context, in *remotefscomms.SetInfoParamsMsg) (*remotefscomms.Empty, error) { + var uidptr *uint32 = nil + var gidptr *uint32 = nil + var sizeptr *uint64 = nil + var modeptr *os.FileMode = nil + var atimeptr *time.Time = nil + var mtimeptr *time.Time = nil + if in.Uid != -1 { + *uidptr = uint32(in.Uid) + } + if in.Gid != -1 { + *gidptr = uint32(in.Gid) + } + if in.Mode != -1 { + *modeptr = os.FileMode(in.Mode) + } + if in.Size != -1 { + *sizeptr = uint64(in.Size) + } + if !in.Atime.AsTime().Equal(time.Time{}) { + *atimeptr = in.Atime.AsTime() + } + if !in.Mtime.AsTime().Equal(time.Time{}) { + *mtimeptr = in.Mtime.AsTime() + } + e := server.manager.SetInfo(fuseops.InodeID(in.Inode), uidptr, gidptr, sizeptr, modeptr, atimeptr, mtimeptr) + if e != nil { + return nil, e + } + return &remotefscomms.Empty{}, nil +} + +func (server *Server) DeleteComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { + e := server.manager.Delete(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &remotefscomms.Empty{}, nil +} + +func (server *Server) MkDirComm(ctx context.Context, in *remotefscomms.MkInodeMsg) (*remotefscomms.UintMsg, error) { + inode, e := server.manager.MkDir(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) + if e != nil { + return nil, e + } + return &remotefscomms.UintMsg{Data: uint64(inode)}, nil +} + +func (server *Server) GenerateHandleComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.UintMsg, error) { + handle, e := server.manager.GenerateHandle(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &remotefscomms.UintMsg{Data: uint64(handle)}, nil +} + +func (server *Server) CreateFileComm(ctx context.Context, in *remotefscomms.MkInodeMsg) (*remotefscomms.UintMsg, error) { + inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) + if e != nil { + return nil, e + } + return &remotefscomms.UintMsg{Data: uint64(inode)}, nil +} + +func (server *Server) RmDirComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { + e := server.manager.RmDir(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &remotefscomms.Empty{}, nil +} + +func (server *Server) DeleteHandleComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { + e := server.manager.DeleteHandle(fuseops.HandleID(in.Data)) + if e != nil { + return nil, e + } + return &remotefscomms.Empty{}, nil +} + +func (server *Server) SyncFileComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { + e := server.manager.SyncFile(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &remotefscomms.Empty{}, nil +} + +func (server *Server) WriteAtComm(ctx context.Context, in *remotefscomms.ContentMsg) (*remotefscomms.UintMsg, error) { + n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) + return &remotefscomms.UintMsg{Data: uint64(n)}, nil +} + +func (server *Server) ReadAtComm(ctx context.Context, in *remotefscomms.ContentMsg) (*remotefscomms.UintMsg, error) { + n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), in.Data, in.Off) + return &remotefscomms.UintMsg{Data: uint64(n)}, nil +} diff --git a/mft-fs/remotefs/servermain/server_main.go b/mft-fs/remotefs/servermain/server_main.go new file mode 100644 index 00000000..a75a977a --- /dev/null +++ b/mft-fs/remotefs/servermain/server_main.go @@ -0,0 +1,26 @@ +package main + +import ( + "flag" + "google.golang.org/grpc" + "log" + "mft-fs/remotefs/remotefscomms" + "mft-fs/remotefs/server" + "net" +) + +func main() { + + rootDirectory := flag.String("rootDirectory", "", "Root Directory") + flag.Parse() + + lis, e := net.Listen("tcp", ":8000") + if e != nil { + log.Fatalf("Error: %v\n", e) + } + defer lis.Close() + + s := grpc.NewServer() + remotefscomms.RegisterRemoteFSCommsServer(s, server.NewServerHandler(*rootDirectory)) + s.Serve(lis) +} From 2c01db1a06be2b47414a7b6bd252f56f636838c4 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 19 Jul 2024 09:09:16 -0700 Subject: [PATCH 18/37] updated readme --- mft-fs/README.md | 96 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 90 insertions(+), 6 deletions(-) diff --git a/mft-fs/README.md b/mft-fs/README.md index 21c1eaf0..b24c9be7 100644 --- a/mft-fs/README.md +++ b/mft-fs/README.md @@ -4,7 +4,91 @@ MFT-FS is a FUSE-based extension to Airavata MFT. It provides the abstraction that unifies the different file I/O protocols into one filesystem. -

    Instructions

    +
    + +

    Instructions for RemoteFS

    + +RemoteFS is a Filesystem supported over a gRPC-based TCP connection. + +The following instructions assume Go v1.20.x and FUSE are installed on the system. + +
      +
    1. + +Code can be installed using + +```shell +git clone https://github.com/RohanPhadnis/airavata-mft.git +``` + +Perform all the steps below from the airavata-mft/mft-fs directory. +
    2. + +
    3. +
      +To get the go.mod file ready, use the following command: + +```shell +cat gomod.txt > go.mod +``` +
      +
    4. + +
    5. +
      +To install all dependencies, run the following two commands: + +```shell +go mod tidy +go install ./... +``` +
      +
    6. + +
    7. +
      +Before running, ensure you have the mount and test directories in the main directory. + +```shell +mkdir mount +mkdir root +``` +
      +
    8. + +
    9. +
      +To run the server, use the command: + +```shell +go run ./remotefs/servermain/server_main.go --rootDirectory ./root +``` + +This will run the server locally to interface with the FUSE client. + +
      +
    10. + +
    11. +
      +To run the client, allow the server to run in a terminal session. Open a new terminal and type: + +```shell +go run ./remotefs/clientmain/client_main.go --mountDirectory ./mount +``` +
      +
    12. + +
    13. +Important Final Step: Enjoy and report any bugs! +
    14. +
    + +
    + +

    Instructions for OSFS

    + +OSFS is a Filesystem Mount which uses the local operating system to interface with FUSE. The following instructions assume Go v1.20.x and FUSE are installed on the system. @@ -13,7 +97,7 @@ The following instructions assume Go v1.20.x and FUSE are installed on the syste Code can be installed using -``` shell +```shell git clone https://github.com/RohanPhadnis/airavata-mft.git ``` @@ -24,7 +108,7 @@ Perform all the steps below from the airavata-mft/mft-fs directory.
    To get the go.mod file ready, use the following command: -``` shell +```shell cat gomod.txt > go.mod ```
    @@ -34,7 +118,7 @@ cat gomod.txt > go.mod
    To install all dependencies, run the following two commands: -``` shell +```shell go mod tidy go install ./... ``` @@ -45,7 +129,7 @@ go install ./...
    Before running, ensure you have the mount and test directories in the main directory. -``` shell +```shell mkdir mount mkdir root ``` @@ -56,7 +140,7 @@ mkdir root
    To run the project, use the command: -``` shell +```shell go run ./main/main.go --mountDirectory ./mount --rootDirectory ./root ``` From 4f51c2358d9cf5076b931d2b66af5541ed6d16bb Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 25 Jul 2024 14:43:34 -0700 Subject: [PATCH 19/37] added read-write lock logic --- mft-fs/datastructures/read_write_lock.go | 74 +++++++++++++++++++++++ mft-fs/datastructures/slice_operations.go | 6 +- 2 files changed, 75 insertions(+), 5 deletions(-) create mode 100644 mft-fs/datastructures/read_write_lock.go diff --git a/mft-fs/datastructures/read_write_lock.go b/mft-fs/datastructures/read_write_lock.go new file mode 100644 index 00000000..5a899b2b --- /dev/null +++ b/mft-fs/datastructures/read_write_lock.go @@ -0,0 +1,74 @@ +package datastructures + +import ( + "sync" +) + +type CREWResource struct { + reads int + readsMutex *sync.Mutex + doneReads *sync.Cond + + allowRead bool + allowReadMutex *sync.Mutex + doneWrite *sync.Cond +} + +func NewCREWResource() *CREWResource { + mutex1 := &sync.Mutex{} + mutex2 := &sync.Mutex{} + + return &CREWResource{ + reads: 0, + readsMutex: mutex1, + doneReads: &sync.Cond{L: mutex1}, + + allowRead: true, + allowReadMutex: mutex2, + doneWrite: &sync.Cond{L: mutex2}, + } +} + +func (resource *CREWResource) RequestRead() { + resource.allowReadMutex.Lock() + for !resource.allowRead { + resource.doneWrite.Wait() + } + resource.readsMutex.Lock() + resource.reads++ + resource.readsMutex.Unlock() + resource.allowReadMutex.Unlock() +} + +func (resource *CREWResource) AckRead() { + resource.readsMutex.Lock() + resource.reads-- + if resource.reads == 0 { + resource.doneReads.Signal() + } + resource.readsMutex.Unlock() +} + +func (resource *CREWResource) RequestWrite() { + // wait for any writes to finish and set allow reads to false + resource.allowReadMutex.Lock() + for !resource.allowRead { + resource.doneWrite.Wait() + } + resource.allowRead = false + resource.allowReadMutex.Unlock() + + // wait for all reads to finish + resource.readsMutex.Lock() + for resource.reads > 0 { + resource.doneReads.Wait() + } + resource.readsMutex.Unlock() +} + +func (resource *CREWResource) AckWrite() { + resource.allowReadMutex.Lock() + resource.allowRead = true + resource.doneWrite.Broadcast() + resource.allowReadMutex.Unlock() +} diff --git a/mft-fs/datastructures/slice_operations.go b/mft-fs/datastructures/slice_operations.go index 0254c377..db6fb89f 100644 --- a/mft-fs/datastructures/slice_operations.go +++ b/mft-fs/datastructures/slice_operations.go @@ -1,10 +1,6 @@ package datastructures -import ( - "github.com/jacobsa/fuse/fuseops" -) - -func Remove(slice []fuseops.InodeID, i int) []fuseops.InodeID { +func Remove[T any](slice []T, i int) []T { if i+1 < len(slice) { return append(slice[:i], slice[i+1:]...) } From 416859f806906152c15b0d6d67e7e021645410d5 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Sat, 24 Aug 2024 08:49:46 -0400 Subject: [PATCH 20/37] copied remotefs files for safe-remotefs --- mft-fs/osfsmanager/os_fs_manager.go | 7 - mft-fs/remotefs/comm.proto | 2 +- mft-fs/remotefs/remotefscomms/comm.pb.go | 80 +- mft-fs/remotefs/remotefscomms/comm_grpc.pb.go | 28 +- mft-fs/safe-remotefs/client/client_manager.go | 163 ++++ .../safe-remotefs/clientmain/client_main.go | 54 ++ mft-fs/safe-remotefs/comm.proto | 102 +++ .../safe-remotefscomms/comm.pb.go | 821 ++++++++++++++++++ .../safe-remotefscomms/comm_grpc.pb.go | 566 ++++++++++++ .../safe-remotefscomms/commutils.go | 57 ++ mft-fs/safe-remotefs/server/server_manager.go | 148 ++++ .../safe-remotefs/servermain/server_main.go | 26 + 12 files changed, 1992 insertions(+), 62 deletions(-) create mode 100644 mft-fs/safe-remotefs/client/client_manager.go create mode 100644 mft-fs/safe-remotefs/clientmain/client_main.go create mode 100644 mft-fs/safe-remotefs/comm.proto create mode 100644 mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go create mode 100644 mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go create mode 100644 mft-fs/safe-remotefs/safe-remotefscomms/commutils.go create mode 100644 mft-fs/safe-remotefs/server/server_manager.go create mode 100644 mft-fs/safe-remotefs/servermain/server_main.go diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/osfsmanager/os_fs_manager.go index fd4ea2f2..53e232f4 100644 --- a/mft-fs/osfsmanager/os_fs_manager.go +++ b/mft-fs/osfsmanager/os_fs_manager.go @@ -104,13 +104,6 @@ func (manager *OSFSManager) GenerateHandle(inode fuseops.InodeID) (fuseops.Handl return handle, nil } -/* - -todo - update - fillAttributes -*/ - func (manager *OSFSManager) updateInfo(info *abstractfs.FileInfo) error { fileInfo, e := os.Stat(info.Path) diff --git a/mft-fs/remotefs/comm.proto b/mft-fs/remotefs/comm.proto index ca1ec35b..3660e5bf 100644 --- a/mft-fs/remotefs/comm.proto +++ b/mft-fs/remotefs/comm.proto @@ -1,7 +1,7 @@ syntax = "proto3"; package remotefscomms; -option go_package="./remotefscomms"; +option go_package="./safe-remotefscomms"; import "google/protobuf/timestamp.proto"; diff --git a/mft-fs/remotefs/remotefscomms/comm.pb.go b/mft-fs/remotefs/remotefscomms/comm.pb.go index 2679e9ce..52d7855e 100644 --- a/mft-fs/remotefs/remotefscomms/comm.pb.go +++ b/mft-fs/remotefs/remotefscomms/comm.pb.go @@ -671,49 +671,49 @@ func file_comm_proto_rawDescGZIP() []byte { var file_comm_proto_msgTypes = make([]protoimpl.MessageInfo, 7) var file_comm_proto_goTypes = []any{ - (*FileInfoMsg)(nil), // 0: remotefscomms.FileInfoMsg - (*UintMsg)(nil), // 1: remotefscomms.UintMsg - (*ContentMsg)(nil), // 2: remotefscomms.ContentMsg - (*SetInfoParamsMsg)(nil), // 3: remotefscomms.SetInfoParamsMsg - (*MkInodeMsg)(nil), // 4: remotefscomms.MkInodeMsg - (*Empty)(nil), // 5: remotefscomms.Empty - nil, // 6: remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + (*FileInfoMsg)(nil), // 0: safe-remotefscomms.FileInfoMsg + (*UintMsg)(nil), // 1: safe-remotefscomms.UintMsg + (*ContentMsg)(nil), // 2: safe-remotefscomms.ContentMsg + (*SetInfoParamsMsg)(nil), // 3: safe-remotefscomms.SetInfoParamsMsg + (*MkInodeMsg)(nil), // 4: safe-remotefscomms.MkInodeMsg + (*Empty)(nil), // 5: safe-remotefscomms.Empty + nil, // 6: safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp } var file_comm_proto_depIdxs = []int32{ - 6, // 0: remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> remotefscomms.FileInfoMsg.ChildrenIndexMapEntry - 7, // 1: remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp - 7, // 2: remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp - 7, // 3: remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp - 7, // 4: remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp - 7, // 5: remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp - 7, // 6: remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp - 5, // 7: remotefscomms.RemoteFSComms.GetSizeComm:input_type -> remotefscomms.Empty - 5, // 8: remotefscomms.RemoteFSComms.GetLengthComm:input_type -> remotefscomms.Empty - 1, // 9: remotefscomms.RemoteFSComms.GetInfoComm:input_type -> remotefscomms.UintMsg - 3, // 10: remotefscomms.RemoteFSComms.SetInfoComm:input_type -> remotefscomms.SetInfoParamsMsg - 1, // 11: remotefscomms.RemoteFSComms.DeleteComm:input_type -> remotefscomms.UintMsg - 4, // 12: remotefscomms.RemoteFSComms.MkDirComm:input_type -> remotefscomms.MkInodeMsg - 1, // 13: remotefscomms.RemoteFSComms.GenerateHandleComm:input_type -> remotefscomms.UintMsg - 4, // 14: remotefscomms.RemoteFSComms.CreateFileComm:input_type -> remotefscomms.MkInodeMsg - 1, // 15: remotefscomms.RemoteFSComms.RmDirComm:input_type -> remotefscomms.UintMsg - 1, // 16: remotefscomms.RemoteFSComms.DeleteHandleComm:input_type -> remotefscomms.UintMsg - 1, // 17: remotefscomms.RemoteFSComms.SyncFileComm:input_type -> remotefscomms.UintMsg - 2, // 18: remotefscomms.RemoteFSComms.WriteAtComm:input_type -> remotefscomms.ContentMsg - 2, // 19: remotefscomms.RemoteFSComms.ReadAtComm:input_type -> remotefscomms.ContentMsg - 1, // 20: remotefscomms.RemoteFSComms.GetSizeComm:output_type -> remotefscomms.UintMsg - 1, // 21: remotefscomms.RemoteFSComms.GetLengthComm:output_type -> remotefscomms.UintMsg - 0, // 22: remotefscomms.RemoteFSComms.GetInfoComm:output_type -> remotefscomms.FileInfoMsg - 5, // 23: remotefscomms.RemoteFSComms.SetInfoComm:output_type -> remotefscomms.Empty - 5, // 24: remotefscomms.RemoteFSComms.DeleteComm:output_type -> remotefscomms.Empty - 1, // 25: remotefscomms.RemoteFSComms.MkDirComm:output_type -> remotefscomms.UintMsg - 1, // 26: remotefscomms.RemoteFSComms.GenerateHandleComm:output_type -> remotefscomms.UintMsg - 1, // 27: remotefscomms.RemoteFSComms.CreateFileComm:output_type -> remotefscomms.UintMsg - 5, // 28: remotefscomms.RemoteFSComms.RmDirComm:output_type -> remotefscomms.Empty - 5, // 29: remotefscomms.RemoteFSComms.DeleteHandleComm:output_type -> remotefscomms.Empty - 5, // 30: remotefscomms.RemoteFSComms.SyncFileComm:output_type -> remotefscomms.Empty - 1, // 31: remotefscomms.RemoteFSComms.WriteAtComm:output_type -> remotefscomms.UintMsg - 1, // 32: remotefscomms.RemoteFSComms.ReadAtComm:output_type -> remotefscomms.UintMsg + 6, // 0: safe-remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + 7, // 1: safe-remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 2: safe-remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp + 7, // 3: safe-remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp + 7, // 4: safe-remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp + 7, // 5: safe-remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 6: safe-remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp + 5, // 7: safe-remotefscomms.RemoteFSComms.GetSizeComm:input_type -> safe-remotefscomms.Empty + 5, // 8: safe-remotefscomms.RemoteFSComms.GetLengthComm:input_type -> safe-remotefscomms.Empty + 1, // 9: safe-remotefscomms.RemoteFSComms.GetInfoComm:input_type -> safe-remotefscomms.UintMsg + 3, // 10: safe-remotefscomms.RemoteFSComms.SetInfoComm:input_type -> safe-remotefscomms.SetInfoParamsMsg + 1, // 11: safe-remotefscomms.RemoteFSComms.DeleteComm:input_type -> safe-remotefscomms.UintMsg + 4, // 12: safe-remotefscomms.RemoteFSComms.MkDirComm:input_type -> safe-remotefscomms.MkInodeMsg + 1, // 13: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:input_type -> safe-remotefscomms.UintMsg + 4, // 14: safe-remotefscomms.RemoteFSComms.CreateFileComm:input_type -> safe-remotefscomms.MkInodeMsg + 1, // 15: safe-remotefscomms.RemoteFSComms.RmDirComm:input_type -> safe-remotefscomms.UintMsg + 1, // 16: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:input_type -> safe-remotefscomms.UintMsg + 1, // 17: safe-remotefscomms.RemoteFSComms.SyncFileComm:input_type -> safe-remotefscomms.UintMsg + 2, // 18: safe-remotefscomms.RemoteFSComms.WriteAtComm:input_type -> safe-remotefscomms.ContentMsg + 2, // 19: safe-remotefscomms.RemoteFSComms.ReadAtComm:input_type -> safe-remotefscomms.ContentMsg + 1, // 20: safe-remotefscomms.RemoteFSComms.GetSizeComm:output_type -> safe-remotefscomms.UintMsg + 1, // 21: safe-remotefscomms.RemoteFSComms.GetLengthComm:output_type -> safe-remotefscomms.UintMsg + 0, // 22: safe-remotefscomms.RemoteFSComms.GetInfoComm:output_type -> safe-remotefscomms.FileInfoMsg + 5, // 23: safe-remotefscomms.RemoteFSComms.SetInfoComm:output_type -> safe-remotefscomms.Empty + 5, // 24: safe-remotefscomms.RemoteFSComms.DeleteComm:output_type -> safe-remotefscomms.Empty + 1, // 25: safe-remotefscomms.RemoteFSComms.MkDirComm:output_type -> safe-remotefscomms.UintMsg + 1, // 26: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:output_type -> safe-remotefscomms.UintMsg + 1, // 27: safe-remotefscomms.RemoteFSComms.CreateFileComm:output_type -> safe-remotefscomms.UintMsg + 5, // 28: safe-remotefscomms.RemoteFSComms.RmDirComm:output_type -> safe-remotefscomms.Empty + 5, // 29: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:output_type -> safe-remotefscomms.Empty + 5, // 30: safe-remotefscomms.RemoteFSComms.SyncFileComm:output_type -> safe-remotefscomms.Empty + 1, // 31: safe-remotefscomms.RemoteFSComms.WriteAtComm:output_type -> safe-remotefscomms.UintMsg + 1, // 32: safe-remotefscomms.RemoteFSComms.ReadAtComm:output_type -> safe-remotefscomms.UintMsg 20, // [20:33] is the sub-list for method output_type 7, // [7:20] is the sub-list for method input_type 7, // [7:7] is the sub-list for extension type_name diff --git a/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go b/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go index 11916590..31791914 100644 --- a/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go +++ b/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go @@ -19,19 +19,19 @@ import ( const _ = grpc.SupportPackageIsVersion8 const ( - RemoteFSComms_GetSizeComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetSizeComm" - RemoteFSComms_GetLengthComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetLengthComm" - RemoteFSComms_GetInfoComm_FullMethodName = "/remotefscomms.RemoteFSComms/GetInfoComm" - RemoteFSComms_SetInfoComm_FullMethodName = "/remotefscomms.RemoteFSComms/SetInfoComm" - RemoteFSComms_DeleteComm_FullMethodName = "/remotefscomms.RemoteFSComms/DeleteComm" - RemoteFSComms_MkDirComm_FullMethodName = "/remotefscomms.RemoteFSComms/MkDirComm" - RemoteFSComms_GenerateHandleComm_FullMethodName = "/remotefscomms.RemoteFSComms/GenerateHandleComm" - RemoteFSComms_CreateFileComm_FullMethodName = "/remotefscomms.RemoteFSComms/CreateFileComm" - RemoteFSComms_RmDirComm_FullMethodName = "/remotefscomms.RemoteFSComms/RmDirComm" - RemoteFSComms_DeleteHandleComm_FullMethodName = "/remotefscomms.RemoteFSComms/DeleteHandleComm" - RemoteFSComms_SyncFileComm_FullMethodName = "/remotefscomms.RemoteFSComms/SyncFileComm" - RemoteFSComms_WriteAtComm_FullMethodName = "/remotefscomms.RemoteFSComms/WriteAtComm" - RemoteFSComms_ReadAtComm_FullMethodName = "/remotefscomms.RemoteFSComms/ReadAtComm" + RemoteFSComms_GetSizeComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetSizeComm" + RemoteFSComms_GetLengthComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetLengthComm" + RemoteFSComms_GetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetInfoComm" + RemoteFSComms_SetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SetInfoComm" + RemoteFSComms_DeleteComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteComm" + RemoteFSComms_MkDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/MkDirComm" + RemoteFSComms_GenerateHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GenerateHandleComm" + RemoteFSComms_CreateFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/CreateFileComm" + RemoteFSComms_RmDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/RmDirComm" + RemoteFSComms_DeleteHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteHandleComm" + RemoteFSComms_SyncFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SyncFileComm" + RemoteFSComms_WriteAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/WriteAtComm" + RemoteFSComms_ReadAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/ReadAtComm" ) // RemoteFSCommsClient is the client API for RemoteFSComms service. @@ -505,7 +505,7 @@ func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "remotefscomms.RemoteFSComms", + ServiceName: "safe-remotefscomms.RemoteFSComms", HandlerType: (*RemoteFSCommsServer)(nil), Methods: []grpc.MethodDesc{ { diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go new file mode 100644 index 00000000..ab233229 --- /dev/null +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -0,0 +1,163 @@ +package client + +import ( + "context" + "github.com/jacobsa/fuse/fuseops" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/timestamppb" + "mft-fs/abstractfs" + "mft-fs/safe-remotefs/safe-remotefscomms" + "os" + "time" +) + +type ClientManager struct { + abstractfs.FSManager + client safe_remotefscomms.RemoteFSCommsClient +} + +func NewClientManager(conn *grpc.ClientConn) (*ClientManager, error) { + output := &ClientManager{} + output.client = safe_remotefscomms.NewRemoteFSCommsClient(conn) + return output, nil +} + +func (manager *ClientManager) GetSize() (uint64, error) { + resp, e := manager.client.GetSizeComm(context.Background(), &safe_remotefscomms.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetLength() (uint64, error) { + resp, e := manager.client.GetLengthComm(context.Background(), &safe_remotefscomms.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + resp, e := manager.client.GetInfoComm(context.Background(), &safe_remotefscomms.UintMsg{ + Data: uint64(inode), + }) + if e != nil { + return nil, e + } + output := &abstractfs.FileInfo{ + ChildrenIndexMap: make(map[string]int), + } + safe_remotefscomms.ConvertFromComm(resp, output) + return output, nil +} + +func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + request := &safe_remotefscomms.SetInfoParamsMsg{ + Inode: uint64(inode), + Uid: -1, + Gid: -1, + Size: -1, + Mode: -1, + Atime: timestamppb.New(time.Time{}), + Mtime: timestamppb.New(time.Time{}), + } + if uidptr != nil { + request.Uid = int32(*uidptr) + } + if gidptr != nil { + request.Gid = int32(*gidptr) + } + if sizeptr != nil { + request.Size = int64(*sizeptr) + } + if modeptr != nil { + request.Mode = int32(*modeptr) + } + if atimeptr != nil { + request.Atime = timestamppb.New(*atimeptr) + } + if mtimeptr != nil { + request.Mtime = timestamppb.New(*mtimeptr) + } + _, e := manager.client.SetInfoComm(context.Background(), request) + return e +} + +func (manager *ClientManager) Delete(inode fuseops.InodeID) error { + _, e := manager.client.DeleteComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.MkDirComm(context.Background(), &safe_remotefscomms.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + resp, e := manager.client.GenerateHandleComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + return fuseops.HandleID(resp.Data), nil +} +func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.CreateFileComm(context.Background(), &safe_remotefscomms.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { + _, e := manager.client.RmDirComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { + _, e := manager.client.DeleteHandleComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(handle)}) + return e +} + +func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { + _, e := manager.client.SyncFileComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms.ContentMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + return int(resp.Data), nil +} +func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms.ContentMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + return int(resp.Data), nil +} + +func (manager *ClientManager) Destroy() error { + return nil +} diff --git a/mft-fs/safe-remotefs/clientmain/client_main.go b/mft-fs/safe-remotefs/clientmain/client_main.go new file mode 100644 index 00000000..5217310b --- /dev/null +++ b/mft-fs/safe-remotefs/clientmain/client_main.go @@ -0,0 +1,54 @@ +package main + +import ( + "context" + "flag" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" + "log" + "mft-fs/abstractfs" + "mft-fs/safe-remotefs/client" + "os" +) + +func main() { + + // reading commandline args + mountDirectory := flag.String("mountDirectory", "", "mount directory") + flag.Parse() + + // setting up gRPC communicators + var opts []grpc.DialOption + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + conn, e := grpc.NewClient(":8000", opts...) + if e != nil { + log.Fatalf("Error: %v\n", e) + } + defer conn.Close() + + // setting up FUSE + manager, e := client.NewClientManager(conn) + if e != nil { + log.Fatalf("Error: %v\n", e) + } + fs, _ := abstractfs.NewAbstractFS(manager) + server := fuseutil.NewFileSystemServer(&fs) + + // mount the filesystem + cfg := &fuse.MountConfig{ + ReadOnly: false, + DebugLogger: log.New(os.Stderr, "fuse: ", 0), + ErrorLogger: log.New(os.Stderr, "fuse: ", 0), + } + mfs, err := fuse.Mount(*mountDirectory, server, cfg) + if err != nil { + log.Fatalf("Mount: %v", err) + } + + // wait for it to be unmounted + if err = mfs.Join(context.Background()); err != nil { + log.Fatalf("Join: %v", err) + } +} diff --git a/mft-fs/safe-remotefs/comm.proto b/mft-fs/safe-remotefs/comm.proto new file mode 100644 index 00000000..48ba13a0 --- /dev/null +++ b/mft-fs/safe-remotefs/comm.proto @@ -0,0 +1,102 @@ +syntax = "proto3"; +package safe_remotefscomms; + +option go_package="./safe-remotefscomms"; + +import "google/protobuf/timestamp.proto"; + +/* +Complete FileInfo struct + - GetInfo (response) +*/ +message FileInfoMsg { + string name = 1; + string path = 2; + uint64 inode = 3; + repeated uint64 children = 4; + map childrenIndexMap = 5; + uint64 parent = 6; + uint32 nlink = 7; + uint64 size = 8; + uint32 mode = 9; + google.protobuf.Timestamp atime = 10; + google.protobuf.Timestamp mtime = 11; + google.protobuf.Timestamp ctime = 12; + google.protobuf.Timestamp crtime = 13; + uint32 uid = 14; + uint32 gid = 15; + uint32 direntType = 16; + uint64 handle = 17; +} + +/* +Sending a single uint64 + - GetSize (response) + - GetLength (response) + - GetInfo (request) + - Delete (request) + - MkDir (response) + - GenerateHandle (request, response) + - CreateFile (response) + - RmDir (request) + - DeleteHandle (request) + - SyncFile (request) +*/ +message UintMsg { + uint64 data = 1; +} + +/* +Sending file contents + - ReadAt + - WriteAt +*/ +message ContentMsg { + uint64 inode = 1; + bytes data = 2; + int64 off = 3; +} + +/* +SetInfoParamsMsg + - SetInfo (request) +*/ +message SetInfoParamsMsg { + uint64 inode = 1; + int32 uid = 2; + int32 gid = 3; + int64 size = 4; + int32 mode = 5; + google.protobuf.Timestamp atime = 6; + google.protobuf.Timestamp mtime = 7; +} + +/* +MkInodeMsg + - MkDir (request) + - CreateFile (request) +*/ +message MkInodeMsg { + uint64 parent = 1; + string name = 2; + uint32 mode = 3; +} + +/*Empty Message*/ +message Empty {} + +service RemoteFSComms { + rpc GetSizeComm(Empty) returns (UintMsg) {} + rpc GetLengthComm(Empty) returns (UintMsg) {} + rpc GetInfoComm(UintMsg) returns (FileInfoMsg) {} + rpc SetInfoComm(SetInfoParamsMsg) returns (Empty) {} + rpc DeleteComm(UintMsg) returns (Empty) {} + rpc MkDirComm(MkInodeMsg) returns (UintMsg) {} + rpc GenerateHandleComm(UintMsg) returns (UintMsg) {} + rpc CreateFileComm(MkInodeMsg) returns (UintMsg) {} + rpc RmDirComm(UintMsg) returns (Empty) {} + rpc DeleteHandleComm(UintMsg) returns (Empty) {} + rpc SyncFileComm(UintMsg) returns (Empty) {} + rpc WriteAtComm(ContentMsg) returns (UintMsg) {} + rpc ReadAtComm(ContentMsg) returns (UintMsg) {} +} diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go b/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go new file mode 100644 index 00000000..34572f5a --- /dev/null +++ b/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go @@ -0,0 +1,821 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.34.2 +// protoc v5.27.1 +// source: comm.proto + +package safe_remotefscomms + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// Complete FileInfo struct +// - GetInfo (response) +type FileInfoMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` + Inode uint64 `protobuf:"varint,3,opt,name=inode,proto3" json:"inode,omitempty"` + Children []uint64 `protobuf:"varint,4,rep,packed,name=children,proto3" json:"children,omitempty"` + ChildrenIndexMap map[string]uint32 `protobuf:"bytes,5,rep,name=childrenIndexMap,proto3" json:"childrenIndexMap,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Parent uint64 `protobuf:"varint,6,opt,name=parent,proto3" json:"parent,omitempty"` + Nlink uint32 `protobuf:"varint,7,opt,name=nlink,proto3" json:"nlink,omitempty"` + Size uint64 `protobuf:"varint,8,opt,name=size,proto3" json:"size,omitempty"` + Mode uint32 `protobuf:"varint,9,opt,name=mode,proto3" json:"mode,omitempty"` + Atime *timestamppb.Timestamp `protobuf:"bytes,10,opt,name=atime,proto3" json:"atime,omitempty"` + Mtime *timestamppb.Timestamp `protobuf:"bytes,11,opt,name=mtime,proto3" json:"mtime,omitempty"` + Ctime *timestamppb.Timestamp `protobuf:"bytes,12,opt,name=ctime,proto3" json:"ctime,omitempty"` + Crtime *timestamppb.Timestamp `protobuf:"bytes,13,opt,name=crtime,proto3" json:"crtime,omitempty"` + Uid uint32 `protobuf:"varint,14,opt,name=uid,proto3" json:"uid,omitempty"` + Gid uint32 `protobuf:"varint,15,opt,name=gid,proto3" json:"gid,omitempty"` + DirentType uint32 `protobuf:"varint,16,opt,name=direntType,proto3" json:"direntType,omitempty"` + Handle uint64 `protobuf:"varint,17,opt,name=handle,proto3" json:"handle,omitempty"` +} + +func (x *FileInfoMsg) Reset() { + *x = FileInfoMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileInfoMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileInfoMsg) ProtoMessage() {} + +func (x *FileInfoMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use FileInfoMsg.ProtoReflect.Descriptor instead. +func (*FileInfoMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{0} +} + +func (x *FileInfoMsg) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *FileInfoMsg) GetPath() string { + if x != nil { + return x.Path + } + return "" +} + +func (x *FileInfoMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *FileInfoMsg) GetChildren() []uint64 { + if x != nil { + return x.Children + } + return nil +} + +func (x *FileInfoMsg) GetChildrenIndexMap() map[string]uint32 { + if x != nil { + return x.ChildrenIndexMap + } + return nil +} + +func (x *FileInfoMsg) GetParent() uint64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *FileInfoMsg) GetNlink() uint32 { + if x != nil { + return x.Nlink + } + return 0 +} + +func (x *FileInfoMsg) GetSize() uint64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *FileInfoMsg) GetMode() uint32 { + if x != nil { + return x.Mode + } + return 0 +} + +func (x *FileInfoMsg) GetAtime() *timestamppb.Timestamp { + if x != nil { + return x.Atime + } + return nil +} + +func (x *FileInfoMsg) GetMtime() *timestamppb.Timestamp { + if x != nil { + return x.Mtime + } + return nil +} + +func (x *FileInfoMsg) GetCtime() *timestamppb.Timestamp { + if x != nil { + return x.Ctime + } + return nil +} + +func (x *FileInfoMsg) GetCrtime() *timestamppb.Timestamp { + if x != nil { + return x.Crtime + } + return nil +} + +func (x *FileInfoMsg) GetUid() uint32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *FileInfoMsg) GetGid() uint32 { + if x != nil { + return x.Gid + } + return 0 +} + +func (x *FileInfoMsg) GetDirentType() uint32 { + if x != nil { + return x.DirentType + } + return 0 +} + +func (x *FileInfoMsg) GetHandle() uint64 { + if x != nil { + return x.Handle + } + return 0 +} + +// Sending a single uint64 +// - GetSize (response) +// - GetLength (response) +// - GetInfo (request) +// - Delete (request) +// - MkDir (response) +// - GenerateHandle (request, response) +// - CreateFile (response) +// - RmDir (request) +// - DeleteHandle (request) +// - SyncFile (request) +type UintMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data uint64 `protobuf:"varint,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *UintMsg) Reset() { + *x = UintMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UintMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UintMsg) ProtoMessage() {} + +func (x *UintMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UintMsg.ProtoReflect.Descriptor instead. +func (*UintMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{1} +} + +func (x *UintMsg) GetData() uint64 { + if x != nil { + return x.Data + } + return 0 +} + +// Sending file contents +// - ReadAt +// - WriteAt +type ContentMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + Off int64 `protobuf:"varint,3,opt,name=off,proto3" json:"off,omitempty"` +} + +func (x *ContentMsg) Reset() { + *x = ContentMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContentMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContentMsg) ProtoMessage() {} + +func (x *ContentMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContentMsg.ProtoReflect.Descriptor instead. +func (*ContentMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{2} +} + +func (x *ContentMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *ContentMsg) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +func (x *ContentMsg) GetOff() int64 { + if x != nil { + return x.Off + } + return 0 +} + +// SetInfoParamsMsg +// - SetInfo (request) +type SetInfoParamsMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Uid int32 `protobuf:"varint,2,opt,name=uid,proto3" json:"uid,omitempty"` + Gid int32 `protobuf:"varint,3,opt,name=gid,proto3" json:"gid,omitempty"` + Size int64 `protobuf:"varint,4,opt,name=size,proto3" json:"size,omitempty"` + Mode int32 `protobuf:"varint,5,opt,name=mode,proto3" json:"mode,omitempty"` + Atime *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=atime,proto3" json:"atime,omitempty"` + Mtime *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=mtime,proto3" json:"mtime,omitempty"` +} + +func (x *SetInfoParamsMsg) Reset() { + *x = SetInfoParamsMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *SetInfoParamsMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetInfoParamsMsg) ProtoMessage() {} + +func (x *SetInfoParamsMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use SetInfoParamsMsg.ProtoReflect.Descriptor instead. +func (*SetInfoParamsMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{3} +} + +func (x *SetInfoParamsMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *SetInfoParamsMsg) GetUid() int32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *SetInfoParamsMsg) GetGid() int32 { + if x != nil { + return x.Gid + } + return 0 +} + +func (x *SetInfoParamsMsg) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *SetInfoParamsMsg) GetMode() int32 { + if x != nil { + return x.Mode + } + return 0 +} + +func (x *SetInfoParamsMsg) GetAtime() *timestamppb.Timestamp { + if x != nil { + return x.Atime + } + return nil +} + +func (x *SetInfoParamsMsg) GetMtime() *timestamppb.Timestamp { + if x != nil { + return x.Mtime + } + return nil +} + +// MkInodeMsg +// - MkDir (request) +// - CreateFile (request) +type MkInodeMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Parent uint64 `protobuf:"varint,1,opt,name=parent,proto3" json:"parent,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Mode uint32 `protobuf:"varint,3,opt,name=mode,proto3" json:"mode,omitempty"` +} + +func (x *MkInodeMsg) Reset() { + *x = MkInodeMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MkInodeMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MkInodeMsg) ProtoMessage() {} + +func (x *MkInodeMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MkInodeMsg.ProtoReflect.Descriptor instead. +func (*MkInodeMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{4} +} + +func (x *MkInodeMsg) GetParent() uint64 { + if x != nil { + return x.Parent + } + return 0 +} + +func (x *MkInodeMsg) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MkInodeMsg) GetMode() uint32 { + if x != nil { + return x.Mode + } + return 0 +} + +// Empty Message +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{5} +} + +var File_comm_proto protoreflect.FileDescriptor + +var file_comm_proto_rawDesc = []byte{ + 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x05, 0x0a, + 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, + 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x2e, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4d, 0x61, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6c, 0x69, + 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, + 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, + 0x0a, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x63, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, + 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, + 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1d, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, + 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, 0x66, 0x66, 0x22, 0xd8, + 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, + 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x4d, 0x6b, 0x49, + 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x32, 0xf3, 0x06, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x53, 0x43, 0x6f, 0x6d, + 0x6d, 0x73, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, + 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6f, + 0x6d, 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, + 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, + 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x1a, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1f, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, + 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x3c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, + 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, + 0x09, 0x4d, 0x6b, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, + 0x64, 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, + 0x46, 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, + 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, + 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, + 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x09, 0x52, 0x6d, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, + 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, + 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, + 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x42, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, + 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, + 0x67, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x43, 0x6f, 0x6d, + 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, + 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, +} + +var ( + file_comm_proto_rawDescOnce sync.Once + file_comm_proto_rawDescData = file_comm_proto_rawDesc +) + +func file_comm_proto_rawDescGZIP() []byte { + file_comm_proto_rawDescOnce.Do(func() { + file_comm_proto_rawDescData = protoimpl.X.CompressGZIP(file_comm_proto_rawDescData) + }) + return file_comm_proto_rawDescData +} + +var file_comm_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_comm_proto_goTypes = []any{ + (*FileInfoMsg)(nil), // 0: safe-remotefscomms.FileInfoMsg + (*UintMsg)(nil), // 1: safe-remotefscomms.UintMsg + (*ContentMsg)(nil), // 2: safe-remotefscomms.ContentMsg + (*SetInfoParamsMsg)(nil), // 3: safe-remotefscomms.SetInfoParamsMsg + (*MkInodeMsg)(nil), // 4: safe-remotefscomms.MkInodeMsg + (*Empty)(nil), // 5: safe-remotefscomms.Empty + nil, // 6: safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp +} +var file_comm_proto_depIdxs = []int32{ + 6, // 0: safe-remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + 7, // 1: safe-remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 2: safe-remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp + 7, // 3: safe-remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp + 7, // 4: safe-remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp + 7, // 5: safe-remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp + 7, // 6: safe-remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp + 5, // 7: safe-remotefscomms.RemoteFSComms.GetSizeComm:input_type -> safe-remotefscomms.Empty + 5, // 8: safe-remotefscomms.RemoteFSComms.GetLengthComm:input_type -> safe-remotefscomms.Empty + 1, // 9: safe-remotefscomms.RemoteFSComms.GetInfoComm:input_type -> safe-remotefscomms.UintMsg + 3, // 10: safe-remotefscomms.RemoteFSComms.SetInfoComm:input_type -> safe-remotefscomms.SetInfoParamsMsg + 1, // 11: safe-remotefscomms.RemoteFSComms.DeleteComm:input_type -> safe-remotefscomms.UintMsg + 4, // 12: safe-remotefscomms.RemoteFSComms.MkDirComm:input_type -> safe-remotefscomms.MkInodeMsg + 1, // 13: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:input_type -> safe-remotefscomms.UintMsg + 4, // 14: safe-remotefscomms.RemoteFSComms.CreateFileComm:input_type -> safe-remotefscomms.MkInodeMsg + 1, // 15: safe-remotefscomms.RemoteFSComms.RmDirComm:input_type -> safe-remotefscomms.UintMsg + 1, // 16: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:input_type -> safe-remotefscomms.UintMsg + 1, // 17: safe-remotefscomms.RemoteFSComms.SyncFileComm:input_type -> safe-remotefscomms.UintMsg + 2, // 18: safe-remotefscomms.RemoteFSComms.WriteAtComm:input_type -> safe-remotefscomms.ContentMsg + 2, // 19: safe-remotefscomms.RemoteFSComms.ReadAtComm:input_type -> safe-remotefscomms.ContentMsg + 1, // 20: safe-remotefscomms.RemoteFSComms.GetSizeComm:output_type -> safe-remotefscomms.UintMsg + 1, // 21: safe-remotefscomms.RemoteFSComms.GetLengthComm:output_type -> safe-remotefscomms.UintMsg + 0, // 22: safe-remotefscomms.RemoteFSComms.GetInfoComm:output_type -> safe-remotefscomms.FileInfoMsg + 5, // 23: safe-remotefscomms.RemoteFSComms.SetInfoComm:output_type -> safe-remotefscomms.Empty + 5, // 24: safe-remotefscomms.RemoteFSComms.DeleteComm:output_type -> safe-remotefscomms.Empty + 1, // 25: safe-remotefscomms.RemoteFSComms.MkDirComm:output_type -> safe-remotefscomms.UintMsg + 1, // 26: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:output_type -> safe-remotefscomms.UintMsg + 1, // 27: safe-remotefscomms.RemoteFSComms.CreateFileComm:output_type -> safe-remotefscomms.UintMsg + 5, // 28: safe-remotefscomms.RemoteFSComms.RmDirComm:output_type -> safe-remotefscomms.Empty + 5, // 29: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:output_type -> safe-remotefscomms.Empty + 5, // 30: safe-remotefscomms.RemoteFSComms.SyncFileComm:output_type -> safe-remotefscomms.Empty + 1, // 31: safe-remotefscomms.RemoteFSComms.WriteAtComm:output_type -> safe-remotefscomms.UintMsg + 1, // 32: safe-remotefscomms.RemoteFSComms.ReadAtComm:output_type -> safe-remotefscomms.UintMsg + 20, // [20:33] is the sub-list for method output_type + 7, // [7:20] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name +} + +func init() { file_comm_proto_init() } +func file_comm_proto_init() { + if File_comm_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_comm_proto_msgTypes[0].Exporter = func(v any, i int) any { + switch v := v.(*FileInfoMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[1].Exporter = func(v any, i int) any { + switch v := v.(*UintMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[2].Exporter = func(v any, i int) any { + switch v := v.(*ContentMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[3].Exporter = func(v any, i int) any { + switch v := v.(*SetInfoParamsMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[4].Exporter = func(v any, i int) any { + switch v := v.(*MkInodeMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_comm_proto_rawDesc, + NumEnums: 0, + NumMessages: 7, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_comm_proto_goTypes, + DependencyIndexes: file_comm_proto_depIdxs, + MessageInfos: file_comm_proto_msgTypes, + }.Build() + File_comm_proto = out.File + file_comm_proto_rawDesc = nil + file_comm_proto_goTypes = nil + file_comm_proto_depIdxs = nil +} diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go b/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go new file mode 100644 index 00000000..01d967d4 --- /dev/null +++ b/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go @@ -0,0 +1,566 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.4.0 +// - protoc v5.27.1 +// source: comm.proto + +package safe_remotefscomms + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 + +const ( + RemoteFSComms_GetSizeComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetSizeComm" + RemoteFSComms_GetLengthComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetLengthComm" + RemoteFSComms_GetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetInfoComm" + RemoteFSComms_SetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SetInfoComm" + RemoteFSComms_DeleteComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteComm" + RemoteFSComms_MkDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/MkDirComm" + RemoteFSComms_GenerateHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GenerateHandleComm" + RemoteFSComms_CreateFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/CreateFileComm" + RemoteFSComms_RmDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/RmDirComm" + RemoteFSComms_DeleteHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteHandleComm" + RemoteFSComms_SyncFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SyncFileComm" + RemoteFSComms_WriteAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/WriteAtComm" + RemoteFSComms_ReadAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/ReadAtComm" +) + +// RemoteFSCommsClient is the client API for RemoteFSComms service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type RemoteFSCommsClient interface { + GetSizeComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) + GetLengthComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) + GetInfoComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*FileInfoMsg, error) + SetInfoComm(ctx context.Context, in *SetInfoParamsMsg, opts ...grpc.CallOption) (*Empty, error) + DeleteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + MkDirComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) + GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) + CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) + RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) + WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) + ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) +} + +type remoteFSCommsClient struct { + cc grpc.ClientConnInterface +} + +func NewRemoteFSCommsClient(cc grpc.ClientConnInterface) RemoteFSCommsClient { + return &remoteFSCommsClient{cc} +} + +func (c *remoteFSCommsClient) GetSizeComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetSizeComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GetLengthComm(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetLengthComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GetInfoComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*FileInfoMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(FileInfoMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GetInfoComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) SetInfoComm(ctx context.Context, in *SetInfoParamsMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_SetInfoComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) DeleteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_DeleteComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) MkDirComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_MkDirComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_GenerateHandleComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_CreateFileComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_RmDirComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_DeleteHandleComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_SyncFileComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_WriteAtComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_ReadAtComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +// RemoteFSCommsServer is the server API for RemoteFSComms service. +// All implementations must embed UnimplementedRemoteFSCommsServer +// for forward compatibility +type RemoteFSCommsServer interface { + GetSizeComm(context.Context, *Empty) (*UintMsg, error) + GetLengthComm(context.Context, *Empty) (*UintMsg, error) + GetInfoComm(context.Context, *UintMsg) (*FileInfoMsg, error) + SetInfoComm(context.Context, *SetInfoParamsMsg) (*Empty, error) + DeleteComm(context.Context, *UintMsg) (*Empty, error) + MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) + GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) + CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) + RmDirComm(context.Context, *UintMsg) (*Empty, error) + DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) + SyncFileComm(context.Context, *UintMsg) (*Empty, error) + WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) + ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) + mustEmbedUnimplementedRemoteFSCommsServer() +} + +// UnimplementedRemoteFSCommsServer must be embedded to have forward compatible implementations. +type UnimplementedRemoteFSCommsServer struct { +} + +func (UnimplementedRemoteFSCommsServer) GetSizeComm(context.Context, *Empty) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetSizeComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GetLengthComm(context.Context, *Empty) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetLengthComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GetInfoComm(context.Context, *UintMsg) (*FileInfoMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetInfoComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) SetInfoComm(context.Context, *SetInfoParamsMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetInfoComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) DeleteComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method MkDirComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method GenerateHandleComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateFileComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) RmDirComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method RmDirComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteHandleComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) SyncFileComm(context.Context, *UintMsg) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SyncFileComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method WriteAtComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method ReadAtComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) mustEmbedUnimplementedRemoteFSCommsServer() {} + +// UnsafeRemoteFSCommsServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to RemoteFSCommsServer will +// result in compilation errors. +type UnsafeRemoteFSCommsServer interface { + mustEmbedUnimplementedRemoteFSCommsServer() +} + +func RegisterRemoteFSCommsServer(s grpc.ServiceRegistrar, srv RemoteFSCommsServer) { + s.RegisterService(&RemoteFSComms_ServiceDesc, srv) +} + +func _RemoteFSComms_GetSizeComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetSizeComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetSizeComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetSizeComm(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GetLengthComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetLengthComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetLengthComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetLengthComm(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GetInfoComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GetInfoComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GetInfoComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GetInfoComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_SetInfoComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetInfoParamsMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).SetInfoComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_SetInfoComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).SetInfoComm(ctx, req.(*SetInfoParamsMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_DeleteComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).DeleteComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_DeleteComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).DeleteComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_MkDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MkInodeMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).MkDirComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_MkDirComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).MkDirComm(ctx, req.(*MkInodeMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_GenerateHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_GenerateHandleComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_CreateFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MkInodeMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_CreateFileComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, req.(*MkInodeMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_RmDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).RmDirComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_RmDirComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).RmDirComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_DeleteHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_DeleteHandleComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_SyncFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_SyncFileComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_WriteAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ContentMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_WriteAtComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, req.(*ContentMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ContentMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_ReadAtComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, req.(*ContentMsg)) + } + return interceptor(ctx, in, info, handler) +} + +// RemoteFSComms_ServiceDesc is the grpc.ServiceDesc for RemoteFSComms service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "safe-remotefscomms.RemoteFSComms", + HandlerType: (*RemoteFSCommsServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetSizeComm", + Handler: _RemoteFSComms_GetSizeComm_Handler, + }, + { + MethodName: "GetLengthComm", + Handler: _RemoteFSComms_GetLengthComm_Handler, + }, + { + MethodName: "GetInfoComm", + Handler: _RemoteFSComms_GetInfoComm_Handler, + }, + { + MethodName: "SetInfoComm", + Handler: _RemoteFSComms_SetInfoComm_Handler, + }, + { + MethodName: "DeleteComm", + Handler: _RemoteFSComms_DeleteComm_Handler, + }, + { + MethodName: "MkDirComm", + Handler: _RemoteFSComms_MkDirComm_Handler, + }, + { + MethodName: "GenerateHandleComm", + Handler: _RemoteFSComms_GenerateHandleComm_Handler, + }, + { + MethodName: "CreateFileComm", + Handler: _RemoteFSComms_CreateFileComm_Handler, + }, + { + MethodName: "RmDirComm", + Handler: _RemoteFSComms_RmDirComm_Handler, + }, + { + MethodName: "DeleteHandleComm", + Handler: _RemoteFSComms_DeleteHandleComm_Handler, + }, + { + MethodName: "SyncFileComm", + Handler: _RemoteFSComms_SyncFileComm_Handler, + }, + { + MethodName: "WriteAtComm", + Handler: _RemoteFSComms_WriteAtComm_Handler, + }, + { + MethodName: "ReadAtComm", + Handler: _RemoteFSComms_ReadAtComm_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "comm.proto", +} diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/commutils.go b/mft-fs/safe-remotefs/safe-remotefscomms/commutils.go new file mode 100644 index 00000000..d214315f --- /dev/null +++ b/mft-fs/safe-remotefs/safe-remotefscomms/commutils.go @@ -0,0 +1,57 @@ +package safe_remotefscomms + +import ( + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "google.golang.org/protobuf/types/known/timestamppb" + "mft-fs/abstractfs" + "os" +) + +func ConvertFromComm(input *FileInfoMsg, output *abstractfs.FileInfo) { + output.Name = input.Name + output.Path = input.Path + output.Inode = fuseops.InodeID(input.Inode) + for _, child := range input.Children { + output.Children = append(output.Children, fuseops.InodeID(child)) + } + for name, index := range input.ChildrenIndexMap { + output.ChildrenIndexMap[name] = int(index) + } + output.Parent = fuseops.InodeID(input.Parent) + output.Nlink = input.Nlink + output.Size = input.Size + output.Mode = os.FileMode(input.Mode) + output.Atime = input.Atime.AsTime() + output.Mtime = input.Mtime.AsTime() + output.Ctime = input.Ctime.AsTime() + output.Crtime = input.Crtime.AsTime() + output.Uid = input.Uid + output.Gid = input.Gid + output.DirentType = fuseutil.DirentType(input.DirentType) + output.Handle = fuseops.HandleID(input.Handle) +} + +func ConvertToComm(input *abstractfs.FileInfo, output *FileInfoMsg) { + output.Name = input.Name + output.Path = input.Path + output.Inode = uint64(input.Inode) + for _, child := range input.Children { + output.Children = append(output.Children, uint64(child)) + } + for name, index := range input.ChildrenIndexMap { + output.ChildrenIndexMap[name] = uint32(index) + } + output.Parent = uint64(input.Parent) + output.Nlink = input.Nlink + output.Size = input.Size + output.Mode = uint32(input.Mode) + output.Atime = timestamppb.New(input.Atime) + output.Mtime = timestamppb.New(input.Mtime) + output.Ctime = timestamppb.New(input.Ctime) + output.Crtime = timestamppb.New(input.Crtime) + output.Uid = input.Uid + output.Gid = input.Gid + output.DirentType = uint32(input.DirentType) + output.Handle = uint64(input.Handle) +} diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go new file mode 100644 index 00000000..09a325b6 --- /dev/null +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -0,0 +1,148 @@ +package server + +import ( + "context" + "github.com/jacobsa/fuse/fuseops" + "mft-fs/osfsmanager" + "mft-fs/safe-remotefs/safe-remotefscomms" + "os" + "time" +) + +type Server struct { + safe_remotefscomms.UnimplementedRemoteFSCommsServer + manager *osfsmanager.OSFSManager +} + +func NewServerHandler(root string) *Server { + output := &Server{ + manager: osfsmanager.NewOSFSManager(root), + } + return output +} + +func (server *Server) GetSizeComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { + size, e := server.manager.GetSize() + if e != nil { + return nil, e + } + return &safe_remotefscomms.UintMsg{Data: size}, nil +} + +func (server *Server) GetLengthComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { + length, e := server.manager.GetLength() + if e != nil { + return nil, e + } + return &safe_remotefscomms.UintMsg{Data: length}, nil +} + +func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.FileInfoMsg, error) { + info, e := server.manager.GetInfo(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + output := &safe_remotefscomms.FileInfoMsg{ + ChildrenIndexMap: make(map[string]uint32), + } + safe_remotefscomms.ConvertToComm(info, output) + return output, nil +} + +func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.SetInfoParamsMsg) (*safe_remotefscomms.Empty, error) { + var uidptr *uint32 = nil + var gidptr *uint32 = nil + var sizeptr *uint64 = nil + var modeptr *os.FileMode = nil + var atimeptr *time.Time = nil + var mtimeptr *time.Time = nil + if in.Uid != -1 { + *uidptr = uint32(in.Uid) + } + if in.Gid != -1 { + *gidptr = uint32(in.Gid) + } + if in.Mode != -1 { + *modeptr = os.FileMode(in.Mode) + } + if in.Size != -1 { + *sizeptr = uint64(in.Size) + } + if !in.Atime.AsTime().Equal(time.Time{}) { + *atimeptr = in.Atime.AsTime() + } + if !in.Mtime.AsTime().Equal(time.Time{}) { + *mtimeptr = in.Mtime.AsTime() + } + e := server.manager.SetInfo(fuseops.InodeID(in.Inode), uidptr, gidptr, sizeptr, modeptr, atimeptr, mtimeptr) + if e != nil { + return nil, e + } + return &safe_remotefscomms.Empty{}, nil +} + +func (server *Server) DeleteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + e := server.manager.Delete(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.Empty{}, nil +} + +func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { + inode, e := server.manager.MkDir(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.UintMsg{Data: uint64(inode)}, nil +} + +func (server *Server) GenerateHandleComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.UintMsg, error) { + handle, e := server.manager.GenerateHandle(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.UintMsg{Data: uint64(handle)}, nil +} + +func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { + inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.UintMsg{Data: uint64(inode)}, nil +} + +func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + e := server.manager.RmDir(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.Empty{}, nil +} + +func (server *Server) DeleteHandleComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + e := server.manager.DeleteHandle(fuseops.HandleID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.Empty{}, nil +} + +func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + e := server.manager.SyncFile(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.Empty{}, nil +} + +func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms.ContentMsg) (*safe_remotefscomms.UintMsg, error) { + n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) + return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil +} + +func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.ContentMsg) (*safe_remotefscomms.UintMsg, error) { + n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), in.Data, in.Off) + return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil +} diff --git a/mft-fs/safe-remotefs/servermain/server_main.go b/mft-fs/safe-remotefs/servermain/server_main.go new file mode 100644 index 00000000..6dcddb5e --- /dev/null +++ b/mft-fs/safe-remotefs/servermain/server_main.go @@ -0,0 +1,26 @@ +package main + +import ( + "flag" + "google.golang.org/grpc" + "log" + "mft-fs/safe-remotefs/safe-remotefscomms" + "mft-fs/safe-remotefs/server" + "net" +) + +func main() { + + rootDirectory := flag.String("rootDirectory", "", "Root Directory") + flag.Parse() + + lis, e := net.Listen("tcp", ":8000") + if e != nil { + log.Fatalf("Error: %v\n", e) + } + defer lis.Close() + + s := grpc.NewServer() + safe_remotefscomms.RegisterRemoteFSCommsServer(s, server.NewServerHandler(*rootDirectory)) + s.Serve(lis) +} From fc6b3dfd2a2c1737d695a87c34682a23b944203a Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Sun, 25 Aug 2024 10:08:39 -0400 Subject: [PATCH 21/37] finished untested safe remote fs --- mft-fs/abstractfs/fs_manager.go | 81 +- mft-fs/safe-remotefs/client/client_manager.go | 166 +++- .../safe-remotefs/clientmain/client_main.go | 3 +- mft-fs/safe-remotefs/comm.proto | 53 +- .../safe-remotefscomms/comm.pb.go | 792 +++++++++++++----- .../safe-remotefscomms/comm_grpc.pb.go | 258 ++++-- .../server/safe_os_fs_manager.go | 423 ++++++++++ mft-fs/safe-remotefs/server/server_manager.go | 64 +- 8 files changed, 1484 insertions(+), 356 deletions(-) create mode 100644 mft-fs/safe-remotefs/server/safe_os_fs_manager.go diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go index 90fe980b..043f2572 100644 --- a/mft-fs/abstractfs/fs_manager.go +++ b/mft-fs/abstractfs/fs_manager.go @@ -3,6 +3,7 @@ package abstractfs import ( "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" + "mft-fs/datastructures" "os" "time" ) @@ -25,26 +26,29 @@ type FSManager interface { } type FileInfo struct { - Name string - Path string - Inode fuseops.InodeID - Children []fuseops.InodeID - ChildrenIndexMap map[string]int - Parent fuseops.InodeID - Nlink uint32 - Size uint64 - Mode os.FileMode - Atime time.Time - Mtime time.Time - Ctime time.Time - Crtime time.Time - Uid uint32 - Gid uint32 - DirentType fuseutil.DirentType - Handle fuseops.HandleID - Cache bool - CacheTime time.Time - WriteTime time.Time + Name string + Path string + Inode fuseops.InodeID + Children []fuseops.InodeID + ChildrenIndexMap map[string]int + Parent fuseops.InodeID + Nlink uint32 + Size uint64 + Mode os.FileMode + Atime time.Time + Mtime time.Time + Ctime time.Time + Crtime time.Time + Uid uint32 + Gid uint32 + DirentType fuseutil.DirentType + Handle fuseops.HandleID + Cache bool + CacheTime time.Time + MetadataWriteTime time.Time + ContentWriteTime time.Time + MetadataLock *datastructures.CREWResource + ContentLock *datastructures.CREWResource } func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { @@ -58,6 +62,41 @@ func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops DirentType: direntType, Cache: false, CacheTime: time.Unix(0, 0), - WriteTime: time.Now(), + ContentWriteTime: time.Now(), } } + +func NewSafeFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { + return FileInfo{ + Name: name, + Children: make([]fuseops.InodeID, 0), + ChildrenIndexMap: make(map[string]int), + Parent: parent, + Inode: inode, + Path: path, + DirentType: direntType, + Cache: false, + CacheTime: time.Unix(0, 0), + ContentWriteTime: time.Now(), + MetadataWriteTime: time.Now(), + ContentLock: datastructures.NewCREWResource(), + MetadataLock: datastructures.NewCREWResource(), + } +} + +/** +TODO + - implement caching + - read/write request + - request contains cacheBool and cacheTime + - permission granted for read iff cache is invalid + - permission granted for write iff cache is valid + - read/write ack + - send inode in request + - return new writecontent time + - implement local handles + - implement thread safety + - metadata updates + - content updates + - read, write, acks for metadata and content +*/ diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go index ab233229..7f781e91 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -2,6 +2,9 @@ package client import ( "context" + "crypto/rand" + "errors" + "fmt" "github.com/jacobsa/fuse/fuseops" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/timestamppb" @@ -11,13 +14,33 @@ import ( "time" ) +type cacheInfo struct { + cache bool + cacheTime time.Time + handle fuseops.HandleID +} + +func newCacheInfo() *cacheInfo { + return &cacheInfo{ + cache: false, + cacheTime: time.Unix(0, 0), + handle: fuseops.HandleID(0), + } +} + type ClientManager struct { abstractfs.FSManager - client safe_remotefscomms.RemoteFSCommsClient + client safe_remotefscomms.RemoteFSCommsClient + cachePath string + localInfo map[fuseops.InodeID]*cacheInfo + handleToInode map[fuseops.HandleID]fuseops.InodeID } -func NewClientManager(conn *grpc.ClientConn) (*ClientManager, error) { - output := &ClientManager{} +func NewClientManager(conn *grpc.ClientConn, cachePath string) (*ClientManager, error) { + output := &ClientManager{ + cachePath: cachePath, + localInfo: make(map[fuseops.InodeID]*cacheInfo), + } output.client = safe_remotefscomms.NewRemoteFSCommsClient(conn) return output, nil } @@ -49,6 +72,10 @@ func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileIn ChildrenIndexMap: make(map[string]int), } safe_remotefscomms.ConvertFromComm(resp, output) + info, ok := manager.localInfo[inode] + if ok { + output.Handle = info.handle + } return output, nil } @@ -102,11 +129,28 @@ func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os } func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { - resp, e := manager.client.GenerateHandleComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + var buff [8]byte + _, e := rand.Read(buff[:]) if e != nil { return 0, e } - return fuseops.HandleID(resp.Data), nil + var output uint64 = 0 + for i := 0; i < len(buff); i++ { + output = output | uint64(buff[i]<<(8*i)) + } + handle := fuseops.HandleID(output) + _, ok := manager.handleToInode[handle] + if ok { + return manager.GenerateHandle(inode) + } + info, ok := manager.localInfo[inode] + if !ok { + manager.localInfo[inode] = newCacheInfo() + info = manager.localInfo[inode] + } + info.handle = handle + manager.handleToInode[handle] = inode + return handle, nil } func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { resp, e := manager.client.CreateFileComm(context.Background(), &safe_remotefscomms.MkInodeMsg{ @@ -126,8 +170,8 @@ func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { } func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { - _, e := manager.client.DeleteHandleComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(handle)}) - return e + delete(manager.handleToInode, handle) + return nil } func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { @@ -136,26 +180,110 @@ func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { } func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { - resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms.ContentMsg{ - Inode: uint64(inode), - Data: data, - Off: off, - }) + + info, ok := manager.localInfo[inode] + if !ok { + return 0, errors.New("local cache not updated") + } + + msg := safe_remotefscomms.RequestResourceMsg{ + CacheTime: timestamppb.New(time.Unix(0, 0)), + Inode: uint64(inode), + Cache: info.cache, + } + + requestResp, e := manager.client.RequestWriteComm(context.Background(), &msg) if e != nil { return 0, e } - return int(resp.Data), nil + + if requestResp.Success { + resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms.WriteAtMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + + ackResp, e := manager.client.AckWriteComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + + manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() + + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) + if e != nil { + return 0, e + } + _, e = file.WriteAt(data, off) + if e != nil { + return 0, e + } + + return int(resp.Data), nil + } + + return 0, errors.New("local cache not updated") } func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { - resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms.ContentMsg{ - Inode: uint64(inode), - Data: data, - Off: off, - }) + + msg := safe_remotefscomms.RequestResourceMsg{ + CacheTime: timestamppb.New(time.Unix(0, 0)), + Inode: uint64(inode), + Cache: false, + } + + info, ok := manager.localInfo[inode] + if ok { + msg.Cache = info.cache + msg.CacheTime = timestamppb.New(info.cacheTime) + } else { + manager.localInfo[inode] = newCacheInfo() + } + + requestResp, e := manager.client.RequestReadComm(context.Background(), &msg) if e != nil { return 0, e } - return int(resp.Data), nil + + if requestResp.Success { + resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms.ReadAtMsg{ + Inode: uint64(inode), + Size: int64(len(data)), + Off: off, + }) + if e != nil { + return 0, e + } + ackResp, e := manager.client.AckReadComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() + manager.localInfo[inode].cache = true + for i := 0; i < min(len(data), len(resp.Data)); i++ { + data[i] = resp.Data[i] + } + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) + if e != nil { + return 0, e + } + _, e = file.WriteAt(data, off) + if e != nil { + return 0, e + } + return int(resp.N), nil + } else { + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR, 777) + if e != nil { + return 0, e + } + n, _ := file.ReadAt(data, off) + return n, nil + } } func (manager *ClientManager) Destroy() error { diff --git a/mft-fs/safe-remotefs/clientmain/client_main.go b/mft-fs/safe-remotefs/clientmain/client_main.go index 5217310b..52d7240b 100644 --- a/mft-fs/safe-remotefs/clientmain/client_main.go +++ b/mft-fs/safe-remotefs/clientmain/client_main.go @@ -17,6 +17,7 @@ func main() { // reading commandline args mountDirectory := flag.String("mountDirectory", "", "mount directory") + cacheDirectory := flag.String("cacheDirectory", "", "cache directory") flag.Parse() // setting up gRPC communicators @@ -29,7 +30,7 @@ func main() { defer conn.Close() // setting up FUSE - manager, e := client.NewClientManager(conn) + manager, e := client.NewClientManager(conn, *cacheDirectory) if e != nil { log.Fatalf("Error: %v\n", e) } diff --git a/mft-fs/safe-remotefs/comm.proto b/mft-fs/safe-remotefs/comm.proto index 48ba13a0..35adeb3e 100644 --- a/mft-fs/safe-remotefs/comm.proto +++ b/mft-fs/safe-remotefs/comm.proto @@ -48,15 +48,25 @@ message UintMsg { /* Sending file contents - - ReadAt - WriteAt */ -message ContentMsg { +message WriteAtMsg { uint64 inode = 1; bytes data = 2; int64 off = 3; } +message ReadAtMsg { + uint64 inode = 1; + int64 size = 2; + int64 off = 3; +} + +message ReadAtResponseMsg { + int64 n = 1; + bytes data = 2; +} + /* SetInfoParamsMsg - SetInfo (request) @@ -82,6 +92,35 @@ message MkInodeMsg { uint32 mode = 3; } +/* +RequestResourceMsg + - RequestRead + - RequestWrite + */ +message RequestResourceMsg { + uint64 inode = 1; + bool cache = 2; + google.protobuf.Timestamp cacheTime = 3; +} + +/* +RequestResponseMsg + - RequestRead + - RequestWrite + */ +message RequestResponseMsg { + bool success = 1; +} + +/* +AckResponseMsg + - AckRead + - AckWrite + */ +message AckResponseMsg { + google.protobuf.Timestamp writeTime = 1; +} + /*Empty Message*/ message Empty {} @@ -92,11 +131,13 @@ service RemoteFSComms { rpc SetInfoComm(SetInfoParamsMsg) returns (Empty) {} rpc DeleteComm(UintMsg) returns (Empty) {} rpc MkDirComm(MkInodeMsg) returns (UintMsg) {} - rpc GenerateHandleComm(UintMsg) returns (UintMsg) {} rpc CreateFileComm(MkInodeMsg) returns (UintMsg) {} rpc RmDirComm(UintMsg) returns (Empty) {} - rpc DeleteHandleComm(UintMsg) returns (Empty) {} rpc SyncFileComm(UintMsg) returns (Empty) {} - rpc WriteAtComm(ContentMsg) returns (UintMsg) {} - rpc ReadAtComm(ContentMsg) returns (UintMsg) {} + rpc WriteAtComm(WriteAtMsg) returns (UintMsg) {} + rpc ReadAtComm(ReadAtMsg) returns (ReadAtResponseMsg) {} + rpc RequestReadComm(RequestResourceMsg) returns (RequestResponseMsg) {} + rpc RequestWriteComm(RequestResourceMsg) returns (RequestResponseMsg) {} + rpc AckReadComm(UintMsg) returns (AckResponseMsg) {} + rpc AckWriteComm(UintMsg) returns (AckResponseMsg) {} } diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go b/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go index 34572f5a..69636763 100644 --- a/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go +++ b/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go @@ -257,9 +257,8 @@ func (x *UintMsg) GetData() uint64 { } // Sending file contents -// - ReadAt // - WriteAt -type ContentMsg struct { +type WriteAtMsg struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields @@ -269,8 +268,8 @@ type ContentMsg struct { Off int64 `protobuf:"varint,3,opt,name=off,proto3" json:"off,omitempty"` } -func (x *ContentMsg) Reset() { - *x = ContentMsg{} +func (x *WriteAtMsg) Reset() { + *x = WriteAtMsg{} if protoimpl.UnsafeEnabled { mi := &file_comm_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -278,13 +277,13 @@ func (x *ContentMsg) Reset() { } } -func (x *ContentMsg) String() string { +func (x *WriteAtMsg) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ContentMsg) ProtoMessage() {} +func (*WriteAtMsg) ProtoMessage() {} -func (x *ContentMsg) ProtoReflect() protoreflect.Message { +func (x *WriteAtMsg) ProtoReflect() protoreflect.Message { mi := &file_comm_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -296,32 +295,150 @@ func (x *ContentMsg) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ContentMsg.ProtoReflect.Descriptor instead. -func (*ContentMsg) Descriptor() ([]byte, []int) { +// Deprecated: Use WriteAtMsg.ProtoReflect.Descriptor instead. +func (*WriteAtMsg) Descriptor() ([]byte, []int) { return file_comm_proto_rawDescGZIP(), []int{2} } -func (x *ContentMsg) GetInode() uint64 { +func (x *WriteAtMsg) GetInode() uint64 { if x != nil { return x.Inode } return 0 } -func (x *ContentMsg) GetData() []byte { +func (x *WriteAtMsg) GetData() []byte { if x != nil { return x.Data } return nil } -func (x *ContentMsg) GetOff() int64 { +func (x *WriteAtMsg) GetOff() int64 { if x != nil { return x.Off } return 0 } +type ReadAtMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Size int64 `protobuf:"varint,2,opt,name=size,proto3" json:"size,omitempty"` + Off int64 `protobuf:"varint,3,opt,name=off,proto3" json:"off,omitempty"` +} + +func (x *ReadAtMsg) Reset() { + *x = ReadAtMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadAtMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadAtMsg) ProtoMessage() {} + +func (x *ReadAtMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadAtMsg.ProtoReflect.Descriptor instead. +func (*ReadAtMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{3} +} + +func (x *ReadAtMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *ReadAtMsg) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *ReadAtMsg) GetOff() int64 { + if x != nil { + return x.Off + } + return 0 +} + +type ReadAtResponseMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + N int64 `protobuf:"varint,1,opt,name=n,proto3" json:"n,omitempty"` + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *ReadAtResponseMsg) Reset() { + *x = ReadAtResponseMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadAtResponseMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadAtResponseMsg) ProtoMessage() {} + +func (x *ReadAtResponseMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadAtResponseMsg.ProtoReflect.Descriptor instead. +func (*ReadAtResponseMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{4} +} + +func (x *ReadAtResponseMsg) GetN() int64 { + if x != nil { + return x.N + } + return 0 +} + +func (x *ReadAtResponseMsg) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + // SetInfoParamsMsg // - SetInfo (request) type SetInfoParamsMsg struct { @@ -341,7 +458,7 @@ type SetInfoParamsMsg struct { func (x *SetInfoParamsMsg) Reset() { *x = SetInfoParamsMsg{} if protoimpl.UnsafeEnabled { - mi := &file_comm_proto_msgTypes[3] + mi := &file_comm_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -354,7 +471,7 @@ func (x *SetInfoParamsMsg) String() string { func (*SetInfoParamsMsg) ProtoMessage() {} func (x *SetInfoParamsMsg) ProtoReflect() protoreflect.Message { - mi := &file_comm_proto_msgTypes[3] + mi := &file_comm_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -367,7 +484,7 @@ func (x *SetInfoParamsMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use SetInfoParamsMsg.ProtoReflect.Descriptor instead. func (*SetInfoParamsMsg) Descriptor() ([]byte, []int) { - return file_comm_proto_rawDescGZIP(), []int{3} + return file_comm_proto_rawDescGZIP(), []int{5} } func (x *SetInfoParamsMsg) GetInode() uint64 { @@ -435,7 +552,7 @@ type MkInodeMsg struct { func (x *MkInodeMsg) Reset() { *x = MkInodeMsg{} if protoimpl.UnsafeEnabled { - mi := &file_comm_proto_msgTypes[4] + mi := &file_comm_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -448,7 +565,7 @@ func (x *MkInodeMsg) String() string { func (*MkInodeMsg) ProtoMessage() {} func (x *MkInodeMsg) ProtoReflect() protoreflect.Message { - mi := &file_comm_proto_msgTypes[4] + mi := &file_comm_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -461,7 +578,7 @@ func (x *MkInodeMsg) ProtoReflect() protoreflect.Message { // Deprecated: Use MkInodeMsg.ProtoReflect.Descriptor instead. func (*MkInodeMsg) Descriptor() ([]byte, []int) { - return file_comm_proto_rawDescGZIP(), []int{4} + return file_comm_proto_rawDescGZIP(), []int{6} } func (x *MkInodeMsg) GetParent() uint64 { @@ -485,6 +602,172 @@ func (x *MkInodeMsg) GetMode() uint32 { return 0 } +// RequestResourceMsg +// - RequestRead +// - RequestWrite +type RequestResourceMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inode uint64 `protobuf:"varint,1,opt,name=inode,proto3" json:"inode,omitempty"` + Cache bool `protobuf:"varint,2,opt,name=cache,proto3" json:"cache,omitempty"` + CacheTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=cacheTime,proto3" json:"cacheTime,omitempty"` +} + +func (x *RequestResourceMsg) Reset() { + *x = RequestResourceMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestResourceMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestResourceMsg) ProtoMessage() {} + +func (x *RequestResourceMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestResourceMsg.ProtoReflect.Descriptor instead. +func (*RequestResourceMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{7} +} + +func (x *RequestResourceMsg) GetInode() uint64 { + if x != nil { + return x.Inode + } + return 0 +} + +func (x *RequestResourceMsg) GetCache() bool { + if x != nil { + return x.Cache + } + return false +} + +func (x *RequestResourceMsg) GetCacheTime() *timestamppb.Timestamp { + if x != nil { + return x.CacheTime + } + return nil +} + +// RequestResponseMsg +// - RequestRead +// - RequestWrite +type RequestResponseMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Success bool `protobuf:"varint,1,opt,name=success,proto3" json:"success,omitempty"` +} + +func (x *RequestResponseMsg) Reset() { + *x = RequestResponseMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RequestResponseMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestResponseMsg) ProtoMessage() {} + +func (x *RequestResponseMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[8] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RequestResponseMsg.ProtoReflect.Descriptor instead. +func (*RequestResponseMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{8} +} + +func (x *RequestResponseMsg) GetSuccess() bool { + if x != nil { + return x.Success + } + return false +} + +// AckResponseMsg +// - AckRead +// - AckWrite +type AckResponseMsg struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WriteTime *timestamppb.Timestamp `protobuf:"bytes,1,opt,name=writeTime,proto3" json:"writeTime,omitempty"` +} + +func (x *AckResponseMsg) Reset() { + *x = AckResponseMsg{} + if protoimpl.UnsafeEnabled { + mi := &file_comm_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AckResponseMsg) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AckResponseMsg) ProtoMessage() {} + +func (x *AckResponseMsg) ProtoReflect() protoreflect.Message { + mi := &file_comm_proto_msgTypes[9] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AckResponseMsg.ProtoReflect.Descriptor instead. +func (*AckResponseMsg) Descriptor() ([]byte, []int) { + return file_comm_proto_rawDescGZIP(), []int{9} +} + +func (x *AckResponseMsg) GetWriteTime() *timestamppb.Timestamp { + if x != nil { + return x.WriteTime + } + return nil +} + // Empty Message type Empty struct { state protoimpl.MessageState @@ -495,7 +778,7 @@ type Empty struct { func (x *Empty) Reset() { *x = Empty{} if protoimpl.UnsafeEnabled { - mi := &file_comm_proto_msgTypes[5] + mi := &file_comm_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -508,7 +791,7 @@ func (x *Empty) String() string { func (*Empty) ProtoMessage() {} func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_comm_proto_msgTypes[5] + mi := &file_comm_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -521,140 +804,186 @@ func (x *Empty) ProtoReflect() protoreflect.Message { // Deprecated: Use Empty.ProtoReflect.Descriptor instead. func (*Empty) Descriptor() ([]byte, []int) { - return file_comm_proto_rawDescGZIP(), []int{5} + return file_comm_proto_rawDescGZIP(), []int{10} } var File_comm_proto protoreflect.FileDescriptor var file_comm_proto_rawDesc = []byte{ - 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0d, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x86, 0x05, 0x0a, - 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x04, 0x52, 0x08, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, - 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x30, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x2e, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4d, 0x61, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, - 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, - 0x0a, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x6d, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x12, 0x73, 0x61, + 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, + 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x22, 0x8b, 0x05, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x4d, 0x73, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x04, 0x52, 0x08, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x12, 0x61, 0x0a, 0x10, 0x63, + 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x2e, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x63, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x05, 0x63, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x06, 0x63, 0x72, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x63, 0x72, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, + 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x1d, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, + 0x0a, 0x0a, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, + 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, 0x66, 0x66, 0x22, 0x47, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x41, 0x74, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, + 0x10, 0x0a, 0x03, 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, 0x66, + 0x66, 0x22, 0x35, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x0c, 0x0a, 0x01, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x01, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd8, 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, + 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, + 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, + 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, + 0x30, 0x0a, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, + 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x06, 0x63, 0x72, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x72, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x64, 0x69, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x61, 0x6e, 0x64, - 0x6c, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x61, 0x6e, 0x64, 0x6c, 0x65, - 0x1a, 0x43, 0x0a, 0x15, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x1d, 0x0a, 0x07, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x22, 0x48, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, - 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, - 0x6f, 0x66, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, 0x66, 0x66, 0x22, 0xd8, - 0x01, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, - 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x05, 0x61, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, + 0x69, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x22, 0x7a, 0x0a, 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x69, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x61, + 0x63, 0x68, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x52, 0x05, 0x6d, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x4c, 0x0a, 0x0a, 0x4d, 0x6b, 0x49, - 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x32, 0xf3, 0x06, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x53, 0x43, 0x6f, 0x6d, - 0x6d, 0x73, 0x12, 0x3d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, - 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, - 0x00, 0x12, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6f, - 0x6d, 0x6d, 0x12, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, - 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, - 0x22, 0x00, 0x12, 0x43, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x43, 0x6f, 0x6d, - 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, - 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x1a, 0x2e, 0x72, 0x65, 0x6d, 0x6f, + 0x6d, 0x70, 0x52, 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x2e, 0x0a, + 0x12, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4d, 0x73, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x4a, 0x0a, + 0x0e, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x73, 0x67, 0x12, + 0x38, 0x0a, 0x09, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x32, 0xce, 0x09, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x46, 0x53, 0x43, + 0x6f, 0x6d, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x49, 0x0a, + 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, + 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, + 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x4d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, + 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x1f, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1f, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, - 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x3c, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, - 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, - 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x40, 0x0a, - 0x09, 0x4d, 0x6b, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, - 0x64, 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, - 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, - 0x46, 0x0a, 0x12, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, - 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, - 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, - 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x45, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, - 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, - 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x3b, - 0x0a, 0x09, 0x52, 0x6d, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x16, 0x2e, 0x72, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, - 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, - 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x10, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x48, 0x61, 0x6e, 0x64, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, - 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, - 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, - 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, - 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x14, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, - 0x42, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x19, - 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, - 0x67, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x0a, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x43, 0x6f, 0x6d, - 0x6d, 0x12, 0x19, 0x2e, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x16, 0x2e, 0x72, + 0x66, 0x6f, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x50, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x6f, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x24, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x53, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x4d, 0x73, 0x67, 0x1a, 0x19, 0x2e, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x46, 0x0a, 0x0a, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, - 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x42, 0x11, 0x5a, 0x0f, 0x2e, 0x2f, 0x72, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x19, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x4a, 0x0a, 0x09, 0x4d, 0x6b, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1e, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x1b, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x4f, 0x0a, + 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, + 0x1e, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, + 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x4d, 0x6b, 0x49, 0x6e, 0x6f, 0x64, 0x65, 0x4d, 0x73, 0x67, 0x1a, + 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, + 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x45, + 0x0a, 0x09, 0x52, 0x6d, 0x44, 0x69, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1b, 0x2e, 0x73, 0x61, + 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, + 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x19, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, + 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x46, 0x69, 0x6c, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, + 0x73, 0x67, 0x1a, 0x19, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x4c, 0x0a, 0x0b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1e, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x1b, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x54, 0x0a, + 0x0a, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1d, 0x2e, 0x73, 0x61, + 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, + 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x25, 0x2e, 0x73, 0x61, 0x66, + 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x52, 0x65, 0x61, 0x64, 0x41, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x73, + 0x67, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, + 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x26, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x26, + 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, + 0x6d, 0x6d, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x10, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x26, 0x2e, 0x73, + 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, + 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x73, 0x67, 0x1a, 0x26, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x73, 0x67, 0x22, 0x00, 0x12, 0x50, + 0x0a, 0x0b, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x12, 0x1b, 0x2e, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, + 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x22, 0x2e, 0x73, 0x61, 0x66, + 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, + 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x73, 0x67, 0x22, 0x00, + 0x12, 0x51, 0x0a, 0x0c, 0x41, 0x63, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x12, 0x1b, 0x2e, 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x2e, 0x55, 0x69, 0x6e, 0x74, 0x4d, 0x73, 0x67, 0x1a, 0x22, 0x2e, + 0x73, 0x61, 0x66, 0x65, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, + 0x6d, 0x73, 0x2e, 0x41, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4d, 0x73, + 0x67, 0x22, 0x00, 0x42, 0x16, 0x5a, 0x14, 0x2e, 0x2f, 0x73, 0x61, 0x66, 0x65, 0x2d, 0x72, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x66, 0x73, 0x63, 0x6f, 0x6d, 0x6d, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -669,56 +998,67 @@ func file_comm_proto_rawDescGZIP() []byte { return file_comm_proto_rawDescData } -var file_comm_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_comm_proto_msgTypes = make([]protoimpl.MessageInfo, 12) var file_comm_proto_goTypes = []any{ - (*FileInfoMsg)(nil), // 0: safe-remotefscomms.FileInfoMsg - (*UintMsg)(nil), // 1: safe-remotefscomms.UintMsg - (*ContentMsg)(nil), // 2: safe-remotefscomms.ContentMsg - (*SetInfoParamsMsg)(nil), // 3: safe-remotefscomms.SetInfoParamsMsg - (*MkInodeMsg)(nil), // 4: safe-remotefscomms.MkInodeMsg - (*Empty)(nil), // 5: safe-remotefscomms.Empty - nil, // 6: safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry - (*timestamppb.Timestamp)(nil), // 7: google.protobuf.Timestamp + (*FileInfoMsg)(nil), // 0: safe_remotefscomms.FileInfoMsg + (*UintMsg)(nil), // 1: safe_remotefscomms.UintMsg + (*WriteAtMsg)(nil), // 2: safe_remotefscomms.WriteAtMsg + (*ReadAtMsg)(nil), // 3: safe_remotefscomms.ReadAtMsg + (*ReadAtResponseMsg)(nil), // 4: safe_remotefscomms.ReadAtResponseMsg + (*SetInfoParamsMsg)(nil), // 5: safe_remotefscomms.SetInfoParamsMsg + (*MkInodeMsg)(nil), // 6: safe_remotefscomms.MkInodeMsg + (*RequestResourceMsg)(nil), // 7: safe_remotefscomms.RequestResourceMsg + (*RequestResponseMsg)(nil), // 8: safe_remotefscomms.RequestResponseMsg + (*AckResponseMsg)(nil), // 9: safe_remotefscomms.AckResponseMsg + (*Empty)(nil), // 10: safe_remotefscomms.Empty + nil, // 11: safe_remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + (*timestamppb.Timestamp)(nil), // 12: google.protobuf.Timestamp } var file_comm_proto_depIdxs = []int32{ - 6, // 0: safe-remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> safe-remotefscomms.FileInfoMsg.ChildrenIndexMapEntry - 7, // 1: safe-remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp - 7, // 2: safe-remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp - 7, // 3: safe-remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp - 7, // 4: safe-remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp - 7, // 5: safe-remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp - 7, // 6: safe-remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp - 5, // 7: safe-remotefscomms.RemoteFSComms.GetSizeComm:input_type -> safe-remotefscomms.Empty - 5, // 8: safe-remotefscomms.RemoteFSComms.GetLengthComm:input_type -> safe-remotefscomms.Empty - 1, // 9: safe-remotefscomms.RemoteFSComms.GetInfoComm:input_type -> safe-remotefscomms.UintMsg - 3, // 10: safe-remotefscomms.RemoteFSComms.SetInfoComm:input_type -> safe-remotefscomms.SetInfoParamsMsg - 1, // 11: safe-remotefscomms.RemoteFSComms.DeleteComm:input_type -> safe-remotefscomms.UintMsg - 4, // 12: safe-remotefscomms.RemoteFSComms.MkDirComm:input_type -> safe-remotefscomms.MkInodeMsg - 1, // 13: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:input_type -> safe-remotefscomms.UintMsg - 4, // 14: safe-remotefscomms.RemoteFSComms.CreateFileComm:input_type -> safe-remotefscomms.MkInodeMsg - 1, // 15: safe-remotefscomms.RemoteFSComms.RmDirComm:input_type -> safe-remotefscomms.UintMsg - 1, // 16: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:input_type -> safe-remotefscomms.UintMsg - 1, // 17: safe-remotefscomms.RemoteFSComms.SyncFileComm:input_type -> safe-remotefscomms.UintMsg - 2, // 18: safe-remotefscomms.RemoteFSComms.WriteAtComm:input_type -> safe-remotefscomms.ContentMsg - 2, // 19: safe-remotefscomms.RemoteFSComms.ReadAtComm:input_type -> safe-remotefscomms.ContentMsg - 1, // 20: safe-remotefscomms.RemoteFSComms.GetSizeComm:output_type -> safe-remotefscomms.UintMsg - 1, // 21: safe-remotefscomms.RemoteFSComms.GetLengthComm:output_type -> safe-remotefscomms.UintMsg - 0, // 22: safe-remotefscomms.RemoteFSComms.GetInfoComm:output_type -> safe-remotefscomms.FileInfoMsg - 5, // 23: safe-remotefscomms.RemoteFSComms.SetInfoComm:output_type -> safe-remotefscomms.Empty - 5, // 24: safe-remotefscomms.RemoteFSComms.DeleteComm:output_type -> safe-remotefscomms.Empty - 1, // 25: safe-remotefscomms.RemoteFSComms.MkDirComm:output_type -> safe-remotefscomms.UintMsg - 1, // 26: safe-remotefscomms.RemoteFSComms.GenerateHandleComm:output_type -> safe-remotefscomms.UintMsg - 1, // 27: safe-remotefscomms.RemoteFSComms.CreateFileComm:output_type -> safe-remotefscomms.UintMsg - 5, // 28: safe-remotefscomms.RemoteFSComms.RmDirComm:output_type -> safe-remotefscomms.Empty - 5, // 29: safe-remotefscomms.RemoteFSComms.DeleteHandleComm:output_type -> safe-remotefscomms.Empty - 5, // 30: safe-remotefscomms.RemoteFSComms.SyncFileComm:output_type -> safe-remotefscomms.Empty - 1, // 31: safe-remotefscomms.RemoteFSComms.WriteAtComm:output_type -> safe-remotefscomms.UintMsg - 1, // 32: safe-remotefscomms.RemoteFSComms.ReadAtComm:output_type -> safe-remotefscomms.UintMsg - 20, // [20:33] is the sub-list for method output_type - 7, // [7:20] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 11, // 0: safe_remotefscomms.FileInfoMsg.childrenIndexMap:type_name -> safe_remotefscomms.FileInfoMsg.ChildrenIndexMapEntry + 12, // 1: safe_remotefscomms.FileInfoMsg.atime:type_name -> google.protobuf.Timestamp + 12, // 2: safe_remotefscomms.FileInfoMsg.mtime:type_name -> google.protobuf.Timestamp + 12, // 3: safe_remotefscomms.FileInfoMsg.ctime:type_name -> google.protobuf.Timestamp + 12, // 4: safe_remotefscomms.FileInfoMsg.crtime:type_name -> google.protobuf.Timestamp + 12, // 5: safe_remotefscomms.SetInfoParamsMsg.atime:type_name -> google.protobuf.Timestamp + 12, // 6: safe_remotefscomms.SetInfoParamsMsg.mtime:type_name -> google.protobuf.Timestamp + 12, // 7: safe_remotefscomms.RequestResourceMsg.cacheTime:type_name -> google.protobuf.Timestamp + 12, // 8: safe_remotefscomms.AckResponseMsg.writeTime:type_name -> google.protobuf.Timestamp + 10, // 9: safe_remotefscomms.RemoteFSComms.GetSizeComm:input_type -> safe_remotefscomms.Empty + 10, // 10: safe_remotefscomms.RemoteFSComms.GetLengthComm:input_type -> safe_remotefscomms.Empty + 1, // 11: safe_remotefscomms.RemoteFSComms.GetInfoComm:input_type -> safe_remotefscomms.UintMsg + 5, // 12: safe_remotefscomms.RemoteFSComms.SetInfoComm:input_type -> safe_remotefscomms.SetInfoParamsMsg + 1, // 13: safe_remotefscomms.RemoteFSComms.DeleteComm:input_type -> safe_remotefscomms.UintMsg + 6, // 14: safe_remotefscomms.RemoteFSComms.MkDirComm:input_type -> safe_remotefscomms.MkInodeMsg + 6, // 15: safe_remotefscomms.RemoteFSComms.CreateFileComm:input_type -> safe_remotefscomms.MkInodeMsg + 1, // 16: safe_remotefscomms.RemoteFSComms.RmDirComm:input_type -> safe_remotefscomms.UintMsg + 1, // 17: safe_remotefscomms.RemoteFSComms.SyncFileComm:input_type -> safe_remotefscomms.UintMsg + 2, // 18: safe_remotefscomms.RemoteFSComms.WriteAtComm:input_type -> safe_remotefscomms.WriteAtMsg + 3, // 19: safe_remotefscomms.RemoteFSComms.ReadAtComm:input_type -> safe_remotefscomms.ReadAtMsg + 7, // 20: safe_remotefscomms.RemoteFSComms.RequestReadComm:input_type -> safe_remotefscomms.RequestResourceMsg + 7, // 21: safe_remotefscomms.RemoteFSComms.RequestWriteComm:input_type -> safe_remotefscomms.RequestResourceMsg + 1, // 22: safe_remotefscomms.RemoteFSComms.AckReadComm:input_type -> safe_remotefscomms.UintMsg + 1, // 23: safe_remotefscomms.RemoteFSComms.AckWriteComm:input_type -> safe_remotefscomms.UintMsg + 1, // 24: safe_remotefscomms.RemoteFSComms.GetSizeComm:output_type -> safe_remotefscomms.UintMsg + 1, // 25: safe_remotefscomms.RemoteFSComms.GetLengthComm:output_type -> safe_remotefscomms.UintMsg + 0, // 26: safe_remotefscomms.RemoteFSComms.GetInfoComm:output_type -> safe_remotefscomms.FileInfoMsg + 10, // 27: safe_remotefscomms.RemoteFSComms.SetInfoComm:output_type -> safe_remotefscomms.Empty + 10, // 28: safe_remotefscomms.RemoteFSComms.DeleteComm:output_type -> safe_remotefscomms.Empty + 1, // 29: safe_remotefscomms.RemoteFSComms.MkDirComm:output_type -> safe_remotefscomms.UintMsg + 1, // 30: safe_remotefscomms.RemoteFSComms.CreateFileComm:output_type -> safe_remotefscomms.UintMsg + 10, // 31: safe_remotefscomms.RemoteFSComms.RmDirComm:output_type -> safe_remotefscomms.Empty + 10, // 32: safe_remotefscomms.RemoteFSComms.SyncFileComm:output_type -> safe_remotefscomms.Empty + 1, // 33: safe_remotefscomms.RemoteFSComms.WriteAtComm:output_type -> safe_remotefscomms.UintMsg + 4, // 34: safe_remotefscomms.RemoteFSComms.ReadAtComm:output_type -> safe_remotefscomms.ReadAtResponseMsg + 8, // 35: safe_remotefscomms.RemoteFSComms.RequestReadComm:output_type -> safe_remotefscomms.RequestResponseMsg + 8, // 36: safe_remotefscomms.RemoteFSComms.RequestWriteComm:output_type -> safe_remotefscomms.RequestResponseMsg + 9, // 37: safe_remotefscomms.RemoteFSComms.AckReadComm:output_type -> safe_remotefscomms.AckResponseMsg + 9, // 38: safe_remotefscomms.RemoteFSComms.AckWriteComm:output_type -> safe_remotefscomms.AckResponseMsg + 24, // [24:39] is the sub-list for method output_type + 9, // [9:24] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_comm_proto_init() } @@ -752,7 +1092,7 @@ func file_comm_proto_init() { } } file_comm_proto_msgTypes[2].Exporter = func(v any, i int) any { - switch v := v.(*ContentMsg); i { + switch v := v.(*WriteAtMsg); i { case 0: return &v.state case 1: @@ -764,7 +1104,7 @@ func file_comm_proto_init() { } } file_comm_proto_msgTypes[3].Exporter = func(v any, i int) any { - switch v := v.(*SetInfoParamsMsg); i { + switch v := v.(*ReadAtMsg); i { case 0: return &v.state case 1: @@ -776,7 +1116,7 @@ func file_comm_proto_init() { } } file_comm_proto_msgTypes[4].Exporter = func(v any, i int) any { - switch v := v.(*MkInodeMsg); i { + switch v := v.(*ReadAtResponseMsg); i { case 0: return &v.state case 1: @@ -788,6 +1128,66 @@ func file_comm_proto_init() { } } file_comm_proto_msgTypes[5].Exporter = func(v any, i int) any { + switch v := v.(*SetInfoParamsMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[6].Exporter = func(v any, i int) any { + switch v := v.(*MkInodeMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[7].Exporter = func(v any, i int) any { + switch v := v.(*RequestResourceMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[8].Exporter = func(v any, i int) any { + switch v := v.(*RequestResponseMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[9].Exporter = func(v any, i int) any { + switch v := v.(*AckResponseMsg); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_comm_proto_msgTypes[10].Exporter = func(v any, i int) any { switch v := v.(*Empty); i { case 0: return &v.state @@ -806,7 +1206,7 @@ func file_comm_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_comm_proto_rawDesc, NumEnums: 0, - NumMessages: 7, + NumMessages: 12, NumExtensions: 0, NumServices: 1, }, diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go b/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go index 01d967d4..d9eae90d 100644 --- a/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go +++ b/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go @@ -19,19 +19,21 @@ import ( const _ = grpc.SupportPackageIsVersion8 const ( - RemoteFSComms_GetSizeComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetSizeComm" - RemoteFSComms_GetLengthComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetLengthComm" - RemoteFSComms_GetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GetInfoComm" - RemoteFSComms_SetInfoComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SetInfoComm" - RemoteFSComms_DeleteComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteComm" - RemoteFSComms_MkDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/MkDirComm" - RemoteFSComms_GenerateHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/GenerateHandleComm" - RemoteFSComms_CreateFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/CreateFileComm" - RemoteFSComms_RmDirComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/RmDirComm" - RemoteFSComms_DeleteHandleComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/DeleteHandleComm" - RemoteFSComms_SyncFileComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/SyncFileComm" - RemoteFSComms_WriteAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/WriteAtComm" - RemoteFSComms_ReadAtComm_FullMethodName = "/safe-remotefscomms.RemoteFSComms/ReadAtComm" + RemoteFSComms_GetSizeComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/GetSizeComm" + RemoteFSComms_GetLengthComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/GetLengthComm" + RemoteFSComms_GetInfoComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/GetInfoComm" + RemoteFSComms_SetInfoComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/SetInfoComm" + RemoteFSComms_DeleteComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/DeleteComm" + RemoteFSComms_MkDirComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/MkDirComm" + RemoteFSComms_CreateFileComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/CreateFileComm" + RemoteFSComms_RmDirComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/RmDirComm" + RemoteFSComms_SyncFileComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/SyncFileComm" + RemoteFSComms_WriteAtComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/WriteAtComm" + RemoteFSComms_ReadAtComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/ReadAtComm" + RemoteFSComms_RequestReadComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/RequestReadComm" + RemoteFSComms_RequestWriteComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/RequestWriteComm" + RemoteFSComms_AckReadComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/AckReadComm" + RemoteFSComms_AckWriteComm_FullMethodName = "/safe_remotefscomms.RemoteFSComms/AckWriteComm" ) // RemoteFSCommsClient is the client API for RemoteFSComms service. @@ -44,13 +46,15 @@ type RemoteFSCommsClient interface { SetInfoComm(ctx context.Context, in *SetInfoParamsMsg, opts ...grpc.CallOption) (*Empty, error) DeleteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) MkDirComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) - GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) - DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) - WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) - ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) + WriteAtComm(ctx context.Context, in *WriteAtMsg, opts ...grpc.CallOption) (*UintMsg, error) + ReadAtComm(ctx context.Context, in *ReadAtMsg, opts ...grpc.CallOption) (*ReadAtResponseMsg, error) + RequestReadComm(ctx context.Context, in *RequestResourceMsg, opts ...grpc.CallOption) (*RequestResponseMsg, error) + RequestWriteComm(ctx context.Context, in *RequestResourceMsg, opts ...grpc.CallOption) (*RequestResponseMsg, error) + AckReadComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*AckResponseMsg, error) + AckWriteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*AckResponseMsg, error) } type remoteFSCommsClient struct { @@ -121,70 +125,90 @@ func (c *remoteFSCommsClient) MkDirComm(ctx context.Context, in *MkInodeMsg, opt return out, nil } -func (c *remoteFSCommsClient) GenerateHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*UintMsg, error) { +func (c *remoteFSCommsClient) CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UintMsg) - err := c.cc.Invoke(ctx, RemoteFSComms_GenerateHandleComm_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, RemoteFSComms_CreateFileComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) CreateFileComm(ctx context.Context, in *MkInodeMsg, opts ...grpc.CallOption) (*UintMsg, error) { +func (c *remoteFSCommsClient) RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(UintMsg) - err := c.cc.Invoke(ctx, RemoteFSComms_CreateFileComm_FullMethodName, in, out, cOpts...) + out := new(Empty) + err := c.cc.Invoke(ctx, RemoteFSComms_RmDirComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) RmDirComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { +func (c *remoteFSCommsClient) SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Empty) - err := c.cc.Invoke(ctx, RemoteFSComms_RmDirComm_FullMethodName, in, out, cOpts...) + err := c.cc.Invoke(ctx, RemoteFSComms_SyncFileComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) DeleteHandleComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { +func (c *remoteFSCommsClient) WriteAtComm(ctx context.Context, in *WriteAtMsg, opts ...grpc.CallOption) (*UintMsg, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(Empty) - err := c.cc.Invoke(ctx, RemoteFSComms_DeleteHandleComm_FullMethodName, in, out, cOpts...) + out := new(UintMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_WriteAtComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) SyncFileComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*Empty, error) { +func (c *remoteFSCommsClient) ReadAtComm(ctx context.Context, in *ReadAtMsg, opts ...grpc.CallOption) (*ReadAtResponseMsg, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(Empty) - err := c.cc.Invoke(ctx, RemoteFSComms_SyncFileComm_FullMethodName, in, out, cOpts...) + out := new(ReadAtResponseMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_ReadAtComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) WriteAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { +func (c *remoteFSCommsClient) RequestReadComm(ctx context.Context, in *RequestResourceMsg, opts ...grpc.CallOption) (*RequestResponseMsg, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(UintMsg) - err := c.cc.Invoke(ctx, RemoteFSComms_WriteAtComm_FullMethodName, in, out, cOpts...) + out := new(RequestResponseMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_RequestReadComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } return out, nil } -func (c *remoteFSCommsClient) ReadAtComm(ctx context.Context, in *ContentMsg, opts ...grpc.CallOption) (*UintMsg, error) { +func (c *remoteFSCommsClient) RequestWriteComm(ctx context.Context, in *RequestResourceMsg, opts ...grpc.CallOption) (*RequestResponseMsg, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(UintMsg) - err := c.cc.Invoke(ctx, RemoteFSComms_ReadAtComm_FullMethodName, in, out, cOpts...) + out := new(RequestResponseMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_RequestWriteComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) AckReadComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*AckResponseMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AckResponseMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_AckReadComm_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *remoteFSCommsClient) AckWriteComm(ctx context.Context, in *UintMsg, opts ...grpc.CallOption) (*AckResponseMsg, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AckResponseMsg) + err := c.cc.Invoke(ctx, RemoteFSComms_AckWriteComm_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -201,13 +225,15 @@ type RemoteFSCommsServer interface { SetInfoComm(context.Context, *SetInfoParamsMsg) (*Empty, error) DeleteComm(context.Context, *UintMsg) (*Empty, error) MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) - GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) RmDirComm(context.Context, *UintMsg) (*Empty, error) - DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) SyncFileComm(context.Context, *UintMsg) (*Empty, error) - WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) - ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) + WriteAtComm(context.Context, *WriteAtMsg) (*UintMsg, error) + ReadAtComm(context.Context, *ReadAtMsg) (*ReadAtResponseMsg, error) + RequestReadComm(context.Context, *RequestResourceMsg) (*RequestResponseMsg, error) + RequestWriteComm(context.Context, *RequestResourceMsg) (*RequestResponseMsg, error) + AckReadComm(context.Context, *UintMsg) (*AckResponseMsg, error) + AckWriteComm(context.Context, *UintMsg) (*AckResponseMsg, error) mustEmbedUnimplementedRemoteFSCommsServer() } @@ -233,27 +259,33 @@ func (UnimplementedRemoteFSCommsServer) DeleteComm(context.Context, *UintMsg) (* func (UnimplementedRemoteFSCommsServer) MkDirComm(context.Context, *MkInodeMsg) (*UintMsg, error) { return nil, status.Errorf(codes.Unimplemented, "method MkDirComm not implemented") } -func (UnimplementedRemoteFSCommsServer) GenerateHandleComm(context.Context, *UintMsg) (*UintMsg, error) { - return nil, status.Errorf(codes.Unimplemented, "method GenerateHandleComm not implemented") -} func (UnimplementedRemoteFSCommsServer) CreateFileComm(context.Context, *MkInodeMsg) (*UintMsg, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateFileComm not implemented") } func (UnimplementedRemoteFSCommsServer) RmDirComm(context.Context, *UintMsg) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method RmDirComm not implemented") } -func (UnimplementedRemoteFSCommsServer) DeleteHandleComm(context.Context, *UintMsg) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteHandleComm not implemented") -} func (UnimplementedRemoteFSCommsServer) SyncFileComm(context.Context, *UintMsg) (*Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method SyncFileComm not implemented") } -func (UnimplementedRemoteFSCommsServer) WriteAtComm(context.Context, *ContentMsg) (*UintMsg, error) { +func (UnimplementedRemoteFSCommsServer) WriteAtComm(context.Context, *WriteAtMsg) (*UintMsg, error) { return nil, status.Errorf(codes.Unimplemented, "method WriteAtComm not implemented") } -func (UnimplementedRemoteFSCommsServer) ReadAtComm(context.Context, *ContentMsg) (*UintMsg, error) { +func (UnimplementedRemoteFSCommsServer) ReadAtComm(context.Context, *ReadAtMsg) (*ReadAtResponseMsg, error) { return nil, status.Errorf(codes.Unimplemented, "method ReadAtComm not implemented") } +func (UnimplementedRemoteFSCommsServer) RequestReadComm(context.Context, *RequestResourceMsg) (*RequestResponseMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method RequestReadComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) RequestWriteComm(context.Context, *RequestResourceMsg) (*RequestResponseMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method RequestWriteComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) AckReadComm(context.Context, *UintMsg) (*AckResponseMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method AckReadComm not implemented") +} +func (UnimplementedRemoteFSCommsServer) AckWriteComm(context.Context, *UintMsg) (*AckResponseMsg, error) { + return nil, status.Errorf(codes.Unimplemented, "method AckWriteComm not implemented") +} func (UnimplementedRemoteFSCommsServer) mustEmbedUnimplementedRemoteFSCommsServer() {} // UnsafeRemoteFSCommsServer may be embedded to opt out of forward compatibility for this service. @@ -375,128 +407,164 @@ func _RemoteFSComms_MkDirComm_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_GenerateHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UintMsg) +func _RemoteFSComms_CreateFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MkInodeMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, in) + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_GenerateHandleComm_FullMethodName, + FullMethod: RemoteFSComms_CreateFileComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).GenerateHandleComm(ctx, req.(*UintMsg)) + return srv.(RemoteFSCommsServer).CreateFileComm(ctx, req.(*MkInodeMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_CreateFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(MkInodeMsg) +func _RemoteFSComms_RmDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).CreateFileComm(ctx, in) + return srv.(RemoteFSCommsServer).RmDirComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_CreateFileComm_FullMethodName, + FullMethod: RemoteFSComms_RmDirComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).CreateFileComm(ctx, req.(*MkInodeMsg)) + return srv.(RemoteFSCommsServer).RmDirComm(ctx, req.(*UintMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_RmDirComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { +func _RemoteFSComms_SyncFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(UintMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).RmDirComm(ctx, in) + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_RmDirComm_FullMethodName, + FullMethod: RemoteFSComms_SyncFileComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).RmDirComm(ctx, req.(*UintMsg)) + return srv.(RemoteFSCommsServer).SyncFileComm(ctx, req.(*UintMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_DeleteHandleComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UintMsg) +func _RemoteFSComms_WriteAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WriteAtMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, in) + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_DeleteHandleComm_FullMethodName, + FullMethod: RemoteFSComms_WriteAtComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).DeleteHandleComm(ctx, req.(*UintMsg)) + return srv.(RemoteFSCommsServer).WriteAtComm(ctx, req.(*WriteAtMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_SyncFileComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(UintMsg) +func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ReadAtMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).SyncFileComm(ctx, in) + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_SyncFileComm_FullMethodName, + FullMethod: RemoteFSComms_ReadAtComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).SyncFileComm(ctx, req.(*UintMsg)) + return srv.(RemoteFSCommsServer).ReadAtComm(ctx, req.(*ReadAtMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_WriteAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ContentMsg) +func _RemoteFSComms_RequestReadComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestResourceMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).WriteAtComm(ctx, in) + return srv.(RemoteFSCommsServer).RequestReadComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_WriteAtComm_FullMethodName, + FullMethod: RemoteFSComms_RequestReadComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).WriteAtComm(ctx, req.(*ContentMsg)) + return srv.(RemoteFSCommsServer).RequestReadComm(ctx, req.(*RequestResourceMsg)) } return interceptor(ctx, in, info, handler) } -func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ContentMsg) +func _RemoteFSComms_RequestWriteComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(RequestResourceMsg) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(RemoteFSCommsServer).ReadAtComm(ctx, in) + return srv.(RemoteFSCommsServer).RequestWriteComm(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: RemoteFSComms_ReadAtComm_FullMethodName, + FullMethod: RemoteFSComms_RequestWriteComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).RequestWriteComm(ctx, req.(*RequestResourceMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_AckReadComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).AckReadComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_AckReadComm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(RemoteFSCommsServer).ReadAtComm(ctx, req.(*ContentMsg)) + return srv.(RemoteFSCommsServer).AckReadComm(ctx, req.(*UintMsg)) + } + return interceptor(ctx, in, info, handler) +} + +func _RemoteFSComms_AckWriteComm_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UintMsg) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(RemoteFSCommsServer).AckWriteComm(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: RemoteFSComms_AckWriteComm_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(RemoteFSCommsServer).AckWriteComm(ctx, req.(*UintMsg)) } return interceptor(ctx, in, info, handler) } @@ -505,7 +573,7 @@ func _RemoteFSComms_ReadAtComm_Handler(srv interface{}, ctx context.Context, dec // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "safe-remotefscomms.RemoteFSComms", + ServiceName: "safe_remotefscomms.RemoteFSComms", HandlerType: (*RemoteFSCommsServer)(nil), Methods: []grpc.MethodDesc{ { @@ -532,10 +600,6 @@ var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ MethodName: "MkDirComm", Handler: _RemoteFSComms_MkDirComm_Handler, }, - { - MethodName: "GenerateHandleComm", - Handler: _RemoteFSComms_GenerateHandleComm_Handler, - }, { MethodName: "CreateFileComm", Handler: _RemoteFSComms_CreateFileComm_Handler, @@ -544,10 +608,6 @@ var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ MethodName: "RmDirComm", Handler: _RemoteFSComms_RmDirComm_Handler, }, - { - MethodName: "DeleteHandleComm", - Handler: _RemoteFSComms_DeleteHandleComm_Handler, - }, { MethodName: "SyncFileComm", Handler: _RemoteFSComms_SyncFileComm_Handler, @@ -560,6 +620,22 @@ var RemoteFSComms_ServiceDesc = grpc.ServiceDesc{ MethodName: "ReadAtComm", Handler: _RemoteFSComms_ReadAtComm_Handler, }, + { + MethodName: "RequestReadComm", + Handler: _RemoteFSComms_RequestReadComm_Handler, + }, + { + MethodName: "RequestWriteComm", + Handler: _RemoteFSComms_RequestWriteComm_Handler, + }, + { + MethodName: "AckReadComm", + Handler: _RemoteFSComms_AckReadComm_Handler, + }, + { + MethodName: "AckWriteComm", + Handler: _RemoteFSComms_AckWriteComm_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "comm.proto", diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go new file mode 100644 index 00000000..bce56bd9 --- /dev/null +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -0,0 +1,423 @@ +package server + +import ( + "fmt" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + "golang.org/x/sys/unix" + "mft-fs/abstractfs" + "mft-fs/datastructures" + "os" + "syscall" + "time" +) + +type SafeOSFSManager struct { + abstractfs.FSManager + root string + lock *datastructures.CREWResource + inodeInfo map[fuseops.InodeID]*abstractfs.FileInfo + inodeCounter fuseops.InodeID +} + +type parentChildPair struct { + parent fuseops.InodeID + child string +} + +func (manager *SafeOSFSManager) bfs(root string) { + q := datastructures.NewQueue() + q.Enqueue(&(parentChildPair{ + parent: 0, + child: root, + })) + for !q.IsEmpty() { + current := q.Dequeue().(*parentChildPair) + var direntType fuseutil.DirentType + stat, e := os.Stat(current.child) + if e != nil { + fmt.Println("error:") + fmt.Println(e.Error()) + continue + } + if stat.IsDir() { + dir, e := os.ReadDir(current.child) + if e != nil { + continue + } + for _, file := range dir { + q.Enqueue(&(parentChildPair{ + parent: manager.inodeCounter, + child: fmt.Sprintf("%s/%s", current.child, file.Name()), + })) + } + direntType = fuseutil.DT_Directory + } else { + direntType = fuseutil.DT_File + } + info := abstractfs.NewSafeFileInfo(stat.Name(), current.child, manager.inodeCounter, current.parent, direntType) + manager.inodeInfo[manager.inodeCounter] = &info + parentInfo, ok := manager.inodeInfo[current.parent] + if ok { + parentInfo.ChildrenIndexMap[info.Name] = len(parentInfo.Children) + parentInfo.Children = append(parentInfo.Children, manager.inodeCounter) + } + manager.updateInfo(manager.inodeInfo[manager.inodeCounter]) + manager.inodeCounter++ + } +} + +func NewSafeOSFSManager(root string) *SafeOSFSManager { + manager := &SafeOSFSManager{ + root: root, + lock: datastructures.NewCREWResource(), + inodeInfo: make(map[fuseops.InodeID]*abstractfs.FileInfo), + inodeCounter: 1, + } + manager.lock.RequestWrite() + defer manager.lock.AckWrite() + manager.bfs(root) + return manager +} + +func (manager *SafeOSFSManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + return 0, nil +} + +func (manager *SafeOSFSManager) updateInfo(info *abstractfs.FileInfo) error { + + fileInfo, e := os.Stat(info.Path) + if e != nil { + return e + } + stats := fileInfo.Sys().(*syscall.Stat_t) + + info.Size = uint64(fileInfo.Size()) + + info.Nlink = 1 + + info.Mode = fileInfo.Mode() + + /*info.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) + info.Mtime = time.Unix(stats.Mtimespec.Sec, stats.Mtimespec.Nsec) + info.Ctime = time.Unix(stats.Ctimespec.Sec, stats.Ctimespec.Nsec) + info.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec)*/ + var timeStats unix.Stat_t + e = unix.Stat(info.Path, &timeStats) + if e != nil { + return e + } + info.Atime = time.Unix(timeStats.Atim.Sec, timeStats.Atim.Nsec) + info.Mtime = time.Unix(timeStats.Mtim.Sec, timeStats.Mtim.Nsec) + info.Ctime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + info.Crtime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + + info.Uid = stats.Uid + info.Gid = stats.Gid + + info.MetadataWriteTime = time.Now() + + return nil +} + +// todo: consider locking mechanisms +func (manager *SafeOSFSManager) GetSize() (uint64, error) { + stat, _ := os.Stat(manager.root) + return uint64(stat.Size()), nil +} + +func (manager *SafeOSFSManager) GetLength() (uint64, error) { + manager.lock.RequestRead() + defer manager.lock.AckRead() + output := uint64(len(manager.inodeInfo)) + return output, nil +} + +func (manager *SafeOSFSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + manager.lock.RequestRead() + defer manager.lock.AckRead() + info, ok := manager.inodeInfo[inode] + if !ok { + return nil, fuse.ENOENT + } + return info, nil +} + +func (manager *SafeOSFSManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + info, e := manager.GetInfo(inode) + + // todo consider thread safety options + + if e != nil { + return e + } + + if modeptr != nil { + e = os.Chmod(info.Path, *modeptr) + if e != nil { + return e + } + } + + uid := -1 + gid := -1 + if uidptr != nil { + uid = int(*uidptr) + } + if gidptr != nil { + gid = int(*gidptr) + } + e = os.Chown(info.Path, uid, gid) + if e != nil { + return e + } + + atime := time.Time{} + mtime := time.Time{} + if atimeptr != nil { + atime = *atimeptr + } + if mtimeptr != nil { + mtime = *mtimeptr + } + e = os.Chtimes(info.Path, atime, mtime) + if e != nil { + return e + } + + info.MetadataLock.RequestWrite() + e = manager.updateInfo(info) + info.MetadataLock.AckWrite() + + return e +} + +func (manager *SafeOSFSManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + e = os.Mkdir(path, mode) + if e != nil { + return 0, e + } + + manager.lock.RequestWrite() + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewSafeFileInfo(name, path, inode, parent, fuseutil.DT_Directory) + manager.inodeInfo[inode] = &infoObj + manager.lock.AckWrite() + + infoObj.MetadataLock.RequestWrite() + e = manager.updateInfo(&infoObj) + infoObj.MetadataLock.AckWrite() + if e != nil { + return 0, e + } + + parentInfo.MetadataLock.RequestWrite() + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + parentInfo.MetadataWriteTime = time.Now() + parentInfo.MetadataLock.AckWrite() + + return inode, nil +} + +func (manager *SafeOSFSManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + file, e := os.Create(path) + defer file.Close() + if e != nil { + return 0, e + } + + e = file.Chmod(mode) + if e != nil { + return 0, e + } + + manager.lock.RequestWrite() + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewSafeFileInfo(name, path, inode, parent, fuseutil.DT_File) + manager.inodeInfo[inode] = &infoObj + manager.lock.AckWrite() + + infoObj.MetadataLock.RequestWrite() + e = manager.updateInfo(&infoObj) + infoObj.MetadataLock.AckWrite() + if e != nil { + return 0, e + } + + parentInfo.MetadataLock.RequestWrite() + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + parentInfo.MetadataWriteTime = time.Now() + parentInfo.MetadataLock.AckWrite() + + return inode, nil +} + +func (manager *SafeOSFSManager) RmDir(inode fuseops.InodeID) error { + return nil +} + +func (manager *SafeOSFSManager) Delete(inode fuseops.InodeID) error { + + // first delete any reference in parents + // then delete self + + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + + parentInfo, e := manager.GetInfo(info.Parent) + if e != nil { + return e + } + + parentInfo.MetadataLock.RequestWrite() + parentInfo.Children = datastructures.Remove(parentInfo.Children, parentInfo.ChildrenIndexMap[info.Name]) + target := parentInfo.ChildrenIndexMap[info.Name] + for name, index := range parentInfo.ChildrenIndexMap { + if index > target { + parentInfo.ChildrenIndexMap[name] = index - 1 + } + } + delete(parentInfo.ChildrenIndexMap, info.Name) + parentInfo.MetadataWriteTime = time.Now() + parentInfo.MetadataLock.AckWrite() + + manager.lock.RequestWrite() + delete(manager.inodeInfo, info.Inode) + manager.lock.AckWrite() + + return nil +} + +func (manager *SafeOSFSManager) DeleteHandle(handle fuseops.HandleID) error { + return nil +} + +func (manager *SafeOSFSManager) SyncFile(inode fuseops.InodeID) error { + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return e + } + defer file.Close() + e = file.Sync() + if e != nil { + return e + } + return nil +} + +func (manager *SafeOSFSManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.ReadAt(data, off) + return n, e +} + +func (manager *SafeOSFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.WriteAt(data, off) + return n, e +} + +func (manager *SafeOSFSManager) RequestRead(inode fuseops.InodeID, cache bool, cacheTime time.Time) (bool, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return false, e + } + + info.ContentLock.RequestRead() + // if cache is invalid, return lock success = true + if !cache || info.ContentWriteTime.After(cacheTime) { + return true, nil + } + info.ContentLock.AckRead() + + // if cache is valid, no need to lock + return false, nil +} + +func (manager *SafeOSFSManager) AckRead(inode fuseops.InodeID) (time.Time, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return time.Time{}, e + } + info.ContentLock.AckRead() + info.MetadataLock.RequestRead() + output := info.ContentWriteTime + info.MetadataLock.RequestRead() + return output, nil +} + +func (manager *SafeOSFSManager) RequestWrite(inode fuseops.InodeID, cache bool, cacheTime time.Time) (bool, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return false, e + } + + info.ContentLock.RequestWrite() + + // cache is valid so grant permission + if cache && info.ContentWriteTime.Equal(cacheTime) { + return true, nil + } + info.ContentLock.AckWrite() + + // cache is not valid, so do not grant permission + return false, nil +} + +func (manager *SafeOSFSManager) AckWrite(inode fuseops.InodeID) (time.Time, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return time.Time{}, e + } + info.MetadataLock.RequestWrite() + info.ContentWriteTime = time.Now() + output := info.ContentWriteTime + info.MetadataLock.AckWrite() + info.ContentLock.AckWrite() + return output, nil +} + +func (manager *SafeOSFSManager) Destroy() error { return nil } diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go index 09a325b6..f4c3cd20 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -3,7 +3,7 @@ package server import ( "context" "github.com/jacobsa/fuse/fuseops" - "mft-fs/osfsmanager" + "google.golang.org/protobuf/types/known/timestamppb" "mft-fs/safe-remotefs/safe-remotefscomms" "os" "time" @@ -11,12 +11,12 @@ import ( type Server struct { safe_remotefscomms.UnimplementedRemoteFSCommsServer - manager *osfsmanager.OSFSManager + manager *SafeOSFSManager } func NewServerHandler(root string) *Server { output := &Server{ - manager: osfsmanager.NewOSFSManager(root), + manager: NewSafeOSFSManager(root), } return output } @@ -97,14 +97,6 @@ func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms.MkIn return &safe_remotefscomms.UintMsg{Data: uint64(inode)}, nil } -func (server *Server) GenerateHandleComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.UintMsg, error) { - handle, e := server.manager.GenerateHandle(fuseops.InodeID(in.Data)) - if e != nil { - return nil, e - } - return &safe_remotefscomms.UintMsg{Data: uint64(handle)}, nil -} - func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { @@ -121,28 +113,56 @@ func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms.Uint return &safe_remotefscomms.Empty{}, nil } -func (server *Server) DeleteHandleComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { - e := server.manager.DeleteHandle(fuseops.HandleID(in.Data)) +func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + e := server.manager.SyncFile(fuseops.InodeID(in.Data)) if e != nil { return nil, e } return &safe_remotefscomms.Empty{}, nil } -func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { - e := server.manager.SyncFile(fuseops.InodeID(in.Data)) +func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms.WriteAtMsg) (*safe_remotefscomms.UintMsg, error) { + n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) + return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil +} + +func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.ReadAtMsg) (*safe_remotefscomms.ReadAtResponseMsg, error) { + data := make([]byte, in.Size) + n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), data, in.Off) + return &safe_remotefscomms.ReadAtResponseMsg{ + Data: data, + N: int64(n), + }, nil +} + +func (server *Server) RequestReadComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { + success, e := server.manager.RequestRead(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) if e != nil { return nil, e } - return &safe_remotefscomms.Empty{}, nil + return &safe_remotefscomms.RequestResponseMsg{Success: success}, nil } -func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms.ContentMsg) (*safe_remotefscomms.UintMsg, error) { - n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) - return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil +func (server *Server) RequestWriteComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { + success, e := server.manager.RequestWrite(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) + if e != nil { + return nil, e + } + return &safe_remotefscomms.RequestResponseMsg{Success: success}, nil } -func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.ContentMsg) (*safe_remotefscomms.UintMsg, error) { - n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), in.Data, in.Off) - return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil +func (server *Server) AckReadComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { + timestamp, e := server.manager.AckRead(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil +} + +func (server *Server) AckWriteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { + timestamp, e := server.manager.AckWrite(fuseops.InodeID(in.Data)) + if e != nil { + return nil, e + } + return &safe_remotefscomms.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil } From 656cec11ca0d04421d69a683b1b39f98c556068c Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Wed, 28 Aug 2024 21:49:24 -0400 Subject: [PATCH 22/37] client map allocation bugfix --- mft-fs/safe-remotefs/client/client_manager.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go index 7f781e91..8bcf0cfa 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -38,8 +38,9 @@ type ClientManager struct { func NewClientManager(conn *grpc.ClientConn, cachePath string) (*ClientManager, error) { output := &ClientManager{ - cachePath: cachePath, - localInfo: make(map[fuseops.InodeID]*cacheInfo), + cachePath: cachePath, + localInfo: make(map[fuseops.InodeID]*cacheInfo), + handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), } output.client = safe_remotefscomms.NewRemoteFSCommsClient(conn) return output, nil From b00706c06c96b5e2dee886f63cf526e2c4b9862d Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Wed, 28 Aug 2024 22:01:59 -0400 Subject: [PATCH 23/37] debugging pointer errors --- mft-fs/safe-remotefs/server/server_manager.go | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go index f4c3cd20..0d4696af 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -50,29 +50,41 @@ func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.Ui } func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.SetInfoParamsMsg) (*safe_remotefscomms.Empty, error) { - var uidptr *uint32 = nil - var gidptr *uint32 = nil - var sizeptr *uint64 = nil - var modeptr *os.FileMode = nil - var atimeptr *time.Time = nil - var mtimeptr *time.Time = nil + var uidptr *uint32 + var gidptr *uint32 + var sizeptr *uint64 + var modeptr *os.FileMode + var atimeptr *time.Time + var mtimeptr *time.Time if in.Uid != -1 { *uidptr = uint32(in.Uid) + } else { + uidptr = nil } if in.Gid != -1 { *gidptr = uint32(in.Gid) + } else { + gidptr = nil } if in.Mode != -1 { *modeptr = os.FileMode(in.Mode) + } else { + modeptr = nil } if in.Size != -1 { *sizeptr = uint64(in.Size) + } else { + sizeptr = nil } if !in.Atime.AsTime().Equal(time.Time{}) { *atimeptr = in.Atime.AsTime() + } else { + atimeptr = nil } if !in.Mtime.AsTime().Equal(time.Time{}) { *mtimeptr = in.Mtime.AsTime() + } else { + mtimeptr = nil } e := server.manager.SetInfo(fuseops.InodeID(in.Inode), uidptr, gidptr, sizeptr, modeptr, atimeptr, mtimeptr) if e != nil { From 6e4e68a79eae89f5963855886b3a9a576bc36a07 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Wed, 28 Aug 2024 22:12:03 -0400 Subject: [PATCH 24/37] debugging memory issues --- mft-fs/safe-remotefs/server/server_manager.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go index 0d4696af..e24c2a44 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -57,32 +57,38 @@ func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.Se var atimeptr *time.Time var mtimeptr *time.Time if in.Uid != -1 { - *uidptr = uint32(in.Uid) + var temp uint32 = uint32(in.Uid) + uidptr = &temp } else { uidptr = nil } if in.Gid != -1 { - *gidptr = uint32(in.Gid) + var temp uint32 = uint32(in.Uid) + gidptr = &temp } else { gidptr = nil } if in.Mode != -1 { - *modeptr = os.FileMode(in.Mode) + var temp os.FileMode = os.FileMode(in.Mode) + modeptr = &temp } else { modeptr = nil } if in.Size != -1 { - *sizeptr = uint64(in.Size) + var temp uint64 = uint64(in.Size) + sizeptr = &temp } else { sizeptr = nil } if !in.Atime.AsTime().Equal(time.Time{}) { - *atimeptr = in.Atime.AsTime() + var temp time.Time = in.Atime.AsTime() + atimeptr = &temp } else { atimeptr = nil } if !in.Mtime.AsTime().Equal(time.Time{}) { - *mtimeptr = in.Mtime.AsTime() + var temp time.Time = in.Mtime.AsTime() + mtimeptr = &temp } else { mtimeptr = nil } From 0eeb104d2670ae74a88f2ca0e8ede421663f3db2 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 12:27:47 -0400 Subject: [PATCH 25/37] debugging --- mft-fs/safe-remotefs/server/server_manager.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go index e24c2a44..4abb6016 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -2,6 +2,7 @@ package server import ( "context" + "fmt" "github.com/jacobsa/fuse/fuseops" "google.golang.org/protobuf/types/known/timestamppb" "mft-fs/safe-remotefs/safe-remotefscomms" @@ -22,6 +23,7 @@ func NewServerHandler(root string) *Server { } func (server *Server) GetSizeComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { + fmt.Println("GetSizeComm") size, e := server.manager.GetSize() if e != nil { return nil, e @@ -30,6 +32,7 @@ func (server *Server) GetSizeComm(ctx context.Context, in *safe_remotefscomms.Em } func (server *Server) GetLengthComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { + fmt.Println("GetLengthComm") length, e := server.manager.GetLength() if e != nil { return nil, e @@ -38,6 +41,7 @@ func (server *Server) GetLengthComm(ctx context.Context, in *safe_remotefscomms. } func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.FileInfoMsg, error) { + fmt.Println("GetInfoComm") info, e := server.manager.GetInfo(fuseops.InodeID(in.Data)) if e != nil { return nil, e @@ -50,6 +54,7 @@ func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.Ui } func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.SetInfoParamsMsg) (*safe_remotefscomms.Empty, error) { + fmt.Println("SetInfoComm") var uidptr *uint32 var gidptr *uint32 var sizeptr *uint64 @@ -100,6 +105,7 @@ func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.Se } func (server *Server) DeleteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + fmt.Println("DeleteComm") e := server.manager.Delete(fuseops.InodeID(in.Data)) if e != nil { return nil, e @@ -108,6 +114,7 @@ func (server *Server) DeleteComm(ctx context.Context, in *safe_remotefscomms.Uin } func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { + fmt.Println("MkDirComm") inode, e := server.manager.MkDir(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e @@ -116,6 +123,7 @@ func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms.MkIn } func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { + fmt.Println("CreateFileComm") inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e @@ -124,6 +132,7 @@ func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms } func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + fmt.Println("RmDirComm") e := server.manager.RmDir(fuseops.InodeID(in.Data)) if e != nil { return nil, e @@ -132,6 +141,7 @@ func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms.Uint } func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { + fmt.Println("SyncFileComm") e := server.manager.SyncFile(fuseops.InodeID(in.Data)) if e != nil { return nil, e @@ -140,11 +150,13 @@ func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.U } func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms.WriteAtMsg) (*safe_remotefscomms.UintMsg, error) { + fmt.Println("WriteAtComm") n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil } func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.ReadAtMsg) (*safe_remotefscomms.ReadAtResponseMsg, error) { + fmt.Println("ReadAtComm") data := make([]byte, in.Size) n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), data, in.Off) return &safe_remotefscomms.ReadAtResponseMsg{ @@ -154,6 +166,7 @@ func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.Rea } func (server *Server) RequestReadComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { + fmt.Println("RequestReadComm") success, e := server.manager.RequestRead(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) if e != nil { return nil, e @@ -162,6 +175,7 @@ func (server *Server) RequestReadComm(ctx context.Context, in *safe_remotefscomm } func (server *Server) RequestWriteComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { + fmt.Println("RequestWriteComm") success, e := server.manager.RequestWrite(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) if e != nil { return nil, e @@ -170,6 +184,7 @@ func (server *Server) RequestWriteComm(ctx context.Context, in *safe_remotefscom } func (server *Server) AckReadComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { + fmt.Println("AckReadComm") timestamp, e := server.manager.AckRead(fuseops.InodeID(in.Data)) if e != nil { return nil, e @@ -178,6 +193,7 @@ func (server *Server) AckReadComm(ctx context.Context, in *safe_remotefscomms.Ui } func (server *Server) AckWriteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { + fmt.Println("AckWriteComm") timestamp, e := server.manager.AckWrite(fuseops.InodeID(in.Data)) if e != nil { return nil, e From a4a07c8bcfa4a0bee4a0e203197782e2cbf408be Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 12:46:14 -0400 Subject: [PATCH 26/37] debugging set info deadlocks --- mft-fs/safe-remotefs/server/safe_os_fs_manager.go | 3 +++ mft-fs/safe-remotefs/server/server_manager.go | 2 ++ 2 files changed, 5 insertions(+) diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go index bce56bd9..6c1e0eb2 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -186,9 +186,12 @@ func (manager *SafeOSFSManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, g return e } + fmt.Println("requesting metadata lock write") info.MetadataLock.RequestWrite() + fmt.Println("in critical section") e = manager.updateInfo(info) info.MetadataLock.AckWrite() + fmt.Println("acking metadata lock write") return e } diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/safe-remotefs/server/server_manager.go index 4abb6016..98437b6c 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/safe-remotefs/server/server_manager.go @@ -49,7 +49,9 @@ func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.Ui output := &safe_remotefscomms.FileInfoMsg{ ChildrenIndexMap: make(map[string]uint32), } + info.MetadataLock.RequestRead() safe_remotefscomms.ConvertToComm(info, output) + info.MetadataLock.AckRead() return output, nil } From 379e9bcdbd75ec3b0dd0f6bc65328b410c400b0d Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 12:50:32 -0400 Subject: [PATCH 27/37] bugfix --- mft-fs/safe-remotefs/server/safe_os_fs_manager.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go index 6c1e0eb2..22ff6d3a 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -388,7 +388,7 @@ func (manager *SafeOSFSManager) AckRead(inode fuseops.InodeID) (time.Time, error info.ContentLock.AckRead() info.MetadataLock.RequestRead() output := info.ContentWriteTime - info.MetadataLock.RequestRead() + info.MetadataLock.AckRead() return output, nil } From 1d218d1ea4a8a77feae10c6397e752a6773e4ac5 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 13:30:35 -0400 Subject: [PATCH 28/37] request write bugfix --- mft-fs/safe-remotefs/client/client_manager.go | 3 ++- mft-fs/safe-remotefs/server/safe_os_fs_manager.go | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go index 8bcf0cfa..bee31d3d 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -188,7 +188,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in } msg := safe_remotefscomms.RequestResourceMsg{ - CacheTime: timestamppb.New(time.Unix(0, 0)), + CacheTime: timestamppb.New(info.cacheTime), Inode: uint64(inode), Cache: info.cache, } @@ -213,6 +213,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in return 0, e } + manager.localInfo[inode].cache = true manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go index 22ff6d3a..29909964 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -401,7 +401,7 @@ func (manager *SafeOSFSManager) RequestWrite(inode fuseops.InodeID, cache bool, info.ContentLock.RequestWrite() // cache is valid so grant permission - if cache && info.ContentWriteTime.Equal(cacheTime) { + if cache && (info.ContentWriteTime.Equal(cacheTime) || info.ContentWriteTime.Before(cacheTime)) { return true, nil } info.ContentLock.AckWrite() From fd508e22f82b2f3c27beba49c12675b039474ddf Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 13:47:12 -0400 Subject: [PATCH 29/37] debugging write request --- mft-fs/safe-remotefs/client/client_manager.go | 2 ++ mft-fs/safe-remotefs/server/safe_os_fs_manager.go | 3 --- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go index bee31d3d..affbb0d9 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -184,6 +184,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in info, ok := manager.localInfo[inode] if !ok { + fmt.Println("cache map issue") return 0, errors.New("local cache not updated") } @@ -228,6 +229,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in return int(resp.Data), nil } + fmt.Println("cache timing issue") return 0, errors.New("local cache not updated") } func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go index 29909964..9c53d10e 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -186,12 +186,9 @@ func (manager *SafeOSFSManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, g return e } - fmt.Println("requesting metadata lock write") info.MetadataLock.RequestWrite() - fmt.Println("in critical section") e = manager.updateInfo(info) info.MetadataLock.AckWrite() - fmt.Println("acking metadata lock write") return e } From a3b99442916da0fb2c5d6f357dc081c7f9994b9e Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Thu, 29 Aug 2024 13:49:15 -0400 Subject: [PATCH 30/37] debugging write request --- mft-fs/safe-remotefs/server/safe_os_fs_manager.go | 1 + 1 file changed, 1 insertion(+) diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go index 9c53d10e..a4019975 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/safe-remotefs/server/safe_os_fs_manager.go @@ -398,6 +398,7 @@ func (manager *SafeOSFSManager) RequestWrite(inode fuseops.InodeID, cache bool, info.ContentLock.RequestWrite() // cache is valid so grant permission + fmt.Printf("%v\t%v\n", info.ContentWriteTime, cacheTime) if cache && (info.ContentWriteTime.Equal(cacheTime) || info.ContentWriteTime.Before(cacheTime)) { return true, nil } From 27e293fec41774d404f7425783b1f0711277a4f9 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Fri, 4 Oct 2024 10:52:52 -0400 Subject: [PATCH 31/37] added documentation --- mft-fs/README.md | 32 +++ mft-fs/abstractfs/abstract_fs_operations.go | 6 + mft-fs/abstractfs/fs_manager.go | 240 ++++++++++++++++++-- mft-fs/images/many_clients.png | Bin 0 -> 435310 bytes mft-fs/images/problem.png | Bin 0 -> 201565 bytes mft-fs/images/single_client.png | Bin 0 -> 296955 bytes mft-fs/images/solution.png | Bin 0 -> 176695 bytes 7 files changed, 256 insertions(+), 22 deletions(-) create mode 100644 mft-fs/images/many_clients.png create mode 100644 mft-fs/images/problem.png create mode 100644 mft-fs/images/single_client.png create mode 100644 mft-fs/images/solution.png diff --git a/mft-fs/README.md b/mft-fs/README.md index b24c9be7..3dadc180 100644 --- a/mft-fs/README.md +++ b/mft-fs/README.md @@ -4,6 +4,38 @@ MFT-FS is a FUSE-based extension to Airavata MFT. It provides the abstraction that unifies the different file I/O protocols into one filesystem. +The Problem: + + +
    + +The Solution: + + +
    + +

    Operating System Filesystem (OSFS)

    + +This was more of a learning/testing implementation. It creates a filesystem mount which provides implementations for each fileystem method. However, the implementation has identical behavior to the native filesystem of the computer. It is merely a filesystem that mimics the operating system's filesystem. + +
    + +

    Remote Filesystem (RemoteFS)

    + + + +This filesystem uses gRPC to exchange data between a client and a server. In this filesystem, the client has the FUSE mount running. The client's FUSE mount invokes FUSE operations remotely, using gRPC. Thus, all of the operations performed on the client will modify the server's operating system. + +Note: RemoteFS is NOT threadsafe. Multiple clients reading and writing concurrently can cause race conditions and inconsistency. + +
    + +

    Safe Remote Filesystem (SafeRemoteFS)

    + + + +This filesystem adds the safety layers on top of the remote filesystem. It uses a Concurrent Reads, Exclusive Writes (CREW) model. Prior to reading/writing a file, the client must request to read/write. This is a blocking operation. The server only grants access to the client when there are no writers. If a client is reading/writing, it is guaranteed that no other client can write at the same time. After a client is done reading/writing, it must send an acknowledgement. +

    Instructions for RemoteFS

    diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/abstractfs/abstract_fs_operations.go index 5adcbdb3..142096e5 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/abstractfs/abstract_fs_operations.go @@ -1,3 +1,9 @@ +/* +Package abstractfs +abstractfs is a FUSE-based filesystem wrapper +it defines an interface for a filesystem manager, which can be implemented by any filesystem +it implements FUSE operations which calls the respective methods of the filesystems +*/ package abstractfs import ( diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/abstractfs/fs_manager.go index 043f2572..6d49f812 100644 --- a/mft-fs/abstractfs/fs_manager.go +++ b/mft-fs/abstractfs/fs_manager.go @@ -1,3 +1,9 @@ +/* +Package abstractfs +abstractfs is a FUSE-based filesystem wrapper +it defines an interface for a filesystem manager, which can be implemented by any filesystem +it implements FUSE operations which calls the respective methods of the filesystems +*/ package abstractfs import ( @@ -8,49 +14,235 @@ import ( "time" ) +/* +FSManager Interface +the FSManager interface can be implemented by any custom filesystem +its methods are used by the AbstractFS fuse server +*/ type FSManager interface { + /* + GetSize method to get the size of the filesystem + params: None + returns: + uint64: the size of the filesystem, in bytes + error: any error caused by the invocation + */ GetSize() (uint64, error) + + /* + GetLength method for getting the length of the filesystem + params: None + returns: + uint64: the length of the filesystem (count the number of unique inodes) + error: any error caused by the invocation + */ GetLength() (uint64, error) + + /* + GetInfo method for getting stats and metrics of a specific inode + params: + id fuseops.InodeID: the inode for which the information is required + returns: + *FileInfo: a reference to the FileInfo object which describes the inode's information + error: any error caused by the invocation + */ GetInfo(id fuseops.InodeID) (*FileInfo, error) + + /* + SetInfo method for setting or modifying an inode's attributes + params: + id fuseops.InodeID: the inode in question + uidptr *uint32: a pointer to the new UserID for the inode's ownership; if no change is desired, pass nil + gidptr *uint32: a pointer to the new GroupID for the inode's ownership; if no change is desired, pass nil + sizeptr *uint64: a pointer to the new size of the inode (in bytes); if no change is desired, pass nil + modeptr *os.FileMode: a pointer to the new filemode of the inode; if no change is desired, pass nil + atimeptr *time.Time: a pointer to the new access time of the inode; if no change is desired, pass nil + mtimeptr *time.Time: a pointer to the new modification time of the inode; if no change is desired, pass nil + returns: + error: any error caused by the invocation + */ SetInfo(id fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error + + /* + Delete method for deleting an inode from the filesystem entirely + params: + inode fuseops.InodeID: the inode to be deleted + returns: + error: any error caused by the invocation + */ Delete(inode fuseops.InodeID) error + + /* + MkDir method for creating a directory + params: + parent fuseops.InodeID: inode of the parent directory + name string: name of the directory to be created + mode os.FileMode: mode to set permissions for the new directory + returns: + fuseops.InodeID: the inode of the new directory + error: any error caused by the invocation + */ MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + + /* + GenerateHandle method for creating a handle for a certain inode + params: + id fuseops.InodeID: the inode for which the handle is being created + returns: + fuseops.HandleID: the handle generated + error: any error caused by the invocation + */ GenerateHandle(id fuseops.InodeID) (fuseops.HandleID, error) + + /* + CreateFile method to create a new file + params: + parent fuseops.InodeID: inode of the parent directory + name string: name of the file to be created + mode os.FileMode: mode to set permissions for the new file + returns: + fuseops.InodeID: the inode of the newly created file + error: any error caused by the invocation + */ CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + + /* + RmDir method for removing a directory + params: + inode fuseops.InodeID: inode of the directory being deleted + returns: + error: any error caused by the invocation + */ RmDir(inode fuseops.InodeID) error + + /* + DeleteHandle method for deleting a handle which had been created previously + params: + handle fuseops.HandleID: the handle being deleted + return: + error: any error caused by the invocation + */ DeleteHandle(handle fuseops.HandleID) error + + /* + SyncFile method for syncing a file + params: + inode fuseops.InodeID: inode of the file being synced + returns: + error: any error caused by the invocation + */ SyncFile(inode fuseops.InodeID) error + + /* + WriteAt method for writing data to a file at a specific offset + params: + inode fuseops.InodeID: the inode of the file being written to + data []byte: the bytes being written in + off int64: the offset of the location to write to + returns: + n int: the number of bytes written + err error: any error caused by the invocation + */ WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + + /* + ReadAt method for reading from a file at a specific offset + params: + inode fuseops.InodeID: the inode of the file being read from + data []byte: the buffer to store all data being read into + off int64: the offset of the location to read from + returns: + n int: the number of bytes read + err error: any error caused by the invocation + */ ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + + /* + Destroy method for destroying a filesystem + params: None + returns: + error: any error caused by the invocation + */ Destroy() error } +/* +FileInfo struct for representing a file's information +*/ type FileInfo struct { - Name string - Path string - Inode fuseops.InodeID - Children []fuseops.InodeID - ChildrenIndexMap map[string]int - Parent fuseops.InodeID - Nlink uint32 - Size uint64 - Mode os.FileMode - Atime time.Time - Mtime time.Time - Ctime time.Time - Crtime time.Time - Uid uint32 - Gid uint32 - DirentType fuseutil.DirentType - Handle fuseops.HandleID - Cache bool - CacheTime time.Time + // name of the file/directory + Name string + + // path to the file/directory + Path string + + // inode of the file/directory + Inode fuseops.InodeID + + // if it is a directory, a slice with inodes of all children + Children []fuseops.InodeID + + // if it is a directory, a map: name of child -> index of child in Children slice + ChildrenIndexMap map[string]int + + // inode of the parent directory + Parent fuseops.InodeID + + // if it is a file, the number of links + Nlink uint32 + + // size of the file/directory + Size uint64 + + // the mode of the file/directory + Mode os.FileMode + + // access time of the file/directory + Atime time.Time + + // modification time of the file/directory + Mtime time.Time + + // creation time of the file/directory + Ctime time.Time + + // creation time of the file/directory + Crtime time.Time + + // user id of the file/directory ownership + Uid uint32 + + // group id of the file/directory ownership + Gid uint32 + + // dirent type (file, directory, other) + DirentType fuseutil.DirentType + + // handle to the file/directory + Handle fuseops.HandleID + + // boolean variable to assess whether file has been cached locally + Cache bool + + // time the variable was downloaded to the local cache + CacheTime time.Time + + // time the metadata of the file was modified MetadataWriteTime time.Time - ContentWriteTime time.Time - MetadataLock *datastructures.CREWResource - ContentLock *datastructures.CREWResource + + // time the content of the file was modified + ContentWriteTime time.Time + + // CREW lock for metadata + MetadataLock *datastructures.CREWResource + + // CREW lock for content + ContentLock *datastructures.CREWResource } +/* +NewFileInfo method to create a new FileInfo +*/ func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { return FileInfo{ Name: name, @@ -66,6 +258,10 @@ func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops } } +/* +NewSafeFileInfo method to create a new FileInfo + - also initializes CREW locks +*/ func NewSafeFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { return FileInfo{ Name: name, diff --git a/mft-fs/images/many_clients.png b/mft-fs/images/many_clients.png new file mode 100644 index 0000000000000000000000000000000000000000..1e99c0dc18f907ba528f6e7e1f318d71f7fde0da GIT binary patch literal 435310 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

    y@KFTg={U8) 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�CbTIli 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

    sdrh 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%0Do%FGik569}=EjV0rCO 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 A-v9sr literal 0 HcmV?d00001 diff --git a/mft-fs/images/problem.png b/mft-fs/images/problem.png new file mode 100644 index 0000000000000000000000000000000000000000..2701e6e284e44417e5a30a9a899000c4b5aed6e8 GIT binary patch literal 201565 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%0D_2zLyBd|7B%|7qsl2|e+b73zQN z_U7rom>2)~=jedGUBu^>?PaM;ugGdQha~GT+bE}3H@C{%F?^33*5&2?8F_Xx(T%V{ zt|S9mn9j7rWdO}1M|j{YB8P5(sb=e^VcQaHb(%D9E&cUh@5gCtYyU$!=HPoa%^4f! zF=o+Lvvj-3pF6ZoJx#FBCTO#*#E33QgpO}_;Y&4-=u!#{7ta!Gtv^@X5ejFc1{KOgV1bbQx!XiWml~sj**`bs zV*+0M(d45+;K;R+@0)0|v6fAzDJ7q0SXoW+>pGe$Qnkgb%i){<;C9_mU*`MVd33D% zhnG*TZ~U3t=uqkOXG?~8v{bKsoN(Uk%QDs53LnXS{RcDlD+YY9L!n($DrzaZ$6IcD zxJ0c>0{MH}w#FE~71PHS78c3?F6*^78Xnj0d#c%k=c{d$|NiVbS^@p`Q}JlNeJs=m z^SfO4J%&yRwt`@F)Loz?9+nV+^2g=S5y_b9=XT?*@vQz?j(_5tCRG|GFG7M6k|*a3n^GGS_H0|L2N7Rnr>Us_xqtPJW&=%d$5+G5fX} zy`koXj{n(gMG+uc8EHjCRmZwXdwdA%3O}B%ph30P?m&o>O>mHZk_6EU855zW9v&#G zZaG)tY=E=Wx9t&AdpU2;x^;e5|0hoZHOqQhTFL~#gp+^CruigW51Mcl@9pGr0US?^ z-Ck2txVf9d*6Vpa%5fC-3+=11?;jP*PQe{~XI?hWD80X6dvf<5X386{Ot!nE?w@6T ze6)SU&in4IdS7W)^Q^w#Nl08K**HyM%!4w;N<~AMy2-ooy`5^j<$2+=<$6?QR8e9> zKYjX5HaJefk&y_%|Dp5elrz1Z=h`9pY7M?}=rk2PqF7ThFwD7?ju%8p^L&kGLYK(P z7caIY_t{3Jy{UTT5kENaUKhg=7#?sn9Ris;e4iEG=GwJu7vo=^O-!`iam8wGLTufk zyyUvAtsSpazH}V2=lHyVhkw4Pi64IQlvBT?YhPonH`K48!W2GHF2~G_;}gQOs(${+ z|M|veK;((IxVUjft7{6j`Glf4c-yC;>N7Z>{%Y=lnw}TtOt(;@1BiQoSCdRNx3}ljaok^|{3^(mN;p4DZ_g_~>8$@a%ER79l&69Gj(D z&5hW3$m&Rh*|P(m^{4gvP2OVG#pmvB{SO(3XW>$eSE&OK9@r-hz^Q~fszT7F!C z;n2W)d9G9J6t~fN^MMKtsoY=g@Jx7FzbQu$C?X&Rt5vvC%f6(@xB{R0O`{+EoUq}| zv+!x%ToXRews4MSMnT#kX%$3Cyid&ZnO6B}?;aGsg- z=lkYYgoEnP5a(Bboe}m@cSPTINPbg=LG_NzqMkZBer!d5Q~h=2HEW_lyT7PMhXABMqeq&>x6Mbrd!!d!fIyB@QW=p^_$0$xA+ck zXoKI1Edy926Nb|hR~7GynIe-5)*DklBj77jcFL|h`u479Ee}xOJ6G3(^V;y!= zS_Ey}+r>%ozimXC!r$`DYlCxeiq)C(gC2*QeKqK;!g7s{qt@xF`&Q0x|ZLlHkW0KfR)&S1f7}B-PTF^et^(oVLJb~&~$5GtU`CrGe;Qu_cLuOKQeZz z@wTsDzlJ7;KurPM`4rFdy?sl-M&2;xF)-ZV-d)JGC+b;<1#H72!ZvU?DzLz6zVDnv zszSa!4}IdN(YpC3&xCb`V(jSv7a-dMXsdid$#=@^0ol@a)7M2o=0!c?GaK?@ov{E@ z-FSeskEwUxx40|Kl}KV`@{rMlIC_eCF-t6BkG4H%@W@beG$u7dkAiJb1<0sBNk??D zwCuW__I>*B#8+4ke$*=4$1*x z$ynKNA`RZ#@7scYcp4UPPjx(kCp3lWZv> z&68+~$+!rhKtgnZ$8hY5O8gelGMy%zq)*_pm^*h8G-~thTX`m;zy-QubB%sy70=po zGlDgVs9-^y`Y}I{b!m#dYUVMNq!(Cb6jHJ|VA%c0)ooSp=Iv0|a9ZoItVJUVRK37` zVvb~=vTGH9aupWaLr_qlo|xNm-j8F4rHd0Vu}JZrj0|p?BEl3;)If4+BkD_SrHEV(XN%#S}ms`9ii5! z#|>nJjc42+lYAXY9o(rG#^$d7@wG_gqYTbdW6PI7=-=g~SFMeO5wy7zaFsyw90<(? z^bVv$0xdNQ$nl%cp3ra%_F^T{bK?HgVt3ij#2^GGTkh7K7nQwmSf{h+&MoA-NLz*-!9~x{OJzY1G!8X8gvRe%7($vkYu4kC z)g#n>?Lox6P9!Ym!a79HP21TjY2wP~!5;$tK0mp*G|jrk@Zg#;Da-X>1U6gj3vE`? za96ztbnHC!(I&mc{~p-dWZ@8o4S0R*2etr2`&ikt^cCj%(`}!DDYtFG* zbLf4r4YE41TE;?-)+Q*u=ragX(n~Y8pdEINPF!#-d({GE*SF6lAW63!hrD*XHvUjDW>z?*bRO4N?YBk? zqihrUYHNp)FbOfd9GVb}#i=y`@9CMuEnn>1@N5M4q$oRj>y|NK{UFa>`zG|1H(6AT zaTxY#jqp=ubY?wLMV1YuxyDi{6s_dM$kt0<04udZ@20xOVxl#kVwx{i;I@Bs&0Hmr z3~p!W08bt;m4I*gVi4!tGWD$7oFM^w;}WjaO|VdlJ`vJ@L%M$vtgDMsi@JR^)Q26U zX_HMqq8k=hR3PCO+pqun=tqc`qsNQ5RWf;rHyMv$eNB!NpR9<&wf#XCuWz615mq^T zFg=i{b4}m2_ArZvcyH7RG6~zF&_L(0KH$Zq7zQ2NmTaKq)qj4*tC8D@C0A%J$!hF@GLT253V-DQq%41{30T-J@X!~ z*~9Rc0y0g0l99yOcB4s-woyg(wfW%*30(l;Zfw)|Im_9PdsL*^W4dq2Dt5#khfMCq$?_?7aEVTkTsNiF!SwMoB>b*^gee}gnB|))9F_aqX~`N=dtVB>;HRGTC&z0r(%VqCe+0D%!Lb!SlnWhFz-3dndztXC>$&Itvrn%4Rvcb^@c8%fJFf8CV1lZ!e~Bh8Vz@gv zz*NEfkd@wl_T&f2_FzDH@j|4H^VzvPDz2av9i$I@Dzup#ewrP;UdG=%N`X&{&WIj` zA-P7DmZ1!LMJ3i}_;CN12^&^Fn%oD@u?+_=?Lo*mI)u;~d(MY!nPQ-bpU*-e78L)SZcxl;Rr66*<0%zbZPM3AQ+>gc{=*3xKq?XuHFrc31zUBiFD=V{tD#4WuK}hL+&ekVv2@J03-+4R!fj4YmY#E6 zcLn6tOIkdY0pfB(r~a1Zpra-5BTjk6=M!=(YS-P>%grH{JSe!tW?>5Dz07M<96 z6D|k*j7pyaOQvtvvMEWLCIhO*@VK8)MhYVD*5b>19>iX}_$OFR^u^=0QM~uY3x)(V zG?~;PtTIfg*zayINNW#RY=CKVV7F%!5S7sG!zm3^CprtEz>RkFA2w3}sF zNa-mw>nSK+k&Pi?D~IjE(WUI4HN2Q-#JHpStNCrisdm>pD6D%)3a#^R&~Wl%(fST!NaM#29I zeZ^}EoRlTQ3aY<~86ufit?1DHQO_5K#qSvYD7GFAk=DUo2Y2^_4D)nT z43vdrkc%L{0MNEmCu{yl|_Z;kVs1syrcH8UKe)!XQ|M2ZY>N+us-X4gVfI2uLu^ z>4WbrrrLrluB3ZPu;tX#xSLpTVPH|@I(FKp`S;VXJzZ2ejqk z^u4)gK!Jrq`?f-CT|V7EWapzC%l3|DyDKu1&y+vje!kf)EB)`RQwro1kahW^p&xkM zKF&)OQSwyJJt7s+U8Jj_Fu!zG*d?c4Vi3o^%BS_0+> ziz!xY_SvXGF zHcs=e_j*z7p1+~%zCsb(S;f0$HDdX6T8sTDuWvdIp&nowv%P8(%@$G(atb76L*q;M zZaXvS^-2xzl(F1l{vp`Bc|z5i|7igx&YRbfLYoqj$0waqu(`$86McQo{C#H=1IPWS zsX=W9Udk3zSdCr^w>Vza#gRAu&}hwvX=hyGZa`Be9-Gu{Oc~$5=@9+kveUG7%aMEPivvWHgoEOe}N*?@52m8os8MmS5qdr9PCcRWLd& zSPw9Y1`z6IFsl4{&a0X}xE1^#+ML|5tjWRtN+emRIOlR7+2PUPEOuq;)srcWm&eC0 zqdH`R5X5q;F+2vOBkF6KJbxTHd*}jP4SqB)9883Sn@Uw)wa%bvq*eQ|h@w<);C-54 zOTB%osCv(s5gM(1N~Y2{WjRx2a4(wPeO`?jK>Cn8RIg*l zHj0RtLGed#D9&v3R)kXvCmaz)$-UJ){0)UI=<%Lhvv{wV+byr;&Te`;!Y4Fqk85$o zqb>v7E{)p^px#yWxx;o$Cr;B3=7j~$YlwmhzNSkf*K399KTs`K^Wa4#Cm zPr5(@w}%oMZlU;68OYGG$ZNX<9hLf+xhZ$wCR0Q^!;L{nv0N|k+0#;Uo?f5+&11eb zy)aE56ylgY#WL%M={lxcL#8bm28>6p)@(|jbsFr|Ho=p3Hoo$lS?1EQ(dtUH&FzNN z)o+3s-QN6H2Wqp8C}*W0!1P(f?^H4<^>CVk*j>Vo7%*x!*{#*Txlk`qivI-9&xn26 zBAVl)bCqxsWTl+uQe9env}+AcXdRIo`Gj7?O_uN2??VS|`je~6b8c~MXurtcta*se zE&Ecxi9~)W^RsHHO8U>-H>XC9+TT!+pYrONKX}Tcb`Fr9BH9ys4s2z_B#ja6hfe}~ zuVKaSL^!=`g@>7~sd{^G+DAGakrw_ysO~T%0OVD)i9&i7EX;WnVph`UkXLYCCXB4e zYA#;9n6aU_?o;u01yqElFY@Qv4@>N}rB)!$W8II*uj3T%|2!B#A59Hb+km?vH=KR0 zJ&}qN*C2xO)n16ILS?^mCWEn8AD)||Bj1$ou2`4rI7F0g?C}#bK58@obec-Rs%0k~ zHiM8>%p3fTlqH(8MOO3r)_=;T;uFv;MRAvc;@fz4{L#Wr)Y~_i6>d&+iil z(ss=&Frk-W8(OT;zS2g@S~8Y&?_l3^o-3#_y5Us@!QlA6Anh{P->7+;uH3f;yj&Xf z*PlJtgS*kZ1jTK}c?xKXb$U1`rlwY{P5+U1Q71Y2`)Ex?a&cdx=xJpVDxHKMfd7){ z%7!}KXGEZDv7XKL8QBjFjYqF7w|QK<1#91Nf830W19LWmzyaEAUxo zm5JWdXDV-cQ>9NVQlJgpJFC#z%h1I8hubk%;jv)FojYEM$Y-Y{n|DQ5_47wP1$-~H zR2GkA{-TSqH9U%x?fb!c$bqKywUsvlSi<0sagDDe)M7(=wzkBf)U15C$dti$h-~*9~ zyclf44<|cB%W`1;9B}e9e{btYiCMRL%p3P80WwbZ7|b2`sUkn=-0&8c)YEfmeG!gs z7`-_0OMx;UzUQ_#qtk7VEMK8qxkx8W9ZPF;C_+BiZLDfWJ=D76kR8g}aa$z7=_Gz> z3`I|o!7@fMognW@`=PD9_~w>IBoHAKR?!cm51<|P~ah6`7XLl5FNK`z&R|78vA&`66O40S|h&2aoJS;^5yU{=d33N~Be%f^-U6wQKH}6+B0=<3#uY>=+SoATTh4vMqrY}8928peP0;l#CA%|aD3UEF;Xy4n$z*lTjRTV-MKAdDR)q1l*u=>mw&%HF4 z_8-#mQSm3k&q^8j9TabKvUhVq_u5T@`GE$JV zh;yx;ESx9UGgb@&;e$SuRj==$V>{4ub!~RZ)^tbwLUrBVP7)N1BASLB2nNgl@$g7! zL?|OImPKQxb8P)Pc~>GRqEsAJd9w-0W8oF65wM6-xXAi(G8520gucvQ+{w)B;Cri) zSiQ;Q5Q8~*{qoK?B7pu*0&VY=I>&ldGc396nI_^SK(l~G6dhT(KbiI$=58n-3v?2S z(^RXc@j{QJ@(=C?ty;BWZ%;e>dRT}reDm?Pwq1b>$*S1ttb?&{Hip`P3#3HBF7ix> zZ%T^o$y**SafCwyJq5isB>@~vCw7W+J7-v63|6o~{?Uzcf`+hE5So=AO;dP~{z6)| zt8+@$nU|{ES(Fy7$YqaSkAqTi-!VgNr>qDzV#q{zW-;ty#q(10-$4%(=)8o?Ls$^Gp>3%&j}oMWqjUV zjlqpMq`iK7&AMlMNG6gqoeV)2&SDid^aPBt1SkaJ*ltzh4BC-C;mOkWEoLM8##hdF zt|>oGu=NELB$LEhUv`~C8I0+xRzQCKhov_UzQG)ZZvOd0(d#i+qG%P%JPvZ5(9zJx z{u?~9!|}{MS^+KEbTx&TL)^$)=aUHhEZAaKzlE1`fc{XO3-(0Dq;Qv^8L6HrKM2N% zNjg8P{<@JSnhVTfjmpjq@qboS{nx>R#Ckkic4xQPo;-$`7QEUJKACi0=L5K3=E1p{ z6h7nq=Wkv|^(O54Pb1>pT5%Iykr2rEmmqP1JBkT~lxd$APxe;2P%aKaqEZ3D6=e{w zOkg)QG2Z~S1E`_?l~J+rXuZ0PDZ_WV&|*z@(nvqaYq(qM728ne5jpp4)X<9S|u+hB7Dvce8Y zUz#;ERorXHOagAsa{BJwuk?oxpYwg-!SqU$4>RY@+mq)iQhTXFSdIrci9DZ14^9G^ z4H($erVmTY7bMDR9=w*JAXV$c&xdOc7S6i?6qh&;^Z;k9eyomY6>W8aZydevc`sP; zkZH#aiT>j^7K~HAisYwiowaH6%kgQ3EHy#xs1T>Tsja&mx*Y(E_{#SN$Fa18M5BA- zYBQq&=a*adj=wpr zspty&1oDKj6{h`1p${uXS1A%q4|omT&WKivrRB=1-u@D8Tr0K=kKl>v?`R>UfY+&tIeoH}YZV~6N7$G#nJ zVqtYNF}7~-!Sp+oa~m40wwgeJ2b5%u>$+E4Tf_mGNrI4o&pKN>#oL>q)(prLHykAS ztS$yto(6j6onKJ|*|ktc(aJoe1!KyHv@yg~|4!nvA=3@k37*rmv6{L%c<*)3)iv)y zDhh#I1q*Q;5>QdPV7BEUUQeSf#J955cGZbN=JPkYfESZRN#JA)$X59iFT`pf4BrL(2p^Rh>J92*MNV=YQpK$0 z0ns;c*IAd4ikN{*`-*1#9Z2>~*H|Epf2f@q1NormyS>YPVC=spm9Fk~)_p-9W0Mz0 z292I8&2SY87AgGqPI$9 zmTf{F=5tOXS5YqVVmRMoM8<;}5}>AXd!hY@X#g*N&;4ciI>l6<=TaL z@O$Mr;ju7W@1tc=3n?kgmRKsthCG!gzXUgH+=$8rHU`|NEZfD1LFQ-J;Iq${rji8C z?WPU~T01){Vw@5i>`Wd6numjsYPNP=y0m~E3NLFB-lBph{7|>y|1tsij{1P@>q7#X zw(SwcJOZh9<(xqE3RFw7pq@Dt)1OOwMC;`QcKNZi$2s-qOEd3{Hmmh8d~kB-tqs?s zV!SH8KR;_DFX+&eJ-NopX{vjg(pUk}Q7hNM6M=wZ0uAVmqt(E+XR?Yb<6Z#LZc9D^ z>Zy3*Dm@v{=~XWu9i=xJ%v?Lyr%ly(Vr)3R-Mu05HEUJ6i!=Wg5jPg{z8P==p1*D*XYUI*XLdyB> ze=T~j-2c=FSubCjYyQP8^F6zi@-(9mHgk`8K8+?FQ!$(q0-Wv~Q2?3jlJ>zV=rvJI zd-_}+mw!JuG2Ad8k=ny0rMgw;o){~IX6tWAy4=V2%JI`#&cE&1apnRuWnI*-EAOQ6 z`(<#|`8*Y?>}d7(402g4f>hm`U2^)wi7jAiLFVCSBJRA@Df@Z3L@UP2wD*Dczc%Ob zK^oWF)~;XM-N@^|=_n_8_|8#6c6VL>ww(x!#OH0b=r11o&6qk--DR5#${*8XqdGQ- zVKYZnw-!@-dIZ_4Kvse67Ood2Z^-xW-4<=`W%r>IUkqRklnK{X{WIA%1RW`j2|R3o zS;UC8tUb%`*cGr>>}g~ygSl}+_FwDZV+`Fx?_hDXCUgboL6kBHD8(_4LWZvD5%BOa7l ztNzsmzXy}Jqf_>jJkZ*E@?l>g$UlIG&OnU-UWo=p^V5^Y_5hYht(gu9=a~Y`?K!H< zXu{Ir21c=0isGNfo)4a&eELd7&dlfnRKt_)AdIqHkNA}R4nxP zk`$h6(U3kBOxl6OES{7G&9=tS^z$f+ z+&_eSq0if3-AgCf-1qu6Eb!j9SiwkY(E4`)f?y{v8MbNJ3|nRUD?5v0j@b-a*?hd$ z&e@rvpEs0z{-*MJfrppx)3W>#E6u{Q9KOvxcV&sQa|kR1K#RV%7I_6eP-lRcPZt4!p`ef6RTdTv|ME8>airU%ujFL1+zbv zWoLa&q-!V`5|c|C8M1iRD%-CH0~;zxg-&Dg&nLjRU#O<@?*~UCze*a%c3Q9lg7BhFNB-pwddj zWF9#lRC$#M^9NHu6B;NC3_1M&+Aix$LAHMVdT8p)tiMJwnEN^(eh%0hlymar^foUO zOAYf%ogb90{A1*qS!yPxotE{8Ahg)CoFN2(BTo#7MjjvX7zULfLfA|)8WWEG`sWuPFt$*jzbq;MD$tJeAWRK^#;1**rinod%^(rU~gMsV0`wUH4B(T6c|H< zhYNJ?h(;Tz%goiaJl34~Mj3h+lVYL0#K_J&EsHWuyvdhdDUa>9^uq6PJVb`Ldpv&J zzjKU9sS@abUZB~ILC*|N^P1p-eKGWbCQQkW)1x9Ot9U# z`??yfIn@jpX!}q7)VZjz5Oh|;Jg75@n>^Qv7HR;eEz`rz0=10Sk688J5nlJ#9=~3b z>;5fvzeMFAdumC{%qSGXr`{@bTk|<=^2EM_PKdb=gGt>FrsH#%A&l+$^Nw(K4ZNo@ zbg@7kjOn~z`LgFEkb4eO9n5 z^iJsPvx!S@FSR(QzU;zNtJJ6MR~0^q81y{RD%aSi(S<38d|LWUYCP|bLBPL;MgOk< zsatfdd1~a6mZOfB+-){lYiMTByzaH%-)$;D+)|Z5N&buHkA!Ec(0wL-i-G>)^C;)( zY59lHP-Dv{!FoZfwf+ju1Rt|(9dB5p9Pbl6Cidd3TbIsfHcdagXwT%u;a5W{zXy$Z z`gOh2ZzFkSd3l3wy`*@=evUne7#SiAfB%PhcoqfHkbr-k8oQZg(Uv*%XJAU4?0Kgt z_5kdr-P_(oN>g(EOFWnF_ofC}Ikr)2!y^}_=%yYGepBB0AYLtii9GEs$IO(y47)9z zc461*^B$J#_SS|K9kUt!tq$*0W_i>s`zU-0*o>az@`rB&tduAtNnSwMExg z5$7TcfOed?QnJ2fyNbb?Sbwd_1!YxI|6FyUXc5uTI`*=DtxRci4N$^l2`)Un%;Bo? zYIc^Fv>IM=AaNsU7TZjEdhgC|lUC?(Xa*I+;=bdJ_fhv1+Zb`>06$-A5F8O942#Hi zF`W{3fw9wCGHzJ0XKBFbsr|M;^S46R^VZ z>GZjCzLbkpdsONWEw>$bsL{#6sx8?ijezycs+D0IivxDm)YY#W)zvuU&-eNsTBpW^ zv_*$?k_mp0qC}QwfT8`Va?XyUX!F|@bGGg{8bnqvH>@GL2_f_B_-{x`KNV8A2&#j zQ*Gsc=nyj#CM&INZOw6fPe`ag{_(mah_TXV}^x|o^RPj@*QcEptXf#3nr zCm(q@*F#gyBkZE;o*gZHgZnMXy=r2)`!Y(fNwm(_BYmAKZ!LV^xd`N)@mUT5m6yt> z$}tFo23|k<=HKJJ|EC2g`S3yJz?-yCQ8RMVXs-6cukO*T$f5Jf#hY~1$cIC_jCQ=! z_FHX*Ut~$BuazR}IB!-YogWJY8|75DL;=}Hgsj4agXtwC44nL}b@;eXac}m&VKlPY z2}Yd+aRI22HD-_-+jGknKR7W~s+!Iq6<+<7zOEfH_ODNcms|odHF@QB?a0Wrt}Aq$ zVu5+)@d2f8z=bM^eI~Ne#}N>xU>H~`lmg=iVpt?=4tOnKq7e}rN?Dw;NP;Oi^7e=b z;hG3I*wFHKgl5KKe~11u%xR5Hhb}kFZ|{T&qW!O}Gx1)5+X?y_5k07Qn-q@I@2p<* zddH)kYt-*A-oPbeqqw%eYPb8&xNY-y(WV{9C=@#L=KaN&3+6hH{-ce#29pHba@iQ} zoTbIH%ao=QzTYYAY;eY1$03@!QIV0XAf7&FP9M*GHrgFTAi)I`&=nM%ZKbjpUN&0| zGgC9cslxRY#IQ*63Rv;pe(Tw+K}Kv&XV zs(h*be>Z56;szzT!4`_q+!ipFLN-Ud6PW1lndV!M)jePY_iORA&C)`^Zdq%4hdG0$m;befWwv-v4d3)7 zrJF=h@;68*5;KP5cIK9e#1-?1j6xQDRc)L0I&97T@sTdMN5cBuvURe`F7sd#??ia) zS|CUOT#kdxi=)J5Qa;4F6IjQ( za)HLKBi(HoTtj94hAc0x=G+^?o_u@y9jSm2%}~gT7rOis#0vI>-$n5$w?Ii)N&q0R z{)f(^mOSWANuv+2Ohe2DubGxlLkk@bz+~L23E2hLW#N74ZDPC%fMPVNhZ9?O?sKkyv3P{S_VfN0-VO$9ZF5 zi;%8+eo2JomnVT>cYS4Y3o)K!C{$Ji$mLs?@Y1l`^}G9yC2qXxQVmXu!TqcqzzQKA zc=8;BzcLCjG+`QH^H>WtYTU`|*I#RSB6tkFBeQNdLkY-2Y}6}f%n+@O&oM2f&u;#o_E=^98Opg z1{9ZLA`Y0(8)JT!Ee}2-25>jHM`L>piI-y6_m!pXZKM3RHfiC;G|ubluR;U!yU8yQ zh<;(tZ{0?~c6ayOvYGZ>R%v4x&iFukFqMmE;^8z~g{^G>Tuymy7wqME&+nU(TKdJZ zPy>BT96!gzKeX59X6C1F%McOfT}n3zEn?Nie7GZIF7snD!;c70J~yj)y|l-BglPxw zF)hx(J9-QyS4_;`1qB5!ZSNb4eo5vb7k<>sGW%-(H3Lj#Ta?dI)@CT=GBnc6BnWLSYGKU5Dd^~r zWX^|4K$l$MPfWXR7}b?BjbmL%M0!om4k4s7Ac%ppg<3P4Z21^6Bi-qbR*d6;_Wu4r z5DOt1P#h9pyt{gyIg`!hErcM9Xz41Puegb5SLCmqOu z0Ud`eY0K-8SX2EqbxmfWo8(V~RwzENF(ElZzBtxSCW9t)Z!1fJ*d0^_R={Q>!UXY3 zs+#-?C!jOUmTkOKd2))#97+%>8OijS!uu36I4O6yF;eo(WeWn$ z&H}*wBVp-V8a1hTw#eZ3=zy?25fQX+7;4j+F2G@e!g27Rjc9)_BE_bayFFnwcZ%@E zZBr7jP0Rt?F>9Z!+nS$>HD)``T-cQ>hj7Fc**K!J$v`uL33OI@gWuTKjh#K7*@J)i z{9441VSbirb%tA}=>-;UX`;fGVkTz*Pm(VUB#?@)fCrH7mPW)avhIj7f*R3w~kI zJaJ;Aw6FS@p;L|U(=x~vuAUc(v0Yr&r;iB7mWrHTHT-CmjQ%121h4_bO}W6MDkAldPQrW#Jynkea}@2y_+Jn&`q9L6=DoK$_jUE-PAg z4SMy@uzN3U?{0d-UBE^WJIB<70>jGV{k65<$xH^L)jg5;h+;y5V$c2h+m;OLuQxaM zV9>FJTNHg?q5M9KiF2=tMhOyL5*Exkhl12e3SvopOK3e-XsHK2?Bf1lto%*%%UJVu zR;d<7ih=Y!C-)opC|r2}G{fuAR3=hryUB6MBORiiwX{$*O<1&>E+4{{ST-23@ zrvJxyY5KkFY1$nnT0v-Lpm3ZB_9q+gY9j13dKV`ZnwIb9l(AO3{T7;eF;WoXPSm!j zIuS-v#)|(fv(y{bR8Mj;eo%Pe=dWLe5M(&|N&G;W^4+ju#D-J|iA-6911^u?*d94U zs8vWr#0TYgHovll9QcY0if#jKBw<%d1%6)-@Fk>VJ-j>LBK49#54PM5RV5=>mjZLs+p%3qvQfBS`c$|qE&B`{l=z%y(xt)+4m#WUAJ zqd6B7E#bk;BHo+iPDZ)e<&F+x6f=dPHDNbyh#?3?YU<+c(B+7+#0Z8#@G$2ClX}g) zym(*BI7`dk0j3|R{Eai;j5?T3O~8^*n%q4LPnTR@r-BD0Cr3mPUpGQKt_t|{$uvu~ zWl{C|Rm-25wf!Dts#;+X@**(E%sBW>(4=1QA&V+sB@2ZIYrZS(jeMN{cOk#$gVNcZ zLDW%=*m(%_y(kjp0kg>1F*YJ*n%k{E;pc^_8yr%DV}hW^poaf~)v;!qLS4n^`$|bX zFI;Q=JDn=+^kb6UdD((YNTMkp-1=m!|K&6}mEvqCI2{(jI9v19n>OC6Q#z!*%&)G- z;vUakUwaL{DqRO+fMGT^HazvJZRTWMt}fvRN^e(aUz!vlad;g^!>WvaRvU5D1p{KT z6K@8tAI@gdLu@p(u&g>1wQ(myNa{A(l(Y0n_TF9oq3C?L21z>bRR{>0Y*T@h!t?&k zDk6WiwXlmxT9v zzD(v55hXGD+Kun+Y=_a?;GemNJDjspcd~y}*o{9v00o<%7B+3zLeE<*$ zgG|=}e(^SGjy7zF|8l*0C|l1sD$(~@>qk3C-$ZGp?Vs|dYWKc!G(EfQsim1&B(`#$ z9t_*pWuyl|A|@*}dUd@1*2<(AGcCT%SC@ z#`A7>7yvw_voo?pgjm*_z7`6BhoznyXx(7<_YYp$9_{7j%vTb}_d7lPnx24{V9bnM zpGmVIj7|dzBbEg!BTFyp^a`4;wkSL{Vyc~}v<(alXg4*-zv%FFqanio!#V@o4jh$F zmDXlcWs|Ba^b$z&jTuj6Z71oTj%+S{6hn(UBFrm`c3h{AW!xQKz9R)|ZrL~)caVAp zxg*<46(f?{m=+$p)bM!z*_XG@uH!+5mTNMwKJW0C08C0pt6rc~z%HBlcmIrsFJ9~o z?MoXbWtUWkoGIB0s)Qt^N86U-G}pgBvlsG82TtAb!d$7WX@Z(*R+!+@t#M37G9LB{ zJ;Q%ys=R&1{-~dJorzd!{PfnC+#Fr=K}SZt%=0?2QqyzAQGM;!TYet8zVFsq*P`1k z6;XP9PX=9$*YP$1iF-?iWBNF% zt6xi3`~zHL=QoYLpB?n;>!3Ad*8>8pX|AWMnatABx1$^26f)6Btwi9mWeT0zj{cu^ zm;-n;Y|kG&J9iuLW`H>+W`MfVMe|?c;?{-lncrszX10noo$7vOMedTCBO=_0jM5O> z9}Qbq>N%<_`9>7?^bic5x3kHXxlw7~Yx6f7fnxx9iNOaBqN~f3er^)=FRcmrC}`uy zbn)WnBN_z1L!T?M((ll-g3!~#M<3h#%+6XjWI#i4UN%z1+mHOGSg1+thd%h1Fe>fW z7~&v0CHoaRW(Pd?h4uw)VF$xN`Nh|jEzz_qAr!w-wvMVRz07Y=F?ip7@x7zCuK$SI zX5eHs{aXQt3Py;-kGA)7ja$txJT-^kjvVVCOLw`tpuXtU=>KU@7^!Cl4Vh%{eP$v} zXHB6x7pGnvMb%o7ce$GnK&L8Y_=|}QXj2)D#*Qi7@xdCKS=03WOv3HvWeo#*y6VDQ zkq`QN&34GP(qQB!0c+B;G9nm=1;V(@@s<4JRQe^cYmlu^#pUG_vWB_aI5Din6sro> z4`g)^R1z_{99?hDS=;2C^F#ldwBV=~9H@WBZK_j^A&%k>4&91Z4&_CFE$d)nB4I{jcW=%7l_I@OQ z2r?)WF>rKsUCf|+5X_j6W(XfaA;w4jz>Fw^>e-}w+wS-g!2)qLge_LEaJK=n#JBNi zn8lnq$Wj-hC>*)-#PvuLt*nd_9Tk#fx_&|q`G8Cv&*dSI;92T0aK7 zUwGzbN(zy$Oq&OeD9SK&1nW^65l4AwF0pwNm<(RWe?a=4R_I1KCu6rDFN{TZjLjXC zs94p>j2a77`b7vwFK$3!w0uqpCG2kfSK0&_P+$c*P?PMirst^yL-`xopT$m!z;2tr z4<r^3pX3epayr(;-)HGeG$lHfTsEgi3pu{GtiE)5BXAq=4*ZIQ&k(jTuQXP8UGk z){SD9?Y<-H4*l4mpe_F!>=?Z8pXoDZuqp`~w?I-g!G-yp6kUNO0Z5p)_341;jRvJF zWeATzs2~A2A(4G7;QS&=9WMLs8 zjWRB=F%sPlC;$(Q#DaKcE7cvo3;!NBvOAB+$9QZ~bhYL*Lc->+8Fm=fQ1#A9{Meqa zg(_HN^)}fiH*Mg|=y|>PfQJ{sm@#7)U3fX>59MJ!83Q5*`=KG&qiI2i_<{R z<$ToPJ+CQog^*1ZD1n@u=y%C-pWBGQ)lY>D_sq|A6( zpJ0o$0CgJ%nOFd|VecYfGC6~)depb~C&dkl3|)m`3`P;}8BszEp@*4~_p!=Bf%ooi zDN^R$A;j%=c+o20o4ddKJNiz*fz2pc=yFW5hDj&F+%I*lyr0^ zX0HLdB;|mfNF$DQDzQ(NIN^x%>a!>{j;4ms|8bji^P)Mx+v@Rch3tv-sA^MaB0FVI@MbDV$9b4yYbTEtrthZM<*OthWLX>9*#Zh^3mW z{A8~pcbbwGGYIKFf%`oZjtGhciouo<0AcmC+h-rGyi*t7(6%Sa2uQE8_9)85j}Qb@ zR)Jc(rT3Nvi?T32Az|3$52``2Co$9cti%r%A7mNiVP??i+e5$c;Stqw2Q1s$?L~qO zKpYYjQ>3325BGDDMO!2bo)~B*y^$a|V%goaF_pGhD?oz`3j1^7{?3z`?iI6HjvB~r zjB^%6IJt%OEZAk;x-<~#h#)_5O|NN3bhkDv&={n()z{Zo*l~icVx#C1K^q;AjA;IQ zY*e9!s7)EC*@+j$;oC?-b|BLi+qvtJ3pJYagJ#W|^&ra5h|5ZOV5&vS)Ed%)g`(6| zVa|{_}qhdLPw9@iw;oNOo&iD^%sm?5m|vq zPL>!*;t(T#_8`3_k8eNLVKSU~xP7!s#)Af-xpO!1oH$U^sbRpd3csT&T5C775Y-5b zRuZLZ2wP_}S8kJ;difeIxqKh!`80<8WM)7{vPFHYD1ez%2^hInd+V4ny9_tT7}O4; z(viXAx@K*@S^f)Now^>`_sUFfk4$@*(>jXslL`SlaNH5bWDVPI@S(4Y;gWvWy$bBT!HuSmTRf!^5ER$v$y+xHyC|L zkH(z`AB1GJ-T2|dhEajgz28{$SH&-ng2%-FsbJbZe!X$t^)JO$_%QD6&lkNWKQCd< z#~NPlvn}Mt4$k-2gv zE8Jx=3p?mMoCi zV|NpTxOT)=@t_cfLY%|DRKAv7i=xaE+K@#BUCpu}9;KaOkkUT<_@N)sIB)SWN03Jf z2iG;$pLrEMAKJeYCD)I1`tdY2(FE{Yi8AO0Lmjezgy7+l%Xee7FcS_S;p8(O3slIC zRSf`Af&0<0Rq(w&#q-UwfYvp3_0T$PmZhc||H<@&`X){$TTZjrw0r-q8X74K?16f1 z#@WAHu8hBaokiY^+A^JItgu}OCaDfH>#4B$5|ra(kWsMi9JVcL`yVmT9xy=Knx={7 z&CpDrMyU;UMef>VzwzCXk%4cVk7{Xo2bX+k`gGT8t$bCh|FUgE=@XOPpYcO*L?`%m zL9J!f8me;zViH8>c11g8(9(@*&3R&$-o!k@$vI#_0qRzw=+kK@Xo!$rf&CS8Y{3hr3M{f`r(SOUOHiZ!58TZECvX9K*WGC zqe4=uoW6Ye@*Q`a6AaoPrn>6P*?56}W1K)S+|OD)y#5}{?1$S* zn6pp14Y$c&!(m4D*#ixLFIAj)&Jn|T9$aFvHSTF>mX(@0GVdO6o2f~>wRXF%72nDO zY~q8I`>a*oo|mb-er^4F&mZ+K^0L>C{&{P1ao#H9TAL9?6>isV{%{|Xlk+O`+Kt3Y z?GQ92ktGhE&xe^syPA=X%}lR19JaC*3OK-)IbQJ)mGycrH`Tc$(npH#y4y2*@6Yno zruA?A#;~G}yarvonqPq7^k$;0SpM=xfQ$f3g@HBqOtvTxP-W)UA?JJQ!Fg_03;~8vXU087i#WgD@X9WH8i)(P3J~!4}v*u>LOb&HE z`sGJ?d0M=(t#XQW(dwe;!sShin);P$wSH-HCO*FMYGvKezDi-QqRZR|WvT8}Z(dC7 zqPei}#-0P@OVe7Xbz*yycEA4^G4`4$B+J*2>dLm`nTEl}`)@nUJ$xn0swbQJ+|ToRb>DsYem?JUUFV$ZoY96sx?+Gp|7e%O z*LKCPU}Kf#5b~iNUv+fS@cf^;$kczTj9Eo;_QzZzS&nl=9;2QE3hb2B+fUT=cV43)9 z_R8$R+LFYy>=3$J6O2E&JlNRJQ9kM{@@fxh5czGV$JLU`jeZmF{npWgBRnC)?SPBf zo>40@)H)lzDPp*3we@|drRc|mh8l>PajM}UMwx-{4mlx~gl}H$aEH-vJ?5m`>rQ%m zT>Ld{^28?htRiwK-oB!VTTyi_o7^ddHd%PTi!=y(#U94tU*%wwQQBFN?IfJpg}zq? z){&OmYo|=cM(ecyok+PP!A#nr7VfhIlmVl$TukP~C#(yrh}O&LjcqialsS_bJQ_#sNZo$P4 zr;ZU`B+%{L(lcd)4ukE-yBkF<*_S30-~M5-q@9fYkzV`Q%4L;q_kRA|UvzEnQB903 z8s5A=zV==2sBk0)wUyi;ljh()-%1#Ho%MrB(}!^@+yj*X@^5j-=Wg|~7J8ST*N5r*UtAywqc%~-8c@2@~F8L+3b#9wlUQsAC&xCUAw@TR4k`Wy6@JLhk zNz?^bv*;U@$3zv!ObRAtMnsS8b{TESSg>iXIwE^j<}Abd4yd_5w4)5ILrB=4b^%$w zv*V4L^p4D)rKm1|hvEiU89^>#H?3vdT1T9K*RjLKN1B?e@Ax2>nf%gPIKd94ZtR9*V<}f%Wa&AWV z4n70L5$11jsiLXI<|LMrx3}m?WaZ_lD`?Trava}XD)KSUJY+M=TQJ?ga~B#;6+~U> zn`SqsGEne*=2ox>jf$FEsOZ;3jVdxoK%~n6PyEP38_x*Y zI){09B^kB{`2;`$PnXQ+5sfUQwBYqF8TAB%I zJ8wEIRE$7Dp^A|y6g{1Awg0lPy!y@`U-I~vcu#@B0GYcFZ#Kw|3jF>Tj+ru2o3S1TN%aUG6ihg}o?PG7W z#J_eRXAEcwK;T6Ye50c7PcSbC`~8u(duY(bJ6A~_Wj(MuRCrj6 z5YGT0BGOG5bEDS*t@i8K@sHX3Ja>0K-Wa{+0R;q>*h55SnB*YVB`1F7(t$_iy);dX zm>6y+#a?#cZKKca!KqSVnDgqT7w zPq58tYyy{8(wf+&!c0=~^lZ=ETHNY3IfOduVoyssu1uzXfKfBaJjR4hTCFIhYy&_v zsA@yKeRWh()_MC)|G`LT`0djT0@yJi(|{7LJ1bArlPI`1>;G>TkY!2BmZGy z{ww3><5yu`S^_mqc8|xQKfNr=6}V_16nnO)bLshJ;g4PhLHYSFLWQq>#@Oc#OnE}1 zLj1Kz<^~onglk&~3-kEqWetrQ!onQA<@Trba2xTDgT4f=JwHVTD0?hMksnBAa)<;c zZ`ylkHSA((HOlGNzQ8VB8@~eVLy|xmAJn~wqkePw{E77;pIji&zqu0#874*OHxsNB z?((JIKR!BpE}1_tj&$JHWVRmPzN6JpNkQiF=SssMcD(zQ_EQ^lKUO_pH3%p0)dE1h zk*1sI2t8{Cz`~Gt8N#gq&XHjcgnF51I3ZTv03?)`IKw0@FYC;<_CUOqK zB^gugfC?Z*#^^yw-}}T-3rovYm@^(88*7iD-5*wGPE@Kf-H=2?z6iB*(u_AVxy`v* zQ-O2wmA&CgkC86EA_rUuAzFHjJ(yx`Cu0DBq&&d9#BTiV-1GEI(@3UJs-}Fu*jS4i^RgFR7Z0YJ+_=y>QSxu?TZHYGE=p}fPm)T0(dW5B;q@xfyjhl!+W3(_M!VLoURNbmo2b}ro4SV1$OIO~R%1xrs zFqDtFmMDZmU_|wq?)_WN&sWRq{U3fUlBKoOz|1=cwi3#%F1rtZDbES~?~r%SUl5Xl zpl=!I8gVb_M^#P^y4EzkG@B_BqH1er@Vs#}#ALjxooTZ0T`U*M6r!g$7$)H>=#rkH z|0U{aQfatd@I?1*|Hf|z5#-~d1b8&0fC|LUB{b(uU=K}} zZGBTyDM+kn#D5^zr5AS#@sa)@APc}ewTkyGC}`-AjH0%V!W_thzWKV)J*s{KKy{+6|LYukr^uz9D^x2%L?Lp*`$mroGDJx&}Y zj>&lA{5L+_KWXKFfgaNI;$#78s_zpLm2OvClHAa7XXknf%za{1ad(42Y2ySuBZh{C zT4Hjvz`#Or1wAg14G_0miuYn30XPwC*noHH0071n3?S&APXk0soB3kKWZo4(`UgbG zkWd0*yMhw~jzy-zr497v=b(<)!YjvTptQwFMW9n4s%~3HPy}-#{skyD zJFUChl7?-h9cBcipv%N2!$w6fg|viyC_oJu388`AM$8Ox@EPrqG z{G67E!ubizve6SaHQg_ZVj{M-ukLaI~8*|e|}3?>sR4Kj&@sRp87 zu_K%9P6$<9fq?0v55zsNy(bkEE^0*akq!}3qZX(cD0gsU0u+;3fufdNnhW2Wm*Rfh z#y13#3kj51nsnf=(hDndr1%M^vGB2Laq7Voh;{WvT;q^o#l{}hD%l7a`OTo?iqGFJ$+nr?TSpT9qd5EN12sUKtfaeUc0Xdx{J`W;}+FNb!A+jY_p!h&F1#Wy3AQWWI-N7iKwoQGZuhmy}$A80= zv%5+DU5Ojb%3XZPX`YUV2S5Q#OcxGa_~I1)V|;Oe3#0s79vM3=wAqhd>%uGQL?Eam zT>jFu%c;n#A<9UwTBzNL#}C|~7mEj-p_4|fi$fR;q+?9;xp{%=2Fp+c>^%qbsizke z!1)R)KFn@*#UyGWlMiPaaoff71!jU_TENE`;lX^=&$O_=PXNS|5fM22T#dr9b^LAt z#zqm>y&pavD@n)12jMah1n>{^r$!e5KGfKt zLdozluJ7m1pI;KnTmz*Oj!U*%hvC=@KciE7lN;`SUmKH~==acTV0K;Y-M&V1PLI?& zaXrWS0_#%0_`hw(DcZA#tf)k?-e>;HX#FDo&sgCQVXsIE4BQfK!Pl8QS6prBbyoR! zD;FBl9U^0UG`pQoVPFPG0@`UZF9%p2h17ivc0Fam3&k=9xs6#CZNQ>zS?0vZgVn#v z6lRN6gIVN_IH4$GgW@(I7)_2XpQozzXN&PGoeMOW`g{;Vjuj{E+3`O^w(Pyan= zHMafl2j1|#R_i2x6+gZ}clwkq<*`)~wt|(jp>uyv57-A^KD+mYxu$Yrb!~0Py}_}u z^{?*D-g9|9Vj>LdY8+PPs8DIQtVh@noQi*dFNI#<0;J37>GaTbz$ODRQGYhV^F7i) z!alv#5T-qRiS_#XMMMG-nTO|qN|Z}679)T9&53*9$wswDbRz?t@pjy+uuVT}Z=a`M z)|_K`hfj0fbY{JA4tg&t%HQu_X~0wiz`#c%z+bU$F`u2_rS$ClTGA6q#b$D@8+hI#4B+vdDJd zS&irnwS*#fs5xQK#ulftoN$g7PZ>6%32GUuUn8Xjiv~|zOzf4j^V%m;Z>i5%rl=)d zHI9wSRhrR}Z9wLTgniT5Yk!&kIu=&cdT-Cuo_>rY#6<$#)n-acbRVb%=~wdW-T{BX zIf37UqP4a4^2;?E7{gn!^Zyqc3QYuD1gNvdt&T$u`wn61T1JOFDs^051}_xnKYmW< z+C17nJb3-P&jBaqAMLO5?OM~U4~zd@r1V#Be|E0yq)C}hdK^HC(bCbG)O#02HERN- z2j%=tm-DqvDxG>!`MXP+$(-+2VS5(h2meA6D3AI;`qCvm99HByZcI8HdhmJLhQQ`* zmcNIFFcI|{6eRY{NK+h<7*y2O>LPW<9@26s9#hlO3|dqBck$$~NH508ApdYPO4v6t zGI$^zbFq}EDRNUDTidl*M#GK9dR3H-#zx1cY(5KYMMbpYhL02m@b^GXKypJNgYyUz z#ao*!25%dlkcmH%ptlt!y3c)mfe0g!yYiM6f^;lK8r@N9HWWD6r6j@2Zs(TG&B^c{ zX%N71ji?GZ@tBz%Rf_Y2`X4(Wfd3PlGN@JImtu*XHc1f?l37_epQ-p{k7>JT^BFIM z2`8v$>oG2!x}UQAdoN_Ok5hvw_Z(L*$)33aa^_b;n@akhZQ$po8Myo0&pR``a>z-o z5@SCxHKpG9wr$m@qT;^7*Y}&^nxBUHuKAFs>7@O8g1(eO`hQx04jJ3KMF$VO@UiRT z+rg{0z7*({CgvpBTTrTov*zOC){N+Urfxl$rVh7DE%?Mm&@(m=L~ff z+J27{8%{H9yOweL02`0hWM>T=rpSCdItw_w5)1*$HVaek`ki@myY}s0hMNXybs$Cw zd){Mu^CoLxU?60dsI&grSh`3+{K~pIE|#lAwqtwz@>h-0l<+iM8s0ZS*fM3Ih{k5W z-5C85@c=QZX_5L$Q9>yV+HAipbKDXJ`9@0wm64K(59x04l4L_u34HScs){)b=L|Q- z(BZ8Dazx-U(iiZXoax&kbi2_lB4R(WqDJNye9Ez_$zUUX04YUPRaIf?4d8NyA+ z)iP}6Tn0%mlYJMgS!IXz#5<(Nlsa+WTq-)N{w3wi0Y&>U1?ku#4eKYuebe~lzwInG zGvaicT#5|8<+%uTI=U{DwVPiVMNLZU-Y0Wvb2w}4oT;iOE3BzJYjoq4VmkwKeNz^#Le#_3i z&czMLf&7F7ON19~K&g%4)56q?T!Xip1iU~a6B*EzT&ufShE%R+Hm0XEXA~gNjN}N; zq|i{JdVnkotK6m&!V*0ChFoi7VwZ@CJ&++RFz!h=?s|o(2I9$%J_>gQ7?Bj1;5#nO z>ERF1lH$Cn&ob2}I!tnKadCyKW!xq<$@b9MVH8|)V+OH0hd8VlUf*6)SMxYhA2)cWYkOH1YRZ7p$*qFB1!6uXI46qgoWF?t|;I|$sMFb);9499@& zEgc>Bx#~AY)4bT!y2H~2pqm@JBL(g@hlSbGE|E5BGW+s8sAd|bzKM6B4zlN8xHk1C zhJ*R|DS`FEgCRLjc3K^(EBv*YqHEcD!r&ki3%rs)C@NonP;*;nv7v7Dk-^-_U7|y} zu?jI)TKoU)IW<-nZG6@$Jp5B>x-~@oD!%k*AI@c>H1gAUDQQ;p`K(}N{S>i2;M@%C zwJ+S0R|~Ki7CT0`wvpj^EMTar6!0WsYS4CkOr2Wqz!9TU>J;O;XA{hoe%RtoinGjE={MFYi!{HUk57pJE} zf|?)JAMP0#Y=A}I07G9GDxHmgyyST2TlzuF&XH`c^ZVJt4#^4nx0W-M4j=O~ zuS>A5xO-gP;*HAnOvhsBn55L9Z}0e792O6@y*K7yR8&p1*mW`~D=)PQBXii8=@Mjr zN?wuj+=0=Ndq)ZTPKFRL3)+t(#xGH(a+mw!g}Hi+Y{L@@UU4Sf=;Q?QL7a37NU!=5o&yJ5$gn2#3CqXmj-MsuAQ=|MN+FInh%J!Lx^n1I%WkF=*?}DE zNjcC^9^oi{u;(!J^8n&3H>7WBaRNy=cl&lM_1PL-{!N=Uk?>JGJ{)Knx0@cOHfIA8 z8|%yuhLPJ3JTyq2VOs2Kuq+-3tMh8Gcb65n$2ENd98iH!gGvk)5IJvx()z88lGt|S z=(Ng(O)I=T!VwfT){*NEn-n)b9OGmh0EtmO_A9!4!QJFM5)s+;DWnkDEbyd9?!vZH zT3T$FXv87}VuzxpNcL`q+Hhz7aTwU4=Dz(kURr?h0QPW6i6nevP}YC|_yI1*1VLg~ zv&*inV)$~I)p z$G%E8Zl2A0HC_KDRmc3jU%!Q(?u1yMRh4plpZ~qWpTA?9`Ud*(`rV&SywptSQQxM4UjK5(v_xWiyx9>Ba<^r^_CxNDib1l0_R#HiCBpoH*@7O$wT?n9U!GUs|NM2Ej7 z?8b+2H-8vc_;};U5u{pSvL1%|%qyNvFi`~05}zKVRjQ2!0et6*ha1=DgVsrBR( zMUjDjLqa-nI@ln|va+V;03RQkN?NpJuz;uLB_^RTG)KCDg{~YwWsU-GQ0b$aH&a&KrBhVAZZoX2 zbo_U@+357opMM;dRy&3j-hZX6e*NH9)ljM^6{@wXH=LN9vAs9aI;i?{@XMN4FuV(P zSV#^0J!<@G=&PUUwst2;{*U$5&CiCuzDuL_Zce;*$;gOVT6%*|i%PQoGZmw*!~}Y; z1ElzFe^!)&Riy9%85+>*kfahYMI@V<1P5WtG->S1{^z|9dDknJIrUr;g1{C9RgqST z30%yWo5VcA5d}-qD==nvT2YZq;eew#g9Sn`4ifYM!+(4tnMR>zVR8E8Rxvd-MX+Jy z?WG!biIENq!%oUEQzz$Z$oLY74IUmZ{N$@}hCnC?s8;diMPIlTT)lkxl)e24oPVdfde;FRI=bNfcu}APxoyC@eHE|n1~{z57o;0N2?%PtGrdz zZE_<;1#NFcWaJf81_+C(*QZC?7y{}r4g{zQw%yUo@ML<2tRqqq9N8JIn#PV3>in(3 zTzPBZJ3&$qB~(^aP)``#fAVAtk|t53z(4TW%a>)4_Cp2OhQx+)eSuWiq!B3ym^(O_ zAP)zzk}I}Wm>44P3LJU^0xAHSde!UqfhxdfxCie>UDFGvCIsv-?|rdHhDnKnXCUKw zNKU-^T&9Xq(APe95`uk@_s9nxJ%pj?KQUC14;_=YDe) zEKIid+A^QJXmtIRinpidq2KC|-mct}xh=}{?c)u3 z%gfg@f>imu<|eWncK$Wad(&=(A*#MN=U6!Q@lR)kR@GyMStZ9X(55~5<|DH@r};Ss z2?3*^mu1s+VlEtF1?_^A3_QB+`+QdYn5ho@RXFwdOpcRCk$r|i#|3Vug^u4^+0wmI z>K5JW`pbqpGpd%Id*?PVVEuZk=IbsC?(hus-oq=}10w+}u%DOyon%ap2_1q)VT!n+ z0wFMi%E}bNDrM3P6#{R^9BcKY7$JiIv7(X&$8elin{mr}^mzBsL}7x6Ooo7zB~%8s z5Mh-0f@^TLfN$8AV=>HTrguruV>BYQ$L_qOzElV8 z60u++Ns#5eI3MB7`{wdSAOgUOB;Otf8sy`nhjkM^d`&`PHL3YfI$_;1qEPP6%V;%Z zi)um83F^f+20_%fVS7nVKMV^ZMCP9kANvH0vosYJM)0SBO$VaJaf?D=h2lNy`$I}p zWk5z?1%muqRK$cl!CEEV4PfCx6ioD!*Yd64lZ~to$Rc+mZ2fejafVveS@|IeJ;M{w zu^>hqB!#dL4$ii5V$EOXfaCrR^52k7hBFn(8E@;|0D06KTa>hKd>X=t3;Fa-Rwo|K zkFHn6+01`0g>;=3>XNM5QR9>4lm>;8&9KWF^)k^g``K)j35W5fEkoA5tJ*@$>L=YpA80P1GvO&Bb#EomVXP z-_gT~d3oimK6VjvqH3ZVRtJ;h>`{Ie#WvmHMEq>;)Qh$OA8~(LuZhAGtJ4d!!lAWi zp1`ON_+QGtmEKEaH8Ep}iHRZ8nj`|6)U0q93n%5g_pXz%5_Q=xm_lTO1!3xV0q+Zm z(d7>IXXVk@V02AF;1D=3b`-NvnjA%?L^;w6mC`+*UNnjq#m=NH{UD7}b_D{lP`RRI!;B{G8Z?La;RN$W z3x?N>pA0|VjgC2Qj~_m~&9js(^^KQKMu-t_JHMaZ^5p54ybGiEXV3|>8SN_C+B|bI z)^vT>i62kd;2?C+iML~N2%)AQ*BFcT2_L(yz>y%W{W3}AUgO}8OYX5;oot6kg$%z> zA1>7D?}{ri&!pP(q(k>m=HKJS`KxrAN4t$81Pwpm#}Zic)X&edg^@}~b9pTyFxCxb z>UD>g0?AoiN12_|tl0m){?6*5_Uwj2u}D%i@857{r8P67C!Hc-1W%&U0UBad_}7Zm zB*XE~L*AoI9Tpbb0yCAHMQg!)0WjiNw6T>ugDppVh9O0H^{N)_Yh`uyEz~32>RBXH zw5E#9Na9Zje1zVGD9DK}1$#X7hj#gwglj@5{^7X7&c{bX0a!Mi zQ{qEYX>&_h%cw?Jl8G>P&-(ECXzH8CWQzxxr_i(Qdm%omoxM#H8sZx5j>-jNZ znNyY3lZx`EwHl_)zLn0UT5xyvIH8U7jd0GA(o$%!V$?EXO+-eiZs8TLh4@(RN>eO= z2bw8X5ld<57%4RD@`^KVUQ-lI-e-h1bf(|)bbD^ln9Qme%OqOVZIfy_D#$z0I1`;& zxRfKd!OQjtvrak^xVKlmxjdBI#%xrubg(1Wil*m>@ifB=I`4hY+^EMBln(9TlGIo^ z;LY-$u9T`w2aert{0^c{3+E=;6y&bc`Sjw#!l(C=KaH_du6!5S0`_uj%n-LF^gm+5 zaksXP`sSBmpykok$)A zu`hs`Uz7Zp!`>8cwUc7~mr)Q-%?*Zms&|41MkBfsqzWiQ;?&ml7~i2uxz3HnSk%afTR@q#<=AVEs5M79I7q_&W zYl4Eb5_Pjpd(x2u1J4ZS_Li=kjk`xnnu7b}*<)`9u^)BWcJ}O)U-8D|l<-8}%Ogp5 z3>DV#O*XY`+;}oEyeD8gz~=LwEjk+XUJ2J&E?FP-zhldgra6|C61Hc1X@A4`V}&t$ zv=EQbDy}$itwDo}E9eB5^+Zg`fj!&kFa93usCtW=fBL1xz~A}ZQ>La*^7R_|Sl&iN zC~%jTm+qMsUZzJcRCkD~dROOUfc10rWA5qc?2YmAy>8kGUC9rk!t5SAdE(oaHK~sp zS>0Cp9D2rcxQi)w@a&lTM9HvxI5PZVR25gs1yX#646l$Z=a*PL!pTV6G&F1kPJ(wJ zFG2RfII6Y2lit7V_Q~pMXe{^@JU28)QR@6M8Uo`;;R7KCqX~?06{AWy4cM=6@h2sU zmEvxb%W1l@2u=7z+&+idHOd*@%Ln zfOT?L%Ier9VXORCcNh=-q1_i>mh%_~)<=W`LHbaypB{2~_huK#_QwTxSBxG!_%NWU ze~V#vuDpETJDH)cE(RytRO7~+dR)&Sb-Me)uPdgW4?o8z@;KK$;T_t%|Xtm!Og4a4+oQMfk~;` z6WsJ`J3ZvL=L}sl4fBxu=HWe{vO$2)>sZyMNu4SBobL{z@>6L)ZiIP8{oK0$e$$<= zZc+w3*V11*Ws%X59r{ShL+5$U= zzGTyBIv&FWN_BXtQ?gwh^OXHy?a@di^Pb<&vEyIAUl@UNnK(|jV=9BN4w1Dzo> zwfidrtENmsU%B7X)kQ|=ML@pp?(TjXwS|aAYXEF#5=IzXFIX1mFHUt(5uAkieE&r5x`qHiLJQ1= zU>;Fcc5P@z!J_}lX?5@ICNt$JvLnA3xumY5g@A^@EdgyxPYT4n6Jw}b*^X#sHaCy@ zTm-Z)^|ogxdY67JA&EDaMf~53iQ8H{jx@*<>{bklcz2VVF6aP1&V!lDMhiMrA^jdmOm;IHFoWaSIwOW z@UhHu|GWN!cj)nLfpr=x3MI|_g(4H>K7X0&ck?lOlzB1A=PL0WJ<1P2HOyIJA+xaW zxo3YN{|ZD}^vubCkU7H0lEf^{He%mo_j`iql0mi%r(5$}s6A0jfBKgVvE574+Xkma zP+Q7YA{<))L0`E->vQ7gMhY}eB&x1(Y2LFV*LoT~{0+ficTdk=;7f0mldiWIzTbCU zh*<4|$${7N!%K+h1o}XT9w)`PPU^!-=OO3Z7`c7=!Q1+wRrfyFzE9?Txr2d$@{NK| zK1R;9+EI({rKYX|8@F*SRmEZNyPQ$YQQ}`?c6!o`cD{S~J>KVSQiH~aPtkn;(*iWi z8^ek>oc|YEG>sBNbdZ2O-AbXmL9<9x_-0aXCA^SL;*3wD+nzHF1-KLZGcj=rFasKx zT&Iao16QTKhuGJOMDhNI0s@u&`9u5Ck6*r*s5MWY;N?Bo?amRlBfG#~!?to&+u~KD z5vP5WJ9s4;1PcC)+_`ck)>I>`vtR7+d!x46Gd?G*E@ao&#av^^gnNTDArJC?eTr*$ znhY@OnF2vG)lPZXm!bFbtba{M;en6Sg^!&_zZ!r4a*gFfct1kLmKELyQ z5`)(3r@Nkt$t}`g5rq?>p8Ey|NirYCSCB0j1=^ap1Mg>NXEt*rzG^tM&L}DE zAQLXQG?uwoaD^5uFWC{v5I`V#dfcai!3iPSpS4mjFN87_QDq?C^#!yt)bK0f`b6IX zjv%-O`v9Y6tO05XNeej1RN}d&b#xc#dyYd&OIwjDyqEFhF{WYEi@_VHzSm@St^4j8=BV5H zvtQuOH+s)jnfb4G$6B)KxEjZ2cCh&OW*W9WR81>f_r0O6@W$_nj{ScC zL{nIEy@pTDXS_Fj8q|4|-TbufH;x8kt4l=GR93|&*{6FJF6 zJlOg!m&YtbkzA++SAgPynqb1%VNij{V$io8R<|3^ATuGv@iQxH=FXtSf_e;RLAgiS zd^RSu5+7WhYajUTvvdr5e%K~39r_W_6Q@z>V0H9a@-E;9A*f)&NUVfD2-wLOpI<8)=e1PSQ=ee894 zV22R%{tX(WEP3ARMZ|vYeQQlI0P_Wq`HHOj@2{(08X8ba+movA1>L*-3v=+TKu=0k zq5bWz^bX~mQhF=3m5_)Sy@NL4aN*)}s70PVd-f4B8I*%>fI9cjLcd4C`JmD`dF$4# zBc?r)Qa;QMGL|KqgDFUsL*1*BEB0~FtZZuL=Bw$oP)>f;c2PAldSawW`{1u;HS2>I z3hXxYmSn>|Bq7Uka*_CXFJ92sC)bTzQF8F<)Q*E#hpf_cTh1EQq`2@OafRDvW=KHd z!GrDqK0uFG!il~lTivvDI}QtE&ln2&-+9j9E(tss`@K6JDM8>9@OHpDz&;BjTZax^ zl+;FRP6tJ{^9-79X3PO`(uc#iwl?&*Z)m72rWlPfeFFn4F+3)H;R5Z%xW}%zsJLF0 z1_3ex0>;WTTfImpUa#xbr|^_o2-fCq{5-xm-!{28zhEzD^iA^SO&X8YKp-QI8AvqO zh62P5e0gAST>0GF^I0Q;zi;}CEZg{bv} z3?LNnxq5o7&EF2^jvc+-oLJMW=_Ct*15PC<;9y8dY)j$$T2LWTFdP|7NP?iqXa4@> z=xILo`)k&suwJ1Xx;Ce^R-=%-2b3I;Ba(y3=;Q|KPt*z0=Ig43|$% zy7b)w`X7j@4t~_thz!IL1B!#UaM6r6>-%aNJwCYKLpieF*$J8qMny z9H~DtoUy4qy=!j#o2g^2m8-pD$&Z^)c8ZO)lo@q-uPa=#mswzTpZ=CUkXKwHrV#hi zzD1j5)c(MJ8=IjA%g0B?m(>bZ--n+0bNIb!ZP9{+ z&eFQ++Lhsuk-$(6qNaH^s1_v``iXZi{ll%Jd*nAd!g=lw{B0^BTP2!3XyKOs2=DMb z+czClql>+cv%MXY4mj;mOlH9#k$4ySoSfb1;^Kn$kJnBBgE<_<#A}_}7sEI=XD2$U zz&t>Y16UU80Mmnb|3C&@>-BF9e|ZOnd-Zn{VaYxhq|E_$Ca~?EXHTD=0xV#FR}Am~ zvIQ^$8aWmpUvoNFh19Hn^Z<+&IUP}~P(Ye=nf(U*U4foJsqtZO+MV6nRzU)Kxh%M0 zLj1Z7-9%%f0&MjwUcj-KmUjq`&4lS zNL`Gn0$_!hNIq+$sC=3eWdSUoWj8NX|Gv*Oc4PAPJtMG^go~Y)By>R)H8sdQ zQJCd=s=$@|d+g@l`K=TdIb+XzM|S!X(74a!d=qI#6GVI#NV|>R_#b_y;wD zFw_lfocDIsyQaCQ{t)w(InRMu_s8RrFH zp?!=2stHQOBDS0RtGSEa>{umED&7)JMa3AU1jeh8G9O20Fq9pmSt$1QoKGZ*UkLEA zJ21gp25TU^*2GPn5b?I;+X+E-vY&$kUJ%$iaG8GU@4w*`sNLkYF#&@w&cNw#ey6k= zQh+-L#}5|aVM41z-S-fWq{dh3-09x?@dG!+`XHz&~-N%L?f1y%Tya%~sjQrd6@OG{q zLS+i=0d^Jc7u@;KXO`%urRY@csOOfeyY}@hS6>Z-d*7c_{V5jvW7_N#UW|f!6Qq4V z@xmSuuZ8Bn*Wwn=Nm7Sp0*|_2Fzkp?yD-ssL-Wj)D^RKW7(&slDYd!;X+RH!YpH-f z&zq*Os}Allf6zVQ?xIPd!V*KEFCQ+9YTap55hYmktuSoPf8~^A-{J;Sw`@`*z_G-i zC!U_#a9AU`Pk5N1M`8N~3tK$ra>$UlLb5?DVpE~Q;wckg^un93ooC!OpNgk2C3 zMFA$lpCX$b3jjMuK@lnpT3Xs<6`o%c9lPUd)(1VVzeTDC{7Z5jt$>{`pb(Z%P&>9| z{Uf&vpZP1|6yv1inV1eQ4i61Nr#Vo30>~qLNK=7$Unaqqa8t@D@t1xF zha7;ZCnvq=XrWbt0b}9v(s3N}=zCwMR*BsGT-u63)E|K2df_YTT73DXgF21^@Bn8p z1nFb9|G}$sqb9-?6%{b_y#m|Uqc+x)owA6l#km1S9XG>&sy_VIiTSf?1XY4n6#LJ6 zEVe_ecuUYX6=C4ULKG(MY4*Jr3G!EwKuRxAqnvwtF*|b;h&SrjQmr>Yyg=t--+^t1GKN?xJq-%F0EHM%G`v)-(`=~+ za2UvQMd}{58O|Xs!C(lkP{pF~maKjVg@U3Y>Z0gtnTaNX0O^n=u99tb0Kdpz8=2%So<(Mj>Tg^c!`HrI{|!Cw=g_gJA= zLjO@LT<%bnH$b;Tl0+Pr|61eHB$C5-*DjhB;kP*}UppV|0Ywf*JIQnegla%M4|+1c zAvY6=9r4(H2rB}&y(tey4ozX&!iPzDL|B-f6y&REv{+@0QD9CFwxGscUQ*EEGh@sM zI5B`>XxA_|1GT~Vjqk8CAVB+xIMU6o39W_$kTTr@ZCz4c4zckn)Cg=Iz#_0sv0nX6 z4zIz_BMbwy=S%*-;|%^Rip{GxD`!1DCaaCV))=ek2?@2Q8%Aa75Iln`kj-43VF2pn ziy-o`(>P9^+>_fur9*WSLFEuL;l&;LEp%q3GvH(%O}fOLvoStND7XeY1-TQlv-qts zCW5*XBUg{YIdL#SR+Tjs;d2*njUvHNtnODKjOE=$8jNp+3=eXP%qd)odE8;d!RYlR zTK>%X*~#*ip%on>pzq_B{3o?`CuKXa@5Qx*JGmTw>%rvmTLv*A{|MG86ZD zn3Umw3~MqsJ@QNCA^yahG<4{l&=gZw;+MnDB9WA^bAy3|`4z@jSjAqDrk#~MfUiI# zV6USF$8m3?Oh5%Ed1+{M7La+i1m4FZVc9rpvA+>J-->JEUv&fl0r*XL@#L$UXQ}|S zyZ5Ft-qDY#skKV8!mc3DkY6H^^@yvPG7%fT8Ef^?Z|qPCprkQg#MK zLfyFW!DRA<#KDr!|380`+9As)hLgj#^V*R+{K_(xpVVx)0)h00e8sARiS`S+pc&Jd-tyYP*2QdcTM+^} z^4~ax$U2aiWcZh~oA2#7G8&N^1tjZpd#>d05D6yW2|&(=k|Y)$*M5Y~td} zuZv8_vgW_EI-a@k@5}ee{D*9L09{PVpJfDZ-iI=>hs3+RZ!>xeu-Q)|sBg=@uUqd4 z0#79LBf;8?a$@kl1t9GqbQQFG7y<>}h4WScD<9hNAe_@sLd(To=9awk7WI{)9?C6? z$xe-1Ka{EipjeWy;DNsrFE17R*qr`85vTfpu6kdFSv6HIf6g|p`t>^2`U#KgBeMn zrFb6riV>I#L?sdm87PFt$ZBW9ZH3AE9meIYh@jnE5Gk8N%Q=*ER}LM;eJ)M46n%vzf!S;`}HJDh*u4013)k`*i14$KLIybwMtm^% za32!|yd$Vl$!o@raam)FaHMufVc>CZeGN7=k1@5yYnl zM}57z32F>7*$PV>jCPfy7n8m?7EW%FO@!T|8kJNfbG`~XDk}{`CzL-_Uzl!bkMC{pW9zG-qUYhn+$hp6wZ$v0?G)+ zA^mRKOE~sV<7xPYgX0>%X)erB zJbzw<5{?v;Kq2uf0Pw`+0M>segj)khW=q5HJc3@pia=q7=Oz~_D)D2TGiOKMJ@aSp zWK@fr0Jyq8b^@#fmm68x13<^2?M5ez`i6oa``BXc=ePM*mf)s$MbZO#?fA}xH44J;f#0d-sP-Nn}1Brkp5nWYL%AFJy$#&Rf!LAsS3t;gi_JfSaku_ED zxuXONRm(}Xfq15&_W_oJpD@&sD+DDd)a)#PPj64C&uxUe}kHWfx^ILkl~yM4iRrHh&$P&ek~4;}JErH#Q^I1LhJXt}QQo~yEa zr12lI{C9M#H|<&Nd|zPI*>&sa*V>g!$e&hTWttG}d1o?pha~<+bB?%OG1Vc?*LykL z*f#M{uij)3B_~oSUj2K#?`P~RU&+^oWCCdenLS73vJDSaZ= z#a)TQ{V1S^`((}t7b59w`Elg$N+G=yBsDf*ddWaW?-V&~K>}iE2el0X!+F=~Pl{suXSg}@ z5^jLYob;Pr!cAX0Yr9Ci(O(NWJaN1sd!1l+BybYvw>1in#?S8#GP36G`@!^toWcmI z$;R1T5xVeEVn6Li-Lz-8>3|eR++cz)9kjzaiSQ@_GXwAd2tGt?Z|U6tJ)u@nH~F~k z^1kz#`t=VX>L7$O@HoUs5-~XtE^tr?sCb^(1xV1DuJqpeRsEe80;NY z1>-Kt%9bA40$(V7nZx`3rv)%1R;yczpKkq445MHiNb0u9-&h+m(ECBmmueJTBL#3C zPjKH3&&uds4Fbe+uYZBgryLhMPGh6|83K2%h0O)a1V!lDrN`K=1Hktp5DU~PLjYP4e&J1 zU%dDhshogRaRuHtl+z1h2T=p|wrdhT)*etcV^OZhe~njzONgY)^m+;1q7!Gm1)p_v z_Hb+T_*k@yY2(^kOs>)O{brTZ^x^3pM*fqkd#RDGfximc682_u78fxk4g8h|6a3+=W0kR-$}|%?&XrAU-q56_H#$fNkqaR8KBf!L8;kFWH${3+*3ywUvPIW3MgNilPV`ju`$YZ878v_gg zLGsk9#;xoULVntu@QyUdIO?7-7-VBqG{t?Jb~-4s(iY1XXNg8LPFq%S@i0^opMINR zv3z0O;}hHye(Y17|IU5?Y^yXc=83Vr>OIvrBecA4bhm90HT$KI%Y(L%8*Wlw^fK9B zlsoBgKXJ6$epX~@=JT3`Y%TI+un1QjU^+y<`RqPYwG-o2V)Xy+qCbf=_z7D(rYlre zN?+|Od3xrZ$n_J<{zmmUX9X=pJVN(6tFX#l+4r>uqag(NH4#?7;}F-YZ0K)ursP}R zR!`~>8<_|C=k-9;Hk&n$K;}&pBg$U`Zz#tu^Io`Hi4H$NPbZ! zzBnhpNp{>sIN}HoV|rvn1hg9mV`6S(KG>?2^S+pGn*wcD1Ia1%Dc@I@1f?T##rL#s zNHxhboV#RZTjI_!VfNSaoKH{3Z!wDR3oI`$%d2KTI<88-DVD;fa{N#Id6>EkV#KkZ z$emz%0lbwTc~*;#PG|fh_17|8@Og0<1N^A-gQE^oZJ{mK)L_%YKrwL?N7;*ZLPP50 z#s>;+fl9P4pEWehyO}#x?<)O{p{7nS8ZKcRq4iEk?CLlz5J9Jv(3E1hy=ghVSSTei zXRYDrT;t41%uhXOLo1t6GG1nJ=7MmA3uPV*QGcolQc8uW>32yi^}4TcX7%8?0+4Sy&KaUEA7sOK(bod!qjDGX;l?pi@)|o%rUaMAju}<6-UY2tVdea@@r3jAX z?J@CS?!=uA!U+z8ROR#*rrxzw`Yx|A2 zE3VLXd}+i+bh1buu_*UkXN>daSj^^ectkho6c(0ykkjGGf2RW<+8P`X4+y+~r~!W4 zU;4!7I#4?1a%1_MFH9JUoJKY&vSv_r{$(|-^?Ekno`R+U9;0e%jPMH6GL_u?;IMp4 zJ44aCrh6A9#B4My+YANOd6h#KS~N-=UG#VPl;MGMyF^V?(aN@2#CGO?7ecONSdpw_W@9nSLz%OZO zTFG0OEa3pv-cu4N)A4w>xKLk?fn#12(_VGEv9Ipu)Upa1sAXjr`2^aEdoNwD9J#aB zw*DcT4e#|eiL-^q8y8$Gq%h=eG;^q@M>=7uZH7~5=yQc*PRF@4hrPS5W{-aR?z}+fL79buZ7Gz z_qDY1J(PWAd&UF{4F_t@vmES`&~@#SJt#I7%5g=Ik3Z&F%Kbpu(2}BUF3)ti)KjvP zTIY@31DO!8Bs5ftQ}N71?T`f$zW}0#Ax=1WB8&6OVRmfY_l0pSpVxyH*qleec3*B2AA|c`UC}JfO?Rb&mu)WFA|}_NzPl23 ze9i1UhgE6*XfyTT^tgzfjBL^R0@umX-m!CMH9mZIZhuCVT9`AIId2tOg@wHA6%IGl zxe)g@+YmDi)jEpNs21NfN;jQ(T=gV!X4`e|+r^prf4)>Nv;XxqC`o4wg#en+0i2KdcWnzi zua*^wSK5+pa_DV+-B4T3HFpoT-}z@TbA>$G?G0;mpy0vZdg|FUXqt%aIYK@AZjVcYqa~oQ z?Ho}UI!)tYxB)587yrGi`Trf!{J37Fevhc%#OAKGr3W7?bjb&4osIf)rL`hym1b03 zcJ)-8z^&#zhCIF(d<1&sxw4Zi@0x4OYH(y{X&--fWx>+zYmdLoMdgGXqy2 zaPoOK-(9z}cAssoQw`+R@U7c$M}wcIchf2XiG_nQPer_jTB=bCDdY@XQ99IPSbJ!O zUn|S>^QRtqKeKy9|Cwt(?YjNd{yIo#in=6!MlP`by=3XJBuzTl}Wd5%Y zYbJ{`XWoqe`gUHaXrbeTUEUd8lYjyDZd&T_aOw-((rcwpOQ`WN`rh#d(J3f6xP+K^ z!bq36tdYj^SI%5tt#wmBZ$(gY#XmVjqJ50U1FVj&vXboB2DT&B{do~7?vrm53lDbc z3?&OV{!W@4F^SB7TirG<(+*lLlNmjHxIcV&mXczV+z{7z=-l~pPJeFA z!ed=DwvBvEPwPnhd^OL0bzCLGyd~?%0Go50wZ&qT}NhvtKMYw{ylmhU-@05Td}-3+q^=RA-Ox??eOX!xPf(&SsD|~W$L%(7wPu) ziPRkuT-`nrqMLsQG~qney}$D2qVBz&J-w{WIXlZ{c5qDatg7njcb^zMZKnU6acn$s zZu>iqg@`I6btN?CDJgng$7N>!1Z&Nt+Wl%Wu`4%=`}NzU;=8uMHt8_;Lw|Fw56zC% zA{B`(cat8x%kZZ!SaKQv+(<2O&T#xC}s%xe4nidud`-$D-ZmunM} zKGdT*V~MhAUP%)btglrlsSAUO;due6BAa!-yuEtk?M3xYnZ#i)I8aY$nje<>`Eztu zL|J6E^m%4^Rn?;+p|K{-dxcKy(dD{TRO@-K%R)Jq%-L+lRVD843;ZTH%QEU6d5?A z+p81_@hti@X>I{0du{gMn+;~LmZe_H<7+Re94$-Z)I?HZsvvigv# zeX^MQsCUOiQg~GRF(vD!bLWO#X3Na8i<;UEj**gX^-@WA z=1iBfIrY5UA~771ZU$TT#2$P`gTMFUB&KewT!-bsMl}=e3R;%!aqc<=c@1fgiV_}d ztaY)MweUL0ycboU@u~`aR;Zj`T|HD(H2>;}QMLO6=Y|58$#-2NgBg?N$xlDFI=0o~ zDg<1rh3w3r2=UDbm1U##>dE-P$GpNsUw8DE_Y>GHN7Z3W7s^pg z#`#|K;e6Jw_I~?@P+JS8i&VQAE%U@PUo(A+j*2onfCXD)+|uEx{6bE{`{z#iQyPJx zPTICI+;xpTcJNBV<%e&~YRzMh?43yKF)*`Yk%bV|?uNQUJjWs*B zIQtR}(XVzF{1i;yM=||myZv~dme5F5k#L7^wdQoS;K#_RjhAlBW!i_Rsj1oZwoZ-0 zgG1P?m}#Sq0K~t+^%s4!ziMTfjTuW8*nHMsvq9=c_S8icm614e7^Q?qz&-7o0A=_A zB~;+6RbgIkj)s!s$Dx#JH%KMyq%%zV1FM&5WLvdHS&4=?MVpw+HVs!srl$XYHmoq> zHQ;d(hk*-^`88qY!9d)>fDDqmcH=$M-}XZ2Ig_zLn6m<$@SkaN%ze}L+M;;g%NKjymWhBzIpB_vdI1Bu=e2MtIs;WuEM95is4V)SX( zf*BBfow2e0u&6qwkU*2qox{%88rCQLolsxa_NQ(EzA9`=l4kOE8bZS!aL2u2&=&;} zcFL*9wKJ9}K=o#KOw1uED>Jju2P1 z-Ce8|z5DLrFqTt6Im&yF@6B-$y^=f%7@J7K8 zjt{j=-LzL+*oqZDF-|?xF5`7|;m)S&pQeHzZ-mm9D3^Y|x$%6Wf%J%5!0~9iytS(Nl5WT?#c|Lp_VLStc_tg8) z=b5L^d6G_fwU5D3`3pGYkoF}c+{0>NyW_3_SY4lGc@dHJRHnp=DNK}mu?`Y4^xx2V z1W*A)4Bc2;9F;NX@vowlGicZDBTPTx(?l44QqqYnesP6;?6gh2-< zo=p1_>qm4-uZZ%q&pw8svp-xdF@w!w=0vUE*_1raC5H<>tHIb9{t<&5e_{gPOa zVBuf%Qch!sm^Uzf$ftNdOB-;fZHb9FoM?24nPLs^Imw0mt5atCDk~SHb@?((XtjdW z6^e6*?hQSDb@wArsH^>V&&wthEBEw&#W2lMF-*$^q0vb+tI7Blum(tv7_&UOZ`PV! z7<9uema38PKJv)SiV`6WDEI)~!{k#Guu#EafJFL+$S9GW0|Ue*!HjQ*M&1~~Waq{iFwJ+N;y#xg zA${SAKMvXmZV?$g1dueMkG!`e6QZ)|=nsm6TS!1xUg@kSx3G-- z*IiZ$-qai0ziDp?JSY<>SoD|mW|7W;fc15pxz(09;h5L@lhQtKYOHqd9JhzT+aY&x z^-1*@6}=8ENwlNJw5r3zW-ird1H`b5qM#kQFHYQ|G3UgL>3N3M6~AYO&9CJa>V+{f zGFCZLB{})X#6*OAIqr`emtbaxyPrRQuXWT1BW^9 zsW5>O&V_h`X2=_1xBHiwCNXdYeJ^zVFkAuJ;S95}imo!kn8?f1k|Lu<;F4qv(I{ZO z)(oJ^KRwy3P%PsHLdOxk3Eahm(fsfs_;yw3)dEEWtPKFRYg*2f16FZZP5cFbQw}Nn zA220-K+gLfpq^92|#`S!_ZRv;`>&Yi`o~wa@f3#Yr@f!xK}~l#UAh@ z$+i*1bmBW_78h9#+6*^GEv9K1ODlt;3QmVJ?ThDaQD(OtpV6c=yb6-U)-3KV|-?U*UMAit1hX* zo%T4gs$5Dyyia1=h99Yx+%a%`SHT6$g)61S8r^fJcpW)cDZWzzdm2m_JIggpKbMs z6FV+)FgvFaAklod-;!-k2_P0%V45JvV*3+T6bydT!9GBcL&(`_-jLAo#30~#em*-U z=t@N*>thzsKB=eo{JJIH3%2QRXxK0?7u6uFkb~P_t_P>!0N#ZL|8aB;gLy8&dTlSl zGACkhIV{oJoO`j6P@CggBc$OgSN33VFGNRvc;BZ!yP~O-Kj&@@2o&3iSg;?FTSEqp zld(Zf`PN`=lOe4{r3XY4Hz^F&h`4DsrF$*2TlRgttb>CXM3*liLno8&G2#jgdvugY z6AB2@*y9~R>o8=U$k@)w*VWcO-uUP4<%Ab{te#wOkfC}sx!?PI%x~JNgFE2hi*}`K zK%!B*_cX5(+nTQ?oQz9mHpjxb#$|7xdpEtqudX|RGHpYwA^R45ele@mokr~CyfNz& z!D&DEPOBQNI*Is&ApSp-(#y6*&ac|k=BQjyRDv#0M*$|UcYcnZ>|3Lcbvm)_bKo$u zz>E02Fo@o6rq>;eZflnPYe@Uq^dVY}r(T;e_Kr{8%pFoA+v)7#IfpnD_+ESn+2DYMq0Nn! zW+j9UnvlJsL~2xK?+er&{twu2GzKc*-gRK;-oA_3??_FiF1WFzH->17f&xSlLSV;4 z5k1ga(7{B60a>9Fdi>~Duh!Lz0;7Ns<}BKCXnx{9z*712MqQBTVL`L%gO%tB4u^;L zbm_#kFm4)V2Q(gFo}@KJ!X2XD9)lXqOV_gLMg@Wriueee4DSNIEof13NlS-=iiKcPnQ+A&LzL@yEvR*&3fkU3Ni710?`}GNSkMyU;j0|W!kAWPC8##ORd~L zTVWSF?aEKD4FnG5IkxK+oGA|odeH%-H+QCR?K(;hHE}jye-{JKrJBKz`I<~|g{H3d zs|Lq)c2Lps6{_uO?8yVPMETzUlyH+Mjx%?Q5=MgVj z4&1o#LJ7tAq);+mQWA+IVM>7uh(qGyYfRU)c5?R^9MDX`VS z*^EM(bb9&69=mU$3<-@z3OSv2Ss@`~O}&>e!O&@Zg!jqBte^ex4VI>wa9Bt->gv9) zx^(09qZVji&7q%8YbXq0leifdfM=yli*Fpo@pci#U3ye8YZO!wrmnYUNt0u-K#-ZJA#4(k3N7a;K9 zns*V(vId_!%QmpvY-p-Ue;uC$H_b<1nrLjQDtU)ShHqQxjO99geF zzbRV!kn1>xzn;^`d7Qg2cRWuw@ZbwhlZb0q65TQ^KHml&?J51MkkpF_TXef&?AE;m zi5s1%Wd2z*&2cX`Gy7AWsGAP`TDDhDHr^3aRXsmF} ze3e%vHy~=0>JfKLd;?|485t;AoN+Kf7qx7DhzJ<``0;V9IIiCkAt$8RBxV2VUB1{n zL8qNum*Br+<_^r4PDAD6H2RviDbIljM-hdM!M}v2q8y|=a0@Do({0fkhC1R2GHh@| z@7MM~S7&Eu2enwD{VX#h^Y6Z{zz$3o+_$d>`NK;ywey94I@gmoi~@upo(J&*0|@E2Z>lIm~TXC^G zxoDjm3S^zyTCp`Q@-$%BlE8zwe+KZ#B}i5O{g+Z2ia_9@4p92<(IoDE0PS<2)8Dv;)5x=e$0~J z9j78QEbEQEj5gL>D!Ar)^&p4z4;BE)CysP*CiOVCfAo^-JoG>0cI#sQ-ebj00Oh1o zvdZh{A*Lw=$&qo(v%AcGcU@5L<*FTSzu&I~c1!Fb{hRJQ!M=w8RsoUEMuI(U`YTvD zgq4Nc2|@|%H0X1A1qI1&tNh@FA`>DCuv7CH<&mWW6vi{?y7u;Yx!xB4iMDPirHk8r~)+O;6|l9u&zR{YwRi`~+`ZKU>bVG;S-OBeN{D0I%uOU)hUmy#P+xoMjN&fow~{N@vX}VCdBMmrtJ-adcFR-u zZFd6LK1dH2*1ah6+ue5Vc5Im`2)+nxKOP2q)_?n=kSq|uA#t;w%xeTYf@|YKD!-Bx}uhrOX8ZK z+yBzE%f}W;63_300z3)}Sv!zRu}JU0Q+LLry-;%h&V~*e#!h8}3QFL(~V=LvS(yZ4Gf?>^`K z&4B}M?I;aA^*|#g`FX!Rl)1#j79`0sOr3+k_Si3=W55u5$FQUTSk=^^_TU1M&@LBy z7nv0(-^vhY&rF3NBv}GYntc=no0$d4SHF98H)srej1QFbgT~;zx@h-?IAEHn zeTnO+-=Eb%kAQW7NQd&;UMKn6DghA3>P3YW83<1K6%20l+0g<$AQl+4J|yLvEk9il z;|i|Y=Amog9PXr0&|YkR!F)^OQcg_SjaDniM1wMY;e*?h6T?sHw{zDw0wAXGh{>@y zW{Y zr=Kpdl-zFG{8>Sqa>fUn7+}>_rqmI?(W~SfKT~l6ok3Z2oqn!H5ui*A+*qx_^=cqb zX>mL@K}8{+MMa4ZhO7qZ76FOIrXe=7YsWsquQC@96eMT{Sa4=x5OyLf1KALg>@|1L zy~m))7*n!h^4xZF!Aep-7y;=yK0YoR);)b4U~a$6wOsAA8z5Bzy~B`p^eW84@b}0# zAgl=1cgB4Uy!DG7MrbouzOLNKbbE#jLxmw6rrb!yc!W!)3hTP9bF}NsSXwEM&UeR` z&hD!a05M*qdxHLX7&;42k@VW2h#+ui(TDepsyI~yk2;BZhL<;vw4n^*jEw9 z;l|+riOzMzfFEo)T)HS#aJ>`3#wE82Ca|aXq9Y7Cvn?s4Fw-6mVsnT}0-2(IxmlO-F^5c35x^*X0SuexGXal>%ePX}{Eo~}B=%VZFcoQ^<7H~L>#j7FaQurh5_4Yxn=aBBG`_h zY!OeN2GkfEz>n)ou6cSBqLck#V-Oh4qKd&U;!&~5%5o~!ce@7Y;zF3M_+6e}+op z#@vK@|IKZ1h{d{|qZ8P>*MMkgnlpT$Q`)_OnpaCKGJwaTOnBQ`ONvXVMVtpyD+n(e zWf6??Fk|y5dJsepiqA}4=!XS%w2`oYaF_?LR4h*zJTmRcfw*DC*&w!{{48iqum%y$By zvFb}>bYIT(P|O$uIN8LlcH(@YD$6B1bgewYTV$+JxC>Bl!S)O^<1zf2G~m7vXNA)RDVP?7FyS5^A^bZy!A#0BY1@I(OmoOf;LG%jQWFL;sQdp}fH6Ya=i4-p_g@$A9V*uHuI2@Gbv^tTtu z;t`@(uyTl_T(wk5GsSAZzn{k@9_Zkol0y_~n0y zEZJAE3mAbyT-=2+@Z6W~2dfC+5ox6KI6Gp0ud2*$qBq&T>P*LG=HhtoCv;ZYQFUt% zYiWgjT!uM47!(L|om1d}llDezY^Pl=(WAjz;5pE)C$S_BkzePh3d4QozxL_*YE`(Fkx6|Oqcx22h>6n`7hwE|c zTSs1&4S1ywm6du>D?EwyDd~7OJT(Tu zZ$sBaFd+dQ1Kc0i-Y%CIOerDR%wpSfUs)l99T>d1i>(SDlz_1xETFN1CHlihk19=R zZo)|)Lr`B*vq3su^o7HO0Ynm9KrHb2#zOt{7jFZI-f1HNc%T<{tvyhV8Mfs+a zCqpH;SpA7h{50cD?{ZQbLUDmt&|@LP+i;EGwmSy7;Xeb8>u`M`{{RglfKv?J!P<&g zw;e>yfTRJcwGZAtNW4-UsA@|o0U2Tp2{iEPW9SVjPTct0&%68KFW;4?Hq48xd*8Na z+uA!voYRlq+hkjE^xodGUn9ttSo2nuZF`XvNfvw6zsMYgNhxFqpe@{7MgS6%p2M%4 zF4})7fE9N{n7``a@;})0Xg$Ik4+$b+1>HDGali)!m^WZq$K}Pz?DNU+YWvg_(93aPezpcq1X$y>n*K<{Z`|IuyLp zEMAZdV+D2uIzT0cz!;|IV+oMa#>i2+Mn0JO!ZHF~FjUJwFm5~=T}6oUusR4XIO!;) zV7G*Tiwh9s21M;s$Bn?TftNU=^9^V~q0_P{-)ge#q-{&@7;wm3xaXqSLH&r|fuhEq z+Tf2Sc(oI0RuW1C{+b+>WNMxg5?O4G)kSnrFhJSiqGw03;9C z@AjSZ#z7TTtUWlU08A4>;M@;}06qFB1C})qWC;`Z4T~phKf%kc?fRG^Kq+h#K&!-# z9>m$N-t~}|T+!e2irzr6-Vm5RZkF6cn5huPH6}0LzRP2a0klaD=Sze(1W5j536Pz4 zf)o8gB?yYh$Q?|wg~tV~xJkf)FW$!=_7f)uhZA$30kv$^Ooa{= z6ZJ5R&h+z()hKME!2%~Sn`I50UG|`11c%}~cw|UENYuk$07$XVPXCnHzRSPgwT#v8 z1yzawXghX*rn}2P0Z5(^bEdEHzcqaIzmP19-sC<6%?^yx>BQFyyb${CV#vdEK0Ub` znMZD4WI8*L3Lv2pBdPgG5FOy*4lUY-J4CVKSB7{PG_t}c^n==nTFyx^#bC|%aLTC{ zMF(v^RUC9n3}WD@i8a$_S%XF_Dt3Awd5wH0Vc_GhGnM$6gE#(85%m(;5UsW?g)aLT zgOqvVk`2K0&UZl0LuK7%kO3e|2@^FdMtCGRGvM(3*KoT5VD8TM9wY!WN=J|rs(Ju4 zqwf(QHNZ#AD52p{=J3`wP`Sju?_YyfTTKn?q?@c>Sj2r=F6S!S#kL$V z!MC`&Ganln8lp7g5{X=rXzoiK(l-2#0l0Dq@CE_g>Hvxf9Hnl(XjXmd6& zqRcGvKe1&8)ZYL8dR{qk*XfHM@?3eoJq>H@R+yKF@vq3%ph#ICa=!`ZngCo-==pJH zG)6hJ4P-Sq=+L|XmT(*s41(e;ELZRbsO##|iseoom5@Qq{sRzBv+%m)2~Iarz-cG| zcPp$9Din6(air{SeNs!bKe(~=tzRr%*t15&j{`mMCqjBFh!r!AR4>|07ibe#GIFts z9T%3TIKZ(@9;E=3o0ffcj591HLXiHiCEE%jIMOmbL2*EVf^L#so6rXM+cKW(8j(Q$ zmiaUK^DFz+;j!?f2x_6}O;nXgo zED9?V&X(P}W3$z_g387~yl3;0M3AKII?F*EX-NHnu^{)3rIgFAd*1Lj%%;`XqOCO6 zvcbu(l(PCLKhOK+{GBWbEf?MIrmM4GOt5B(_K<62HPT~B@VLmbeY4L8)Ac$Oc&HpV z@SfA`H6Z2{==yZuD7B+c<+}1!G_k>4Ux!|tOa5AFf$CXi@zrxTWN&`-YKuH*xbz8V zj&&Vbs;?T&5qSwZ1tD=Mq>(I#Ttv|`B#{S~e(`M^`U3|L?XhtoL=|x!?e-Knks3nB zZK2~|5m75Ue?d%<0i@!+6b%br?IgA3TOpNU;nJJSPI|Q>^&>cDKW!QeG_5@~qxU8_ z{70`L;pOOHapn7X!-nos)AhF3sWMc%KMlN|l!-!0<|gxW3Hn1^SLiFUr4kZ{b8R@p znMapW>+Ljt!b{V@ofn-nynG}tQ^|Z=n%KpyXJ!>&_{|*V9f|dLl62-Cumc~W+#z|F zZDYhAaGTHs-XHK@XhW8DyTA@sh58t1224fw^uqQ8M=EpDphoe4BANI$ zY@=Xan5ue#SwERVP0aj0JVj|n>POM~h0FVGtMs6pA=AaN`(;HwVj8_=uDkBqUAcSS zT;#BMgPs0l8k4!gy2A*>V&buE=hVbA|70f#^Vr40RY2>1L1BqjaduFIxDeuIEF~6& z2qmS^dprNQwU#w6L2et@15ut^Cb%%*k`Rd-6h(C_X&W&3sBBjAdSg?n)k|fqzjgRo zLm~c2r+TYJtH}$toFqOPe(_6pB`h5{c)3@deDlV^WXz}6r_4xEF~-B@GOzJIb#--$ zZz;eEa9K3tlBmc^D9y%rq0E7e9!E0?rEg+>oyvC*D6e#*4Xgnx|IeoO*~!*&J4*FC zL}A06$-32dO0ixvU)MT1uPJt^I!P7(SMg2mMtidZ2!E-fGpOQ2uZ*&?OUVd-B)`{vIT_2g}3QBrn|k4)6~^b*>Jm*-RR9T3!M|!%Qx@f z-h9l=_8>LOM`OnxgrJX_SwAIK#>B-9k4I3CMi{(!lOr(T5|y}d{(wc}JE$8SbE8(S zHdo7tH6z1WktQKi1EUeF0?fy1fF~isY6Y$M-V|-+rQ_~S()FcB72AsA=yU^u+}CZuuNSTeD~Xsiakh9k$1AD0Wc_Cc>kz;eSus8dmMV5`POxOpv8 zJ7EI27E)p;^5M5;XmK;v4F8Pxf}jiLk32VAXhd1jrMZp1D5!JD2f>=yxf!|~BEsJw z_lp;3ga7f*4jjk``R~#lKbDkAw?45rRZO`tj7eKvAO)vz*FD}{yH36T(qV&48>uv) zNo3GUap!5e^>w}5;pqXk$#y!hmtp!5BO#E*V7s2%<$c%*iyGnb(a6J!q8<`ksJU9n z{$Tn61Vpt85KlKbTTM=OX%nEEck3Vg*p58=;AEo#F`VnE4iN!ii#Yco1#0~ClEd!n zgww(;q;4h{0S{UUx-hXMX3-Sra|8{)F$??nPE7H=FSSJ7D zs64QYz|<%XyC1KAF3nC`ZF%>kRaorzkO_?jmsAOVk5>_mHp(CUj9nUxiYqy2JmBAJ zjLMp@IK4_fzv8x8eAGCq(kK31ZNuN8tRX`&3B85blP|H@`#c4x_g|!T+XT65Cgu|VRKSXO`cODyf)R3zqRzI zlTWf{c4i@G=iFvthNBirjG<=TYntA@| z8#iPKbst>=Bt-y5$e<d&Ou9_5$oj)zr!fmWL@fgw%q%9ScgKx4J@|*-?6l>)`s{3?#4ty|^j} zls{{Xbp_>GTL7#Vv>$NhFzFiQA)-DQ&N!FEi4aH%PNJBYYPq3Cdf>nOoY9|iB4n`| zXT294Amv-Z=^g=D&f_w_Eh3mm2Eu02s$#c$be**0C#vM0)1l%58jQL0aX1FH%U}Zf zduERPTB9D}%hZbk^$xP##9ibB`(eChI2eRuSbKD@@g}rg`d>ntEn?olkFL$yz1kE1 z;{qVB)dph}wy2xxML`>)$A~)<^gRF~0f>HC-zuu8>(amLALfHk$Yzyui`di<%oxBS zXig=b8>4Xqufux+FcuopDEy3|lP3i{Y4C;dpf)1Dc`)vnj+_D^(XMKD+{ux=loUF& zs!(xC0CR|0_sd2CrwJ**nTiy;Td1MorIOuZUS_93PerWD)z0zruwe&ZvB?6T1?eFh zI@oCB?>32aU?$QC4U#}VZ!p2BsxkQWk%QFD`&0QJyWoG&4kZj{ZP@o$nk;VT3g^{3*Sr1k~h9A%1>ecxd?c;VnKdd_V}=L~)hGSl4*N(V>et@1~XW2Vw+ z7`lGVc@9utgWMGcqM$$lT;d`7L={t0Fy}!6;c>U1VDh&N0TB_{^(ydT6RZ-{g+c@G7C2Ink%fo43UjuOA{!#SFr;fH<9(m8>}Nv8fr}6-FgDzm zZ-c;tY{2?n3Ja6FmT;wGcVIs0j9;6JOj0x3io>A%o*q~m@JtuAH(R@_L7{Oa6L`*` zpy4JwBaj;dIGTMs@ESbP9mnrIOGwyIB1Gov_S-MEOSQG{VJ;pT&~f#ZuyG>)LY=5$ z@4)I3F7i@83AqYN14DFS2uTsafnW|W)jg-9vv2h|G#ZINgMa`Jt3Rg65GE45QAEfj zW0c=Or%C9*gzHKU$M0O>4Q65GL?Z_~j|zNwL8$_kMvG-OVi51uTO#}S_hC9U9xJLz zkm9%vc*4Z3mEe`i2WJ5g+OXY0?vWhIsE3OLL@o~=Kjw+%MRkLjN_@)q`+NJN;&fN~x;euv<8Qrt zKGjJlG5+-C?&nXKCD@NDSR7T}emB5O;D@f^nXD?)zisK&W1XhSCNV5Rcegj`Mp3^Q zRfaXCPnsHUn3}auPUZd@YaU#TVeuy|XxH6WiZim|KlNbesRtQbgWsp(|G)AsIiFV` z+pjeNQ3bSsVvOg0S9fDFy-l~-xWYjP;(lwvu8W7z(q-{{56*9kB z8webd2nn$K`VRl~PAA_N_fNmXKJ;(=E)c0S2IPBmerA{feoBB}@5|BRtiw;0)h?GE zXYp%8!{!ZZn(%|Wnf)@dveMwcaJl6`(VsFwz;A~@zK(&x23WCVX9b_!S=u!V91}i6 zg!GzPbD+grE0l~K#8z6g54c}xh)d!ghxB86DSv8S_n5Pa*ypx3C7xhC6ncb>dg)Rf zm^{V!LP7PcpdbkVw;hu3#aHOL`_fHwOs+y0R{n*vDqP6 zngeg%dr|XSn41w6@*yx17`Y|2cLJ@$qwNh06!uh}EX-)jNsn9(2 zI{N(Gt`KeR19NC*v6D{)oW}^J@!fWk7zKW*=mtr(hO#lFpz3sUb2Asx?_OVe_bcp9}{e9VbKkujWI3? zf@EVSC1i(WHvQ(A|9eHX3|9A*hWo#M{ffKTg)BPuotdR&&pnY^y65IF0~1yJRkUzJ zN=gc4;3u(y>sVD=P|1Q7cu*yy!M)jMmGofB$}Gz+30fcd+hh^(fRC)o$1R4{1kITw z+W@HZF!ghv{k3cQn#@E(+AF&txqgd4HwxNa;WfV7x?vVgyzl@ObFb(pNd&F{0?41| zXI@U`1f%T^ueUFsJ{^{cA|0VT0m%AIuxg)}o~&K597ObE0wD&7@PqJ>BvvYirnIqm zI4g#z@H=O5;X7j!1$3RoTT0dFRxkR?gq7pV)rJ|QGE9zyHVjayuM-oQT1R1%8dY}! z`A(>U@9sh3*oZ9oazlB}8Bah7p)OV&(xX(~1EJDP`#e#gjum>zqa2jE24hG1`eM8j7=BSO#-3$OKo|aJXlN)So3J8GO-*5uL&m|u_!z0bk33=x z#=ou2NvejGH9ip`!z{|v34;`$hdYSwP%*(Fc_VCA+JA+krz9Gq*YWAERnpV^XJdY$wXDyvh!E#gV4M)_!QjCfld$RQIm*2 zCE?g2FrcLZ*EP%=9j%a^4?AF?+}E(mo;`j25>RbyCuFEuO~&DE zx&dF$_VDEUXb5(X-`2MdmZ}#m z>rP9eYCPT*VA*m20ScHSPV{3Vy_N$WM~{5>+|pp2-emPWqkWicGq^mPh3VT-a9)%4 z-o9+T!UcVW&Kv+juziL&C&iKt1mKJmM;)*>0K04bfnh8C`Fg^gQ(?pslF7-4JqUSg zC=O+F4WB-3Kd^lKS0L^ce&!u?>t-(v+gH|MVd~r31gzeUM-=WBom_E4@NoNA-eB>G zi8D(fm47Qc`IDO#2z0=O4Iw-rleI6+4XBf3!PnOpw;NB5L#s?~|98ytxM|tKZuf!9 z&dzpy_i8&`8->9C8i+Uwo={k;vwX0Gz!6ZaPvJjvw;YG|==1HxhSp=^$$^x&{5p^J zwY8gtdFrts3Tji(DI?MdwEc+X4G!Vd%&}+eG#+RNW7M*yW@w|RVtt0yt;{VvuDuA~ z0bSmT%L>F^#ruNP=XZ>r_H9!2R+9*>SU(*~nJqhggNykTPh5db%lhboVJ4c@`$IRB z>8q@2eYyOanTLOT{B;Cb#HLS0?h97QOj(wW>&IP{*xfI_%9FfXZXfC8I6vyJc+pwF}4=S>*Gf6yaFrq5m)0r-gEBT1)mIst$+ z7`SupH6yyCoS?vNi;qWmf*bk^1YuA-Hn(J<-vUx3Xc72>wtyFo$BN}uRaNq)Xqmmz z{vBWx#xs5WDden(N>@O+${fUo78aD91iyY0g~7Gp zQQ){|89l&H8sN|GzdT&`lruaA_8 zVyG>xmuAZ4WM#|#li!Wt?4ijQspn_Xl%Sb7Hshe1r6N&wFp037^*abuDU zACCZ;@3B^b52d9&z>#@=_ML+c3MzhPBH0Nj!9~`j=f#1k-OmdPpOVo9d4KOaHW_W{ zbD3|>+V|J9Al_er=Z;wz>br{5g^K-E{$} zed!l%vQWEl79UV5GB!FI+w}y<4|MB(lUtOJ5lizv%hD>RW6jg+qo;6j>~nd5X0{#j z;iwJ?+A{qhl9{z$Yw<_SeMIs<)Q2)ru%uT@(yl~`CGR+jHgX9t(K2I4c%R~8LZ3Co zG8|}-?@e)lhPWblg6VG|ssiEg={KsdHMO)nMsYwI1~3oF8q|5EbJs$D#c&4cuWP&?R z1}&ksS3Mmd7echf8kK!-NPXnM2yeAuyiU zUHYDrv227T0=mRH9STX4|G*NX7L*F*ix=5&@w`dO^969Un3K<6uCPVIMNoM#DUCF- zB0!1OB2fndNYFEA#FV6mN(-ji{NTC(ugr@V&+svJB0;7LF0l8=F7etFmzqjnVO!b^ z%b;`gINau5>~_dw{$;M*^pGExMlH;mXlZGIs�x@eYHM#4X@Wk!aa{Zff$uM8z)7 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ΞomJJJc#+@4iRACRh8;CT1Q1cv1ZdF??lmt$ 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 z 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 SpFah@9?L#`kR$WT`+or`3uJx( literal 0 HcmV?d00001 diff --git a/mft-fs/images/solution.png b/mft-fs/images/solution.png new file mode 100644 index 0000000000000000000000000000000000000000..769a93f3c7bcfcaf955ad631919fecbc608bb401 GIT binary patch literal 176695 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

    a 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

    6Uq(w`x>U7vfYKwqwL2# zBE=mfPqbfb!$uj~e1w>l;d1lal@L7!YY~7xfN#MGNgbV=?pOXu61V)ry zzYJaDkBU2bo~RB|s@1L_)Mbxeur+`c0))6&n1VDZe8BrMUOZHS_|%{z$2qEYYQKo^ zQfuL+HYG@O(lB>d0+WNVqt5M@CQ-#QPy#`BQ?|6YtHbk0n$yYqkG>Kx9PWyBF*4?x zKA%>8C#na)IYAXD8OpYU+ex4xYXw1E5z2yk{lMTL(M@E+?ZXf9q2t=s_6V>#S$1s& zS78}%7oe~RZ3Kmex*@@KIAXusc8~+W8}R=Nx^e{&-9pOG6+p>~Xm0O1+Wc-Q=XKlP z&k%whq|&Nz;5np%daSSssYLQg--F{CoivS!j7VJ(C5NK;4*|+-R!n&+jx!Q#? z-1y_*ZveI75==PIvU$)a~fBti@_)ZQz+LXCBi>4PTQ<96Sz@ z=nWW=`E;n}t$%w6?1NrB@92eTD!|p*E$+?kO)D=VIqt?M@y6A*-End9JsO+oICbTi jZw>KSSKI$^TAiIi?cMj&fM0yF3)=2odv Date: Tue, 7 Jan 2025 08:39:36 -0500 Subject: [PATCH 32/37] bugfix --- mft-fs/safe-remotefs/client/client_manager.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/safe-remotefs/client/client_manager.go index affbb0d9..d1ad83c3 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/safe-remotefs/client/client_manager.go @@ -20,6 +20,13 @@ type cacheInfo struct { handle fuseops.HandleID } +func minimum(a int, b int) int { + if a < b { + return a + } + return b +} + func newCacheInfo() *cacheInfo { return &cacheInfo{ cache: false, @@ -268,7 +275,7 @@ func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int } manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() manager.localInfo[inode].cache = true - for i := 0; i < min(len(data), len(resp.Data)); i++ { + for i := 0; i < minimum(len(data), len(resp.Data)); i++ { data[i] = resp.Data[i] } file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) From e54159f8fe417f2a89026057789c6791a873acf7 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Sat, 16 Aug 2025 22:08:38 -0400 Subject: [PATCH 33/37] updated filesystem + SFTP untested implementation --- mft-fs/abstractfs/abstractfs.go | 444 +++++++++++++++ mft-fs/abstractfs/abstractfs_utils.go | 296 ++++++++++ .../abstractfs/abstract_fs_operations.go | 62 +-- mft-fs/{ => archive}/abstractfs/fs_manager.go | 0 mft-fs/{ => archive}/basicfs/basic_fs.go | 0 mft-fs/{ => archive}/main/main.go | 4 +- .../osfsmanager/os_fs_manager.go | 2 +- .../remotefs/client/client_manager.go | 36 +- .../remotefs/clientmain/client_main.go | 4 +- mft-fs/{ => archive}/remotefs/comm.proto | 0 .../remotefs/remotefscomms/comm.pb.go | 0 .../remotefs/remotefscomms/comm_grpc.pb.go | 0 .../remotefs/remotefscomms/commutils.go | 2 +- .../remotefs/server/server_manager.go | 60 +-- .../remotefs/servermain/server_main.go | 4 +- .../safe-remotefs/client/client_manager.go | 40 +- .../safe-remotefs/clientmain/client_main.go | 4 +- mft-fs/{ => archive}/safe-remotefs/comm.proto | 0 .../safe-remotefscomms/comm.pb.go | 0 .../safe-remotefscomms/comm_grpc.pb.go | 0 .../safe-remotefscomms/commutils.go | 2 +- .../server/safe_os_fs_manager.go | 2 +- .../safe-remotefs/server/server_manager.go | 66 +-- .../safe-remotefs/servermain/server_main.go | 4 +- mft-fs/go.sum | 77 +++ mft-fs/grpcfs/grpcfs.go | 302 +++++++++++ mft-fs/main.go | 182 +++++++ mft-fs/osfs/osfs.go | 335 ++++++++++++ mft-fs/planning.txt | 93 ++++ mft-fs/sftpfs/sftp_test_server/host_key | 27 + mft-fs/sftpfs/sftp_test_server/main.go | 151 ++++++ mft-fs/sftpfs/sftpfs.go | 510 ++++++++++++++++++ 32 files changed, 2563 insertions(+), 146 deletions(-) create mode 100644 mft-fs/abstractfs/abstractfs.go create mode 100644 mft-fs/abstractfs/abstractfs_utils.go rename mft-fs/{ => archive}/abstractfs/abstract_fs_operations.go (86%) rename mft-fs/{ => archive}/abstractfs/fs_manager.go (100%) rename mft-fs/{ => archive}/basicfs/basic_fs.go (100%) rename mft-fs/{ => archive}/main/main.go (93%) rename mft-fs/{ => archive}/osfsmanager/os_fs_manager.go (99%) rename mft-fs/{ => archive}/remotefs/client/client_manager.go (85%) rename mft-fs/{ => archive}/remotefs/clientmain/client_main.go (94%) rename mft-fs/{ => archive}/remotefs/comm.proto (100%) rename mft-fs/{ => archive}/remotefs/remotefscomms/comm.pb.go (100%) rename mft-fs/{ => archive}/remotefs/remotefscomms/comm_grpc.pb.go (100%) rename mft-fs/{ => archive}/remotefs/remotefscomms/commutils.go (98%) rename mft-fs/{ => archive}/remotefs/server/server_manager.go (66%) rename mft-fs/{ => archive}/remotefs/servermain/server_main.go (84%) rename mft-fs/{ => archive}/safe-remotefs/client/client_manager.go (89%) rename mft-fs/{ => archive}/safe-remotefs/clientmain/client_main.go (94%) rename mft-fs/{ => archive}/safe-remotefs/comm.proto (100%) rename mft-fs/{ => archive}/safe-remotefs/safe-remotefscomms/comm.pb.go (100%) rename mft-fs/{ => archive}/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go (100%) rename mft-fs/{ => archive}/safe-remotefs/safe-remotefscomms/commutils.go (98%) rename mft-fs/{ => archive}/safe-remotefs/server/safe_os_fs_manager.go (99%) rename mft-fs/{ => archive}/safe-remotefs/server/server_manager.go (67%) rename mft-fs/{ => archive}/safe-remotefs/servermain/server_main.go (82%) create mode 100644 mft-fs/grpcfs/grpcfs.go create mode 100644 mft-fs/main.go create mode 100644 mft-fs/osfs/osfs.go create mode 100644 mft-fs/planning.txt create mode 100644 mft-fs/sftpfs/sftp_test_server/host_key create mode 100644 mft-fs/sftpfs/sftp_test_server/main.go create mode 100644 mft-fs/sftpfs/sftpfs.go diff --git a/mft-fs/abstractfs/abstractfs.go b/mft-fs/abstractfs/abstractfs.go new file mode 100644 index 00000000..ac811fa3 --- /dev/null +++ b/mft-fs/abstractfs/abstractfs.go @@ -0,0 +1,444 @@ +/* +Package abstractfs +abstractfs is a FUSE-based filesystem wrapper +it defines an interface for a filesystem Manager, which can be implemented by any filesystem +it implements FUSE operations which calls the respective methods of the filesystems +*/ +package abstractfs + +import ( + "context" + "fmt" + "time" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" +) + +type NoImplementationError struct{} + +func (e NoImplementationError) Error() string { + return "No implementation" +} + +/* +The printer function prints messages to the terminal on behalf of FUSE operations. +*/ +func printer(message string) { + fmt.Println(message) + + /*file, _ := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + defer file.Close() + file.WriteString(fmt.Sprintf("%s\n", message))*/ +} + +func minimum(a int64, b int64) int64 { + if a < b { + return a + } + return b +} + +func expireTime() time.Time { + return time.Now().Add(time.Minute) +} + +type AbstractFS struct { + fuseutil.NotImplementedFileSystem + Manager FSManager + MountDir string + + Cachable bool + CacheDir string +} + +// private helpers + +// fillAttributes +// todo: update local inode info once fetched from remote +func (fs AbstractFS) fillAttributes(inode fuseops.InodeID, attributes *fuseops.InodeAttributes) error { + info, e := fs.Manager.GetInfo(inode) + if e != nil { + return fuse.ENOENT + } + + attributes.Size = info.Size + + attributes.Nlink = info.Nlink + + attributes.Mode = info.Mode + + attributes.Atime = info.Atime + attributes.Mtime = info.Mtime + attributes.Ctime = info.Ctime + attributes.Crtime = info.Crtime + + attributes.Uid = info.Uid + attributes.Gid = info.Gid + + return nil +} + +// public methods + +func NewAbstractFS(manager FSManager) (AbstractFS, error) { + fs := AbstractFS{ + Manager: manager, + } + return fs, nil +} + +// FUSE Operations + +// StatFS +// call Manager's GetSize and GetLength methods to perform operation +func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { + printer("StatFS") + + op.BlockSize = 4096 + + size, e := fs.Manager.GetSize() + op.Blocks = 64 + op.BlocksFree = uint64(64 - uint32(size)/op.BlockSize) + op.BlocksAvailable = op.BlocksFree + + op.IoSize = 4096 + + op.Inodes = 128 + length, e := fs.Manager.GetLength() + if e != nil { + return e + } + op.InodesFree = op.Inodes - length + + return nil +} + +// LookUpInode +// call Manager's GetInode to get latest information +// todo: update local info once fetched from remote +func (fs AbstractFS) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) error { + printer("LookUpInode") + + // does parent exist? + parentInfo, e := fs.Manager.GetInfo(op.Parent) + if e != nil { + return fuse.ENOENT + } + + // is parent a directory? + if parentInfo.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // does child exist in parent? + index, ok := parentInfo.ChildrenIndexMap[op.Name] + if !ok { + return nil // fuse.ENOENT + } + + // get child's inode + childInode := parentInfo.Children[index] + + // fill information + op.Entry.Child = childInode + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) error { + printer("GetInodeAttributes") + + op.AttributesExpiration = expireTime() + return fs.fillAttributes(op.Inode, &op.Attributes) +} + +// SetInodeAttributes +// todo: update local information too; possible data race: remote locking? +func (fs AbstractFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) error { + printer("SetInodeAttributes") + op.AttributesExpiration = expireTime() + e := fs.Manager.SetInfo(op.Inode, op.Uid, op.Gid, op.Size, op.Mode, op.Atime, op.Mtime) + if e != nil { + return e + } + return fs.fillAttributes(op.Inode, &op.Attributes) +} + +// ForgetInode +// todo account for references and hard links +func (fs AbstractFS) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) error { + printer("ForgetInode") + return fs.Manager.Delete(op.Inode) +} + +func (fs AbstractFS) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) error { + printer("BatchForget") + var e error + for _, entry := range op.Entries { + e = fs.Manager.Delete(entry.Inode) + if e != nil { + return e + } + } + return nil +} + +func (fs AbstractFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error { + printer("MkDir") + + // get parent information + info, e := fs.Manager.GetInfo(op.Parent) + if e != nil { + return e + } + + // check if parent is a directory + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // already exists? + _, ok := info.ChildrenIndexMap[op.Name] + if ok { + return fuse.EEXIST + } + + childInode, e := fs.Manager.MkDir(op.Parent, op.Name, op.Mode) + if e != nil { + return e + } + + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + op.Entry.Child = childInode + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) error { + printer("CreateFile") + + // get parent information + info, e := fs.Manager.GetInfo(op.Parent) + if e != nil { + return e + } + + // check if parent is a directory + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + // already exists? + _, ok := info.ChildrenIndexMap[op.Name] + if ok { + return fuse.EEXIST + } + + childInode, e := fs.Manager.CreateFile(op.Parent, op.Name, op.Mode) + if e != nil { + return e + } + + op.Entry.AttributesExpiration = expireTime() + op.Entry.EntryExpiration = expireTime() + op.Entry.Child = childInode + op.Handle = fuseops.HandleID(childInode) + if e != nil { + return e + } + return fs.fillAttributes(childInode, &op.Entry.Attributes) +} + +func (fs AbstractFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error { + printer("RmDir") + + info, e := fs.Manager.GetInfo(op.Parent) + if e != nil { + return e + } + + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + + inode := info.Children[info.ChildrenIndexMap[op.Name]] + return fs.Manager.RmDir(inode) +} + +func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { + printer("OpenDir") + op.Handle = fuseops.HandleID(op.Inode) + return nil +} + +func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { + printer("ReadDir") + + info, e := fs.Manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.DirentType != fuseutil.DT_Directory { + return fuse.ENOTDIR + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + printer(fmt.Sprintf("Path: %v\tOffset: %v\n", info.Path, op.Offset)) + + //if fuseops.DirOffset(len(data)) < op.Offset { + // return nil + //} + + op.BytesRead = 0 + bytesRead := 0 + currentBytesRead := 0 + buff := make([]byte, 1024) + for _, childInode := range info.Children { + dirent := fuseutil.Dirent{} + childInfo, e := fs.Manager.GetInfo(childInode) + if e != nil { + return e + } + dirent.Inode = childInfo.Inode + dirent.Name = childInfo.Name + dirent.Type = childInfo.DirentType + dirent.Offset = fuseops.DirOffset(bytesRead) // - op.Offset + currentBytesRead = fuseutil.WriteDirent(buff, dirent) //op.Dst[bytesRead:], dirent) + if bytesRead >= int(op.Offset) { + copy(op.Dst[op.BytesRead:], buff) + op.BytesRead += currentBytesRead + printer(fmt.Sprintf("Inode: %v\tName: %v\tOffset: %v\n", dirent.Inode, dirent.Name, dirent.Offset)) + } + bytesRead += currentBytesRead + } + + if int(op.Offset) >= bytesRead { + return nil + } + + currentBytesRead = fuseutil.WriteDirent(op.Dst[op.BytesRead:], fuseutil.Dirent{ + Offset: fuseops.DirOffset(bytesRead), + Name: ".", + Type: fuseutil.DT_Directory, + Inode: op.Inode, + }) + bytesRead += currentBytesRead + op.BytesRead += currentBytesRead + + // op.Dst = op.Dst[op.Offset:] + // op.BytesRead = bytesRead - int(op.Offset) + + printer(fmt.Sprintf("Bytes Read: %v\n", op.BytesRead)) + + fmt.Println("done") + + return nil +} + +func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { + printer("ReleaseDirHandle") + return nil +} + +func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error { + printer("OpenFile") + op.Handle = fuseops.HandleID(op.Inode) + return nil +} + +func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { + printer("ReadFile") + + info, e := fs.Manager.GetInfo(op.Inode) + if e != nil { + return e + } + + if op.Handle != info.Handle { + return fuse.ENOENT + } + + if op.Dst != nil { + buff := make([]byte, op.Size) + byteCount, _ := fs.Manager.ReadAt(op.Inode, buff, op.Offset) + /*if e != nil { + return e + }*/ + op.BytesRead = int(minimum(int64(byteCount), op.Size)) + for i := 0; i < op.BytesRead; i++ { + op.Dst[i] = buff[i] //append(op.Dst, buff[i]) + } + printer(string(buff)) + printer(fmt.Sprintf("read requested at offset: %v\tbytes read: %v", op.Offset, byteCount)) + return nil + } + + // todo implement vector read + fmt.Println("vector read requested") + + return NoImplementationError{} +} + +func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) error { + printer("WriteFile") + + info, e := fs.Manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + _, e = fs.Manager.WriteAt(op.Inode, op.Data, op.Offset) + if e != nil { + return e + } + + return nil +} + +func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error { + printer("SyncFile") + + info, e := fs.Manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + return fs.Manager.SyncFile(op.Inode) +} + +func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error { + printer("SyncFile") + + info, e := fs.Manager.GetInfo(op.Inode) + if e != nil { + return e + } + if info.Handle != op.Handle { + return fuse.ENOENT + } + + return fs.Manager.SyncFile(op.Inode) +} + +func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { + printer("ReleaseFileHandle") + return nil +} + +func (fs AbstractFS) Destroy() { + printer("Destroy") + fs.Manager.Destroy() + fuse.Unmount("./mount") +} diff --git a/mft-fs/abstractfs/abstractfs_utils.go b/mft-fs/abstractfs/abstractfs_utils.go new file mode 100644 index 00000000..69df4836 --- /dev/null +++ b/mft-fs/abstractfs/abstractfs_utils.go @@ -0,0 +1,296 @@ +package abstractfs + +import ( + "os" + "time" + + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + + "mft-fs/datastructures" +) + +type FileSystem interface { + fuseutil.FileSystem +} + +/* +FSManager Interface +the FSManager interface can be implemented by any custom filesystem +its methods are used by the AbstractFS fuse server +*/ +type FSManager interface { + /* + Start method to initiate any FS Manager. + params: None + returns: + error: any arror caused by the invocation + */ + Start() error + + /* + Teardown method to close any FS Manager. + params: None + returns: + error: any error caused by the invocation + */ + Teardown() error + + /* + GetSize method to get the size of the filesystem + params: None + returns: + uint64: the size of the filesystem, in bytes + error: any error caused by the invocation + */ + GetSize() (uint64, error) + + /* + GetLength method for getting the length of the filesystem + params: None + returns: + uint64: the length of the filesystem (count the number of unique inodes) + error: any error caused by the invocation + */ + GetLength() (uint64, error) + + /* + GetInfo method for getting stats and metrics of a specific inode + params: + id fuseops.InodeID: the inode for which the information is required + returns: + *FileInfo: a reference to the FileInfo object which describes the inode's information + error: any error caused by the invocation + */ + GetInfo(id fuseops.InodeID) (*FileInfo, error) + + /* + SetInfo method for setting or modifying an inode's attributes + params: + id fuseops.InodeID: the inode in question + uidptr *uint32: a pointer to the new UserID for the inode's ownership; if no change is desired, pass nil + gidptr *uint32: a pointer to the new GroupID for the inode's ownership; if no change is desired, pass nil + sizeptr *uint64: a pointer to the new size of the inode (in bytes); if no change is desired, pass nil + modeptr *os.FileMode: a pointer to the new filemode of the inode; if no change is desired, pass nil + atimeptr *time.Time: a pointer to the new access time of the inode; if no change is desired, pass nil + mtimeptr *time.Time: a pointer to the new modification time of the inode; if no change is desired, pass nil + returns: + error: any error caused by the invocation + */ + SetInfo(id fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error + + /* + Delete method for deleting an inode from the filesystem entirely + params: + inode fuseops.InodeID: the inode to be deleted + returns: + error: any error caused by the invocation + */ + Delete(inode fuseops.InodeID) error + + /* + MkDir method for creating a directory + params: + parent fuseops.InodeID: inode of the parent directory + name string: name of the directory to be created + mode os.FileMode: mode to set permissions for the new directory + returns: + fuseops.InodeID: the inode of the new directory + error: any error caused by the invocation + */ + MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + + /* + CreateFile method to create a new file + params: + parent fuseops.InodeID: inode of the parent directory + name string: name of the file to be created + mode os.FileMode: mode to set permissions for the new file + returns: + fuseops.InodeID: the inode of the newly created file + error: any error caused by the invocation + */ + CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) + + /* + RmDir method for removing a directory + params: + inode fuseops.InodeID: inode of the directory being deleted + returns: + error: any error caused by the invocation + */ + RmDir(inode fuseops.InodeID) error + + /* + SyncFile method for syncing a file + params: + inode fuseops.InodeID: inode of the file being synced + returns: + error: any error caused by the invocation + */ + SyncFile(inode fuseops.InodeID) error + + /* + WriteAt method for writing data to a file at a specific offset + params: + inode fuseops.InodeID: the inode of the file being written to + data []byte: the bytes being written in + off int64: the offset of the location to write to + returns: + n int: the number of bytes written + err error: any error caused by the invocation + */ + WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + + /* + ReadAt method for reading from a file at a specific offset + params: + inode fuseops.InodeID: the inode of the file being read from + data []byte: the buffer to store all data being read into + off int64: the offset of the location to read from + returns: + n int: the number of bytes read + err error: any error caused by the invocation + */ + ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) + + /* + Destroy method for destroying a filesystem + params: None + returns: + error: any error caused by the invocation + */ + Destroy() error +} + +/* +FileInfo struct for representing a file's information +*/ +type FileInfo struct { + // name of the file/directory + Name string + + // path to the file/directory + Path string + + // inode of the file/directory + Inode fuseops.InodeID + + // if it is a directory, a slice with inodes of all children + Children []fuseops.InodeID + + // if it is a directory, a map: name of child -> index of child in Children slice + ChildrenIndexMap map[string]int + + // inode of the parent directory + Parent fuseops.InodeID + + // if it is a file, the number of links + Nlink uint32 + + // size of the file/directory + Size uint64 + + // the mode of the file/directory + Mode os.FileMode + + // access time of the file/directory + Atime time.Time + + // modification time of the file/directory + Mtime time.Time + + // creation time of the file/directory + Ctime time.Time + + // creation time of the file/directory + Crtime time.Time + + // user id of the file/directory ownership + Uid uint32 + + // group id of the file/directory ownership + Gid uint32 + + // dirent type (file, directory, other) + DirentType fuseutil.DirentType + + // handle to the file/directory + Handle fuseops.HandleID + + // boolean variable to assess whether file has been cached locally + Cache bool + + // time the variable was downloaded to the local cache + CacheTime time.Time + + // time the metadata of the file was modified + MetadataWriteTime time.Time + + // time the content of the file was modified + ContentWriteTime time.Time + + // CREW lock for metadata + MetadataLock *datastructures.CREWResource + + // CREW lock for content + ContentLock *datastructures.CREWResource +} + +func (info *FileInfo) AddChild(childName string, childInode fuseops.InodeID) { + info.Children = append(info.Children, childInode) + info.ChildrenIndexMap[childName] = len(info.Children) - 1 +} + +/* +NewFileInfo method to create a new FileInfo +*/ +func NewFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { + return FileInfo{ + Name: name, + Children: make([]fuseops.InodeID, 0), + ChildrenIndexMap: make(map[string]int), + Parent: parent, + Inode: inode, + Path: path, + DirentType: direntType, + Cache: false, + CacheTime: time.Unix(0, 0), + ContentWriteTime: time.Now(), + } +} + +/* +NewSafeFileInfo method to create a new FileInfo + - also initializes CREW locks +*/ +func NewSafeFileInfo(name string, path string, inode fuseops.InodeID, parent fuseops.InodeID, direntType fuseutil.DirentType) FileInfo { + return FileInfo{ + Name: name, + Children: make([]fuseops.InodeID, 0), + ChildrenIndexMap: make(map[string]int), + Parent: parent, + Inode: inode, + Path: path, + DirentType: direntType, + Cache: false, + CacheTime: time.Unix(0, 0), + ContentWriteTime: time.Now(), + MetadataWriteTime: time.Now(), + ContentLock: datastructures.NewCREWResource(), + MetadataLock: datastructures.NewCREWResource(), + } +} + +/** +TODO + - implement caching + - read/write request + - request contains cacheBool and cacheTime + - permission granted for read iff cache is invalid + - permission granted for write iff cache is valid + - read/write ack + - send inode in request + - return new writecontent time + - implement local handles +*/ diff --git a/mft-fs/abstractfs/abstract_fs_operations.go b/mft-fs/archive/abstractfs/abstract_fs_operations.go similarity index 86% rename from mft-fs/abstractfs/abstract_fs_operations.go rename to mft-fs/archive/abstractfs/abstract_fs_operations.go index 142096e5..689ddb63 100644 --- a/mft-fs/abstractfs/abstract_fs_operations.go +++ b/mft-fs/archive/abstractfs/abstract_fs_operations.go @@ -45,13 +45,13 @@ func expireTime() time.Time { type AbstractFS struct { fuseutil.NotImplementedFileSystem - manager FSManager + Manager FSManager } // private helpers func (fs AbstractFS) fillAttributes(inode fuseops.InodeID, attributes *fuseops.InodeAttributes) error { - info, e := fs.manager.GetInfo(inode) + info, e := fs.Manager.GetInfo(inode) if e != nil { return fuse.ENOENT } @@ -77,7 +77,7 @@ func (fs AbstractFS) fillAttributes(inode fuseops.InodeID, attributes *fuseops.I func NewAbstractFS(manager FSManager) (AbstractFS, error) { fs := AbstractFS{ - manager: manager, + Manager: manager, } return fs, nil } @@ -89,7 +89,7 @@ func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { op.BlockSize = 4096 - size, e := fs.manager.GetSize() + size, e := fs.Manager.GetSize() op.Blocks = 64 op.BlocksFree = uint64(64 - uint32(size)/op.BlockSize) op.BlocksAvailable = op.BlocksFree @@ -97,7 +97,7 @@ func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error { op.IoSize = 4096 op.Inodes = 128 - length, e := fs.manager.GetLength() + length, e := fs.Manager.GetLength() if e != nil { return e } @@ -110,7 +110,7 @@ func (fs AbstractFS) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) printer("LookUpInode") // does parent exist? - parentInfo, e := fs.manager.GetInfo(op.Parent) + parentInfo, e := fs.Manager.GetInfo(op.Parent) if e != nil { return fuse.ENOENT } @@ -147,7 +147,7 @@ func (fs AbstractFS) GetInodeAttributes(ctx context.Context, op *fuseops.GetInod func (fs AbstractFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) error { printer("SetInodeAttributes") op.AttributesExpiration = expireTime() - e := fs.manager.SetInfo(op.Inode, op.Uid, op.Gid, op.Size, op.Mode, op.Atime, op.Mtime) + e := fs.Manager.SetInfo(op.Inode, op.Uid, op.Gid, op.Size, op.Mode, op.Atime, op.Mtime) if e != nil { return e } @@ -158,14 +158,14 @@ func (fs AbstractFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInod // todo account for references and hard links func (fs AbstractFS) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) error { printer("ForgetInode") - return fs.manager.Delete(op.Inode) + return fs.Manager.Delete(op.Inode) } func (fs AbstractFS) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) error { printer("BatchForget") var e error for _, entry := range op.Entries { - e = fs.manager.Delete(entry.Inode) + e = fs.Manager.Delete(entry.Inode) if e != nil { return e } @@ -177,7 +177,7 @@ func (fs AbstractFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error { printer("MkDir") // get parent information - info, e := fs.manager.GetInfo(op.Parent) + info, e := fs.Manager.GetInfo(op.Parent) if e != nil { return e } @@ -193,7 +193,7 @@ func (fs AbstractFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error { return fuse.EEXIST } - childInode, e := fs.manager.MkDir(op.Parent, op.Name, op.Mode) + childInode, e := fs.Manager.MkDir(op.Parent, op.Name, op.Mode) if e != nil { return e } @@ -208,7 +208,7 @@ func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) e printer("CreateFile") // get parent information - info, e := fs.manager.GetInfo(op.Parent) + info, e := fs.Manager.GetInfo(op.Parent) if e != nil { return e } @@ -224,7 +224,7 @@ func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) e return fuse.EEXIST } - childInode, e := fs.manager.CreateFile(op.Parent, op.Name, op.Mode) + childInode, e := fs.Manager.CreateFile(op.Parent, op.Name, op.Mode) if e != nil { return e } @@ -232,7 +232,7 @@ func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) e op.Entry.AttributesExpiration = expireTime() op.Entry.EntryExpiration = expireTime() op.Entry.Child = childInode - op.Handle, e = fs.manager.GenerateHandle(childInode) + op.Handle, e = fs.Manager.GenerateHandle(childInode) if e != nil { return e } @@ -242,7 +242,7 @@ func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) e func (fs AbstractFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error { printer("RmDir") - info, e := fs.manager.GetInfo(op.Parent) + info, e := fs.Manager.GetInfo(op.Parent) if e != nil { return e } @@ -252,12 +252,12 @@ func (fs AbstractFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error { } inode := info.Children[info.ChildrenIndexMap[op.Name]] - return fs.manager.RmDir(inode) + return fs.Manager.RmDir(inode) } func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { printer("OpenDir") - handle, e := fs.manager.GenerateHandle(op.Inode) + handle, e := fs.Manager.GenerateHandle(op.Inode) if e != nil { return e } @@ -268,7 +268,7 @@ func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error { func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { printer("ReadDir") - info, e := fs.manager.GetInfo(op.Inode) + info, e := fs.Manager.GetInfo(op.Inode) if e != nil { return e } @@ -291,7 +291,7 @@ func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { buff := make([]byte, 1024) for _, childInode := range info.Children { dirent := fuseutil.Dirent{} - childInfo, e := fs.manager.GetInfo(childInode) + childInfo, e := fs.Manager.GetInfo(childInode) if e != nil { return e } @@ -334,12 +334,12 @@ func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error { func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error { printer("ReleaseDirHandle") - return fs.manager.DeleteHandle(op.Handle) + return fs.Manager.DeleteHandle(op.Handle) } func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error { printer("OpenFile") - handle, e := fs.manager.GenerateHandle(op.Inode) + handle, e := fs.Manager.GenerateHandle(op.Inode) if e != nil { return e } @@ -350,7 +350,7 @@ func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error { printer("ReadFile") - info, e := fs.manager.GetInfo(op.Inode) + info, e := fs.Manager.GetInfo(op.Inode) if e != nil { return e } @@ -361,7 +361,7 @@ func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error if op.Dst != nil { buff := make([]byte, op.Size) - byteCount, _ := fs.manager.ReadAt(op.Inode, buff, op.Offset) + byteCount, _ := fs.Manager.ReadAt(op.Inode, buff, op.Offset) /*if e != nil { return e }*/ @@ -383,7 +383,7 @@ func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) error { printer("WriteFile") - info, e := fs.manager.GetInfo(op.Inode) + info, e := fs.Manager.GetInfo(op.Inode) if e != nil { return e } @@ -391,7 +391,7 @@ func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) err return fuse.ENOENT } - _, e = fs.manager.WriteAt(op.Inode, op.Data, op.Offset) + _, e = fs.Manager.WriteAt(op.Inode, op.Data, op.Offset) if e != nil { return e } @@ -402,7 +402,7 @@ func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) err func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error { printer("SyncFile") - info, e := fs.manager.GetInfo(op.Inode) + info, e := fs.Manager.GetInfo(op.Inode) if e != nil { return e } @@ -410,13 +410,13 @@ func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error return fuse.ENOENT } - return fs.manager.SyncFile(op.Inode) + return fs.Manager.SyncFile(op.Inode) } func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error { printer("SyncFile") - info, e := fs.manager.GetInfo(op.Inode) + info, e := fs.Manager.GetInfo(op.Inode) if e != nil { return e } @@ -424,17 +424,17 @@ func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) err return fuse.ENOENT } - return fs.manager.SyncFile(op.Inode) + return fs.Manager.SyncFile(op.Inode) } func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error { printer("ReleaseFileHandle") - return fs.manager.DeleteHandle(op.Handle) + return fs.Manager.DeleteHandle(op.Handle) } func (fs AbstractFS) Destroy() { printer("Destroy") - fs.manager.Destroy() + fs.Manager.Destroy() fuse.Unmount("./mount") } diff --git a/mft-fs/abstractfs/fs_manager.go b/mft-fs/archive/abstractfs/fs_manager.go similarity index 100% rename from mft-fs/abstractfs/fs_manager.go rename to mft-fs/archive/abstractfs/fs_manager.go diff --git a/mft-fs/basicfs/basic_fs.go b/mft-fs/archive/basicfs/basic_fs.go similarity index 100% rename from mft-fs/basicfs/basic_fs.go rename to mft-fs/archive/basicfs/basic_fs.go diff --git a/mft-fs/main/main.go b/mft-fs/archive/main/main.go similarity index 93% rename from mft-fs/main/main.go rename to mft-fs/archive/main/main.go index 495ec89f..9ed8c081 100644 --- a/mft-fs/main/main.go +++ b/mft-fs/archive/main/main.go @@ -6,8 +6,8 @@ import ( "github.com/jacobsa/fuse" "github.com/jacobsa/fuse/fuseutil" "log" - "mft-fs/abstractfs" - "mft-fs/osfsmanager" + "mft-fs/archive/abstractfs" + "mft-fs/archive/osfsmanager" "os" ) diff --git a/mft-fs/osfsmanager/os_fs_manager.go b/mft-fs/archive/osfsmanager/os_fs_manager.go similarity index 99% rename from mft-fs/osfsmanager/os_fs_manager.go rename to mft-fs/archive/osfsmanager/os_fs_manager.go index 53e232f4..0292ef53 100644 --- a/mft-fs/osfsmanager/os_fs_manager.go +++ b/mft-fs/archive/osfsmanager/os_fs_manager.go @@ -7,7 +7,7 @@ import ( "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" "golang.org/x/sys/unix" - "mft-fs/abstractfs" + "mft-fs/archive/abstractfs" "mft-fs/datastructures" "os" "syscall" diff --git a/mft-fs/remotefs/client/client_manager.go b/mft-fs/archive/remotefs/client/client_manager.go similarity index 85% rename from mft-fs/remotefs/client/client_manager.go rename to mft-fs/archive/remotefs/client/client_manager.go index f1a6dce6..877ca41e 100644 --- a/mft-fs/remotefs/client/client_manager.go +++ b/mft-fs/archive/remotefs/client/client_manager.go @@ -5,25 +5,25 @@ import ( "github.com/jacobsa/fuse/fuseops" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/timestamppb" - "mft-fs/abstractfs" - "mft-fs/remotefs/remotefscomms" + "mft-fs/archive/abstractfs" + remotefscomms2 "mft-fs/archive/remotefs/remotefscomms" "os" "time" ) type ClientManager struct { abstractfs.FSManager - client remotefscomms.RemoteFSCommsClient + client remotefscomms2.RemoteFSCommsClient } func NewClientManager(conn *grpc.ClientConn) (*ClientManager, error) { output := &ClientManager{} - output.client = remotefscomms.NewRemoteFSCommsClient(conn) + output.client = remotefscomms2.NewRemoteFSCommsClient(conn) return output, nil } func (manager *ClientManager) GetSize() (uint64, error) { - resp, e := manager.client.GetSizeComm(context.Background(), &remotefscomms.Empty{}) + resp, e := manager.client.GetSizeComm(context.Background(), &remotefscomms2.Empty{}) if e != nil { return 0, e } @@ -31,7 +31,7 @@ func (manager *ClientManager) GetSize() (uint64, error) { } func (manager *ClientManager) GetLength() (uint64, error) { - resp, e := manager.client.GetLengthComm(context.Background(), &remotefscomms.Empty{}) + resp, e := manager.client.GetLengthComm(context.Background(), &remotefscomms2.Empty{}) if e != nil { return 0, e } @@ -39,7 +39,7 @@ func (manager *ClientManager) GetLength() (uint64, error) { } func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { - resp, e := manager.client.GetInfoComm(context.Background(), &remotefscomms.UintMsg{ + resp, e := manager.client.GetInfoComm(context.Background(), &remotefscomms2.UintMsg{ Data: uint64(inode), }) if e != nil { @@ -48,12 +48,12 @@ func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileIn output := &abstractfs.FileInfo{ ChildrenIndexMap: make(map[string]int), } - remotefscomms.ConvertFromComm(resp, output) + remotefscomms2.ConvertFromComm(resp, output) return output, nil } func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { - request := &remotefscomms.SetInfoParamsMsg{ + request := &remotefscomms2.SetInfoParamsMsg{ Inode: uint64(inode), Uid: -1, Gid: -1, @@ -85,12 +85,12 @@ func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gid } func (manager *ClientManager) Delete(inode fuseops.InodeID) error { - _, e := manager.client.DeleteComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.DeleteComm(context.Background(), &remotefscomms2.UintMsg{Data: uint64(inode)}) return e } func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { - resp, e := manager.client.MkDirComm(context.Background(), &remotefscomms.MkInodeMsg{ + resp, e := manager.client.MkDirComm(context.Background(), &remotefscomms2.MkInodeMsg{ Parent: uint64(parent), Name: name, Mode: uint32(mode), @@ -102,14 +102,14 @@ func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os } func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { - resp, e := manager.client.GenerateHandleComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + resp, e := manager.client.GenerateHandleComm(context.Background(), &remotefscomms2.UintMsg{Data: uint64(inode)}) if e != nil { return 0, e } return fuseops.HandleID(resp.Data), nil } func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { - resp, e := manager.client.CreateFileComm(context.Background(), &remotefscomms.MkInodeMsg{ + resp, e := manager.client.CreateFileComm(context.Background(), &remotefscomms2.MkInodeMsg{ Parent: uint64(parent), Name: name, Mode: uint32(mode), @@ -121,22 +121,22 @@ func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mo } func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { - _, e := manager.client.RmDirComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.RmDirComm(context.Background(), &remotefscomms2.UintMsg{Data: uint64(inode)}) return e } func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { - _, e := manager.client.DeleteHandleComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(handle)}) + _, e := manager.client.DeleteHandleComm(context.Background(), &remotefscomms2.UintMsg{Data: uint64(handle)}) return e } func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { - _, e := manager.client.SyncFileComm(context.Background(), &remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.SyncFileComm(context.Background(), &remotefscomms2.UintMsg{Data: uint64(inode)}) return e } func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { - resp, e := manager.client.WriteAtComm(context.Background(), &remotefscomms.ContentMsg{ + resp, e := manager.client.WriteAtComm(context.Background(), &remotefscomms2.ContentMsg{ Inode: uint64(inode), Data: data, Off: off, @@ -147,7 +147,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in return int(resp.Data), nil } func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { - resp, e := manager.client.ReadAtComm(context.Background(), &remotefscomms.ContentMsg{ + resp, e := manager.client.ReadAtComm(context.Background(), &remotefscomms2.ContentMsg{ Inode: uint64(inode), Data: data, Off: off, diff --git a/mft-fs/remotefs/clientmain/client_main.go b/mft-fs/archive/remotefs/clientmain/client_main.go similarity index 94% rename from mft-fs/remotefs/clientmain/client_main.go rename to mft-fs/archive/remotefs/clientmain/client_main.go index 122cd6ab..872113ba 100644 --- a/mft-fs/remotefs/clientmain/client_main.go +++ b/mft-fs/archive/remotefs/clientmain/client_main.go @@ -8,8 +8,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "log" - "mft-fs/abstractfs" - "mft-fs/remotefs/client" + "mft-fs/archive/abstractfs" + "mft-fs/archive/remotefs/client" "os" ) diff --git a/mft-fs/remotefs/comm.proto b/mft-fs/archive/remotefs/comm.proto similarity index 100% rename from mft-fs/remotefs/comm.proto rename to mft-fs/archive/remotefs/comm.proto diff --git a/mft-fs/remotefs/remotefscomms/comm.pb.go b/mft-fs/archive/remotefs/remotefscomms/comm.pb.go similarity index 100% rename from mft-fs/remotefs/remotefscomms/comm.pb.go rename to mft-fs/archive/remotefs/remotefscomms/comm.pb.go diff --git a/mft-fs/remotefs/remotefscomms/comm_grpc.pb.go b/mft-fs/archive/remotefs/remotefscomms/comm_grpc.pb.go similarity index 100% rename from mft-fs/remotefs/remotefscomms/comm_grpc.pb.go rename to mft-fs/archive/remotefs/remotefscomms/comm_grpc.pb.go diff --git a/mft-fs/remotefs/remotefscomms/commutils.go b/mft-fs/archive/remotefs/remotefscomms/commutils.go similarity index 98% rename from mft-fs/remotefs/remotefscomms/commutils.go rename to mft-fs/archive/remotefs/remotefscomms/commutils.go index 406720d1..1c7ea043 100644 --- a/mft-fs/remotefs/remotefscomms/commutils.go +++ b/mft-fs/archive/remotefs/remotefscomms/commutils.go @@ -4,7 +4,7 @@ import ( "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" "google.golang.org/protobuf/types/known/timestamppb" - "mft-fs/abstractfs" + "mft-fs/archive/abstractfs" "os" ) diff --git a/mft-fs/remotefs/server/server_manager.go b/mft-fs/archive/remotefs/server/server_manager.go similarity index 66% rename from mft-fs/remotefs/server/server_manager.go rename to mft-fs/archive/remotefs/server/server_manager.go index 55bd3d76..6dba102d 100644 --- a/mft-fs/remotefs/server/server_manager.go +++ b/mft-fs/archive/remotefs/server/server_manager.go @@ -3,14 +3,14 @@ package server import ( "context" "github.com/jacobsa/fuse/fuseops" - "mft-fs/osfsmanager" - "mft-fs/remotefs/remotefscomms" + "mft-fs/archive/osfsmanager" + remotefscomms2 "mft-fs/archive/remotefs/remotefscomms" "os" "time" ) type Server struct { - remotefscomms.UnimplementedRemoteFSCommsServer + remotefscomms2.UnimplementedRemoteFSCommsServer manager *osfsmanager.OSFSManager } @@ -21,35 +21,35 @@ func NewServerHandler(root string) *Server { return output } -func (server *Server) GetSizeComm(ctx context.Context, in *remotefscomms.Empty) (*remotefscomms.UintMsg, error) { +func (server *Server) GetSizeComm(ctx context.Context, in *remotefscomms2.Empty) (*remotefscomms2.UintMsg, error) { size, e := server.manager.GetSize() if e != nil { return nil, e } - return &remotefscomms.UintMsg{Data: size}, nil + return &remotefscomms2.UintMsg{Data: size}, nil } -func (server *Server) GetLengthComm(ctx context.Context, in *remotefscomms.Empty) (*remotefscomms.UintMsg, error) { +func (server *Server) GetLengthComm(ctx context.Context, in *remotefscomms2.Empty) (*remotefscomms2.UintMsg, error) { length, e := server.manager.GetLength() if e != nil { return nil, e } - return &remotefscomms.UintMsg{Data: length}, nil + return &remotefscomms2.UintMsg{Data: length}, nil } -func (server *Server) GetInfoComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.FileInfoMsg, error) { +func (server *Server) GetInfoComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.FileInfoMsg, error) { info, e := server.manager.GetInfo(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - output := &remotefscomms.FileInfoMsg{ + output := &remotefscomms2.FileInfoMsg{ ChildrenIndexMap: make(map[string]uint32), } - remotefscomms.ConvertToComm(info, output) + remotefscomms2.ConvertToComm(info, output) return output, nil } -func (server *Server) SetInfoComm(ctx context.Context, in *remotefscomms.SetInfoParamsMsg) (*remotefscomms.Empty, error) { +func (server *Server) SetInfoComm(ctx context.Context, in *remotefscomms2.SetInfoParamsMsg) (*remotefscomms2.Empty, error) { var uidptr *uint32 = nil var gidptr *uint32 = nil var sizeptr *uint64 = nil @@ -78,71 +78,71 @@ func (server *Server) SetInfoComm(ctx context.Context, in *remotefscomms.SetInfo if e != nil { return nil, e } - return &remotefscomms.Empty{}, nil + return &remotefscomms2.Empty{}, nil } -func (server *Server) DeleteComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { +func (server *Server) DeleteComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.Empty, error) { e := server.manager.Delete(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &remotefscomms.Empty{}, nil + return &remotefscomms2.Empty{}, nil } -func (server *Server) MkDirComm(ctx context.Context, in *remotefscomms.MkInodeMsg) (*remotefscomms.UintMsg, error) { +func (server *Server) MkDirComm(ctx context.Context, in *remotefscomms2.MkInodeMsg) (*remotefscomms2.UintMsg, error) { inode, e := server.manager.MkDir(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e } - return &remotefscomms.UintMsg{Data: uint64(inode)}, nil + return &remotefscomms2.UintMsg{Data: uint64(inode)}, nil } -func (server *Server) GenerateHandleComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.UintMsg, error) { +func (server *Server) GenerateHandleComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.UintMsg, error) { handle, e := server.manager.GenerateHandle(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &remotefscomms.UintMsg{Data: uint64(handle)}, nil + return &remotefscomms2.UintMsg{Data: uint64(handle)}, nil } -func (server *Server) CreateFileComm(ctx context.Context, in *remotefscomms.MkInodeMsg) (*remotefscomms.UintMsg, error) { +func (server *Server) CreateFileComm(ctx context.Context, in *remotefscomms2.MkInodeMsg) (*remotefscomms2.UintMsg, error) { inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e } - return &remotefscomms.UintMsg{Data: uint64(inode)}, nil + return &remotefscomms2.UintMsg{Data: uint64(inode)}, nil } -func (server *Server) RmDirComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { +func (server *Server) RmDirComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.Empty, error) { e := server.manager.RmDir(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &remotefscomms.Empty{}, nil + return &remotefscomms2.Empty{}, nil } -func (server *Server) DeleteHandleComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { +func (server *Server) DeleteHandleComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.Empty, error) { e := server.manager.DeleteHandle(fuseops.HandleID(in.Data)) if e != nil { return nil, e } - return &remotefscomms.Empty{}, nil + return &remotefscomms2.Empty{}, nil } -func (server *Server) SyncFileComm(ctx context.Context, in *remotefscomms.UintMsg) (*remotefscomms.Empty, error) { +func (server *Server) SyncFileComm(ctx context.Context, in *remotefscomms2.UintMsg) (*remotefscomms2.Empty, error) { e := server.manager.SyncFile(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &remotefscomms.Empty{}, nil + return &remotefscomms2.Empty{}, nil } -func (server *Server) WriteAtComm(ctx context.Context, in *remotefscomms.ContentMsg) (*remotefscomms.UintMsg, error) { +func (server *Server) WriteAtComm(ctx context.Context, in *remotefscomms2.ContentMsg) (*remotefscomms2.UintMsg, error) { n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) - return &remotefscomms.UintMsg{Data: uint64(n)}, nil + return &remotefscomms2.UintMsg{Data: uint64(n)}, nil } -func (server *Server) ReadAtComm(ctx context.Context, in *remotefscomms.ContentMsg) (*remotefscomms.UintMsg, error) { +func (server *Server) ReadAtComm(ctx context.Context, in *remotefscomms2.ContentMsg) (*remotefscomms2.UintMsg, error) { n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), in.Data, in.Off) - return &remotefscomms.UintMsg{Data: uint64(n)}, nil + return &remotefscomms2.UintMsg{Data: uint64(n)}, nil } diff --git a/mft-fs/remotefs/servermain/server_main.go b/mft-fs/archive/remotefs/servermain/server_main.go similarity index 84% rename from mft-fs/remotefs/servermain/server_main.go rename to mft-fs/archive/remotefs/servermain/server_main.go index a75a977a..aff14736 100644 --- a/mft-fs/remotefs/servermain/server_main.go +++ b/mft-fs/archive/remotefs/servermain/server_main.go @@ -4,8 +4,8 @@ import ( "flag" "google.golang.org/grpc" "log" - "mft-fs/remotefs/remotefscomms" - "mft-fs/remotefs/server" + "mft-fs/archive/remotefs/remotefscomms" + "mft-fs/archive/remotefs/server" "net" ) diff --git a/mft-fs/safe-remotefs/client/client_manager.go b/mft-fs/archive/safe-remotefs/client/client_manager.go similarity index 89% rename from mft-fs/safe-remotefs/client/client_manager.go rename to mft-fs/archive/safe-remotefs/client/client_manager.go index d1ad83c3..7aca84c0 100644 --- a/mft-fs/safe-remotefs/client/client_manager.go +++ b/mft-fs/archive/safe-remotefs/client/client_manager.go @@ -8,8 +8,8 @@ import ( "github.com/jacobsa/fuse/fuseops" "google.golang.org/grpc" "google.golang.org/protobuf/types/known/timestamppb" - "mft-fs/abstractfs" - "mft-fs/safe-remotefs/safe-remotefscomms" + "mft-fs/archive/abstractfs" + safe_remotefscomms2 "mft-fs/archive/safe-remotefs/safe-remotefscomms" "os" "time" ) @@ -37,7 +37,7 @@ func newCacheInfo() *cacheInfo { type ClientManager struct { abstractfs.FSManager - client safe_remotefscomms.RemoteFSCommsClient + client safe_remotefscomms2.RemoteFSCommsClient cachePath string localInfo map[fuseops.InodeID]*cacheInfo handleToInode map[fuseops.HandleID]fuseops.InodeID @@ -49,12 +49,12 @@ func NewClientManager(conn *grpc.ClientConn, cachePath string) (*ClientManager, localInfo: make(map[fuseops.InodeID]*cacheInfo), handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), } - output.client = safe_remotefscomms.NewRemoteFSCommsClient(conn) + output.client = safe_remotefscomms2.NewRemoteFSCommsClient(conn) return output, nil } func (manager *ClientManager) GetSize() (uint64, error) { - resp, e := manager.client.GetSizeComm(context.Background(), &safe_remotefscomms.Empty{}) + resp, e := manager.client.GetSizeComm(context.Background(), &safe_remotefscomms2.Empty{}) if e != nil { return 0, e } @@ -62,7 +62,7 @@ func (manager *ClientManager) GetSize() (uint64, error) { } func (manager *ClientManager) GetLength() (uint64, error) { - resp, e := manager.client.GetLengthComm(context.Background(), &safe_remotefscomms.Empty{}) + resp, e := manager.client.GetLengthComm(context.Background(), &safe_remotefscomms2.Empty{}) if e != nil { return 0, e } @@ -70,7 +70,7 @@ func (manager *ClientManager) GetLength() (uint64, error) { } func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { - resp, e := manager.client.GetInfoComm(context.Background(), &safe_remotefscomms.UintMsg{ + resp, e := manager.client.GetInfoComm(context.Background(), &safe_remotefscomms2.UintMsg{ Data: uint64(inode), }) if e != nil { @@ -79,7 +79,7 @@ func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileIn output := &abstractfs.FileInfo{ ChildrenIndexMap: make(map[string]int), } - safe_remotefscomms.ConvertFromComm(resp, output) + safe_remotefscomms2.ConvertFromComm(resp, output) info, ok := manager.localInfo[inode] if ok { output.Handle = info.handle @@ -88,7 +88,7 @@ func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileIn } func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { - request := &safe_remotefscomms.SetInfoParamsMsg{ + request := &safe_remotefscomms2.SetInfoParamsMsg{ Inode: uint64(inode), Uid: -1, Gid: -1, @@ -120,12 +120,12 @@ func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gid } func (manager *ClientManager) Delete(inode fuseops.InodeID) error { - _, e := manager.client.DeleteComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.DeleteComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) return e } func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { - resp, e := manager.client.MkDirComm(context.Background(), &safe_remotefscomms.MkInodeMsg{ + resp, e := manager.client.MkDirComm(context.Background(), &safe_remotefscomms2.MkInodeMsg{ Parent: uint64(parent), Name: name, Mode: uint32(mode), @@ -161,7 +161,7 @@ func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.Han return handle, nil } func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { - resp, e := manager.client.CreateFileComm(context.Background(), &safe_remotefscomms.MkInodeMsg{ + resp, e := manager.client.CreateFileComm(context.Background(), &safe_remotefscomms2.MkInodeMsg{ Parent: uint64(parent), Name: name, Mode: uint32(mode), @@ -173,7 +173,7 @@ func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mo } func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { - _, e := manager.client.RmDirComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.RmDirComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) return e } @@ -183,7 +183,7 @@ func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { } func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { - _, e := manager.client.SyncFileComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + _, e := manager.client.SyncFileComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) return e } @@ -195,7 +195,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in return 0, errors.New("local cache not updated") } - msg := safe_remotefscomms.RequestResourceMsg{ + msg := safe_remotefscomms2.RequestResourceMsg{ CacheTime: timestamppb.New(info.cacheTime), Inode: uint64(inode), Cache: info.cache, @@ -207,7 +207,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in } if requestResp.Success { - resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms.WriteAtMsg{ + resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms2.WriteAtMsg{ Inode: uint64(inode), Data: data, Off: off, @@ -216,7 +216,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in return 0, e } - ackResp, e := manager.client.AckWriteComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + ackResp, e := manager.client.AckWriteComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) if e != nil { return 0, e } @@ -241,7 +241,7 @@ func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off in } func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { - msg := safe_remotefscomms.RequestResourceMsg{ + msg := safe_remotefscomms2.RequestResourceMsg{ CacheTime: timestamppb.New(time.Unix(0, 0)), Inode: uint64(inode), Cache: false, @@ -261,7 +261,7 @@ func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int } if requestResp.Success { - resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms.ReadAtMsg{ + resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms2.ReadAtMsg{ Inode: uint64(inode), Size: int64(len(data)), Off: off, @@ -269,7 +269,7 @@ func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int if e != nil { return 0, e } - ackResp, e := manager.client.AckReadComm(context.Background(), &safe_remotefscomms.UintMsg{Data: uint64(inode)}) + ackResp, e := manager.client.AckReadComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) if e != nil { return 0, e } diff --git a/mft-fs/safe-remotefs/clientmain/client_main.go b/mft-fs/archive/safe-remotefs/clientmain/client_main.go similarity index 94% rename from mft-fs/safe-remotefs/clientmain/client_main.go rename to mft-fs/archive/safe-remotefs/clientmain/client_main.go index 52d7240b..813617ad 100644 --- a/mft-fs/safe-remotefs/clientmain/client_main.go +++ b/mft-fs/archive/safe-remotefs/clientmain/client_main.go @@ -8,8 +8,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" "log" - "mft-fs/abstractfs" - "mft-fs/safe-remotefs/client" + "mft-fs/archive/abstractfs" + "mft-fs/archive/safe-remotefs/client" "os" ) diff --git a/mft-fs/safe-remotefs/comm.proto b/mft-fs/archive/safe-remotefs/comm.proto similarity index 100% rename from mft-fs/safe-remotefs/comm.proto rename to mft-fs/archive/safe-remotefs/comm.proto diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go b/mft-fs/archive/safe-remotefs/safe-remotefscomms/comm.pb.go similarity index 100% rename from mft-fs/safe-remotefs/safe-remotefscomms/comm.pb.go rename to mft-fs/archive/safe-remotefs/safe-remotefscomms/comm.pb.go diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go b/mft-fs/archive/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go similarity index 100% rename from mft-fs/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go rename to mft-fs/archive/safe-remotefs/safe-remotefscomms/comm_grpc.pb.go diff --git a/mft-fs/safe-remotefs/safe-remotefscomms/commutils.go b/mft-fs/archive/safe-remotefs/safe-remotefscomms/commutils.go similarity index 98% rename from mft-fs/safe-remotefs/safe-remotefscomms/commutils.go rename to mft-fs/archive/safe-remotefs/safe-remotefscomms/commutils.go index d214315f..bd9ead92 100644 --- a/mft-fs/safe-remotefs/safe-remotefscomms/commutils.go +++ b/mft-fs/archive/safe-remotefs/safe-remotefscomms/commutils.go @@ -4,7 +4,7 @@ import ( "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" "google.golang.org/protobuf/types/known/timestamppb" - "mft-fs/abstractfs" + "mft-fs/archive/abstractfs" "os" ) diff --git a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go b/mft-fs/archive/safe-remotefs/server/safe_os_fs_manager.go similarity index 99% rename from mft-fs/safe-remotefs/server/safe_os_fs_manager.go rename to mft-fs/archive/safe-remotefs/server/safe_os_fs_manager.go index a4019975..243f4824 100644 --- a/mft-fs/safe-remotefs/server/safe_os_fs_manager.go +++ b/mft-fs/archive/safe-remotefs/server/safe_os_fs_manager.go @@ -6,7 +6,7 @@ import ( "github.com/jacobsa/fuse/fuseops" "github.com/jacobsa/fuse/fuseutil" "golang.org/x/sys/unix" - "mft-fs/abstractfs" + "mft-fs/archive/abstractfs" "mft-fs/datastructures" "os" "syscall" diff --git a/mft-fs/safe-remotefs/server/server_manager.go b/mft-fs/archive/safe-remotefs/server/server_manager.go similarity index 67% rename from mft-fs/safe-remotefs/server/server_manager.go rename to mft-fs/archive/safe-remotefs/server/server_manager.go index 98437b6c..1e65d673 100644 --- a/mft-fs/safe-remotefs/server/server_manager.go +++ b/mft-fs/archive/safe-remotefs/server/server_manager.go @@ -5,13 +5,13 @@ import ( "fmt" "github.com/jacobsa/fuse/fuseops" "google.golang.org/protobuf/types/known/timestamppb" - "mft-fs/safe-remotefs/safe-remotefscomms" + safe_remotefscomms2 "mft-fs/archive/safe-remotefs/safe-remotefscomms" "os" "time" ) type Server struct { - safe_remotefscomms.UnimplementedRemoteFSCommsServer + safe_remotefscomms2.UnimplementedRemoteFSCommsServer manager *SafeOSFSManager } @@ -22,40 +22,40 @@ func NewServerHandler(root string) *Server { return output } -func (server *Server) GetSizeComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { +func (server *Server) GetSizeComm(ctx context.Context, in *safe_remotefscomms2.Empty) (*safe_remotefscomms2.UintMsg, error) { fmt.Println("GetSizeComm") size, e := server.manager.GetSize() if e != nil { return nil, e } - return &safe_remotefscomms.UintMsg{Data: size}, nil + return &safe_remotefscomms2.UintMsg{Data: size}, nil } -func (server *Server) GetLengthComm(ctx context.Context, in *safe_remotefscomms.Empty) (*safe_remotefscomms.UintMsg, error) { +func (server *Server) GetLengthComm(ctx context.Context, in *safe_remotefscomms2.Empty) (*safe_remotefscomms2.UintMsg, error) { fmt.Println("GetLengthComm") length, e := server.manager.GetLength() if e != nil { return nil, e } - return &safe_remotefscomms.UintMsg{Data: length}, nil + return &safe_remotefscomms2.UintMsg{Data: length}, nil } -func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.FileInfoMsg, error) { +func (server *Server) GetInfoComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.FileInfoMsg, error) { fmt.Println("GetInfoComm") info, e := server.manager.GetInfo(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - output := &safe_remotefscomms.FileInfoMsg{ + output := &safe_remotefscomms2.FileInfoMsg{ ChildrenIndexMap: make(map[string]uint32), } info.MetadataLock.RequestRead() - safe_remotefscomms.ConvertToComm(info, output) + safe_remotefscomms2.ConvertToComm(info, output) info.MetadataLock.AckRead() return output, nil } -func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.SetInfoParamsMsg) (*safe_remotefscomms.Empty, error) { +func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms2.SetInfoParamsMsg) (*safe_remotefscomms2.Empty, error) { fmt.Println("SetInfoComm") var uidptr *uint32 var gidptr *uint32 @@ -103,102 +103,102 @@ func (server *Server) SetInfoComm(ctx context.Context, in *safe_remotefscomms.Se if e != nil { return nil, e } - return &safe_remotefscomms.Empty{}, nil + return &safe_remotefscomms2.Empty{}, nil } -func (server *Server) DeleteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { +func (server *Server) DeleteComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.Empty, error) { fmt.Println("DeleteComm") e := server.manager.Delete(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &safe_remotefscomms.Empty{}, nil + return &safe_remotefscomms2.Empty{}, nil } -func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { +func (server *Server) MkDirComm(ctx context.Context, in *safe_remotefscomms2.MkInodeMsg) (*safe_remotefscomms2.UintMsg, error) { fmt.Println("MkDirComm") inode, e := server.manager.MkDir(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e } - return &safe_remotefscomms.UintMsg{Data: uint64(inode)}, nil + return &safe_remotefscomms2.UintMsg{Data: uint64(inode)}, nil } -func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms.MkInodeMsg) (*safe_remotefscomms.UintMsg, error) { +func (server *Server) CreateFileComm(ctx context.Context, in *safe_remotefscomms2.MkInodeMsg) (*safe_remotefscomms2.UintMsg, error) { fmt.Println("CreateFileComm") inode, e := server.manager.CreateFile(fuseops.InodeID(in.Parent), in.Name, os.FileMode(in.Mode)) if e != nil { return nil, e } - return &safe_remotefscomms.UintMsg{Data: uint64(inode)}, nil + return &safe_remotefscomms2.UintMsg{Data: uint64(inode)}, nil } -func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { +func (server *Server) RmDirComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.Empty, error) { fmt.Println("RmDirComm") e := server.manager.RmDir(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &safe_remotefscomms.Empty{}, nil + return &safe_remotefscomms2.Empty{}, nil } -func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.Empty, error) { +func (server *Server) SyncFileComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.Empty, error) { fmt.Println("SyncFileComm") e := server.manager.SyncFile(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &safe_remotefscomms.Empty{}, nil + return &safe_remotefscomms2.Empty{}, nil } -func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms.WriteAtMsg) (*safe_remotefscomms.UintMsg, error) { +func (server *Server) WriteAtComm(ctx context.Context, in *safe_remotefscomms2.WriteAtMsg) (*safe_remotefscomms2.UintMsg, error) { fmt.Println("WriteAtComm") n, _ := server.manager.WriteAt(fuseops.InodeID(in.Inode), in.Data, in.Off) - return &safe_remotefscomms.UintMsg{Data: uint64(n)}, nil + return &safe_remotefscomms2.UintMsg{Data: uint64(n)}, nil } -func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms.ReadAtMsg) (*safe_remotefscomms.ReadAtResponseMsg, error) { +func (server *Server) ReadAtComm(ctx context.Context, in *safe_remotefscomms2.ReadAtMsg) (*safe_remotefscomms2.ReadAtResponseMsg, error) { fmt.Println("ReadAtComm") data := make([]byte, in.Size) n, _ := server.manager.ReadAt(fuseops.InodeID(in.Inode), data, in.Off) - return &safe_remotefscomms.ReadAtResponseMsg{ + return &safe_remotefscomms2.ReadAtResponseMsg{ Data: data, N: int64(n), }, nil } -func (server *Server) RequestReadComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { +func (server *Server) RequestReadComm(ctx context.Context, in *safe_remotefscomms2.RequestResourceMsg) (*safe_remotefscomms2.RequestResponseMsg, error) { fmt.Println("RequestReadComm") success, e := server.manager.RequestRead(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) if e != nil { return nil, e } - return &safe_remotefscomms.RequestResponseMsg{Success: success}, nil + return &safe_remotefscomms2.RequestResponseMsg{Success: success}, nil } -func (server *Server) RequestWriteComm(ctx context.Context, in *safe_remotefscomms.RequestResourceMsg) (*safe_remotefscomms.RequestResponseMsg, error) { +func (server *Server) RequestWriteComm(ctx context.Context, in *safe_remotefscomms2.RequestResourceMsg) (*safe_remotefscomms2.RequestResponseMsg, error) { fmt.Println("RequestWriteComm") success, e := server.manager.RequestWrite(fuseops.InodeID(in.Inode), in.Cache, in.CacheTime.AsTime()) if e != nil { return nil, e } - return &safe_remotefscomms.RequestResponseMsg{Success: success}, nil + return &safe_remotefscomms2.RequestResponseMsg{Success: success}, nil } -func (server *Server) AckReadComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { +func (server *Server) AckReadComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.AckResponseMsg, error) { fmt.Println("AckReadComm") timestamp, e := server.manager.AckRead(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &safe_remotefscomms.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil + return &safe_remotefscomms2.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil } -func (server *Server) AckWriteComm(ctx context.Context, in *safe_remotefscomms.UintMsg) (*safe_remotefscomms.AckResponseMsg, error) { +func (server *Server) AckWriteComm(ctx context.Context, in *safe_remotefscomms2.UintMsg) (*safe_remotefscomms2.AckResponseMsg, error) { fmt.Println("AckWriteComm") timestamp, e := server.manager.AckWrite(fuseops.InodeID(in.Data)) if e != nil { return nil, e } - return &safe_remotefscomms.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil + return &safe_remotefscomms2.AckResponseMsg{WriteTime: timestamppb.New(timestamp)}, nil } diff --git a/mft-fs/safe-remotefs/servermain/server_main.go b/mft-fs/archive/safe-remotefs/servermain/server_main.go similarity index 82% rename from mft-fs/safe-remotefs/servermain/server_main.go rename to mft-fs/archive/safe-remotefs/servermain/server_main.go index 6dcddb5e..2ad5ed1d 100644 --- a/mft-fs/safe-remotefs/servermain/server_main.go +++ b/mft-fs/archive/safe-remotefs/servermain/server_main.go @@ -4,8 +4,8 @@ import ( "flag" "google.golang.org/grpc" "log" - "mft-fs/safe-remotefs/safe-remotefscomms" - "mft-fs/safe-remotefs/server" + "mft-fs/archive/safe-remotefs/safe-remotefscomms" + "mft-fs/archive/safe-remotefs/server" "net" ) diff --git a/mft-fs/go.sum b/mft-fs/go.sum index df8f43a3..d66a41b3 100644 --- a/mft-fs/go.sum +++ b/mft-fs/go.sum @@ -1,18 +1,95 @@ +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 h1:IWVMQZZvWN+9FeRwWnZAINYNrsr3yyCWI2BcddQBDvk= github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0/go.mod h1:JYi9iIxdYNgxmMgLwtSHO/hmVnP2kfX1oc+mtx+XWLA= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= +github.com/pkg/sftp v1.13.9 h1:4NGkvGudBL7GteO3m6qnaQ4pC0Kvf0onSVc9gR3EWBw= +github.com/pkg/sftp v1.13.9/go.mod h1:OBN7bVXdstkFFN/gdnHPUb5TE8eb8G1Rp9wCItqjkkA= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= +golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= +golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 h1:Zy9XzmMEflZ/MAaA7vNcoebnRAld7FsPW1EeBB7V0m8= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/mft-fs/grpcfs/grpcfs.go b/mft-fs/grpcfs/grpcfs.go new file mode 100644 index 00000000..ef8bcbef --- /dev/null +++ b/mft-fs/grpcfs/grpcfs.go @@ -0,0 +1,302 @@ +package grpcfs + +import ( + "context" + "crypto/rand" + "errors" + "fmt" + "github.com/jacobsa/fuse/fuseops" + "google.golang.org/grpc" + "google.golang.org/protobuf/types/known/timestamppb" + "mft-fs/archive/abstractfs" + safe_remotefscomms2 "mft-fs/archive/safe-remotefs/safe-remotefscomms" + "os" + "time" +) + +type cacheInfo struct { + cache bool + cacheTime time.Time + handle fuseops.HandleID +} + +func minimum(a int, b int) int { + if a < b { + return a + } + return b +} + +func newCacheInfo() *cacheInfo { + return &cacheInfo{ + cache: false, + cacheTime: time.Unix(0, 0), + handle: fuseops.HandleID(0), + } +} + +type ClientManager struct { + abstractfs.FSManager + client safe_remotefscomms2.RemoteFSCommsClient + cachePath string + localInfo map[fuseops.InodeID]*cacheInfo + handleToInode map[fuseops.HandleID]fuseops.InodeID +} + +func NewClientManager(conn *grpc.ClientConn, cachePath string) (*ClientManager, error) { + output := &ClientManager{ + cachePath: cachePath, + localInfo: make(map[fuseops.InodeID]*cacheInfo), + handleToInode: make(map[fuseops.HandleID]fuseops.InodeID), + } + output.client = safe_remotefscomms2.NewRemoteFSCommsClient(conn) + return output, nil +} + +func (manager *ClientManager) GetSize() (uint64, error) { + resp, e := manager.client.GetSizeComm(context.Background(), &safe_remotefscomms2.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetLength() (uint64, error) { + resp, e := manager.client.GetLengthComm(context.Background(), &safe_remotefscomms2.Empty{}) + if e != nil { + return 0, e + } + return resp.Data, nil +} + +func (manager *ClientManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + resp, e := manager.client.GetInfoComm(context.Background(), &safe_remotefscomms2.UintMsg{ + Data: uint64(inode), + }) + if e != nil { + return nil, e + } + output := &abstractfs.FileInfo{ + ChildrenIndexMap: make(map[string]int), + } + safe_remotefscomms2.ConvertFromComm(resp, output) + info, ok := manager.localInfo[inode] + if ok { + output.Handle = info.handle + } + return output, nil +} + +func (manager *ClientManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + request := &safe_remotefscomms2.SetInfoParamsMsg{ + Inode: uint64(inode), + Uid: -1, + Gid: -1, + Size: -1, + Mode: -1, + Atime: timestamppb.New(time.Time{}), + Mtime: timestamppb.New(time.Time{}), + } + if uidptr != nil { + request.Uid = int32(*uidptr) + } + if gidptr != nil { + request.Gid = int32(*gidptr) + } + if sizeptr != nil { + request.Size = int64(*sizeptr) + } + if modeptr != nil { + request.Mode = int32(*modeptr) + } + if atimeptr != nil { + request.Atime = timestamppb.New(*atimeptr) + } + if mtimeptr != nil { + request.Mtime = timestamppb.New(*mtimeptr) + } + _, e := manager.client.SetInfoComm(context.Background(), request) + return e +} + +func (manager *ClientManager) Delete(inode fuseops.InodeID) error { + _, e := manager.client.DeleteComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.MkDirComm(context.Background(), &safe_remotefscomms2.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) GenerateHandle(inode fuseops.InodeID) (fuseops.HandleID, error) { + var buff [8]byte + _, e := rand.Read(buff[:]) + if e != nil { + return 0, e + } + var output uint64 = 0 + for i := 0; i < len(buff); i++ { + output = output | uint64(buff[i]<<(8*i)) + } + handle := fuseops.HandleID(output) + _, ok := manager.handleToInode[handle] + if ok { + return manager.GenerateHandle(inode) + } + info, ok := manager.localInfo[inode] + if !ok { + manager.localInfo[inode] = newCacheInfo() + info = manager.localInfo[inode] + } + info.handle = handle + manager.handleToInode[handle] = inode + return handle, nil +} +func (manager *ClientManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + resp, e := manager.client.CreateFileComm(context.Background(), &safe_remotefscomms2.MkInodeMsg{ + Parent: uint64(parent), + Name: name, + Mode: uint32(mode), + }) + if e != nil { + return 0, e + } + return fuseops.InodeID(resp.Data), nil +} + +func (manager *ClientManager) RmDir(inode fuseops.InodeID) error { + _, e := manager.client.RmDirComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) DeleteHandle(handle fuseops.HandleID) error { + delete(manager.handleToInode, handle) + return nil +} + +func (manager *ClientManager) SyncFile(inode fuseops.InodeID) error { + _, e := manager.client.SyncFileComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) + return e +} + +func (manager *ClientManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + + info, ok := manager.localInfo[inode] + if !ok { + fmt.Println("cache map issue") + return 0, errors.New("local cache not updated") + } + + msg := safe_remotefscomms2.RequestResourceMsg{ + CacheTime: timestamppb.New(info.cacheTime), + Inode: uint64(inode), + Cache: info.cache, + } + + requestResp, e := manager.client.RequestWriteComm(context.Background(), &msg) + if e != nil { + return 0, e + } + + if requestResp.Success { + resp, e := manager.client.WriteAtComm(context.Background(), &safe_remotefscomms2.WriteAtMsg{ + Inode: uint64(inode), + Data: data, + Off: off, + }) + if e != nil { + return 0, e + } + + ackResp, e := manager.client.AckWriteComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + + manager.localInfo[inode].cache = true + manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() + + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) + if e != nil { + return 0, e + } + _, e = file.WriteAt(data, off) + if e != nil { + return 0, e + } + + return int(resp.Data), nil + } + + fmt.Println("cache timing issue") + return 0, errors.New("local cache not updated") +} +func (manager *ClientManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + + msg := safe_remotefscomms2.RequestResourceMsg{ + CacheTime: timestamppb.New(time.Unix(0, 0)), + Inode: uint64(inode), + Cache: false, + } + + info, ok := manager.localInfo[inode] + if ok { + msg.Cache = info.cache + msg.CacheTime = timestamppb.New(info.cacheTime) + } else { + manager.localInfo[inode] = newCacheInfo() + } + + requestResp, e := manager.client.RequestReadComm(context.Background(), &msg) + if e != nil { + return 0, e + } + + if requestResp.Success { + resp, e := manager.client.ReadAtComm(context.Background(), &safe_remotefscomms2.ReadAtMsg{ + Inode: uint64(inode), + Size: int64(len(data)), + Off: off, + }) + if e != nil { + return 0, e + } + ackResp, e := manager.client.AckReadComm(context.Background(), &safe_remotefscomms2.UintMsg{Data: uint64(inode)}) + if e != nil { + return 0, e + } + manager.localInfo[inode].cacheTime = ackResp.WriteTime.AsTime() + manager.localInfo[inode].cache = true + for i := 0; i < minimum(len(data), len(resp.Data)); i++ { + data[i] = resp.Data[i] + } + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR|os.O_CREATE, 777) + if e != nil { + return 0, e + } + _, e = file.WriteAt(data, off) + if e != nil { + return 0, e + } + return int(resp.N), nil + } else { + file, e := os.OpenFile(fmt.Sprintf("%s/file%d.txt", manager.cachePath, int(inode)), os.O_RDWR, 777) + if e != nil { + return 0, e + } + n, _ := file.ReadAt(data, off) + return n, nil + } +} + +func (manager *ClientManager) Destroy() error { + return nil +} diff --git a/mft-fs/main.go b/mft-fs/main.go new file mode 100644 index 00000000..c76737f7 --- /dev/null +++ b/mft-fs/main.go @@ -0,0 +1,182 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "strings" +) + +// Define the command-line flags +var ( + helpFlag bool + initFlag string + destroyFlag string + infoFlag bool +) + +func init() { + // Flag definitions with default values and help text + flag.BoolVar(&helpFlag, "help", false, "Display help information for the program.") + flag.StringVar(&initFlag, "init", "", "Initialize and mount a filesystem at the specified directory.") + flag.StringVar(&destroyFlag, "destroy", "", "Unmount and destroy the filesystem at the specified directory.") + flag.BoolVar(&infoFlag, "info", false, "Display information about the mounted filesystem.") +} + +func main() { + flag.Parse() + + // Handle the --help flag + if helpFlag { + printHelp() + return + } + + // Handle the --init flag + if initFlag != "" { + handleInit(initFlag) + return + } + + // Handle the --destroy flag + if destroyFlag != "" { + handleDestroy(destroyFlag) + return + } + + // Handle the --info flag + if infoFlag { + handleInfo() + return + } + + // If no flags are provided, print help by default + printHelp() +} + +// printHelp displays the usage information for the CLI tool. +func printHelp() { + fmt.Println("Usage: mftfs [flags]") + fmt.Println("A command-line tool to manage your FUSE filesystems.") + fmt.Println("\nFlags:") + flag.PrintDefaults() +} + +// handleInit guides the user through the filesystem initialization process. +func handleInit(mountDir string) { + reader := bufio.NewReader(os.Stdin) + + fmt.Printf("Initializing filesystem at: %s\n", mountDir) + + // Ask for the type of filesystem + fsType := readInput(reader, "Type of filesystem (s3fs, osfs, grpcfs, sftpfs): ") + + switch strings.ToLower(fsType) { + case "sftpfs": + handleSFTPFSInit(reader) + case "s3fs": + handleS3FSInit(reader) + case "osfs", "grpcfs": + fmt.Printf("Support for %s is not yet implemented.\n", fsType) + default: + fmt.Printf("Unknown filesystem type: %s\n", fsType) + os.Exit(1) + } + + // NOTE: You would add the logic here to actually mount the filesystem. + // For this prototype, we're just handling the user input. + fmt.Printf("Filesystem of type '%s' is ready to be mounted at '%s'.\n", fsType, mountDir) + fmt.Println("Add your mounting logic here.") +} + +// handleSFTPFSInit prompts for and reads SFTP connection details. +func handleSFTPFSInit(reader *bufio.Reader) { + fmt.Println("\n--- SFTP-FS Configuration ---") + host := readInput(reader, "Host: ") + port := readInput(reader, "Port: ") + username := readInput(reader, "Username: ") + password := readInput(reader, "Password: ") + + // Here you would use these variables to create and start the sftpfsManager + // For example: + // config := sftpfs.SFTPClientConfig{ + // Host: host, + // Port: convertPortToInt(port), + // Username: username, + // Password: password, + // } + // manager := sftpfs.NewSFTPFSManager(config) + // manager.Start() +} + +// handleS3FSInit prompts for and reads S3 connection details. +func handleS3FSInit(reader *bufio.Reader) { + fmt.Println("\n--- S3-FS Configuration ---") + bucketName := readInput(reader, "Bucket Name: ") + region := readInput(reader, "Region: ") + awsKey := readInput(reader, "AWS Key: ") + awsSecretKey := readInput(reader, "AWS Secret Key: ") + // You would use these variables to configure S3FS +} + +// handleDestroy is a placeholder for the destroy logic. +func handleDestroy(mountDir string) { + fmt.Printf("Attempting to unmount and destroy filesystem at: %s\n", mountDir) + fmt.Println("Add your unmounting logic here.") +} + +// handleInfo is a placeholder for the info logic. +func handleInfo() { + fmt.Println("Displaying information about the filesystem.") + fmt.Println("Add your info/metrics retrieval logic here.") +} + +// readInput is a helper function to read a line of input from the user. +func readInput(reader *bufio.Reader, prompt string) string { + fmt.Print(prompt) + input, _ := reader.ReadString('\n') + return strings.TrimSpace(input) +} + +/*package main + +import ( + "context" + "flag" + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" + "log" + "mft-fs/archive/abstractfs" + "mft-fs/archive/osfsmanager" + "os" +) + +func main() { + + // reading commandline args + mountDirectory := flag.String("mountDirectory", "", "mount directory") + rootDirectory := flag.String("rootDirectory", "", "root directory") + flag.Parse() + + manager := osfsmanager.NewOSFSManager(*rootDirectory) + fs, _ := abstractfs.NewAbstractFS(manager) + server := fuseutil.NewFileSystemServer(&fs) + + // mount the filesystem + cfg := &fuse.MountConfig{ + ReadOnly: false, + DebugLogger: log.New(os.Stderr, "fuse: ", 0), + ErrorLogger: log.New(os.Stderr, "fuse: ", 0), + } + mfs, err := fuse.Mount(*mountDirectory, server, cfg) + if err != nil { + log.Fatalf("Mount: %v", err) + } + + // wait for it to be unmounted + if err = mfs.Join(context.Background()); err != nil { + log.Fatalf("Join: %v", err) + } +} +*/ diff --git a/mft-fs/osfs/osfs.go b/mft-fs/osfs/osfs.go new file mode 100644 index 00000000..c93ee5a5 --- /dev/null +++ b/mft-fs/osfs/osfs.go @@ -0,0 +1,335 @@ +package osfs + +import ( + "fmt" + "os" + "syscall" + "time" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + + "golang.org/x/sys/unix" + + "mft-fs/abstractfs" + "mft-fs/datastructures" +) + +func NewOSFS(mountDir string, rootDir string) *abstractfs.AbstractFS { + return &abstractfs.AbstractFS{ + Manager: NewOSFSManager(rootDir), + MountDir: mountDir, + Cachable: false, + CacheDir: "", + } +} + +type OSFSManager struct { + abstractfs.FSManager + root string + inodeInfo map[fuseops.InodeID]*abstractfs.FileInfo + inodeCounter fuseops.InodeID +} + +type parentChildPair struct { + parent fuseops.InodeID + child string +} + +func (manager *OSFSManager) bfs(root string) { + q := datastructures.NewQueue() + q.Enqueue(&(parentChildPair{ + parent: 0, + child: root, + })) + for !q.IsEmpty() { + current := q.Dequeue().(*parentChildPair) + var direntType fuseutil.DirentType + stat, e := os.Stat(current.child) + if e != nil { + fmt.Println("error:") + fmt.Println(e.Error()) + continue + } + if stat.IsDir() { + dir, e := os.ReadDir(current.child) + if e != nil { + continue + } + for _, file := range dir { + q.Enqueue(&(parentChildPair{ + parent: manager.inodeCounter, + child: fmt.Sprintf("%s/%s", current.child, file.Name()), + })) + } + direntType = fuseutil.DT_Directory + } else { + direntType = fuseutil.DT_File + } + info := abstractfs.NewFileInfo(stat.Name(), current.child, manager.inodeCounter, current.parent, direntType) + manager.inodeInfo[manager.inodeCounter] = &info + parentInfo, ok := manager.inodeInfo[current.parent] + if ok { + parentInfo.ChildrenIndexMap[info.Name] = len(parentInfo.Children) + parentInfo.Children = append(parentInfo.Children, manager.inodeCounter) + } + manager.updateInfo(manager.inodeInfo[manager.inodeCounter]) + manager.inodeCounter++ + } +} + +func NewOSFSManager(root string) *OSFSManager { + manager := &OSFSManager{ + root: root, + inodeInfo: make(map[fuseops.InodeID]*abstractfs.FileInfo), + inodeCounter: 1, + } + manager.bfs(root) + return manager +} + +func (manager *OSFSManager) updateInfo(info *abstractfs.FileInfo) error { + + fileInfo, e := os.Stat(info.Path) + if e != nil { + return e + } + stats := fileInfo.Sys().(*syscall.Stat_t) + + info.Size = uint64(fileInfo.Size()) + + info.Nlink = 1 + + info.Mode = fileInfo.Mode() + + /*info.Atime = time.Unix(stats.Atimespec.Sec, stats.Atimespec.Nsec) + info.Mtime = time.Unix(stats.Mtimespec.Sec, stats.Mtimespec.Nsec) + info.Ctime = time.Unix(stats.Ctimespec.Sec, stats.Ctimespec.Nsec) + info.Crtime = time.Unix(stats.Birthtimespec.Sec, stats.Birthtimespec.Nsec)*/ + var timeStats unix.Stat_t + e = unix.Stat(info.Path, &timeStats) + if e != nil { + return e + } + info.Atime = time.Unix(timeStats.Atim.Sec, timeStats.Atim.Nsec) + info.Mtime = time.Unix(timeStats.Mtim.Sec, timeStats.Mtim.Nsec) + info.Ctime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + info.Crtime = time.Unix(timeStats.Ctim.Sec, timeStats.Ctim.Nsec) + + info.Uid = stats.Uid + info.Gid = stats.Gid + + return nil +} + +func (manager *OSFSManager) Start() error { + return nil +} + +func (manager *OSFSManager) Teardown() error { + return nil +} + +func (manager *OSFSManager) GetSize() (uint64, error) { + stat, _ := os.Stat(manager.root) + return uint64(stat.Size()), nil +} + +func (manager *OSFSManager) GetLength() (uint64, error) { + return uint64(len(manager.inodeInfo)), nil +} + +func (manager *OSFSManager) GetInfo(inode fuseops.InodeID) (*abstractfs.FileInfo, error) { + info, ok := manager.inodeInfo[inode] + if !ok { + return nil, fuse.ENOENT + } + return info, nil +} + +func (manager *OSFSManager) SetInfo(inode fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + + if modeptr != nil { + e = os.Chmod(info.Path, *modeptr) + if e != nil { + return e + } + } + + uid := -1 + gid := -1 + if uidptr != nil { + uid = int(*uidptr) + } + if gidptr != nil { + gid = int(*gidptr) + } + e = os.Chown(info.Path, uid, gid) + if e != nil { + return e + } + + atime := time.Time{} + mtime := time.Time{} + if atimeptr != nil { + atime = *atimeptr + } + if mtimeptr != nil { + mtime = *mtimeptr + } + e = os.Chtimes(info.Path, atime, mtime) + if e != nil { + return e + } + + return manager.updateInfo(info) +} + +func (manager *OSFSManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + e = os.Mkdir(path, mode) + if e != nil { + return 0, e + } + + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewFileInfo(name, path, inode, parent, fuseutil.DT_Directory) + manager.inodeInfo[inode] = &infoObj + e = manager.updateInfo(&infoObj) + if e != nil { + return 0, e + } + + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + + return inode, nil +} + +func (manager *OSFSManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + parentInfo, e := manager.GetInfo(parent) + if e != nil { + return 0, e + } + + path := parentInfo.Path + "/" + name + file, e := os.Create(path) + defer file.Close() + if e != nil { + return 0, e + } + + e = file.Chmod(mode) + if e != nil { + return 0, e + } + + inode := manager.inodeCounter //fuseops.InodeID(osInfo.Sys().(*syscall.Stat_t).Ino) + manager.inodeCounter++ + infoObj := abstractfs.NewFileInfo(name, path, inode, parent, fuseutil.DT_File) + manager.inodeInfo[inode] = &infoObj + e = manager.updateInfo(&infoObj) + if e != nil { + return 0, e + } + + parentInfo.Children = append(parentInfo.Children, inode) + parentInfo.ChildrenIndexMap[name] = len(parentInfo.Children) - 1 + + return inode, nil +} + +func (manager *OSFSManager) RmDir(inode fuseops.InodeID) error { + return nil +} + +func (manager *OSFSManager) Delete(inode fuseops.InodeID) error { + + // first delete any reference in parents + // then delete self + + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + + parentInfo, e := manager.GetInfo(info.Parent) + if e != nil { + return e + } + + parentInfo.Children = datastructures.Remove(parentInfo.Children, parentInfo.ChildrenIndexMap[info.Name]) + target := parentInfo.ChildrenIndexMap[info.Name] + for name, index := range parentInfo.ChildrenIndexMap { + if index > target { + parentInfo.ChildrenIndexMap[name] = index - 1 + } + } + delete(parentInfo.ChildrenIndexMap, info.Name) + + delete(manager.inodeInfo, info.Inode) + + return nil +} + +func (manager *OSFSManager) SyncFile(inode fuseops.InodeID) error { + info, e := manager.GetInfo(inode) + if e != nil { + return e + } + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return e + } + defer file.Close() + e = file.Sync() + if e != nil { + return e + } + return nil +} + +func (manager *OSFSManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.ReadAt(data, off) + return n, e +} + +func (manager *OSFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (int, error) { + info, e := manager.GetInfo(inode) + if e != nil { + return 0, e + } + + file, e := os.OpenFile(info.Path, os.O_RDWR, info.Mode) + if e != nil { + return 0, e + } + defer file.Close() + + n, e := file.WriteAt(data, off) + return n, e +} + +func (manager *OSFSManager) Destroy() error { return nil } diff --git a/mft-fs/planning.txt b/mft-fs/planning.txt new file mode 100644 index 00000000..5a5e47ad --- /dev/null +++ b/mft-fs/planning.txt @@ -0,0 +1,93 @@ +AbstractFS attributes: + - file metadata - a safe, tree-based structure representing metadata of all files in the FS + - generic mount metadata + - cache - boolean value representing if file information should be cached (disable for osfs, s3fs if relying on external mount) + - readonly - boolean value representing if the FS can be written into + - specific mount metadata - mount-dependent metadata + - region, passwords for s3fs + - username, password, key for sftp-fs + + +func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error + - returns general information about the FS like remaining space, inode capacity, etc + - implement GetSize(), GetLength() for each FS + +func (fs AbstractFS) LookUpInode(ctx context.Context, op *fuseops.LookUpInodeOp) error + - returns information about a certain inode + - implement as much in abstract as possible + +func (fs AbstractFS) GetInodeAttributes(ctx context.Context, op *fuseops.GetInodeAttributesOp) error + - simple metadata; fill it up in abstract + +func (fs AbstractFS) SetInodeAttributes(ctx context.Context, op *fuseops.SetInodeAttributesOp) error + - sets inode's attributes + +func (fs AbstractFS) ForgetInode(ctx context.Context, op *fuseops.ForgetInodeOp) error + - delete abstract inode metadata + +func (fs AbstractFS) BatchForget(ctx context.Context, op *fuseops.BatchForgetOp) error + - delete all abstract inodes + +func (fs AbstractFS) MkDir(ctx context.Context, op *fuseops.MkDirOp) error + - make a directory; fs specific, need to implement + +func (fs AbstractFS) CreateFile(ctx context.Context, op *fuseops.CreateFileOp) error + - creates a file; fs specific, need to implement + +func (fs AbstractFS) RmDir(ctx context.Context, op *fuseops.RmDirOp) error + - removes a directory + - fs specific, need to implement + +func (fs AbstractFS) OpenDir(ctx context.Context, op *fuseops.OpenDirOp) error + - returns a file handle + +func (fs AbstractFS) ReadDir(ctx context.Context, op *fuseops.ReadDirOp) error + - lists all items in a directory + - abstract implementation + +func (fs AbstractFS) ReleaseDirHandle(ctx context.Context, op *fuseops.ReleaseDirHandleOp) error + - delete handle + - abstract implementation + +func (fs AbstractFS) OpenFile(ctx context.Context, op *fuseops.OpenFileOp) error + - returns file handle + - abstract implementation + +func (fs AbstractFS) ReadFile(ctx context.Context, op *fuseops.ReadFileOp) error + - reads a file + - if cachable FS, checks if cache is up to date; if so, pulls from cache; + - else, pulls from remote; stores in cache if needed + - fs specific method needed + +func (fs AbstractFS) WriteFile(ctx context.Context, op *fuseops.WriteFileOp) error + - writes into a file. same behavior as readfile + - fs specific method needed + +func (fs AbstractFS) SyncFile(ctx context.Context, op *fuseops.SyncFileOp) error + - fs specific method needed + +func (fs AbstractFS) FlushFile(ctx context.Context, op *fuseops.FlushFileOp) error + - fs specific method needed + +func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseFileHandleOp) error + - abstract implementation for deleting file handle + +func (fs AbstractFS) Destroy() + - abstract implementation for deleting mount + +mount generic methods: + - future: queue read/write + +mount-dependent methods: + - Load() + - Save() + - GetSize() + - GetLength() + - GetMetadata() -> blocking operations which pulls the lastest file metadata from remote to ensure consistency + - SetMetadata() -> blocking operation to update remote metadata + - MkDir() + - CreateFile() + - ReatAt() + - WriteAt() + - SyncFile() + - FlushFile() diff --git a/mft-fs/sftpfs/sftp_test_server/host_key b/mft-fs/sftpfs/sftp_test_server/host_key new file mode 100644 index 00000000..e2b0e872 --- /dev/null +++ b/mft-fs/sftpfs/sftp_test_server/host_key @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEowIBAAKCAQEApBlB0edbPaslbnaPfNdwy3qWPOBnemLkfw+KWGO3hKPg/Q8z +J6OmusjSCapjbfMAxhur/XB8pmwbUwE1P3d+6f5hE1DW5qAxc5eU6QPBK4Y/+f6Z +021W1sKNc2VDy35tTkpJs8qsjgt1EjvOOi6gOM+Pf1e10F+UWpMYjtJo2k4T7gRT +vBwGikWXo5Pk99Rnyv3H6PxxoXHervkCgHqWAhpxG+yPS/JsShMzURuRcCYUqLi7 +vUMtojy/IRoQEaXwn9WZPM3fCC4NfIpiEM5RQf4Sy6ibfCtXXcdo1J5szF4TuRYA +of8PoaVmyuwNYUEQAUuNBM7bycBnjB6Bv4xQKwIDAQABAoIBABeLpjWTkDRvh63r +ZhhAI2eW3dK7Ui2t3eJbXPrkx/LIvuIgmbLw2N4JLZYEdELU8MH8O3fgeYo5jcwh +qr3CDBxQCybF3Sf3SVEwKUYr6z4vA6P/w5uiHykufjRWDd23dMCciSm6hXrWKwSk +Pyl7AjNUmN7pO2W8KSG75HStvSzBdy21QV76RcHPt4d3W0H9OsujRyjENqplJsd6 +Wt5lHytz+PrweaQwo4dRqd6P6Cw5pUoJdL9Dv9aoKv9H95FrCh6CczmCNuwopjuu +fFK0yyMOBbVGOpQJhleHtpM59bdGox6KXdSHyZ5nf4bHNCUycEOy3hwdSJGsZa0F +UDPBzXECgYEA4CoD7sO5+N9rA55t6qbB0sWtkTlEG4ZMceBx1NTMJjPr2AFM/yMt +2zjb3RdLFcPiISB503jswqxCKG6lo48htMYqkzWatvBl4aEmUSdpHN4U7tdcV9Vs +Hmb3Rt4KoEU6/kWw5afkPTxyW5/8I26bk/kX6n3U6AsejIeASB7kqrsCgYEAu2dt +rsEZ2WUsyP4rJO0iS9G8U0UyRinaIe//Ba9+NTQzIfYCI4EPmnlpEdxHdXLa68uv +sC4AHX9uo9WBrCKeDf2BpoOg23KLYh5sfeI+8hqsj2Km15slkvcAiK4+EoqVufy5 +8Edx1sloS6PYi1H7dWmzVXT1AYjkp0t7cMSFsVECgYAsoFCuHOsOH7RXQRgSyeX2 +RwJZ0fO8Iw1e8lbXDxIhXN7L3t5sQJ2lcflbV4LML3X6MFPwhLdlvhNhpz10hU8p +hPX+3oIRf2RY+dL9/wGPDKtQLTGmDsf6eXcq9ZNZ+s5WxpsD7Vuj0T/W+8+fYiq4 +17MqLKjRFT2crnEcaoINdwKBgHGxvglXfac2ioUmLmaotzXoeKjMQkPvADe2srFw +VtFQafUgmwuPMTg2kFgVnATVOZv0ZxIr1kYPGcCrt5AHMHysYAv1r5FzXLyaWJfG +uwmGxUn4P+Bub81JrTk+/Mmi6lN70BLGRXpZlrzNGoLrqfMBvZsK6dmUg6Q7VxiD +IdkBAoGBAKAl81lQTJuzrGoM5a85pehsc8/eUsQ/hqmSefn5hmwjQeTd93AVcLrJ +g8dcDfWDHSmMhZ4f67LMl3v0aVR9QUbsdexrtlGomZSCLo8fOh+NFim1j0DbQ2DR +0Ta8DRUSiO8CzYs7Y5zKydwQVhWol6FhCojunc4d09lpZ3i8c36w +-----END RSA PRIVATE KEY----- diff --git a/mft-fs/sftpfs/sftp_test_server/main.go b/mft-fs/sftpfs/sftp_test_server/main.go new file mode 100644 index 00000000..4c9ac900 --- /dev/null +++ b/mft-fs/sftpfs/sftp_test_server/main.go @@ -0,0 +1,151 @@ +// An example SFTP server implementation using the golang SSH package. +// Serves the whole filesystem visible to the user, and has a hard-coded username and password, +// so not for real use! +package main + +import ( + "fmt" + "io" + "log" + "net" + "os" + + "github.com/pkg/sftp" + "golang.org/x/crypto/ssh" +) + +// Based on example server code from golang.org/x/crypto/ssh and server_standalone +func main() { + var ( + readOnly bool + debugStderr bool + winRoot bool + ) + readOnly = false + debugStderr = true + winRoot = false + + debugStream := io.Discard + if debugStderr { + debugStream = os.Stderr + } + + // An SSH server is represented by a ServerConfig, which holds + // certificate details and handles authentication of ServerConns. + config := &ssh.ServerConfig{ + PasswordCallback: func(c ssh.ConnMetadata, pass []byte) (*ssh.Permissions, error) { + // Should use constant-time compare (or better, salt+hash) in + // a production setting. + fmt.Fprintf(debugStream, "Login: %s\n", c.User()) + if c.User() == "testuser" && string(pass) == "tiger" { + return nil, nil + } + return nil, fmt.Errorf("password rejected for %q", c.User()) + }, + } + + privateBytes, err := os.ReadFile("go_server/host_key") + if err != nil { + log.Fatal("Failed to load private key", err) + } + + private, err := ssh.ParsePrivateKey(privateBytes) + if err != nil { + log.Fatal("Failed to parse private key", err) + } + + config.AddHostKey(private) + + // Once a ServerConfig has been configured, connections can be + // accepted. + listener, err := net.Listen("tcp", "localhost:2222") + if err != nil { + log.Fatal("failed to listen for connection", err) + } + fmt.Printf("Listening on %v\n", listener.Addr()) + + nConn, err := listener.Accept() + if err != nil { + log.Fatal("failed to accept incoming connection", err) + } + + // Before use, a handshake must be performed on the incoming + // net.Conn. + _, chans, reqs, err := ssh.NewServerConn(nConn, config) + if err != nil { + log.Fatal("failed to handshake", err) + } + fmt.Fprintf(debugStream, "SSH server established\n") + + // The incoming Request channel must be serviced. + go ssh.DiscardRequests(reqs) + + // Service the incoming Channel channel. + for newChannel := range chans { + // Channels have a type, depending on the application level + // protocol intended. In the case of an SFTP session, this is "subsystem" + // with a payload string of "sftp" + fmt.Fprintf(debugStream, "Incoming channel: %s\n", newChannel.ChannelType()) + if newChannel.ChannelType() != "session" { + newChannel.Reject(ssh.UnknownChannelType, "unknown channel type") + fmt.Fprintf(debugStream, "Unknown channel type: %s\n", newChannel.ChannelType()) + continue + } + channel, requests, err := newChannel.Accept() + if err != nil { + log.Fatal("could not accept channel.", err) + } + fmt.Fprintf(debugStream, "Channel accepted\n") + + // Sessions have out-of-band requests such as "shell", + // "pty-req" and "env". Here we handle only the + // "subsystem" request. + go func(in <-chan *ssh.Request) { + for req := range in { + fmt.Fprintf(debugStream, "Request: %v\n", req.Type) + ok := false + switch req.Type { + case "subsystem": + fmt.Fprintf(debugStream, "Subsystem: %s\n", req.Payload[4:]) + if string(req.Payload[4:]) == "sftp" { + ok = true + } + } + fmt.Fprintf(debugStream, " - accepted: %v\n", ok) + req.Reply(ok, nil) + } + }(requests) + + serverOptions := []sftp.ServerOption{ + sftp.WithDebug(debugStream), + sftp.WithServerWorkingDirectory("/Users/rohanphadnis/GeorgiaTech/ArtisanResearch/SFTP_Research/go_server/sftp_root"), + } + + if readOnly { + serverOptions = append(serverOptions, sftp.ReadOnly()) + fmt.Fprintf(debugStream, "Read-only server\n") + } else { + fmt.Fprintf(debugStream, "Read write server\n") + } + + if winRoot { + serverOptions = append(serverOptions, sftp.WindowsRootEnumeratesDrives()) + fmt.Fprintf(debugStream, "Windows root enabled\n") + } + + server, err := sftp.NewServer( + channel, + serverOptions..., + ) + if err != nil { + log.Fatal(err) + } + if err := server.Serve(); err != nil { + if err != io.EOF { + log.Fatal("sftp server completed with error:", err) + } + } + server.Close() + log.Print("sftp client exited session.") + } +} diff --git a/mft-fs/sftpfs/sftpfs.go b/mft-fs/sftpfs/sftpfs.go new file mode 100644 index 00000000..e4739476 --- /dev/null +++ b/mft-fs/sftpfs/sftpfs.go @@ -0,0 +1,510 @@ +package sftpfs + +import ( + "fmt" + "io" + "os" + "path" + "sync" + "syscall" + "time" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseops" + "github.com/jacobsa/fuse/fuseutil" + + "github.com/pkg/sftp" + + "golang.org/x/crypto/ssh" + + "mft-fs/abstractfs" + "mft-fs/datastructures" +) + +type sftpClientConfig struct { + Host string + Port int + Username string + Password string + PrivateKeyPath string + RemoteRoot string +} + +type sftpFSManager struct { + abstractfs.FSManager + + client *sftp.Client + conn *ssh.Client + config *sftpClientConfig + + mutex *sync.Mutex + data map[fuseops.InodeID]*abstractfs.FileInfo + length uint64 +} + +func NewSFTPFS(mountDir string, config *sftpClientConfig) *abstractfs.AbstractFS { + return &abstractfs.AbstractFS{ + Manager: newSftpFsManager(config), + MountDir: mountDir, + Cachable: true, + CacheDir: ".", + } +} + +func newSftpFsManager(config *sftpClientConfig) *sftpFSManager { + return &sftpFSManager{ + config: config, + mutex: &sync.Mutex{}, + data: make(map[fuseops.InodeID]*abstractfs.FileInfo), + length: 1, + } +} + +type parentChildPair struct { + parent fuseops.InodeID + child string +} + +func writeFileInfo(stat *os.FileInfo, statSys *syscall.Stat_t, info *abstractfs.FileInfo) { + + // general metadata + info.Size = uint64(statSys.Size) + var direntType fuseutil.DirentType + if (*stat).IsDir() { + direntType = fuseutil.DT_Directory + } else { + direntType = fuseutil.DT_File + } + info.DirentType = direntType + + // permissions metadata + info.Mode = os.FileMode(statSys.Mode) + info.Uid = statSys.Uid + info.Gid = statSys.Gid + + // timing metadata + info.Atime = time.Unix(statSys.Atimespec.Sec, statSys.Atimespec.Nsec) + info.Mtime = time.Unix(statSys.Mtimespec.Sec, statSys.Mtimespec.Nsec) + info.Ctime = time.Unix(statSys.Ctimespec.Sec, statSys.Ctimespec.Nsec) + info.Crtime = time.Unix(statSys.Birthtimespec.Sec, statSys.Birthtimespec.Nsec) + +} + +func (manager *sftpFSManager) bfs() error { + fringe := datastructures.NewQueue() + fringe.Enqueue(&parentChildPair{ + parent: 0, + child: manager.config.RemoteRoot, + }) + var current *parentChildPair + manager.length = 0 + for !fringe.IsEmpty() { + current = fringe.Dequeue().(*parentChildPair) + p := path.Join(manager.data[current.parent].Path, current.child) + + // get the current path + stat, e := manager.client.Stat(p) + if e != nil { + return e + } + + // get the inode + statSys := stat.Sys().(*syscall.Stat_t) + inode := fuseops.InodeID(statSys.Ino) + + // get info object; create if does not exist + var info *abstractfs.FileInfo + info, ok := manager.data[inode] + if !ok { + i := abstractfs.NewFileInfo(current.child, p, inode, current.parent, fuseutil.DT_Unknown) + info = &i + manager.data[inode] = info + manager.data[current.parent].AddChild(current.child, inode) + } + + writeFileInfo(&stat, statSys, info) + + manager.length++ + } + + return nil +} + +func (manager *sftpFSManager) Start() error { + sshConfig := &ssh.ClientConfig{ + User: manager.config.Username, + Auth: []ssh.AuthMethod{ + ssh.Password(manager.config.Password), + }, + + // todo: change in production + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + Timeout: 10 * time.Second, + } + + // Dial the SSH server. + conn, err := ssh.Dial("tcp", fmt.Sprintf("%s:%d", manager.config.Host, manager.config.Port), sshConfig) + if err != nil { + return fmt.Errorf("failed to dial SSH server: %w", err) + } + + // Create the SFTP client from the SSH connection. + client, err := sftp.NewClient(conn) + if err != nil { + // If SFTP client creation fails, ensure the SSH connection is closed. + conn.Close() + return fmt.Errorf("failed to create SFTP client: %w", err) + } + + // update manager attributes + manager.conn = conn + manager.client = client + + return manager.bfs() +} + +func (manager *sftpFSManager) Teardown() error { + var err error + + if manager.client != nil { + err = manager.client.Close() + if err != nil { + return err + } + } + + if manager.conn != nil { + err = manager.conn.Close() + if err != nil { + return err + } + } + + return nil +} + +func (manager *sftpFSManager) GetSize() (uint64, error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + + stat, e := manager.client.Stat(manager.config.RemoteRoot) + if e != nil { + return 0, e + } + return uint64(stat.Size()), nil +} + +func (manager *sftpFSManager) GetLength() (uint64, error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + + return manager.length, nil + +} + +func (manager *sftpFSManager) GetInfo(id fuseops.InodeID) (*abstractfs.FileInfo, error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + + if manager.client == nil { + return nil, fmt.Errorf("SFTP client is not initialized") + } + + var e error + + // get the inode object + info, ok := manager.data[id] + if !ok { + // if it does not exist, perform a BFS to get it + e = manager.bfs() + if e != nil { + return nil, e + } + + // if it still does not exist, throw does not exist error + info, ok = manager.data[id] + if !ok { + return nil, fuse.ENOENT + } + } + + // fetch its statistics + stat, e := manager.client.Stat(info.Path) + if e != nil { + // if it errors, perform a BFS to get latest info + e = manager.bfs() + if e != nil { + return nil, e + } + + info, ok = manager.data[id] + // if it still errors, throw the error + stat, e = manager.client.Stat(info.Path) + if e != nil { + return nil, e + } + } + + writeFileInfo(&stat, stat.Sys().(*syscall.Stat_t), info) + + return info, nil +} + +func (manager *sftpFSManager) SetInfo(id fuseops.InodeID, uidptr *uint32, gidptr *uint32, sizeptr *uint64, modeptr *os.FileMode, atimeptr *time.Time, mtimeptr *time.Time) error { + manager.mutex.Lock() + defer manager.mutex.Unlock() + + if manager.client == nil { + return fmt.Errorf("SFTP client is not initialized") + } + + var e error + + info, ok := manager.data[id] + if !ok { + info, e = manager.GetInfo(id) + if e != nil { + return e + } + } + + if modeptr != nil { + e = manager.client.Chmod(info.Path, *modeptr) + if e != nil { + return e + } + } + + uid := -1 + gid := -1 + if uidptr != nil { + uid = int(*uidptr) + } + if gidptr != nil { + gid = int(*gidptr) + } + e = manager.client.Chown(info.Path, uid, gid) + if e != nil { + return e + } + + atime := time.Time{} + mtime := time.Time{} + if atimeptr != nil { + atime = *atimeptr + } + if mtimeptr != nil { + mtime = *mtimeptr + } + e = manager.client.Chtimes(info.Path, atime, mtime) + if e != nil { + return e + } + + return nil +} + +func (manager *sftpFSManager) Delete(id fuseops.InodeID) error { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return fmt.Errorf("SFTP client is not initialized") + } + + var e error + info, ok := manager.data[id] + if !ok { + info, e = manager.GetInfo(id) + if e != nil { + return e + } + } + return manager.client.Remove(info.Path) +} + +func (manager *sftpFSManager) MkDir(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + var e error + info, ok := manager.data[parent] + if !ok { + info, e = manager.GetInfo(parent) + if e != nil { + return 0, e + } + } + p := path.Join(info.Path, name) + + // make the directory + e = manager.client.Mkdir(p) + if e != nil { + return 0, e + } + + // set permissions + e = manager.client.Chmod(p, mode) + if e != nil { + return 0, e + } + + // create a new inode in local representation + stat, e := manager.client.Stat(p) + if e != nil { + return 0, e + } + statSys := stat.Sys().(*syscall.Stat_t) + inode := fuseops.InodeID(statSys.Ino) + i := abstractfs.NewFileInfo(name, p, inode, parent, fuseutil.DT_Unknown) + info = &i + manager.data[inode] = info + manager.data[parent].AddChild(name, inode) + writeFileInfo(&stat, statSys, info) + return inode, nil +} + +func (manager *sftpFSManager) CreateFile(parent fuseops.InodeID, name string, mode os.FileMode) (fuseops.InodeID, error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + var e error + info, ok := manager.data[parent] + if !ok { + info, e = manager.GetInfo(parent) + if e != nil { + return 0, e + } + } + p := path.Join(info.Path, name) + + // make the directory + _, e = manager.client.Create(p) + if e != nil { + return 0, e + } + + // set permissions + e = manager.client.Chmod(p, mode) + if e != nil { + return 0, e + } + + // create a new inode in local representation + stat, e := manager.client.Stat(p) + if e != nil { + return 0, e + } + statSys := stat.Sys().(*syscall.Stat_t) + inode := fuseops.InodeID(statSys.Ino) + i := abstractfs.NewFileInfo(name, p, inode, parent, fuseutil.DT_Unknown) + info = &i + manager.data[inode] = info + manager.data[parent].AddChild(name, inode) + writeFileInfo(&stat, statSys, info) + return inode, nil +} + +func (manager *sftpFSManager) RmDir(id fuseops.InodeID) error { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return fmt.Errorf("SFTP client is not initialized") + } + + var e error + info, ok := manager.data[id] + if !ok { + info, e = manager.GetInfo(id) + if e != nil { + return e + } + } + return manager.client.RemoveDirectory(info.Path) +} + +func (manager *sftpFSManager) SyncFile(inode fuseops.InodeID) error { + return nil +} + +func (manager *sftpFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + + var e error + info, ok := manager.data[inode] + if !ok { + info, e = manager.GetInfo(inode) + if e != nil { + return 0, e + } + } + + sftpFile, e := manager.client.Open(info.Path) + if e != nil { + return 0, e + } + + _, err = sftpFile.Seek(off, 0) + if err != nil { + return 0, err + } + + n, err = sftpFile.Write(data) + if err != nil { + return 0, err + } + + return n, nil +} + +func (manager *sftpFSManager) ReadAt(inode fuseops.InodeID, data []byte, off int64) (n int, err error) { + manager.mutex.Lock() + defer manager.mutex.Unlock() + if manager.client == nil { + return 0, fmt.Errorf("SFTP client is not initialized") + } + var e error + info, ok := manager.data[inode] + if !ok { + info, e = manager.GetInfo(inode) + if e != nil { + return 0, e + } + } + + sftpFile, e := manager.client.Open(info.Path) + if e != nil { + return 0, e + } + + _, err = sftpFile.Seek(off, 0) + if err != nil { + return 0, err + } + + n, err = sftpFile.Read(data) + if err != nil && err != io.EOF { + return n, err + } + + return n, nil +} + +func (manager *sftpFSManager) Destroy() error { + return nil +} From c4a5a0b22c1325f97b86257a0e6ea653efc8a2ae Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Tue, 19 Aug 2025 07:30:38 -0400 Subject: [PATCH 34/37] debugging --- .gitignore | 8 +- mft-fs/abstractfs/abstractfs.go | 2 +- mft-fs/abstractfs/abstractfs_utils.go | 6 +- mft-fs/main.go | 450 +++++++++++++++++++------ mft-fs/osfs/osfs.go | 14 +- mft-fs/planning.txt | 18 + mft-fs/sftpfs/sftp_test_server/main.go | 2 +- mft-fs/sftpfs/sftpfs.go | 110 +++--- 8 files changed, 456 insertions(+), 154 deletions(-) diff --git a/.gitignore b/.gitignore index 0ceafbbf..d10a224b 100644 --- a/.gitignore +++ b/.gitignore @@ -1213,4 +1213,10 @@ python-sdk/samples/env/* python-sdk/venv/* python-cli/venv/* python-cli/mft_cli/poetry.lock -plugins/* \ No newline at end of file +plugins/* + + +# mft-fs gitignores +mft-fs/mftfs_data/ +mft-fs/mount +mft-fs/root diff --git a/mft-fs/abstractfs/abstractfs.go b/mft-fs/abstractfs/abstractfs.go index ac811fa3..bd171804 100644 --- a/mft-fs/abstractfs/abstractfs.go +++ b/mft-fs/abstractfs/abstractfs.go @@ -439,6 +439,6 @@ func (fs AbstractFS) ReleaseFileHandle(ctx context.Context, op *fuseops.ReleaseF func (fs AbstractFS) Destroy() { printer("Destroy") - fs.Manager.Destroy() + fs.Manager.Teardown() fuse.Unmount("./mount") } diff --git a/mft-fs/abstractfs/abstractfs_utils.go b/mft-fs/abstractfs/abstractfs_utils.go index 69df4836..49c0a369 100644 --- a/mft-fs/abstractfs/abstractfs_utils.go +++ b/mft-fs/abstractfs/abstractfs_utils.go @@ -10,10 +10,6 @@ import ( "mft-fs/datastructures" ) -type FileSystem interface { - fuseutil.FileSystem -} - /* FSManager Interface the FSManager interface can be implemented by any custom filesystem @@ -160,7 +156,7 @@ type FSManager interface { returns: error: any error caused by the invocation */ - Destroy() error + // Destroy() error } /* diff --git a/mft-fs/main.go b/mft-fs/main.go index c76737f7..48e0b2ff 100644 --- a/mft-fs/main.go +++ b/mft-fs/main.go @@ -2,13 +2,84 @@ package main import ( "bufio" + "context" + "encoding/json" "flag" "fmt" + "io/ioutil" + "log" + "math/rand" "os" + "path/filepath" + "strconv" "strings" + + "github.com/jacobsa/fuse" + "github.com/jacobsa/fuse/fuseutil" + + "mft-fs/abstractfs" + "mft-fs/osfs" + "mft-fs/sftpfs" ) -// Define the command-line flags +// --------------- GLOBAL VARIABLES --------------------- + +var mftfsDir string = "/Users/rohanphadnis/GeorgiaTech/ArtisanResearch/airavata-mft/mft-fs/mftfs_data" +var infoData *InfoFile + +const IdLength uint8 = 16 + +// ------------- DATA STRUCTURES ------------------------- + +// InfoFile represents the structure of the info.json file. +type InfoFile struct { + PathToID map[string]string `json:"path_to_id"` + IDToData map[string]FilesystemEntry `json:"id_to_data"` +} + +func (info *InfoFile) generateId() string { + output := make([]byte, IdLength) + for i := uint8(0); i < IdLength; i++ { + output[i] = uint8(rand.Float64()*26 + 65) + } + _, ok := info.IDToData[string(output)] + if ok { + return info.generateId() + } + return string(output) +} + +func (info *InfoFile) AddNewFs(mountDir string, fsType string, fsConfig *Config) { + identity := info.generateId() + info.IDToData[identity] = FilesystemEntry{ + ID: identity, + Path: mountDir, + Type: fsType, + Config: fsConfig, + } + info.PathToID[mountDir] = identity + + err := writeInfo() + if err != nil { + fmt.Fprintf(os.Stderr, "Error writing info file: %v\n", err) + } +} + +type Config struct { + SftpConfig *sftpfs.SftpClientConfig + OsfsConfig *osfs.Config + // add other configuration variables +} + +// FilesystemEntry holds the metadata for a single mounted filesystem. +type FilesystemEntry struct { + ID string `json:"id"` + Path string `json:"path"` + Type string `json:"type"` + Config *Config `json:"config"` +} + +// Command-line flags. var ( helpFlag bool initFlag string @@ -17,46 +88,197 @@ var ( ) func init() { - // Flag definitions with default values and help text flag.BoolVar(&helpFlag, "help", false, "Display help information for the program.") flag.StringVar(&initFlag, "init", "", "Initialize and mount a filesystem at the specified directory.") flag.StringVar(&destroyFlag, "destroy", "", "Unmount and destroy the filesystem at the specified directory.") flag.BoolVar(&infoFlag, "info", false, "Display information about the mounted filesystem.") } +// --------------- MAIN METHOD ------------------ + func main() { flag.Parse() - // Handle the --help flag - if helpFlag { - printHelp() - return + // Perform a one-time setup to ensure the metadata directory exists. + if err := startup(); err != nil { + fmt.Fprintf(os.Stderr, "Startup failed: %v\n", err) + os.Exit(1) } - // Handle the --init flag - if initFlag != "" { - handleInit(initFlag) - return + // Read the info.json file into memory. + if err := readInfo(); err != nil { + fmt.Fprintf(os.Stderr, "Failed to read info.json: %v\n", err) + os.Exit(1) } - // Handle the --destroy flag - if destroyFlag != "" { + // Handle the command-line flags. + switch { + case helpFlag: + handleHelp() + case initFlag != "": + handleInit(initFlag) + runFilesystem(initFlag) + case destroyFlag != "": handleDestroy(destroyFlag) - return + case infoFlag: + handleInfo() + default: + handleHelp() } +} - // Handle the --info flag - if infoFlag { - handleInfo() - return +func runFilesystem(mountDir string) { + fmt.Println("running filesystem!") + + absMountDir, err := filepath.Abs(mountDir) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid mount directory path: %v\n", err) + os.Exit(1) + } + + id, ok := infoData.PathToID[absMountDir] + if !ok { + fmt.Fprintf(os.Stderr, "Could not find mount directory %s\n", absMountDir) + os.Exit(1) + } + + fsInfo, ok := infoData.IDToData[id] + if !ok { + fmt.Fprintf(os.Stderr, "Could not find file system info for %s\n", id) + os.Exit(1) + } + + if fsInfo.Config == nil { + fmt.Fprintln(os.Stderr, "Null value of configuration") + os.Exit(1) + } + + var fs *abstractfs.AbstractFS + + switch fsInfo.Type { + case "osfs": + fs = osfs.NewOSFS(absMountDir, fsInfo.Config.OsfsConfig) + case "sftpfs": + fs = sftpfs.NewSFTPFS(absMountDir, fsInfo.Config.SftpConfig) + default: + fmt.Fprintf(os.Stderr, "Filesystem type %s not implemented\n", fsInfo.Type) + os.Exit(1) + } + + if fs == nil { + fmt.Fprintf(os.Stderr, "Could not find mount directory 678 %s\n", absMountDir) + os.Exit(1) + } + + err = fs.Manager.Start() + if err != nil { + fmt.Fprintf(os.Stderr, "Startup failed: %v\n", err) + os.Exit(1) + } + server := fuseutil.NewFileSystemServer(fs) + + // mount the filesystem + cfg := &fuse.MountConfig{ + ReadOnly: false, + DebugLogger: log.New(os.Stderr, "fuse: ", 0), + ErrorLogger: log.New(os.Stderr, "fuse: ", 0), + } + mfs, err := fuse.Mount(mountDir, server, cfg) + if err != nil { + log.Fatalf("Mount: %v", err) } - // If no flags are provided, print help by default - printHelp() + // wait for it to be unmounted + if err = mfs.Join(context.Background()); err != nil { + log.Fatalf("Join: %v", err) + } } -// printHelp displays the usage information for the CLI tool. -func printHelp() { +// startup ensures the .mftfs directory structure exists. +func startup() error { + /* + todo: uncomment this for eventual release + homeDir, err := os.UserHomeDir() + if err != nil { + return fmt.Errorf("could not find user home directory: %w", err) + } + + mftfsDir = filepath.Join(homeDir, ".mftfs")*/ + + infoPath := filepath.Join(mftfsDir, "info.json") + cacheDir := filepath.Join(mftfsDir, "cache") + + // Create .mftfs directory if it doesn't exist. + if err := os.MkdirAll(mftfsDir, 0755); err != nil { + return fmt.Errorf("failed to create .mftfs directory: %w", err) + } + + // Create cache directory if it doesn't exist. + if err := os.MkdirAll(cacheDir, 0755); err != nil { + return fmt.Errorf("failed to create cache directory: %w", err) + } + + // Create empty info.json file if it doesn't exist. + if _, err := os.Stat(infoPath); os.IsNotExist(err) { + initialInfo := InfoFile{ + PathToID: make(map[string]string), + IDToData: make(map[string]FilesystemEntry), + } + data, err := json.MarshalIndent(initialInfo, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal initial info.json: %w", err) + } + if err := ioutil.WriteFile(infoPath, data, 0644); err != nil { + return fmt.Errorf("failed to write initial info.json: %w", err) + } + } + + return nil +} + +// ----------------- INFO FILE UTILITIES ------------------- + +// readInfo loads the metadata from the info.json file. +func readInfo() error { + infoPath := filepath.Join(mftfsDir, "info.json") + data, err := ioutil.ReadFile(infoPath) + if err != nil { + return fmt.Errorf("failed to read info.json: %w", err) + } + + infoData = &InfoFile{} + if err := json.Unmarshal(data, infoData); err != nil { + return fmt.Errorf("failed to unmarshal info.json: %w", err) + } + + // Initialize maps if they were nil after unmarshalling an empty JSON object. + if infoData.PathToID == nil { + infoData.PathToID = make(map[string]string) + } + if infoData.IDToData == nil { + infoData.IDToData = make(map[string]FilesystemEntry) + } + + return nil +} + +// writeInfo saves the current in-memory infoData to info.json. +func writeInfo() error { + data, err := json.MarshalIndent(infoData, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal infoData: %w", err) + } + infoPath := filepath.Join(mftfsDir, "info.json") + if err := ioutil.WriteFile(infoPath, data, 0644); err != nil { + return fmt.Errorf("failed to write info.json: %w", err) + } + return nil +} + +// ------------------- CLI HANDLERS ----------------- + +// handleHelp displays the usage information for the CLI tool. +func handleHelp() { fmt.Println("Usage: mftfs [flags]") fmt.Println("A command-line tool to manage your FUSE filesystems.") fmt.Println("\nFlags:") @@ -66,117 +288,137 @@ func printHelp() { // handleInit guides the user through the filesystem initialization process. func handleInit(mountDir string) { reader := bufio.NewReader(os.Stdin) + absMountDir, err := filepath.Abs(mountDir) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid mount directory path: %v\n", err) + os.Exit(1) + } + + // Check if the mount path exists in the metadata. + fsID, ok := infoData.PathToID[absMountDir] + if ok { + fsEntry, entryExists := infoData.IDToData[fsID] + if !entryExists { + fmt.Println("Error: Metadata inconsistency detected.") + os.Exit(1) + } - fmt.Printf("Initializing filesystem at: %s\n", mountDir) + fmt.Printf("There was previously a filesystem of type %s on this path. Do you want to relaunch it? [y/n]: ", fsEntry.Type) + response := readInput(reader, "") - // Ask for the type of filesystem - fsType := readInput(reader, "Type of filesystem (s3fs, osfs, grpcfs, sftpfs): ") + if strings.ToLower(response) == "y" { + fmt.Printf("Relaunching existing %s filesystem at %s.\n", fsEntry.Type, absMountDir) + // TODO: Add logic to use fsEntry.Config to mount the filesystem. + return + } - switch strings.ToLower(fsType) { + if strings.ToLower(response) == "n" { + // User wants a new filesystem, so remove the old metadata. + delete(infoData.PathToID, absMountDir) + delete(infoData.IDToData, fsID) + if err := writeInfo(); err != nil { + fmt.Fprintf(os.Stderr, "Failed to update info.json: %v\n", err) + os.Exit(1) + } + fmt.Println("Removed old filesystem metadata. Starting a new initialization.") + } else { + fmt.Println("Invalid response. Exiting.") + os.Exit(1) + } + } + + // Normal initialization flow if no previous record exists or user wants a new one. + fmt.Printf("Initializing a new filesystem at: %s\n", absMountDir) + fsType := strings.ToLower(readInput(reader, "Type of filesystem (s3fs, osfs, grpcfs, sftpfs): ")) + + config := &Config{} + + switch fsType { case "sftpfs": - handleSFTPFSInit(reader) - case "s3fs": - handleS3FSInit(reader) - case "osfs", "grpcfs": + handleSFTPFSInit(reader, config) + case "osfs": + handleOsfsInit(reader, config) + case "s3fs", "grpcfs": fmt.Printf("Support for %s is not yet implemented.\n", fsType) + os.Exit(1) default: fmt.Printf("Unknown filesystem type: %s\n", fsType) os.Exit(1) } - // NOTE: You would add the logic here to actually mount the filesystem. - // For this prototype, we're just handling the user input. - fmt.Printf("Filesystem of type '%s' is ready to be mounted at '%s'.\n", fsType, mountDir) + infoData.AddNewFs(absMountDir, fsType, config) + + fmt.Printf("Filesystem of type '%s' is ready to be mounted at '%s'.\n", fsType, absMountDir) fmt.Println("Add your mounting logic here.") } -// handleSFTPFSInit prompts for and reads SFTP connection details. -func handleSFTPFSInit(reader *bufio.Reader) { +// handleDestroy is a placeholder for the destroy logic. +func handleDestroy(mountDir string) { + fmt.Printf("Attempting to unmount and destroy filesystem at: %s\n", mountDir) + fmt.Println("Add your unmounting logic here.") +} + +// handleInfo displays the contents of the info.json file in a pretty-printed format. +func handleInfo() { + fmt.Println("Displaying metadata from info.json:") + data, err := json.MarshalIndent(infoData, "", " ") + if err != nil { + fmt.Fprintf(os.Stderr, "Error marshaling info data for display: %v\n", err) + return + } + fmt.Println(string(data)) +} + +// -------------- FILESYSTEM SPECIFIC HANDLERS ------------------------ + +// handleSFTPFSInit prompts for and reads SFTP connection details and returns the config map. +func handleSFTPFSInit(reader *bufio.Reader, config *Config) { fmt.Println("\n--- SFTP-FS Configuration ---") host := readInput(reader, "Host: ") - port := readInput(reader, "Port: ") + p, err := strconv.ParseInt(readInput(reader, "Port: "), 10, 16) + if err != nil { + fmt.Fprintf(os.Stderr, "Invalid port: %v\n", err) + os.Exit(1) + } + port := uint16(p) username := readInput(reader, "Username: ") password := readInput(reader, "Password: ") - // Here you would use these variables to create and start the sftpfsManager - // For example: - // config := sftpfs.SFTPClientConfig{ - // Host: host, - // Port: convertPortToInt(port), - // Username: username, - // Password: password, - // } - // manager := sftpfs.NewSFTPFSManager(config) - // manager.Start() + config.SftpConfig = &sftpfs.SftpClientConfig{ + Host: host, + Port: port, + Username: username, + Password: password, + // PrivateKeyPath: ".", + RemoteRoot: ".", + } } -// handleS3FSInit prompts for and reads S3 connection details. -func handleS3FSInit(reader *bufio.Reader) { - fmt.Println("\n--- S3-FS Configuration ---") - bucketName := readInput(reader, "Bucket Name: ") - region := readInput(reader, "Region: ") - awsKey := readInput(reader, "AWS Key: ") - awsSecretKey := readInput(reader, "AWS Secret Key: ") - // You would use these variables to configure S3FS -} +// handleS3FSInit prompts for and reads S3 connection details and returns the config map. +func handleOsfsInit(reader *bufio.Reader, config *Config) { + fmt.Println("\n--- OS-FS Configuration ---") + rootDir := readInput(reader, "Root Absolute Path: ") -// handleDestroy is a placeholder for the destroy logic. -func handleDestroy(mountDir string) { - fmt.Printf("Attempting to unmount and destroy filesystem at: %s\n", mountDir) - fmt.Println("Add your unmounting logic here.") + config.OsfsConfig = &osfs.Config{RootDir: rootDir} } -// handleInfo is a placeholder for the info logic. -func handleInfo() { - fmt.Println("Displaying information about the filesystem.") - fmt.Println("Add your info/metrics retrieval logic here.") +// handleS3FSInit prompts for and reads S3 connection details and returns the config map. +func handleS3FSInit(reader *bufio.Reader) { + fmt.Println("\n--- S3-FS Configuration ---") + // todo: implement + /* + bucketName := readInput(reader, "Bucket Name: ") + region := readInput(reader, "Region: ") + awsKey := readInput(reader, "AWS Key: ") + awsSecretKey := readInput(reader, "AWS Secret Key: ") + */ } +// ----------------- INFO FILE UTILS ----------------- + // readInput is a helper function to read a line of input from the user. func readInput(reader *bufio.Reader, prompt string) string { fmt.Print(prompt) input, _ := reader.ReadString('\n') return strings.TrimSpace(input) } - -/*package main - -import ( - "context" - "flag" - "github.com/jacobsa/fuse" - "github.com/jacobsa/fuse/fuseutil" - "log" - "mft-fs/archive/abstractfs" - "mft-fs/archive/osfsmanager" - "os" -) - -func main() { - - // reading commandline args - mountDirectory := flag.String("mountDirectory", "", "mount directory") - rootDirectory := flag.String("rootDirectory", "", "root directory") - flag.Parse() - - manager := osfsmanager.NewOSFSManager(*rootDirectory) - fs, _ := abstractfs.NewAbstractFS(manager) - server := fuseutil.NewFileSystemServer(&fs) - - // mount the filesystem - cfg := &fuse.MountConfig{ - ReadOnly: false, - DebugLogger: log.New(os.Stderr, "fuse: ", 0), - ErrorLogger: log.New(os.Stderr, "fuse: ", 0), - } - mfs, err := fuse.Mount(*mountDirectory, server, cfg) - if err != nil { - log.Fatalf("Mount: %v", err) - } - - // wait for it to be unmounted - if err = mfs.Join(context.Background()); err != nil { - log.Fatalf("Join: %v", err) - } -} -*/ diff --git a/mft-fs/osfs/osfs.go b/mft-fs/osfs/osfs.go index c93ee5a5..3841eab4 100644 --- a/mft-fs/osfs/osfs.go +++ b/mft-fs/osfs/osfs.go @@ -16,9 +16,17 @@ import ( "mft-fs/datastructures" ) -func NewOSFS(mountDir string, rootDir string) *abstractfs.AbstractFS { +type Config struct { + RootDir string +} + +func NewOSFS(mountDir string, config *Config) *abstractfs.AbstractFS { + if config == nil { + fmt.Println("config is nil") + return nil + } return &abstractfs.AbstractFS{ - Manager: NewOSFSManager(rootDir), + Manager: NewOSFSManager(config.RootDir), MountDir: mountDir, Cachable: false, CacheDir: "", @@ -332,4 +340,4 @@ func (manager *OSFSManager) WriteAt(inode fuseops.InodeID, data []byte, off int6 return n, e } -func (manager *OSFSManager) Destroy() error { return nil } +// func (manager *OSFSManager) Destroy() error { return nil } diff --git a/mft-fs/planning.txt b/mft-fs/planning.txt index 5a5e47ad..2c64a212 100644 --- a/mft-fs/planning.txt +++ b/mft-fs/planning.txt @@ -8,6 +8,24 @@ AbstractFS attributes: - username, password, key for sftp-fs + +.mftfs + cache/ + fs0/ + file_.data + fs1/ + ... + fsn/ + info.json + path to id mapping + id to data + id + path + type (s3fs, osfs, sftpfs, etc) + config (type dependent) + + + func (fs AbstractFS) StatFS(ctx context.Context, op *fuseops.StatFSOp) error - returns general information about the FS like remaining space, inode capacity, etc - implement GetSize(), GetLength() for each FS diff --git a/mft-fs/sftpfs/sftp_test_server/main.go b/mft-fs/sftpfs/sftp_test_server/main.go index 4c9ac900..e4d34448 100644 --- a/mft-fs/sftpfs/sftp_test_server/main.go +++ b/mft-fs/sftpfs/sftp_test_server/main.go @@ -44,7 +44,7 @@ func main() { }, } - privateBytes, err := os.ReadFile("go_server/host_key") + privateBytes, err := os.ReadFile("./host_key") if err != nil { log.Fatal("Failed to load private key", err) } diff --git a/mft-fs/sftpfs/sftpfs.go b/mft-fs/sftpfs/sftpfs.go index e4739476..8c819752 100644 --- a/mft-fs/sftpfs/sftpfs.go +++ b/mft-fs/sftpfs/sftpfs.go @@ -6,7 +6,6 @@ import ( "os" "path" "sync" - "syscall" "time" "github.com/jacobsa/fuse" @@ -21,13 +20,15 @@ import ( "mft-fs/datastructures" ) -type sftpClientConfig struct { - Host string - Port int - Username string - Password string - PrivateKeyPath string - RemoteRoot string +// todo: make generated inode persistent + +type SftpClientConfig struct { + Host string + Port uint16 + Username string + Password string + // PrivateKeyPath string + RemoteRoot string } type sftpFSManager struct { @@ -35,14 +36,16 @@ type sftpFSManager struct { client *sftp.Client conn *ssh.Client - config *sftpClientConfig + config *SftpClientConfig - mutex *sync.Mutex - data map[fuseops.InodeID]*abstractfs.FileInfo - length uint64 + mutex *sync.Mutex + data map[fuseops.InodeID]*abstractfs.FileInfo + pathToInode map[string]fuseops.InodeID + length uint64 + inodeCounter fuseops.InodeID } -func NewSFTPFS(mountDir string, config *sftpClientConfig) *abstractfs.AbstractFS { +func NewSFTPFS(mountDir string, config *SftpClientConfig) *abstractfs.AbstractFS { return &abstractfs.AbstractFS{ Manager: newSftpFsManager(config), MountDir: mountDir, @@ -51,12 +54,18 @@ func NewSFTPFS(mountDir string, config *sftpClientConfig) *abstractfs.AbstractFS } } -func newSftpFsManager(config *sftpClientConfig) *sftpFSManager { +func newSftpFsManager(config *SftpClientConfig) *sftpFSManager { + if config == nil { + fmt.Println("config is nil") + return nil + } return &sftpFSManager{ - config: config, - mutex: &sync.Mutex{}, - data: make(map[fuseops.InodeID]*abstractfs.FileInfo), - length: 1, + config: config, + mutex: &sync.Mutex{}, + data: make(map[fuseops.InodeID]*abstractfs.FileInfo), + length: 1, + inodeCounter: 1, + pathToInode: make(map[string]fuseops.InodeID), } } @@ -65,7 +74,7 @@ type parentChildPair struct { child string } -func writeFileInfo(stat *os.FileInfo, statSys *syscall.Stat_t, info *abstractfs.FileInfo) { +func writeFileInfo(stat *os.FileInfo, statSys *sftp.FileStat, info *abstractfs.FileInfo) { // general metadata info.Size = uint64(statSys.Size) @@ -79,15 +88,21 @@ func writeFileInfo(stat *os.FileInfo, statSys *syscall.Stat_t, info *abstractfs. // permissions metadata info.Mode = os.FileMode(statSys.Mode) - info.Uid = statSys.Uid - info.Gid = statSys.Gid + info.Uid = statSys.UID + info.Gid = statSys.GID // timing metadata - info.Atime = time.Unix(statSys.Atimespec.Sec, statSys.Atimespec.Nsec) - info.Mtime = time.Unix(statSys.Mtimespec.Sec, statSys.Mtimespec.Nsec) - info.Ctime = time.Unix(statSys.Ctimespec.Sec, statSys.Ctimespec.Nsec) - info.Crtime = time.Unix(statSys.Birthtimespec.Sec, statSys.Birthtimespec.Nsec) + info.Atime = statSys.AccessTime() + info.Mtime = statSys.ModTime() + // info.Ctime = time.Unix(statSys.Ctimespec.Sec, statSys.Ctimespec.Nsec) + // info.Crtime = time.Unix(statSys.Birthtimespec.Sec, statSys.Birthtimespec.Nsec) + +} +func (manager *sftpFSManager) generateInode() fuseops.InodeID { + output := manager.inodeCounter + manager.inodeCounter++ + return output } func (manager *sftpFSManager) bfs() error { @@ -100,26 +115,41 @@ func (manager *sftpFSManager) bfs() error { manager.length = 0 for !fringe.IsEmpty() { current = fringe.Dequeue().(*parentChildPair) - p := path.Join(manager.data[current.parent].Path, current.child) + var p string + if current.parent == 0 { + p = manager.config.RemoteRoot + } else { + p = path.Join(manager.data[current.parent].Path, current.child) + } // get the current path stat, e := manager.client.Stat(p) if e != nil { return e } + statSys := stat.Sys().(*sftp.FileStat) + + // variable declaration + var inode fuseops.InodeID + var info *abstractfs.FileInfo + var ok bool // get the inode - statSys := stat.Sys().(*syscall.Stat_t) - inode := fuseops.InodeID(statSys.Ino) + inode, ok = manager.pathToInode[p] + if !ok { + inode = manager.generateInode() + } // get info object; create if does not exist - var info *abstractfs.FileInfo - info, ok := manager.data[inode] + info, ok = manager.data[inode] if !ok { i := abstractfs.NewFileInfo(current.child, p, inode, current.parent, fuseutil.DT_Unknown) info = &i manager.data[inode] = info - manager.data[current.parent].AddChild(current.child, inode) + manager.pathToInode[p] = inode + if current.parent != 0 { + manager.data[current.parent].AddChild(current.child, inode) + } } writeFileInfo(&stat, statSys, info) @@ -253,7 +283,7 @@ func (manager *sftpFSManager) GetInfo(id fuseops.InodeID) (*abstractfs.FileInfo, } } - writeFileInfo(&stat, stat.Sys().(*syscall.Stat_t), info) + writeFileInfo(&stat, stat.Sys().(*sftp.FileStat), info) return info, nil } @@ -363,11 +393,12 @@ func (manager *sftpFSManager) MkDir(parent fuseops.InodeID, name string, mode os if e != nil { return 0, e } - statSys := stat.Sys().(*syscall.Stat_t) - inode := fuseops.InodeID(statSys.Ino) + statSys := stat.Sys().(*sftp.FileStat) + inode := manager.generateInode() i := abstractfs.NewFileInfo(name, p, inode, parent, fuseutil.DT_Unknown) info = &i manager.data[inode] = info + manager.pathToInode[p] = inode manager.data[parent].AddChild(name, inode) writeFileInfo(&stat, statSys, info) return inode, nil @@ -406,11 +437,12 @@ func (manager *sftpFSManager) CreateFile(parent fuseops.InodeID, name string, mo if e != nil { return 0, e } - statSys := stat.Sys().(*syscall.Stat_t) - inode := fuseops.InodeID(statSys.Ino) + statSys := stat.Sys().(*sftp.FileStat) + inode := manager.generateInode() i := abstractfs.NewFileInfo(name, p, inode, parent, fuseutil.DT_Unknown) info = &i manager.data[inode] = info + manager.pathToInode[p] = inode manager.data[parent].AddChild(name, inode) writeFileInfo(&stat, statSys, info) return inode, nil @@ -505,6 +537,6 @@ func (manager *sftpFSManager) ReadAt(inode fuseops.InodeID, data []byte, off int return n, nil } -func (manager *sftpFSManager) Destroy() error { - return nil -} +//func (manager *sftpFSManager) Destroy() error { +// return nil +//} From a72fee2449fee55d08793b2784ddb1b1e10ae4c7 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Tue, 19 Aug 2025 08:02:43 -0400 Subject: [PATCH 35/37] latest go.mod --- mft-fs/gomod.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/mft-fs/gomod.txt b/mft-fs/gomod.txt index 4463839c..361352ae 100644 --- a/mft-fs/gomod.txt +++ b/mft-fs/gomod.txt @@ -7,13 +7,16 @@ toolchain go1.22.3 require github.com/jacobsa/fuse v0.0.0-20240607092844-7285af0d05b0 require ( - golang.org/x/sys v0.21.0 + golang.org/x/sys v0.28.0 google.golang.org/grpc v1.65.0 ) require ( + github.com/kr/fs v0.1.0 // indirect + github.com/pkg/sftp v1.13.9 // indirect + golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157 // indirect google.golang.org/protobuf v1.34.1 // indirect ) From 27ba8690c4e6eb0c2cb1b0b61617c063287cc371 Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Tue, 19 Aug 2025 13:12:18 -0400 Subject: [PATCH 36/37] bfs expanded --- mft-fs/sftpfs/sftpfs.go | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/mft-fs/sftpfs/sftpfs.go b/mft-fs/sftpfs/sftpfs.go index 8c819752..07d3932e 100644 --- a/mft-fs/sftpfs/sftpfs.go +++ b/mft-fs/sftpfs/sftpfs.go @@ -107,6 +107,7 @@ func (manager *sftpFSManager) generateInode() fuseops.InodeID { func (manager *sftpFSManager) bfs() error { fringe := datastructures.NewQueue() + fringe.Enqueue(&parentChildPair{ parent: 0, child: manager.config.RemoteRoot, @@ -154,6 +155,19 @@ func (manager *sftpFSManager) bfs() error { writeFileInfo(&stat, statSys, info) + if info.DirentType == fuseutil.DT_Directory { + dir, err := manager.client.ReadDir(info.Path) + if err != nil { + return err + } + for _, d := range dir { + fringe.Enqueue(&parentChildPair{ + parent: info.Inode, + child: d.Name(), + }) + } + } + manager.length++ } @@ -221,6 +235,7 @@ func (manager *sftpFSManager) GetSize() (uint64, error) { return 0, fmt.Errorf("SFTP client is not initialized") } + return 0, nil stat, e := manager.client.Stat(manager.config.RemoteRoot) if e != nil { return 0, e From 2c109b508441ca1795a3680706c97493d6ca119e Mon Sep 17 00:00:00 2001 From: RohanPhadnis Date: Tue, 19 Aug 2025 13:49:47 -0400 Subject: [PATCH 37/37] added missing methods --- mft-fs/abstractfs/abstractfs.go | 57 ++++++++++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 1 deletion(-) diff --git a/mft-fs/abstractfs/abstractfs.go b/mft-fs/abstractfs/abstractfs.go index bd171804..bac6526c 100644 --- a/mft-fs/abstractfs/abstractfs.go +++ b/mft-fs/abstractfs/abstractfs.go @@ -45,7 +45,7 @@ func expireTime() time.Time { } type AbstractFS struct { - fuseutil.NotImplementedFileSystem + // fuseutil.NotImplementedFileSystem Manager FSManager MountDir string @@ -53,6 +53,61 @@ type AbstractFS struct { CacheDir string } +func (fs AbstractFS) MkNode(ctx context.Context, op *fuseops.MkNodeOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) CreateLink(ctx context.Context, op *fuseops.CreateLinkOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) CreateSymlink(ctx context.Context, op *fuseops.CreateSymlinkOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) Rename(ctx context.Context, op *fuseops.RenameOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) Unlink(ctx context.Context, op *fuseops.UnlinkOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) ReadSymlink(ctx context.Context, op *fuseops.ReadSymlinkOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) RemoveXattr(ctx context.Context, op *fuseops.RemoveXattrOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) GetXattr(ctx context.Context, op *fuseops.GetXattrOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) ListXattr(ctx context.Context, op *fuseops.ListXattrOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) SetXattr(ctx context.Context, op *fuseops.SetXattrOp) error { + printer("MkNode") + return nil +} + +func (fs AbstractFS) Fallocate(ctx context.Context, op *fuseops.FallocateOp) error { + printer("MkNode") + return nil +} + // private helpers // fillAttributes