diff --git a/backend/b2/api/types.go b/backend/b2/api/types.go index b2aa1a7fb..74c098542 100644 --- a/backend/b2/api/types.go +++ b/backend/b2/api/types.go @@ -42,9 +42,10 @@ type Bucket struct { // LifecycleRule is a single lifecycle rule type LifecycleRule struct { - DaysFromHidingToDeleting *int `json:"daysFromHidingToDeleting"` - DaysFromUploadingToHiding *int `json:"daysFromUploadingToHiding"` - FileNamePrefix string `json:"fileNamePrefix"` + DaysFromHidingToDeleting *int `json:"daysFromHidingToDeleting"` + DaysFromUploadingToHiding *int `json:"daysFromUploadingToHiding"` + DaysFromStartingToCancelingUnfinishedLargeFiles *int `json:"daysFromStartingToCancelingUnfinishedLargeFiles"` + FileNamePrefix string `json:"fileNamePrefix"` } // Timestamp is a UTC time when this file was uploaded. It is a base diff --git a/backend/b2/b2.go b/backend/b2/b2.go index a71f9e43c..4d4e75424 100644 --- a/backend/b2/b2.go +++ b/backend/b2/b2.go @@ -2231,6 +2231,7 @@ This will dump something like this showing the lifecycle rules. { "daysFromHidingToDeleting": 1, "daysFromUploadingToHiding": null, + "daysFromStartingToCancelingUnfinishedLargeFiles": null, "fileNamePrefix": "" } ] @@ -2257,8 +2258,9 @@ overwrites will still cause versions to be made. See: https://www.backblaze.com/docs/cloud-storage-lifecycle-rules `, Opts: map[string]string{ - "daysFromHidingToDeleting": "After a file has been hidden for this many days it is deleted. 0 is off.", - "daysFromUploadingToHiding": "This many days after uploading a file is hidden", + "daysFromHidingToDeleting": "After a file has been hidden for this many days it is deleted. 0 is off.", + "daysFromUploadingToHiding": "This many days after uploading a file is hidden", + "daysFromStartingToCancelingUnfinishedLargeFiles": "Cancels any unfinished large file versions after this many days", }, } @@ -2278,6 +2280,13 @@ func (f *Fs) lifecycleCommand(ctx context.Context, name string, arg []string, op } newRule.DaysFromUploadingToHiding = &days } + if daysStr := opt["daysFromStartingToCancelingUnfinishedLargeFiles"]; daysStr != "" { + days, err := strconv.Atoi(daysStr) + if err != nil { + return nil, fmt.Errorf("bad daysFromStartingToCancelingUnfinishedLargeFiles: %w", err) + } + newRule.DaysFromStartingToCancelingUnfinishedLargeFiles = &days + } bucketName, _ := f.split("") if bucketName == "" { return nil, errors.New("bucket required") @@ -2285,7 +2294,7 @@ func (f *Fs) lifecycleCommand(ctx context.Context, name string, arg []string, op } var bucket *api.Bucket - if newRule.DaysFromHidingToDeleting != nil || newRule.DaysFromUploadingToHiding != nil { + if newRule.DaysFromHidingToDeleting != nil || newRule.DaysFromUploadingToHiding != nil || newRule.DaysFromStartingToCancelingUnfinishedLargeFiles != nil { bucketID, err := f.getBucketID(ctx, bucketName) if err != nil { return nil, err