From 6e19db130e03e09dcdfc68eb3af572162247ff5e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Mon, 4 May 2026 15:09:52 +0400 Subject: [PATCH] Fix storage chunk upload events --- .../Storage/Http/Buckets/Files/Create.php | 10 ++-- tests/e2e/Services/Storage/StorageBase.php | 55 +++++++++++-------- 2 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php index a85fb72a23..c26e30474f 100644 --- a/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php +++ b/src/Appwrite/Platform/Modules/Storage/Http/Buckets/Files/Create.php @@ -478,10 +478,12 @@ class Create extends Action } } - $queueForEvents - ->setParam('bucketId', $bucket->getId()) - ->setParam('fileId', $file->getId()) - ->setContext('bucket', $bucket); + if ($chunksUploaded === $chunks) { + $queueForEvents + ->setParam('bucketId', $bucket->getId()) + ->setParam('fileId', $file->getId()) + ->setContext('bucket', $bucket); + } $metadata = null; // was causing leaks as it was passed by reference diff --git a/tests/e2e/Services/Storage/StorageBase.php b/tests/e2e/Services/Storage/StorageBase.php index 3e2e8b4dea..009910fb38 100644 --- a/tests/e2e/Services/Storage/StorageBase.php +++ b/tests/e2e/Services/Storage/StorageBase.php @@ -1458,30 +1458,41 @@ trait StorageBase foreach ($requests as $index => $request) { $wg->add(); \Swoole\Coroutine::create(function () use ($basePath, $bucketId, $fileId, $host, $index, $port, $request, &$responses, $scheme, $wg): void { - $client = new \Swoole\Coroutine\Http\Client($host, (int) $port, $scheme === 'https'); - $client->set([ - 'timeout' => 300, - 'ssl_verify_peer' => false, - 'ssl_verify_host' => false, - ]); - $client->setHeaders($request['headers']); - $client->setMethod(Client::METHOD_POST); - $client->setData([ - 'fileId' => $fileId, - 'permissions[0]' => Permission::read(Role::any()), - 'permissions[1]' => Permission::delete(Role::any()), - ]); - $client->addFile($request['chunkPath'], 'file', 'application/octet-stream', 'large-parallel-upload.bin'); - $client->execute($basePath . '/storage/buckets/' . $bucketId . '/files'); - try { - $responses[$index] = [ - 'body' => $client->body, - 'error' => $client->errMsg, - 'statusCode' => $client->statusCode, - ]; + for ($attempt = 0; $attempt < 3; $attempt++) { + $client = new \Swoole\Coroutine\Http\Client($host, (int) $port, $scheme === 'https'); + $client->set([ + 'timeout' => 300, + 'ssl_verify_peer' => false, + 'ssl_verify_host' => false, + ]); + $client->setHeaders($request['headers']); + $client->setMethod(Client::METHOD_POST); + $client->setData([ + 'fileId' => $fileId, + 'permissions[0]' => Permission::read(Role::any()), + 'permissions[1]' => Permission::delete(Role::any()), + ]); + $client->addFile($request['chunkPath'], 'file', 'application/octet-stream', 'large-parallel-upload.bin'); + $client->execute($basePath . '/storage/buckets/' . $bucketId . '/files'); + + $responses[$index] = [ + 'body' => $client->body, + 'error' => $client->errMsg, + 'headers' => $client->headers ?? [], + 'statusCode' => $client->statusCode, + ]; + + $client->close(); + + if ($responses[$index]['statusCode'] !== 429) { + break; + } + + $retryAfter = (float) ($responses[$index]['headers']['retry-after'] ?? 0.1); + \Swoole\Coroutine::sleep(max($retryAfter, 0.1)); + } } finally { - $client->close(); $wg->done(); } });