mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-08-24 04:09:59 +08:00
support write once read many
fix https://github.com/seaweedfs/seaweedfs/issues/5954
This commit is contained in:
parent
18afdb15b6
commit
eb02946c97
@ -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")
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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…
Reference in New Issue
Block a user