2020-09-01 07:21:19 +00:00
|
|
|
package filer
|
2020-03-30 08:19:33 +00:00
|
|
|
|
|
|
|
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 {
|
|
|
|
|
2020-04-17 07:00:48 +00:00
|
|
|
assignResult, uploadResult, err2 := f.assignAndUpload(data)
|
2020-04-12 21:03:07 +00:00
|
|
|
if err2 != nil {
|
|
|
|
return err2
|
2020-03-30 08:19:33 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// 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
|
2020-05-01 00:20:44 +00:00
|
|
|
entry.Chunks = append(entry.Chunks, uploadResult.ToPbFileChunk(assignResult.Fid, offset))
|
2020-03-30 08:19:33 +00:00
|
|
|
|
|
|
|
// update the entry
|
2020-08-29 06:48:48 +00:00
|
|
|
err = f.CreateEntry(context.Background(), entry, false, false, nil)
|
2020-03-30 08:19:33 +00:00
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
2020-04-12 21:03:07 +00:00
|
|
|
|
2020-04-17 07:00:48 +00:00
|
|
|
func (f *Filer) assignAndUpload(data []byte) (*operation.AssignResult, *operation.UploadResult, error) {
|
2020-04-12 21:03:07 +00:00
|
|
|
// 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 {
|
2020-04-17 07:00:48 +00:00
|
|
|
return nil, nil, fmt.Errorf("AssignVolume: %v", err)
|
2020-04-12 21:03:07 +00:00
|
|
|
}
|
|
|
|
if assignResult.Error != "" {
|
2020-04-17 07:00:48 +00:00
|
|
|
return nil, nil, fmt.Errorf("AssignVolume error: %v", assignResult.Error)
|
2020-04-12 21:03:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// upload data
|
|
|
|
targetUrl := "http://" + assignResult.Url + "/" + assignResult.Fid
|
2020-04-17 08:26:27 +00:00
|
|
|
uploadResult, err := operation.UploadData(targetUrl, "", f.Cipher, data, false, "", nil, assignResult.Auth)
|
2020-04-12 21:03:07 +00:00
|
|
|
if err != nil {
|
2020-04-17 07:00:48 +00:00
|
|
|
return nil, nil, fmt.Errorf("upload data %s: %v", targetUrl, err)
|
2020-04-12 21:03:07 +00:00
|
|
|
}
|
|
|
|
// println("uploaded to", targetUrl)
|
2020-04-17 07:00:48 +00:00
|
|
|
return assignResult, uploadResult, nil
|
2020-04-12 21:03:07 +00:00
|
|
|
}
|