From 03f852c799219b94b7cdf9fc48abce0b36a5a14a Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Mon, 3 Sep 2018 13:03:16 -0700 Subject: [PATCH] refactoring --- weed/s3api/filer_util.go | 60 ++++++++++++++++++++ weed/s3api/s3api_bucket_handlers.go | 86 ++++++++--------------------- 2 files changed, 84 insertions(+), 62 deletions(-) create mode 100644 weed/s3api/filer_util.go diff --git a/weed/s3api/filer_util.go b/weed/s3api/filer_util.go new file mode 100644 index 000000000..aa0a14b80 --- /dev/null +++ b/weed/s3api/filer_util.go @@ -0,0 +1,60 @@ +package s3api + +import ( + "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" + "time" + "os" + "fmt" + "github.com/chrislusf/glog" + "context" +) + +func (s3a *S3ApiServer) mkdir(parentDirectoryPath string, dirName string) error { + return s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.CreateEntryRequest{ + Directory: parentDirectoryPath, + Entry: &filer_pb.Entry{ + Name: dirName, + IsDirectory: true, + Attributes: &filer_pb.FuseAttributes{ + Mtime: time.Now().Unix(), + Crtime: time.Now().Unix(), + FileMode: uint32(0777 | os.ModeDir), + Uid: OS_UID, + Gid: OS_GID, + }, + }, + } + + glog.V(1).Infof("create bucket: %v", request) + if _, err := client.CreateEntry(context.Background(), request); err != nil { + return fmt.Errorf("mkdir %s/%s: %v", parentDirectoryPath, dirName, err) + } + + return nil + }) +} + +func (s3a *S3ApiServer) list(parentDirectoryPath string) (entries []*filer_pb.Entry, err error) { + + s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { + + request := &filer_pb.ListEntriesRequest{ + Directory: s3a.option.BucketsPath, + } + + glog.V(4).Infof("read directory: %v", request) + resp, err := client.ListEntries(context.Background(), request) + if err != nil { + return fmt.Errorf("list dir %v: %v", parentDirectoryPath, err) + } + + entries = resp.Entries + + return nil + }) + + return + +} diff --git a/weed/s3api/s3api_bucket_handlers.go b/weed/s3api/s3api_bucket_handlers.go index a97434ed0..d28cef4d6 100644 --- a/weed/s3api/s3api_bucket_handlers.go +++ b/weed/s3api/s3api_bucket_handlers.go @@ -20,46 +20,34 @@ var ( func (s3a *S3ApiServer) ListBucketsHandler(w http.ResponseWriter, r *http.Request) { var response ListAllMyBucketsResponse - err := s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { - request := &filer_pb.ListEntriesRequest{ - Directory: s3a.option.BucketsPath, - } + entries, err := s3a.list(s3a.option.BucketsPath) - glog.V(4).Infof("read directory: %v", request) - resp, err := client.ListEntries(context.Background(), request) - if err != nil { - return fmt.Errorf("list buckets: %v", err) - } + if err != nil { + writeErrorResponse(w, ErrInternalError, r.URL) + return + } - var buckets []ListAllMyBucketsEntry - for _, entry := range resp.Entries { - if entry.IsDirectory { - buckets = append(buckets, ListAllMyBucketsEntry{ - Name: entry.Name, - CreationDate: time.Unix(entry.Attributes.Crtime, 0), - }) - } + var buckets []ListAllMyBucketsEntry + for _, entry := range entries { + if entry.IsDirectory { + buckets = append(buckets, ListAllMyBucketsEntry{ + Name: entry.Name, + CreationDate: time.Unix(entry.Attributes.Crtime, 0), + }) } + } - response = ListAllMyBucketsResponse{ - ListAllMyBucketsResponse: ListAllMyBucketsResult{ - Owner: CanonicalUser{ - ID: "", - DisplayName: "", - }, - Buckets: ListAllMyBucketsList{ - Bucket: buckets, - }, + response = ListAllMyBucketsResponse{ + ListAllMyBucketsResponse: ListAllMyBucketsResult{ + Owner: CanonicalUser{ + ID: "", + DisplayName: "", }, - } - - return nil - }) - - if err != nil { - writeErrorResponse(w, ErrInternalError, r.URL) - return + Buckets: ListAllMyBucketsList{ + Bucket: buckets, + }, + }, } writeSuccessResponseXML(w, encodeResponse(response)) @@ -70,34 +58,8 @@ func (s3a *S3ApiServer) PutBucketHandler(w http.ResponseWriter, r *http.Request) vars := mux.Vars(r) bucket := vars["bucket"] - err := s3a.withFilerClient(func(client filer_pb.SeaweedFilerClient) error { - - request := &filer_pb.CreateEntryRequest{ - Directory: s3a.option.BucketsPath, - Entry: &filer_pb.Entry{ - Name: bucket, - IsDirectory: true, - Attributes: &filer_pb.FuseAttributes{ - Mtime: time.Now().Unix(), - Crtime: time.Now().Unix(), - FileMode: uint32(0777 | os.ModeDir), - Uid: OS_UID, - Gid: OS_GID, - }, - }, - } - - glog.V(1).Infof("create bucket: %v", request) - if _, err := client.CreateEntry(context.Background(), request); err != nil { - return fmt.Errorf("mkdir %s/%s: %v", s3a.option.BucketsPath, bucket, err) - } - - // lazily create collection - - return nil - }) - - if err != nil { + // create the folder for bucket, but lazily create actual collection + if err := s3a.mkdir(s3a.option.BucketsPath, bucket); err != nil { writeErrorResponse(w, ErrInternalError, r.URL) return }