From 4ecf4587a98fabfd0cdb0392899d28bfb4212ca9 Mon Sep 17 00:00:00 2001 From: joshrencher Date: Sat, 6 Dec 2014 03:19:26 -0800 Subject: [PATCH 1/2] 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. --- .../ObjectStore/Resource/Container.php | 54 ++++++++++--------- 1 file changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/OpenCloud/ObjectStore/Resource/Container.php b/lib/OpenCloud/ObjectStore/Resource/Container.php index 321b5a11a..2d15e8846 100644 --- a/lib/OpenCloud/ObjectStore/Resource/Container.php +++ b/lib/OpenCloud/ObjectStore/Resource/Container.php @@ -179,34 +179,38 @@ public function delete($deleteObjects = false) public function deleteWithObjects($secondsToWait = null) { - // If timeout (seconds to wait) is not specified by caller, try to - // estimate it based on number of objects in container - if (null === $secondsToWait) { - $numObjects = (int) $this->retrieveMetadata()->getProperty('Object-Count'); - $secondsToWait = round($numObjects / 2); - } - - // Attempt to delete all objects and container - $endTime = time() + $secondsToWait; - $containerDeleted = false; - while ((time() < $endTime) && !$containerDeleted) { - $this->deleteAllObjects(); - try { - $response = $this->delete(); - $containerDeleted = true; - } catch (ContainerException $e) { - // Ignore exception and try again - } catch (ClientErrorResponseException $e) { - if ($e->getResponse()->getStatusCode() == 404) { - // Container has been deleted + // If container is empty, just delete it + $numObjects = (int) $this->retrieveMetadata()->getProperty('Object-Count'); + if ($numObjects === 0) $response = $this->delete(); + + // Else attempt to delete all objects first, then delete container + else { + // If timeout (seconds to wait) is not specified by caller, try to + // estimate it based on number of objects in container + if (null === $secondsToWait) $secondsToWait = round($numObjects / 2); + + // Attempt to delete all objects and container + $endTime = time() + $secondsToWait; + $containerDeleted = false; + while ((time() < $endTime) && !$containerDeleted) { + $this->deleteAllObjects(); + try { + $response = $this->delete(); $containerDeleted = true; - } else { - throw $e; + } catch (ContainerException $e) { + // Ignore exception and try again + } catch (ClientErrorResponseException $e) { + if ($e->getResponse()->getStatusCode() == 404) { + // Container has been deleted + $containerDeleted = true; + } else { + throw $e; + } } } - } - if (!$containerDeleted) { - throw new ContainerException('Container and all its objects cound not be deleted'); + if (!$containerDeleted) { + throw new ContainerException('Container and all its objects could not be deleted.'); + } } return $response; } From 0bb1e639219d11920a6fc9841e4f362fb9dcd497 Mon Sep 17 00:00:00 2001 From: Josh Rencher Date: Mon, 8 Dec 2014 12:55:06 -0800 Subject: [PATCH 2/2] make deleteWithObjects() work with empty containers 1) use getObjectCount() to check container size, 2) return early if empty container deleted, 3) conditional syntax changed for PSR-2 compliance, and 4) removed "and all its objects" from container exception message since we can assume objects in container were successfully deleted by deleteAllObjects(); --- .../ObjectStore/Resource/Container.php | 55 +++++++++---------- 1 file changed, 27 insertions(+), 28 deletions(-) diff --git a/lib/OpenCloud/ObjectStore/Resource/Container.php b/lib/OpenCloud/ObjectStore/Resource/Container.php index 2d15e8846..112141202 100644 --- a/lib/OpenCloud/ObjectStore/Resource/Container.php +++ b/lib/OpenCloud/ObjectStore/Resource/Container.php @@ -180,37 +180,36 @@ public function delete($deleteObjects = false) public function deleteWithObjects($secondsToWait = null) { // If container is empty, just delete it - $numObjects = (int) $this->retrieveMetadata()->getProperty('Object-Count'); - if ($numObjects === 0) $response = $this->delete(); - - // Else attempt to delete all objects first, then delete container - else { - // If timeout (seconds to wait) is not specified by caller, try to - // estimate it based on number of objects in container - if (null === $secondsToWait) $secondsToWait = round($numObjects / 2); - - // Attempt to delete all objects and container - $endTime = time() + $secondsToWait; - $containerDeleted = false; - while ((time() < $endTime) && !$containerDeleted) { - $this->deleteAllObjects(); - try { - $response = $this->delete(); + $numObjects = $this->getObjectCount(); + if ($numObjects === 0) { + return $this->delete(); + } + // If timeout ($secondsToWait) is not specified by caller, + // try to estimate it based on number of objects in container + if (null === $secondsToWait) { + $secondsToWait = round($numObjects / 2); + } + // Attempt to delete all objects and container + $endTime = time() + $secondsToWait; + $containerDeleted = false; + while ((time() < $endTime) && !$containerDeleted) { + $this->deleteAllObjects(); + try { + $response = $this->delete(); + $containerDeleted = true; + } catch (ContainerException $e) { + // Ignore exception and try again + } catch (ClientErrorResponseException $e) { + if ($e->getResponse()->getStatusCode() == 404) { + // Container has been deleted $containerDeleted = true; - } catch (ContainerException $e) { - // Ignore exception and try again - } catch (ClientErrorResponseException $e) { - if ($e->getResponse()->getStatusCode() == 404) { - // Container has been deleted - $containerDeleted = true; - } else { - throw $e; - } + } else { + throw $e; } } - if (!$containerDeleted) { - throw new ContainerException('Container and all its objects could not be deleted.'); - } + } + if (!$containerDeleted) { + throw new ContainerException('Container could not be deleted.'); } return $response; }