Skip to content

Commit 4ecf458

Browse files
committed
Update Container.php
As is, deleteWithObjects() will fail if container is EMPTY. This is because an object count of zero means $secondsToWait = 0, which means $endTime = time(), which means WHILE loop never runs. Quickest solution was to change "time() < $endTime" to "time() <= $endTime, but it made more sense to just delete the container if it's empty.
1 parent 0f5d03e commit 4ecf458

File tree

1 file changed

+29
-25
lines changed

1 file changed

+29
-25
lines changed

lib/OpenCloud/ObjectStore/Resource/Container.php

Lines changed: 29 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -179,34 +179,38 @@ public function delete($deleteObjects = false)
179179

180180
public function deleteWithObjects($secondsToWait = null)
181181
{
182-
// If timeout (seconds to wait) is not specified by caller, try to
183-
// estimate it based on number of objects in container
184-
if (null === $secondsToWait) {
185-
$numObjects = (int) $this->retrieveMetadata()->getProperty('Object-Count');
186-
$secondsToWait = round($numObjects / 2);
187-
}
188-
189-
// Attempt to delete all objects and container
190-
$endTime = time() + $secondsToWait;
191-
$containerDeleted = false;
192-
while ((time() < $endTime) && !$containerDeleted) {
193-
$this->deleteAllObjects();
194-
try {
195-
$response = $this->delete();
196-
$containerDeleted = true;
197-
} catch (ContainerException $e) {
198-
// Ignore exception and try again
199-
} catch (ClientErrorResponseException $e) {
200-
if ($e->getResponse()->getStatusCode() == 404) {
201-
// Container has been deleted
182+
// If container is empty, just delete it
183+
$numObjects = (int) $this->retrieveMetadata()->getProperty('Object-Count');
184+
if ($numObjects === 0) $response = $this->delete();
185+
186+
// Else attempt to delete all objects first, then delete container
187+
else {
188+
// If timeout (seconds to wait) is not specified by caller, try to
189+
// estimate it based on number of objects in container
190+
if (null === $secondsToWait) $secondsToWait = round($numObjects / 2);
191+
192+
// Attempt to delete all objects and container
193+
$endTime = time() + $secondsToWait;
194+
$containerDeleted = false;
195+
while ((time() < $endTime) && !$containerDeleted) {
196+
$this->deleteAllObjects();
197+
try {
198+
$response = $this->delete();
202199
$containerDeleted = true;
203-
} else {
204-
throw $e;
200+
} catch (ContainerException $e) {
201+
// Ignore exception and try again
202+
} catch (ClientErrorResponseException $e) {
203+
if ($e->getResponse()->getStatusCode() == 404) {
204+
// Container has been deleted
205+
$containerDeleted = true;
206+
} else {
207+
throw $e;
208+
}
205209
}
206210
}
207-
}
208-
if (!$containerDeleted) {
209-
throw new ContainerException('Container and all its objects cound not be deleted');
211+
if (!$containerDeleted) {
212+
throw new ContainerException('Container and all its objects could not be deleted.');
213+
}
210214
}
211215
return $response;
212216
}

0 commit comments

Comments
 (0)