aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lu <chris.lu@gmail.com>2019-05-03 00:55:52 -0700
committerChris Lu <chris.lu@gmail.com>2019-05-03 00:55:52 -0700
commit7064b2ea48c541904a5a1ba9c144cbe3c070a1d4 (patch)
tree6e512f5496b918f43c9baf714c6a425880fe8f49
parentb30c14b6314c96e0cb0c110e2aa1fc206857a066 (diff)
downloadseaweedfs-7064b2ea48c541904a5a1ba9c144cbe3c070a1d4.tar.xz
seaweedfs-7064b2ea48c541904a5a1ba9c144cbe3c070a1d4.zip
webdav: can write now
-rw-r--r--weed/filer2/filer_client_util.go6
-rw-r--r--weed/server/webdav_server.go83
2 files changed, 80 insertions, 9 deletions
diff --git a/weed/filer2/filer_client_util.go b/weed/filer2/filer_client_util.go
index 71daa9ee1..829c652da 100644
--- a/weed/filer2/filer_client_util.go
+++ b/weed/filer2/filer_client_util.go
@@ -102,13 +102,13 @@ func GetEntry(ctx context.Context, filerClient FilerClient, fullFilePath string)
Name: name,
}
- glog.V(1).Infof("read %s request: %v", fullFilePath, request)
+ glog.V(3).Infof("read %s request: %v", fullFilePath, request)
resp, err := client.LookupDirectoryEntry(ctx, request)
if err != nil {
if err == ErrNotFound {
return nil
}
- glog.V(0).Infof("read %s attr %v: %v", fullFilePath, request, err)
+ glog.V(3).Infof("read %s attr %v: %v", fullFilePath, request, err)
return err
}
@@ -138,7 +138,7 @@ func ReadDirAllEntries(ctx context.Context, filerClient FilerClient, fullDirPath
Limit: uint32(paginationLimit),
}
- glog.V(4).Infof("read directory: %v", request)
+ glog.V(3).Infof("read directory: %v", request)
resp, err := client.ListEntries(ctx, request)
if err != nil {
return fmt.Errorf("list %s: %v", fullDirPath, err)
diff --git a/weed/server/webdav_server.go b/weed/server/webdav_server.go
index 5930e99be..c9e897c83 100644
--- a/weed/server/webdav_server.go
+++ b/weed/server/webdav_server.go
@@ -1,6 +1,7 @@
package weed_server
import (
+ "bytes"
"context"
"fmt"
"io"
@@ -11,6 +12,7 @@ import (
"strings"
"time"
+ "github.com/chrislusf/seaweedfs/weed/operation"
"github.com/chrislusf/seaweedfs/weed/pb/filer_pb"
"github.com/chrislusf/seaweedfs/weed/util"
"golang.org/x/net/webdav"
@@ -63,13 +65,13 @@ func NewWebDavServer(option *WebDavOption) (ws *WebDavServer, err error) {
if u, err := url.Parse(r.Header.Get("Destination")); err == nil {
dst = u.Path
}
- glog.Infof("%-18s %s %s %v",
+ glog.V(3).Infof("%-18s %s %s %v",
r.Method,
r.URL.Path,
dst,
err)
default:
- glog.Infof("%-18s %s %v",
+ glog.V(3).Infof("%-18s %s %v",
r.Method,
r.URL.Path,
err)
@@ -398,17 +400,86 @@ func (fs *WebDavFileSystem) Stat(ctx context.Context, name string) (os.FileInfo,
return fs.stat(ctx, name)
}
-func (f *WebDavFile) Write(p []byte) (int, error) {
+func (f *WebDavFile) Write(buf []byte) (int, error) {
glog.V(2).Infof("WebDavFileSystem.Write %v", f.name)
var err error
- // _, err := f.fs.db.Exec(`update filesystem set content = substr(content, 1, ?) || ? where name = ?`, f.off*2, hex.EncodeToString(p), f.name)
+ ctx := context.Background()
+ if f.entry == nil {
+ f.entry, err = filer2.GetEntry(ctx, f.fs, f.name)
+ }
+
if err != nil {
return 0, err
}
- //f.off += int64(len(p))
- return len(p), err
+
+ var fileId, host string
+ var auth security.EncodedJwt
+
+ if err = f.fs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {
+
+ request := &filer_pb.AssignVolumeRequest{
+ Count: 1,
+ Replication: "000",
+ Collection: f.fs.option.Collection,
+ }
+
+ resp, err := client.AssignVolume(ctx, request)
+ if err != nil {
+ glog.V(0).Infof("assign volume failure %v: %v", request, err)
+ return err
+ }
+
+ fileId, host, auth = resp.FileId, resp.Url, security.EncodedJwt(resp.Auth)
+
+ return nil
+ }); err != nil {
+ return 0, fmt.Errorf("filerGrpcAddress assign volume: %v", err)
+ }
+
+ fileUrl := fmt.Sprintf("http://%s/%s", host, fileId)
+ bufReader := bytes.NewReader(buf)
+ uploadResult, err := operation.Upload(fileUrl, f.name, bufReader, false, "application/octet-stream", nil, auth)
+ if err != nil {
+ glog.V(0).Infof("upload data %v to %s: %v", f.name, fileUrl, err)
+ return 0, fmt.Errorf("upload data: %v", err)
+ }
+ if uploadResult.Error != "" {
+ glog.V(0).Infof("upload failure %v to %s: %v", f.name, fileUrl, err)
+ return 0, fmt.Errorf("upload result: %v", uploadResult.Error)
+ }
+
+ chunk := &filer_pb.FileChunk{
+ FileId: fileId,
+ Offset: f.off,
+ Size: uint64(len(buf)),
+ Mtime: time.Now().UnixNano(),
+ ETag: uploadResult.ETag,
+ }
+
+ f.entry.Chunks = append(f.entry.Chunks, chunk)
+ dir, _ := filer2.FullPath(f.name).DirAndName()
+
+ err = f.fs.WithFilerClient(ctx, func(client filer_pb.SeaweedFilerClient) error {
+ f.entry.Attributes.Mtime = time.Now().Unix()
+
+ request := &filer_pb.UpdateEntryRequest{
+ Directory: dir,
+ Entry: f.entry,
+ }
+
+ if _, err := client.UpdateEntry(ctx, request); err != nil {
+ return fmt.Errorf("update %s: %v", f.name, err)
+ }
+
+ return nil
+ })
+
+ if err !=nil {
+ f.off += int64(len(buf))
+ }
+ return len(buf), err
}
func (f *WebDavFile) Close() error {