| @@ -27,6 +27,26 @@ func (s *Server) Presigned() *PresignedService { | |||||
| } | } | ||||
| } | } | ||||
| func (s *PresignedService) ObjectListByPath(ctx *gin.Context) { | |||||
| log := logger.WithField("HTTP", "Presigned.ObjectListByPath") | |||||
| var req cdsapi.PresignedObjectListByPath | |||||
| if err := ctx.ShouldBindQuery(&req); err != nil { | |||||
| log.Warnf("binding body: %s", err.Error()) | |||||
| ctx.JSON(http.StatusBadRequest, Failed(errorcode.BadArgument, "missing argument or invalid argument")) | |||||
| return | |||||
| } | |||||
| resp, err := s.svc.ObjectSvc().GetByPath(req.ObjectListByPath) | |||||
| if err != nil { | |||||
| log.Warnf("listing objects: %s", err.Error()) | |||||
| ctx.JSON(http.StatusOK, Failed(errorcode.OperationFailed, fmt.Sprintf("listing objects: %v", err))) | |||||
| return | |||||
| } | |||||
| ctx.JSON(http.StatusOK, OK(resp)) | |||||
| } | |||||
| func (s *PresignedService) ObjectDownloadByPath(ctx *gin.Context) { | func (s *PresignedService) ObjectDownloadByPath(ctx *gin.Context) { | ||||
| log := logger.WithField("HTTP", "Presigned.ObjectDownloadByPath") | log := logger.WithField("HTTP", "Presigned.ObjectDownloadByPath") | ||||
| @@ -124,6 +124,7 @@ func (s *Server) routeV1(eg *gin.Engine, rt gin.IRoutes) { | |||||
| rt.POST(cdsapi.ObjectUploadPartPath, s.Object().UploadPart) | rt.POST(cdsapi.ObjectUploadPartPath, s.Object().UploadPart) | ||||
| rt.POST(cdsapi.ObjectCompleteMultipartUploadPath, s.Object().CompleteMultipartUpload) | rt.POST(cdsapi.ObjectCompleteMultipartUploadPath, s.Object().CompleteMultipartUpload) | ||||
| rt.GET(cdsapi.PresignedObjectListByPathPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectListByPath) | |||||
| rt.GET(cdsapi.PresignedObjectDownloadByPathPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectDownloadByPath) | rt.GET(cdsapi.PresignedObjectDownloadByPathPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectDownloadByPath) | ||||
| rt.GET(cdsapi.PresignedObjectDownloadPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectDownload) | rt.GET(cdsapi.PresignedObjectDownloadPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectDownload) | ||||
| rt.POST(cdsapi.PresignedObjectUploadPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectUpload) | rt.POST(cdsapi.PresignedObjectUploadPath, s.awsAuth.PresignedAuth, s.Presigned().ObjectUpload) | ||||
| @@ -458,9 +458,11 @@ func (b *BodyNewPackage) OnUnionSerializing() { | |||||
| // Package克隆的事件 | // Package克隆的事件 | ||||
| type BodyPackageCloned struct { | type BodyPackageCloned struct { | ||||
| serder.Metadata `union:"PackageCloned"` | serder.Metadata `union:"PackageCloned"` | ||||
| Type string `json:"type"` | |||||
| SourcePackageID cdssdk.PackageID `json:"sourcePackageID"` | |||||
| NewPackage cdssdk.Package `json:"newPackage"` | |||||
| Type string `json:"type"` | |||||
| SourcePackageID cdssdk.PackageID `json:"sourcePackageID"` | |||||
| NewPackage cdssdk.Package `json:"newPackage"` | |||||
| SourceObjectIDs []cdssdk.ObjectID `json:"sourceObjectIDs"` // 原本的ObjectID | |||||
| NewObjectIDs []cdssdk.ObjectID `json:"newObjectIDs"` // 复制后的新ObjectID,与SourceObjectIDs一一对应 | |||||
| } | } | ||||
| func (b *BodyPackageCloned) GetBodyType() string { | func (b *BodyPackageCloned) GetBodyType() string { | ||||
| @@ -35,6 +35,7 @@ func (o *Range) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| for o.Offset > 0 { | for o.Offset > 0 { | ||||
| rdCnt := math2.Min(o.Offset, int64(len(buf))) | rdCnt := math2.Min(o.Offset, int64(len(buf))) | ||||
| rd, err := input.Stream.Read(buf[:rdCnt]) | rd, err := input.Stream.Read(buf[:rdCnt]) | ||||
| o.Offset -= int64(rd) | |||||
| if err == io.EOF { | if err == io.EOF { | ||||
| // 输入流不够长度也不报错,只是产生一个空的流 | // 输入流不够长度也不报错,只是产生一个空的流 | ||||
| break | break | ||||
| @@ -42,7 +43,6 @@ func (o *Range) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| o.Offset -= int64(rd) | |||||
| } | } | ||||
| fut := future.NewSetVoid() | fut := future.NewSetVoid() | ||||
| @@ -86,12 +86,20 @@ func (o *SegmentJoin) Read(buf []byte) (int, error) { | |||||
| } | } | ||||
| n, err := o.nextStream.Read(buf) | n, err := o.nextStream.Read(buf) | ||||
| if err == io.EOF { | |||||
| o.nextStream.Close() | |||||
| o.nextStream = nil | |||||
| if err == nil { | |||||
| return n, err | |||||
| } | |||||
| if err != io.EOF { | |||||
| return n, err | |||||
| } | |||||
| o.nextStream.Close() | |||||
| o.nextStream = nil | |||||
| if n == 0 { | |||||
| continue | continue | ||||
| } | } | ||||
| return n, err | |||||
| return n, nil | |||||
| } | } | ||||
| } | } | ||||
| @@ -35,6 +35,7 @@ func (o *Range) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| for o.Offset > 0 { | for o.Offset > 0 { | ||||
| rdCnt := math2.Min(o.Offset, int64(len(buf))) | rdCnt := math2.Min(o.Offset, int64(len(buf))) | ||||
| rd, err := input.Stream.Read(buf[:rdCnt]) | rd, err := input.Stream.Read(buf[:rdCnt]) | ||||
| o.Offset -= int64(rd) | |||||
| if err == io.EOF { | if err == io.EOF { | ||||
| // 输入流不够长度也不报错,只是产生一个空的流 | // 输入流不够长度也不报错,只是产生一个空的流 | ||||
| break | break | ||||
| @@ -42,7 +43,6 @@ func (o *Range) Execute(ctx *exec.ExecContext, e *exec.Executor) error { | |||||
| if err != nil { | if err != nil { | ||||
| return err | return err | ||||
| } | } | ||||
| o.Offset -= int64(rd) | |||||
| } | } | ||||
| fut := future.NewSetVoid() | fut := future.NewSetVoid() | ||||
| @@ -40,6 +40,7 @@ func migrate(configPath string) { | |||||
| fmt.Println(err) | fmt.Println(err) | ||||
| os.Exit(1) | os.Exit(1) | ||||
| } | } | ||||
| db = db.Set("gorm:table_options", "CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci") | |||||
| migrateOne(db, cdssdk.Bucket{}) | migrateOne(db, cdssdk.Bucket{}) | ||||
| migrateOne(db, model.Cache{}) | migrateOne(db, model.Cache{}) | ||||
| @@ -160,6 +160,8 @@ func (svc *Service) DeletePackage(msg *coormq.DeletePackage) (*coormq.DeletePack | |||||
| func (svc *Service) ClonePackage(msg *coormq.ClonePackage) (*coormq.ClonePackageResp, *mq.CodeMessage) { | func (svc *Service) ClonePackage(msg *coormq.ClonePackage) (*coormq.ClonePackageResp, *mq.CodeMessage) { | ||||
| var pkg cdssdk.Package | var pkg cdssdk.Package | ||||
| var oldObjIDs []cdssdk.ObjectID | |||||
| var newObjIDs []cdssdk.ObjectID | |||||
| err := svc.db2.DoTx(func(tx db2.SQLContext) error { | err := svc.db2.DoTx(func(tx db2.SQLContext) error { | ||||
| var err error | var err error | ||||
| @@ -198,6 +200,9 @@ func (svc *Service) ClonePackage(msg *coormq.ClonePackage) (*coormq.ClonePackage | |||||
| oldToNew := make(map[cdssdk.ObjectID]cdssdk.ObjectID) | oldToNew := make(map[cdssdk.ObjectID]cdssdk.ObjectID) | ||||
| for i, obj := range clonedObjs { | for i, obj := range clonedObjs { | ||||
| oldToNew[objs[i].ObjectID] = obj.ObjectID | oldToNew[objs[i].ObjectID] = obj.ObjectID | ||||
| oldObjIDs = append(oldObjIDs, objs[i].ObjectID) | |||||
| newObjIDs = append(newObjIDs, obj.ObjectID) | |||||
| } | } | ||||
| clonedBlks := make([]stgmod.ObjectBlock, len(objBlks)) | clonedBlks := make([]stgmod.ObjectBlock, len(objBlks)) | ||||
| @@ -224,6 +229,8 @@ func (svc *Service) ClonePackage(msg *coormq.ClonePackage) (*coormq.ClonePackage | |||||
| svc.evtPub.Publish(&stgmod.BodyPackageCloned{ | svc.evtPub.Publish(&stgmod.BodyPackageCloned{ | ||||
| SourcePackageID: msg.PackageID, | SourcePackageID: msg.PackageID, | ||||
| NewPackage: pkg, | NewPackage: pkg, | ||||
| SourceObjectIDs: oldObjIDs, | |||||
| NewObjectIDs: newObjIDs, | |||||
| }) | }) | ||||
| return mq.ReplyOK(coormq.RespClonePackage(pkg)) | return mq.ReplyOK(coormq.RespClonePackage(pkg)) | ||||