mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2025-12-17 17:51:20 +08:00
Merge branch 'master' into mq-subscribe
This commit is contained in:
@@ -164,6 +164,7 @@ func init() {
|
|||||||
webdavOptions.tlsCertificate = cmdServer.Flag.String("webdav.cert.file", "", "path to the TLS certificate file")
|
webdavOptions.tlsCertificate = cmdServer.Flag.String("webdav.cert.file", "", "path to the TLS certificate file")
|
||||||
webdavOptions.cacheDir = cmdServer.Flag.String("webdav.cacheDir", os.TempDir(), "local cache directory for file chunks")
|
webdavOptions.cacheDir = cmdServer.Flag.String("webdav.cacheDir", os.TempDir(), "local cache directory for file chunks")
|
||||||
webdavOptions.cacheSizeMB = cmdServer.Flag.Int64("webdav.cacheCapacityMB", 0, "local cache capacity in MB")
|
webdavOptions.cacheSizeMB = cmdServer.Flag.Int64("webdav.cacheCapacityMB", 0, "local cache capacity in MB")
|
||||||
|
webdavOptions.maxMB = cmdServer.Flag.Int("webdav.maxMB", 4, "split files larger than the limit")
|
||||||
webdavOptions.filerRootPath = cmdServer.Flag.String("webdav.filer.path", "/", "use this remote path from filer server")
|
webdavOptions.filerRootPath = cmdServer.Flag.String("webdav.filer.path", "/", "use this remote path from filer server")
|
||||||
|
|
||||||
mqBrokerOptions.port = cmdServer.Flag.Int("mq.broker.port", 17777, "message queue broker gRPC listen port")
|
mqBrokerOptions.port = cmdServer.Flag.Int("mq.broker.port", 17777, "message queue broker gRPC listen port")
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ type WebDavOption struct {
|
|||||||
tlsCertificate *string
|
tlsCertificate *string
|
||||||
cacheDir *string
|
cacheDir *string
|
||||||
cacheSizeMB *int64
|
cacheSizeMB *int64
|
||||||
|
maxMB *int
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -45,6 +46,7 @@ func init() {
|
|||||||
webDavStandaloneOptions.tlsCertificate = cmdWebDav.Flag.String("cert.file", "", "path to the TLS certificate file")
|
webDavStandaloneOptions.tlsCertificate = cmdWebDav.Flag.String("cert.file", "", "path to the TLS certificate file")
|
||||||
webDavStandaloneOptions.cacheDir = cmdWebDav.Flag.String("cacheDir", os.TempDir(), "local cache directory for file chunks")
|
webDavStandaloneOptions.cacheDir = cmdWebDav.Flag.String("cacheDir", os.TempDir(), "local cache directory for file chunks")
|
||||||
webDavStandaloneOptions.cacheSizeMB = cmdWebDav.Flag.Int64("cacheCapacityMB", 0, "local cache capacity in MB")
|
webDavStandaloneOptions.cacheSizeMB = cmdWebDav.Flag.Int64("cacheCapacityMB", 0, "local cache capacity in MB")
|
||||||
|
webDavStandaloneOptions.maxMB = cmdWebDav.Flag.Int("maxMB", 4, "split files larger than the limit")
|
||||||
webDavStandaloneOptions.filerRootPath = cmdWebDav.Flag.String("filer.path", "/", "use this remote path from filer server")
|
webDavStandaloneOptions.filerRootPath = cmdWebDav.Flag.String("filer.path", "/", "use this remote path from filer server")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,6 +118,7 @@ func (wo *WebDavOption) startWebDav() bool {
|
|||||||
Cipher: cipher,
|
Cipher: cipher,
|
||||||
CacheDir: util.ResolvePath(*wo.cacheDir),
|
CacheDir: util.ResolvePath(*wo.cacheDir),
|
||||||
CacheSizeMB: *wo.cacheSizeMB,
|
CacheSizeMB: *wo.cacheSizeMB,
|
||||||
|
MaxMB: *wo.maxMB,
|
||||||
})
|
})
|
||||||
if webdavServer_err != nil {
|
if webdavServer_err != nil {
|
||||||
glog.Fatalf("WebDav Server startup error: %v", webdavServer_err)
|
glog.Fatalf("WebDav Server startup error: %v", webdavServer_err)
|
||||||
|
|||||||
@@ -545,8 +545,9 @@ func (s3a *S3ApiServer) GetBucketVersioningHandler(w http.ResponseWriter, r *htt
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
result := &s3.VersioningConfiguration{}
|
s3err.WriteAwsXMLResponse(w, r, http.StatusOK, &s3.PutBucketVersioningInput{
|
||||||
result.SetStatus(s3.BucketVersioningStatusSuspended)
|
VersioningConfiguration: &s3.VersioningConfiguration{
|
||||||
|
Status: aws.String(s3.BucketVersioningStatusSuspended),
|
||||||
s3err.WriteAwsXMLResponse(w, r, http.StatusOK, result)
|
},
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ type WebDavOption struct {
|
|||||||
Cipher bool
|
Cipher bool
|
||||||
CacheDir string
|
CacheDir string
|
||||||
CacheSizeMB int64
|
CacheSizeMB int64
|
||||||
|
MaxMB int
|
||||||
}
|
}
|
||||||
|
|
||||||
type WebDavServer struct {
|
type WebDavServer struct {
|
||||||
@@ -96,6 +97,7 @@ type FileInfo struct {
|
|||||||
size int64
|
size int64
|
||||||
mode os.FileMode
|
mode os.FileMode
|
||||||
modifiedTime time.Time
|
modifiedTime time.Time
|
||||||
|
etag string
|
||||||
isDirectory bool
|
isDirectory bool
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -106,6 +108,10 @@ func (fi *FileInfo) ModTime() time.Time { return fi.modifiedTime }
|
|||||||
func (fi *FileInfo) IsDir() bool { return fi.isDirectory }
|
func (fi *FileInfo) IsDir() bool { return fi.isDirectory }
|
||||||
func (fi *FileInfo) Sys() interface{} { return nil }
|
func (fi *FileInfo) Sys() interface{} { return nil }
|
||||||
|
|
||||||
|
func (fi *FileInfo) ETag(ctx context.Context) (string, error) {
|
||||||
|
return fi.etag, nil
|
||||||
|
}
|
||||||
|
|
||||||
type WebDavFile struct {
|
type WebDavFile struct {
|
||||||
fs *WebDavFileSystem
|
fs *WebDavFileSystem
|
||||||
name string
|
name string
|
||||||
@@ -236,7 +242,7 @@ func (fs *WebDavFileSystem) OpenFile(ctx context.Context, fullFilePath string, f
|
|||||||
Name: name,
|
Name: name,
|
||||||
IsDirectory: perm&os.ModeDir > 0,
|
IsDirectory: perm&os.ModeDir > 0,
|
||||||
Attributes: &filer_pb.FuseAttributes{
|
Attributes: &filer_pb.FuseAttributes{
|
||||||
Mtime: time.Now().Unix(),
|
Mtime: 0,
|
||||||
Crtime: time.Now().Unix(),
|
Crtime: time.Now().Unix(),
|
||||||
FileMode: uint32(perm),
|
FileMode: uint32(perm),
|
||||||
Uid: fs.option.Uid,
|
Uid: fs.option.Uid,
|
||||||
@@ -257,7 +263,7 @@ func (fs *WebDavFileSystem) OpenFile(ctx context.Context, fullFilePath string, f
|
|||||||
fs: fs,
|
fs: fs,
|
||||||
name: fullFilePath,
|
name: fullFilePath,
|
||||||
isDirectory: false,
|
isDirectory: false,
|
||||||
bufWriter: buffered_writer.NewBufferedWriteCloser(4 * 1024 * 1024),
|
bufWriter: buffered_writer.NewBufferedWriteCloser(fs.option.MaxMB * 1024 * 1024),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,7 +279,7 @@ func (fs *WebDavFileSystem) OpenFile(ctx context.Context, fullFilePath string, f
|
|||||||
fs: fs,
|
fs: fs,
|
||||||
name: fullFilePath,
|
name: fullFilePath,
|
||||||
isDirectory: false,
|
isDirectory: false,
|
||||||
bufWriter: buffered_writer.NewBufferedWriteCloser(4 * 1024 * 1024),
|
bufWriter: buffered_writer.NewBufferedWriteCloser(fs.option.MaxMB * 1024 * 1024),
|
||||||
}, nil
|
}, nil
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -369,6 +375,7 @@ func (fs *WebDavFileSystem) stat(ctx context.Context, fullFilePath string) (os.F
|
|||||||
fi.name = string(fullpath)
|
fi.name = string(fullpath)
|
||||||
fi.mode = os.FileMode(entry.Attributes.FileMode)
|
fi.mode = os.FileMode(entry.Attributes.FileMode)
|
||||||
fi.modifiedTime = time.Unix(entry.Attributes.Mtime, 0)
|
fi.modifiedTime = time.Unix(entry.Attributes.Mtime, 0)
|
||||||
|
fi.etag = filer.ETag(entry)
|
||||||
fi.isDirectory = entry.IsDirectory
|
fi.isDirectory = entry.IsDirectory
|
||||||
|
|
||||||
if fi.name == "/" {
|
if fi.name == "/" {
|
||||||
@@ -423,12 +430,13 @@ func (f *WebDavFile) Write(buf []byte) (int, error) {
|
|||||||
|
|
||||||
glog.V(2).Infof("WebDavFileSystem.Write %v", f.name)
|
glog.V(2).Infof("WebDavFileSystem.Write %v", f.name)
|
||||||
|
|
||||||
dir, _ := util.FullPath(f.name).DirAndName()
|
fullPath := util.FullPath(f.name)
|
||||||
|
dir, _ := fullPath.DirAndName()
|
||||||
|
|
||||||
var getErr error
|
var getErr error
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
if f.entry == nil {
|
if f.entry == nil {
|
||||||
f.entry, getErr = filer_pb.GetEntry(f.fs, util.FullPath(f.name))
|
f.entry, getErr = filer_pb.GetEntry(f.fs, fullPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
if f.entry == nil {
|
if f.entry == nil {
|
||||||
@@ -445,6 +453,11 @@ func (f *WebDavFile) Write(buf []byte) (int, error) {
|
|||||||
chunk, flushErr = f.saveDataAsChunk(util.NewBytesReader(data), f.name, offset, time.Now().UnixNano())
|
chunk, flushErr = f.saveDataAsChunk(util.NewBytesReader(data), f.name, offset, time.Now().UnixNano())
|
||||||
|
|
||||||
if flushErr != nil {
|
if flushErr != nil {
|
||||||
|
if f.entry.Attributes.Mtime == 0 {
|
||||||
|
if err := f.fs.removeAll(ctx, f.name); err != nil {
|
||||||
|
glog.Errorf("bufWriter.Flush remove file error: %+v", f.name)
|
||||||
|
}
|
||||||
|
}
|
||||||
return fmt.Errorf("%s upload result: %v", f.name, flushErr)
|
return fmt.Errorf("%s upload result: %v", f.name, flushErr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -95,3 +95,11 @@ func (w wrappedFileInfo) Name() string {
|
|||||||
name := w.FileInfo.Name()
|
name := w.FileInfo.Name()
|
||||||
return strings.TrimPrefix(name, *w.subFolder)
|
return strings.TrimPrefix(name, *w.subFolder)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (w wrappedFileInfo) ETag(ctx context.Context) (string, error) {
|
||||||
|
etag, _ := w.FileInfo.(webdav.ETager).ETag(ctx)
|
||||||
|
if len(etag) == 0 {
|
||||||
|
return etag, webdav.ErrNotImplemented
|
||||||
|
}
|
||||||
|
return etag, nil
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user