Browse Source

support write once read many

fix https://github.com/seaweedfs/seaweedfs/issues/5954
pull/5976/head
chrislu 4 months ago
parent
commit
eb02946c97
  1. 2
      weed/command/mount.go
  2. 1
      weed/command/mount_std.go
  3. 2
      weed/mount/weedfs.go
  4. 2
      weed/mount/weedfs_file_io.go
  5. 10
      weed/mount/weedfs_filehandle.go

2
weed/command/mount.go

@ -33,6 +33,7 @@ type MountOptions struct {
localSocket *string localSocket *string
disableXAttr *bool disableXAttr *bool
extraOptions []string extraOptions []string
writeOnceReadMany *bool
} }
var ( var (
@ -70,6 +71,7 @@ func init() {
mountOptions.debugPort = cmdMount.Flag.Int("debug.port", 6061, "http port for debugging") mountOptions.debugPort = cmdMount.Flag.Int("debug.port", 6061, "http port for debugging")
mountOptions.localSocket = cmdMount.Flag.String("localSocket", "", "default to /tmp/seaweedfs-mount-<mount_dir_hash>.sock") mountOptions.localSocket = cmdMount.Flag.String("localSocket", "", "default to /tmp/seaweedfs-mount-<mount_dir_hash>.sock")
mountOptions.disableXAttr = cmdMount.Flag.Bool("disableXAttr", false, "disable xattr") mountOptions.disableXAttr = cmdMount.Flag.Bool("disableXAttr", false, "disable xattr")
mountOptions.writeOnceReadMany = cmdMount.Flag.Bool("writeOnceReadMany", false, "write once, read many times")
mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file") mountCpuProfile = cmdMount.Flag.String("cpuprofile", "", "cpu profile output file")
mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file") mountMemProfile = cmdMount.Flag.String("memprofile", "", "memory profile output file")

1
weed/command/mount_std.go

@ -247,6 +247,7 @@ func RunMount(option *MountOptions, umask os.FileMode) bool {
Cipher: cipher, Cipher: cipher,
UidGidMapper: uidGidMapper, UidGidMapper: uidGidMapper,
DisableXAttr: *option.disableXAttr, DisableXAttr: *option.disableXAttr,
WriteOnceReadMany: *option.writeOnceReadMany,
}) })
// create mount root // create mount root

2
weed/mount/weedfs.go

@ -46,6 +46,8 @@ type Option struct {
Quota int64 Quota int64
DisableXAttr bool DisableXAttr bool
WriteOnceReadMany bool
MountUid uint32 MountUid uint32
MountGid uint32 MountGid uint32
MountMode os.FileMode MountMode os.FileMode

2
weed/mount/weedfs_file_io.go

@ -62,7 +62,7 @@ import (
*/ */
func (wfs *WFS) Open(cancel <-chan struct{}, in *fuse.OpenIn, out *fuse.OpenOut) (status fuse.Status) { func (wfs *WFS) Open(cancel <-chan struct{}, in *fuse.OpenIn, out *fuse.OpenOut) (status fuse.Status) {
var fileHandle *FileHandle var fileHandle *FileHandle
fileHandle, status = wfs.AcquireHandle(in.NodeId, in.Uid, in.Gid)
fileHandle, status = wfs.AcquireHandle(in.NodeId, in.Flags, in.Uid, in.Gid)
if status == fuse.OK { if status == fuse.OK {
out.Fh = uint64(fileHandle.fh) out.Fh = uint64(fileHandle.fh)
// TODO https://github.com/libfuse/libfuse/blob/master/include/fuse_common.h#L64 // TODO https://github.com/libfuse/libfuse/blob/master/include/fuse_common.h#L64

10
weed/mount/weedfs_filehandle.go

@ -3,12 +3,20 @@ package mount
import ( import (
"github.com/hanwen/go-fuse/v2/fuse" "github.com/hanwen/go-fuse/v2/fuse"
"github.com/seaweedfs/seaweedfs/weed/pb/filer_pb" "github.com/seaweedfs/seaweedfs/weed/pb/filer_pb"
"time"
) )
func (wfs *WFS) AcquireHandle(inode uint64, uid, gid uint32) (fileHandle *FileHandle, status fuse.Status) {
func (wfs *WFS) AcquireHandle(inode uint64, flags, uid, gid uint32) (fileHandle *FileHandle, status fuse.Status) {
var entry *filer_pb.Entry var entry *filer_pb.Entry
_, _, entry, status = wfs.maybeReadEntry(inode) _, _, entry, status = wfs.maybeReadEntry(inode)
if status == fuse.OK { if status == fuse.OK {
if entry != nil && wfs.option.WriteOnceReadMany {
if entry.Attributes.Mtime+10 < time.Now().Unix() {
if flags&fuse.O_ANYWRITE != 0 {
return nil, fuse.EPERM
}
}
}
// need to AcquireFileHandle again to ensure correct handle counter // need to AcquireFileHandle again to ensure correct handle counter
fileHandle = wfs.fhmap.AcquireFileHandle(wfs, inode, entry) fileHandle = wfs.fhmap.AcquireFileHandle(wfs, inode, entry)
} }

Loading…
Cancel
Save