You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							3.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							121 lines
						
					
					
						
							3.2 KiB
						
					
					
				| package weed_server | |
| 
 | |
| import ( | |
| 	"context" | |
| 	"net/http" | |
| 	"time" | |
| 
 | |
| 	"github.com/seaweedfs/seaweedfs/weed/operation" | |
| 	"github.com/seaweedfs/seaweedfs/weed/pb/volume_server_pb" | |
| 	"github.com/seaweedfs/seaweedfs/weed/storage/needle" | |
| ) | |
| 
 | |
| func (vs *VolumeServer) BatchDelete(ctx context.Context, req *volume_server_pb.BatchDeleteRequest) (*volume_server_pb.BatchDeleteResponse, error) { | |
| 
 | |
| 	resp := &volume_server_pb.BatchDeleteResponse{} | |
| 
 | |
| 	now := uint64(time.Now().Unix()) | |
| 
 | |
| 	for _, fid := range req.FileIds { | |
| 		vid, id_cookie, err := operation.ParseFileId(fid) | |
| 		if err != nil { | |
| 			resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 				FileId: fid, | |
| 				Status: http.StatusBadRequest, | |
| 				Error:  err.Error()}) | |
| 			continue | |
| 		} | |
| 
 | |
| 		n := new(needle.Needle) | |
| 		volumeId, _ := needle.NewVolumeId(vid) | |
| 		ecVolume, isEcVolume := vs.store.FindEcVolume(volumeId) | |
| 		if req.SkipCookieCheck { | |
| 			n.Id, _, err = needle.ParseNeedleIdCookie(id_cookie) | |
| 			if err != nil { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusBadRequest, | |
| 					Error:  err.Error()}) | |
| 				continue | |
| 			} | |
| 		} else { | |
| 			n.ParsePath(id_cookie) | |
| 			cookie := n.Cookie | |
| 			if !isEcVolume { | |
| 				if _, err := vs.store.ReadVolumeNeedle(volumeId, n, nil, nil); err != nil { | |
| 					resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 						FileId: fid, | |
| 						Status: http.StatusNotFound, | |
| 						Error:  err.Error(), | |
| 					}) | |
| 					continue | |
| 				} | |
| 			} else { | |
| 				if _, err := vs.store.ReadEcShardNeedle(volumeId, n, nil); err != nil { | |
| 					resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 						FileId: fid, | |
| 						Status: http.StatusNotFound, | |
| 						Error:  err.Error(), | |
| 					}) | |
| 					continue | |
| 				} | |
| 			} | |
| 			if n.Cookie != cookie { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusBadRequest, | |
| 					Error:  "File Random Cookie does not match.", | |
| 				}) | |
| 				break | |
| 			} | |
| 		} | |
| 
 | |
| 		if n.IsChunkedManifest() { | |
| 			resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 				FileId: fid, | |
| 				Status: http.StatusNotAcceptable, | |
| 				Error:  "ChunkManifest: not allowed in batch delete mode.", | |
| 			}) | |
| 			continue | |
| 		} | |
| 
 | |
| 		n.LastModified = now | |
| 		if !isEcVolume { | |
| 			if size, err := vs.store.DeleteVolumeNeedle(volumeId, n); err != nil { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusInternalServerError, | |
| 					Error:  err.Error()}, | |
| 				) | |
| 			} else if size == 0 { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusNotModified}, | |
| 				) | |
| 			} else { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusAccepted, | |
| 					Size:   uint32(size)}, | |
| 				) | |
| 			} | |
| 		} else { | |
| 			if size, err := vs.store.DeleteEcShardNeedle(ecVolume, n, n.Cookie); err != nil { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusInternalServerError, | |
| 					Error:  err.Error()}, | |
| 				) | |
| 			} else { | |
| 				resp.Results = append(resp.Results, &volume_server_pb.DeleteResult{ | |
| 					FileId: fid, | |
| 					Status: http.StatusAccepted, | |
| 					Size:   uint32(size)}, | |
| 				) | |
| 			} | |
| 		} | |
| 	} | |
| 
 | |
| 	return resp, nil | |
| 
 | |
| }
 |