summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2018-02-08 14:30:02 +0100
committerGitHub <noreply@github.com>2018-02-08 14:30:02 +0100
commit26e0c14c6d90adae72797e759024d140047b827c (patch)
treea5b48a45e95c25cefdd8ab0ded4c24667b926ef1
parent12c9bad5b26509feee1527596b2e54b86732c788 (diff)
parent3499cbdb76d264353d3d9f358601694bc4aae956 (diff)
downloadnextcloud-server-26e0c14c6d90adae72797e759024d140047b827c.tar.gz
nextcloud-server-26e0c14c6d90adae72797e759024d140047b827c.zip
Merge pull request #8033 from nextcloud/s3-uploader
Use S3Client::upload instead of splitting single/multipart upload ourselves
-rw-r--r--lib/private/Files/ObjectStore/S3ObjectTrait.php45
-rw-r--r--tests/lib/Files/ObjectStore/S3Test.php17
2 files changed, 14 insertions, 48 deletions
diff --git a/lib/private/Files/ObjectStore/S3ObjectTrait.php b/lib/private/Files/ObjectStore/S3ObjectTrait.php
index 9c5cf9ccc6c..defeda4c21a 100644
--- a/lib/private/Files/ObjectStore/S3ObjectTrait.php
+++ b/lib/private/Files/ObjectStore/S3ObjectTrait.php
@@ -75,51 +75,10 @@ trait S3ObjectTrait {
* @since 7.0.0
*/
function writeObject($urn, $stream) {
- $stat = fstat($stream);
-
- if ($stat['size'] && $stat['size'] < S3_UPLOAD_PART_SIZE) {
- $this->singlePartUpload($urn, $stream);
- } else {
- $this->multiPartUpload($urn, $stream);
- }
-
- }
-
- protected function singlePartUpload($urn, $stream) {
- $this->getConnection()->putObject([
- 'Bucket' => $this->bucket,
- 'Key' => $urn,
- 'Body' => $stream
- ]);
- }
-
- protected function multiPartUpload($urn, $stream) {
- $uploader = new MultipartUploader($this->getConnection(), $stream, [
- 'bucket' => $this->bucket,
- 'key' => $urn,
+ $this->getConnection()->upload($this->bucket, $urn, $stream, 'private', [
+ 'mup_threshold' => S3_UPLOAD_PART_SIZE,
'part_size' => S3_UPLOAD_PART_SIZE
]);
-
- $tries = 0;
-
- do {
- try {
- $result = $uploader->upload();
- } catch (MultipartUploadException $e) {
- \OC::$server->getLogger()->logException($e);
- rewind($stream);
- $tries++;
-
- if ($tries < 5) {
- $uploader = new MultipartUploader($this->getConnection(), $stream, [
- 'state' => $e->getState()
- ]);
- } else {
- $this->getConnection()->abortMultipartUpload($e->getState()->getId());
- throw $e;
- }
- }
- } while (!isset($result) && $tries < 5);
}
/**
diff --git a/tests/lib/Files/ObjectStore/S3Test.php b/tests/lib/Files/ObjectStore/S3Test.php
index 14167656fb5..a54ade8fd08 100644
--- a/tests/lib/Files/ObjectStore/S3Test.php
+++ b/tests/lib/Files/ObjectStore/S3Test.php
@@ -24,8 +24,10 @@ namespace Test\Files\ObjectStore;
use OC\Files\ObjectStore\S3;
class MultiPartUploadS3 extends S3 {
- public function multiPartUpload($urn, $stream) {
- parent::multiPartUpload($urn, $stream);
+ function writeObject($urn, $stream) {
+ $this->getConnection()->upload($this->bucket, $urn, $stream, 'private', [
+ 'mup_threshold' => 1
+ ]);
}
}
@@ -39,13 +41,18 @@ class S3Test extends ObjectStoreTest {
$this->markTestSkipped('objectstore not configured for s3');
}
- return new MultiPartUploadS3($config['arguments']);
+ return new S3($config['arguments']);
}
public function testMultiPartUploader() {
- $s3 = $this->getInstance();
+ $config = \OC::$server->getConfig()->getSystemValue('objectstore');
+ if (!is_array($config) || $config['class'] !== 'OC\\Files\\ObjectStore\\S3') {
+ $this->markTestSkipped('objectstore not configured for s3');
+ }
+
+ $s3 = new MultiPartUploadS3($config['arguments']);
- $s3->multiPartUpload('multiparttest', fopen(__FILE__, 'r'));
+ $s3->writeObject('multiparttest', fopen(__FILE__, 'r'));
$result = $s3->readObject('multiparttest');