|
18 | 18 |
|
19 | 19 | import static java.util.Objects.requireNonNull; |
20 | 20 |
|
| 21 | +import static com.google.common.base.Throwables.getStackTraceAsString; |
21 | 22 | import static com.google.common.base.Throwables.propagate; |
22 | 23 |
|
23 | 24 | import java.io.BufferedReader; |
24 | 25 | import java.io.IOException; |
25 | 26 | import java.io.InputStreamReader; |
26 | 27 | import java.util.ArrayList; |
| 28 | +import java.util.HashMap; |
27 | 29 | import java.util.List; |
| 30 | +import java.util.Map; |
28 | 31 | import java.util.Objects; |
29 | 32 | import java.util.Optional; |
30 | 33 | import java.util.stream.Collectors; |
@@ -151,34 +154,59 @@ public BulkDeleteResult bulkDelete(@NotNull @PathParam("account") String account |
151 | 154 | } |
152 | 155 |
|
153 | 156 | BulkDeleteResult result = new BulkDeleteResult(); |
| 157 | + Map<String, List<String>> removeBlobsMap = new HashMap<>(); |
| 158 | + List<String> deleteContainers = new ArrayList<>(); |
154 | 159 | for (String objectContainer : objects) { |
155 | 160 | try { |
156 | 161 | if (objectContainer.startsWith("/")) { |
157 | 162 | objectContainer = objectContainer.substring(1); |
158 | 163 | } |
159 | 164 | int separatorIndex = objectContainer.indexOf('/'); |
160 | 165 | if (separatorIndex < 0) { |
161 | | - blobStore.deleteContainer(objectContainer.substring(1)); |
162 | | - result.numberDeleted += 1; |
| 166 | + deleteContainers.add(objectContainer.substring(1)); |
163 | 167 | continue; |
164 | 168 | } |
165 | 169 | String container = objectContainer.substring(0, separatorIndex); |
166 | 170 | String object = objectContainer.substring(separatorIndex + 1); |
167 | 171 |
|
168 | | - if (!blobStore.blobExists(container, object)) { |
169 | | - result.numberNotFound += 1; |
170 | | - } else { |
171 | | - blobStore.removeBlob(container, object); |
172 | | - result.numberDeleted += 1; |
| 172 | + if (!removeBlobsMap.containsKey(container)) { |
| 173 | + removeBlobsMap.put(container, new ArrayList<>()); |
173 | 174 | } |
| 175 | + removeBlobsMap.get(container).add(object); |
174 | 176 | } catch (ContainerNotFoundException e) { |
175 | 177 | result.numberNotFound += 1; |
176 | 178 | } catch (Exception e) { |
177 | | - e.printStackTrace(); |
| 179 | + logger.error(e.toString()); |
| 180 | + logger.debug(getStackTraceAsString(e)); |
178 | 181 | result.errors.add(objectContainer); |
179 | 182 | } |
180 | 183 | } |
181 | 184 |
|
| 185 | + removeBlobsMap.forEach((container, blobList) -> { |
| 186 | + try { |
| 187 | + blobStore.removeBlobs(container, blobList); |
| 188 | + result.numberDeleted += blobList.size(); |
| 189 | + } catch (ContainerNotFoundException e) { |
| 190 | + result.numberNotFound += blobList.size(); |
| 191 | + } catch (Exception e) { |
| 192 | + logger.error(e.toString()); |
| 193 | + logger.debug(getStackTraceAsString(e)); |
| 194 | + blobList.forEach(blob -> result.errors.add(container + "/" + blob)); |
| 195 | + } |
| 196 | + }); |
| 197 | + deleteContainers.forEach(container -> { |
| 198 | + try { |
| 199 | + blobStore.deleteContainer(container); |
| 200 | + result.numberDeleted += 1; |
| 201 | + } catch (ContainerNotFoundException e) { |
| 202 | + result.numberNotFound += 1; |
| 203 | + } catch (Exception e) { |
| 204 | + logger.error(e.toString()); |
| 205 | + logger.debug(getStackTraceAsString(e)); |
| 206 | + result.errors.add(container); |
| 207 | + } |
| 208 | + }); |
| 209 | + |
182 | 210 | if (result.errors.isEmpty()) { |
183 | 211 | result.responseStatus = Response.Status.OK.toString(); |
184 | 212 | return result; |
|
0 commit comments