Fix aliyun OSS Delete method's notion of subpaths
Deleting "/a" was deleting "/a/b" but also "/ab". Signed-off-by: Richard Scothern <richard.scothern@docker.com>master
							parent
							
								
									12e73f01d2
								
							
						
					
					
						commit
						a621a86cb4
					
				|  | @ -408,7 +408,8 @@ func (d *driver) Move(ctx context.Context, sourcePath string, destPath string) e | ||||||
| 
 | 
 | ||||||
| // Delete recursively deletes all objects stored at "path" and its subpaths.
 | // Delete recursively deletes all objects stored at "path" and its subpaths.
 | ||||||
| func (d *driver) Delete(ctx context.Context, path string) error { | func (d *driver) Delete(ctx context.Context, path string) error { | ||||||
| 	listResponse, err := d.Bucket.List(d.ossPath(path), "", "", listMax) | 	ossPath := d.ossPath(path) | ||||||
|  | 	listResponse, err := d.Bucket.List(ossPath, "", "", listMax) | ||||||
| 	if err != nil || len(listResponse.Contents) == 0 { | 	if err != nil || len(listResponse.Contents) == 0 { | ||||||
| 		return storagedriver.PathNotFoundError{Path: path} | 		return storagedriver.PathNotFoundError{Path: path} | ||||||
| 	} | 	} | ||||||
|  | @ -416,15 +417,25 @@ func (d *driver) Delete(ctx context.Context, path string) error { | ||||||
| 	ossObjects := make([]oss.Object, listMax) | 	ossObjects := make([]oss.Object, listMax) | ||||||
| 
 | 
 | ||||||
| 	for len(listResponse.Contents) > 0 { | 	for len(listResponse.Contents) > 0 { | ||||||
|  | 		numOssObjects := len(listResponse.Contents) | ||||||
| 		for index, key := range listResponse.Contents { | 		for index, key := range listResponse.Contents { | ||||||
|  | 			// Stop if we encounter a key that is not a subpath (so that deleting "/a" does not delete "/ab").
 | ||||||
|  | 			if len(key.Key) > len(ossPath) && (key.Key)[len(ossPath)] != '/' { | ||||||
|  | 				numOssObjects = index | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
| 			ossObjects[index].Key = key.Key | 			ossObjects[index].Key = key.Key | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		err := d.Bucket.DelMulti(oss.Delete{Quiet: false, Objects: ossObjects[0:len(listResponse.Contents)]}) | 		err := d.Bucket.DelMulti(oss.Delete{Quiet: false, Objects: ossObjects[0:numOssObjects]}) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		if numOssObjects < len(listResponse.Contents) { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
| 		listResponse, err = d.Bucket.List(d.ossPath(path), "", "", listMax) | 		listResponse, err = d.Bucket.List(d.ossPath(path), "", "", listMax) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue