Fix AmazonS3 rmdir on the root
This commit is contained in:
parent
c88d517e88
commit
6e12d830d5
|
@ -73,6 +73,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
sleep($this->timeout);
|
sleep($this->timeout);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function cleanKey($path) {
|
private function cleanKey($path) {
|
||||||
if ($path === '.') {
|
if ($path === '.') {
|
||||||
return '/';
|
return '/';
|
||||||
|
@ -90,13 +91,13 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
$this->bucket = $params['bucket'];
|
$this->bucket = $params['bucket'];
|
||||||
$scheme = ($params['use_ssl'] === 'false') ? 'http' : 'https';
|
$scheme = ($params['use_ssl'] === 'false') ? 'http' : 'https';
|
||||||
$this->test = isset($params['test']);
|
$this->test = isset($params['test']);
|
||||||
$this->timeout = ( ! isset($params['timeout'])) ? 15 : $params['timeout'];
|
$this->timeout = (!isset($params['timeout'])) ? 15 : $params['timeout'];
|
||||||
$params['region'] = ( ! isset($params['region']) || $params['region'] === '' ) ? 'eu-west-1' : $params['region'];
|
$params['region'] = (!isset($params['region']) || $params['region'] === '') ? 'eu-west-1' : $params['region'];
|
||||||
$params['hostname'] = ( !isset($params['hostname']) || $params['hostname'] === '' ) ? 's3.amazonaws.com' : $params['hostname'];
|
$params['hostname'] = (!isset($params['hostname']) || $params['hostname'] === '') ? 's3.amazonaws.com' : $params['hostname'];
|
||||||
if (!isset($params['port']) || $params['port'] === '') {
|
if (!isset($params['port']) || $params['port'] === '') {
|
||||||
$params['port'] = ($params['use_ssl'] === 'false') ? 80 : 443;
|
$params['port'] = ($params['use_ssl'] === 'false') ? 80 : 443;
|
||||||
}
|
}
|
||||||
$base_url = $scheme.'://'.$params['hostname'].':'.$params['port'].'/';
|
$base_url = $scheme . '://' . $params['hostname'] . ':' . $params['port'] . '/';
|
||||||
|
|
||||||
$this->connection = S3Client::factory(array(
|
$this->connection = S3Client::factory(array(
|
||||||
'key' => $params['key'],
|
'key' => $params['key'],
|
||||||
|
@ -119,7 +120,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
'waiter.interval' => 1,
|
'waiter.interval' => 1,
|
||||||
'waiter.max_attempts' => 15
|
'waiter.max_attempts' => 15
|
||||||
));
|
));
|
||||||
$this->testTimeout();
|
$this->testTimeout();
|
||||||
} catch (S3Exception $e) {
|
} catch (S3Exception $e) {
|
||||||
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR);
|
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR);
|
||||||
throw new \Exception("Creation of bucket failed.");
|
throw new \Exception("Creation of bucket failed.");
|
||||||
|
@ -128,8 +129,8 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
if (!$this->file_exists('.')) {
|
if (!$this->file_exists('.')) {
|
||||||
$result = $this->connection->putObject(array(
|
$result = $this->connection->putObject(array(
|
||||||
'Bucket' => $this->bucket,
|
'Bucket' => $this->bucket,
|
||||||
'Key' => $this->cleanKey('.'),
|
'Key' => $this->cleanKey('.'),
|
||||||
'Body' => '',
|
'Body' => '',
|
||||||
'ContentType' => 'httpd/unix-directory',
|
'ContentType' => 'httpd/unix-directory',
|
||||||
'ContentLength' => 0
|
'ContentLength' => 0
|
||||||
));
|
));
|
||||||
|
@ -145,10 +146,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$result = $this->connection->putObject(array(
|
$this->connection->putObject(array(
|
||||||
'Bucket' => $this->bucket,
|
'Bucket' => $this->bucket,
|
||||||
'Key' => $path . '/',
|
'Key' => $path . '/',
|
||||||
'Body' => '',
|
'Body' => '',
|
||||||
'ContentType' => 'httpd/unix-directory',
|
'ContentType' => 'httpd/unix-directory',
|
||||||
'ContentLength' => 0
|
'ContentLength' => 0
|
||||||
));
|
));
|
||||||
|
@ -187,6 +188,10 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
public function rmdir($path) {
|
public function rmdir($path) {
|
||||||
$path = $this->normalizePath($path);
|
$path = $this->normalizePath($path);
|
||||||
|
|
||||||
|
if ($path === '.') {
|
||||||
|
return $this->clearBucket();
|
||||||
|
}
|
||||||
|
|
||||||
if (!$this->file_exists($path)) {
|
if (!$this->file_exists($path)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -199,7 +204,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
));
|
));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$result = $this->connection->deleteObjects(array(
|
$this->connection->deleteObjects(array(
|
||||||
'Bucket' => $this->bucket,
|
'Bucket' => $this->bucket,
|
||||||
'Objects' => $objects['Contents']
|
'Objects' => $objects['Contents']
|
||||||
));
|
));
|
||||||
|
@ -212,6 +217,28 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function clearBucket() {
|
||||||
|
try {
|
||||||
|
$this->connection->clearBucket($this->bucket);
|
||||||
|
// clearBucket() is not working with Ceph, so if it fails we try the slower approach
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
try {
|
||||||
|
$iterator = $this->connection->getIterator('ListObjects', array(
|
||||||
|
'Bucket' => $this->bucket
|
||||||
|
));
|
||||||
|
|
||||||
|
foreach ($iterator as $object) {
|
||||||
|
$this->connection->deleteObject(array(
|
||||||
|
'Bucket' => $this->bucket,
|
||||||
|
'Key' => $object['Key']
|
||||||
|
));
|
||||||
|
}
|
||||||
|
} catch (S3Exception $e) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function opendir($path) {
|
public function opendir($path) {
|
||||||
$path = $this->normalizePath($path);
|
$path = $this->normalizePath($path);
|
||||||
|
|
||||||
|
@ -271,7 +298,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
$stat['atime'] = time();
|
$stat['atime'] = time();
|
||||||
|
|
||||||
return $stat;
|
return $stat;
|
||||||
} catch(S3Exception $e) {
|
} catch (S3Exception $e) {
|
||||||
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR);
|
\OCP\Util::writeLog('files_external', $e->getMessage(), \OCP\Util::ERROR);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -302,7 +329,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
public function unlink($path) {
|
public function unlink($path) {
|
||||||
$path = $this->normalizePath($path);
|
$path = $this->normalizePath($path);
|
||||||
|
|
||||||
if ( $this->is_dir($path) ) {
|
if ($this->is_dir($path)) {
|
||||||
return $this->rmdir($path);
|
return $this->rmdir($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -463,7 +490,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
}
|
}
|
||||||
|
|
||||||
$dh = $this->opendir($path1);
|
$dh = $this->opendir($path1);
|
||||||
if(is_resource($dh)) {
|
if (is_resource($dh)) {
|
||||||
while (($file = readdir($dh)) !== false) {
|
while (($file = readdir($dh)) !== false) {
|
||||||
if ($file === '.' || $file === '..') {
|
if ($file === '.' || $file === '..') {
|
||||||
continue;
|
continue;
|
||||||
|
@ -534,7 +561,7 @@ class AmazonS3 extends \OC\Files\Storage\Common {
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$result= $this->connection->putObject(array(
|
$result = $this->connection->putObject(array(
|
||||||
'Bucket' => $this->bucket,
|
'Bucket' => $this->bucket,
|
||||||
'Key' => $this->cleanKey(self::$tmpFiles[$tmpFile]),
|
'Key' => $this->cleanKey(self::$tmpFiles[$tmpFile]),
|
||||||
'SourceFile' => $tmpFile,
|
'SourceFile' => $tmpFile,
|
||||||
|
|
|
@ -38,29 +38,7 @@ class AmazonS3 extends Storage {
|
||||||
|
|
||||||
public function tearDown() {
|
public function tearDown() {
|
||||||
if ($this->instance) {
|
if ($this->instance) {
|
||||||
$connection = $this->instance->getConnection();
|
$this->instance->rmdir('');
|
||||||
|
|
||||||
try {
|
|
||||||
// NOTE(berendt): clearBucket() is not working with Ceph
|
|
||||||
$iterator = $connection->getIterator('ListObjects', array(
|
|
||||||
'Bucket' => $this->config['amazons3']['bucket']
|
|
||||||
));
|
|
||||||
|
|
||||||
foreach ($iterator as $object) {
|
|
||||||
$connection->deleteObject(array(
|
|
||||||
'Bucket' => $this->config['amazons3']['bucket'],
|
|
||||||
'Key' => $object['Key']
|
|
||||||
));
|
|
||||||
}
|
|
||||||
} catch (S3Exception $e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
$connection->deleteBucket(array(
|
|
||||||
'Bucket' => $this->config['amazons3']['bucket']
|
|
||||||
));
|
|
||||||
|
|
||||||
//wait some seconds for completing the replication
|
|
||||||
sleep(30);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue