package filer2 import ( "context" "fmt" "os" "time" "github.com/chrislusf/seaweedfs/weed/operation" "github.com/chrislusf/seaweedfs/weed/pb/filer_pb" "github.com/chrislusf/seaweedfs/weed/util" ) func (f *Filer) appendToFile(targetFile string, data []byte) error { assignResult, uploadResult, err2 := f.assignAndUpload(data) if err2 != nil { return err2 } // find out existing entry fullpath := util.FullPath(targetFile) entry, err := f.FindEntry(context.Background(), fullpath) var offset int64 = 0 if err == filer_pb.ErrNotFound { entry = &Entry{ FullPath: fullpath, Attr: Attr{ Crtime: time.Now(), Mtime: time.Now(), Mode: os.FileMode(0644), Uid: OS_UID, Gid: OS_GID, }, } } else { offset = int64(TotalSize(entry.Chunks)) } // append to existing chunks chunk := &filer_pb.FileChunk{ FileId: assignResult.Fid, Offset: offset, Size: uint64(uploadResult.Size), Mtime: time.Now().UnixNano(), ETag: uploadResult.ETag, IsGzipped: uploadResult.Gzip > 0, } entry.Chunks = append(entry.Chunks, chunk) // update the entry err = f.CreateEntry(context.Background(), entry, false) return err } func (f *Filer) assignAndUpload(data []byte) (*operation.AssignResult, *operation.UploadResult, error) { // assign a volume location assignRequest := &operation.VolumeAssignRequest{ Count: 1, Collection: f.metaLogCollection, Replication: f.metaLogReplication, WritableVolumeCount: 1, } assignResult, err := operation.Assign(f.GetMaster(), f.GrpcDialOption, assignRequest) if err != nil { return nil, nil, fmt.Errorf("AssignVolume: %v", err) } if assignResult.Error != "" { return nil, nil, fmt.Errorf("AssignVolume error: %v", assignResult.Error) } // upload data targetUrl := "http://" + assignResult.Url + "/" + assignResult.Fid uploadResult, err := operation.UploadData(targetUrl, "", f.Cipher, data, false, "", nil, assignResult.Auth) if err != nil { return nil, nil, fmt.Errorf("upload data %s: %v", targetUrl, err) } // println("uploaded to", targetUrl) return assignResult, uploadResult, nil }