Skip to content

Commit 4f91b95

Browse files
feat(DMD-987): add retry logic for 409 versionConflict responses
- Add retry handling for HTTP 409 responses with versionConflict error code - Reuse existing exponential backoff mechanism for deadlock retries Co-Authored-By: Martin Zajic <ja@mzajic.cz>
1 parent 07a3eda commit 4f91b95

1 file changed

Lines changed: 16 additions & 0 deletions

File tree

src/Keboola/StorageApi/HandlerStack.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ private static function createDefaultDecider(int $maxRetries, bool $retryOnMaint
6666

6767
if ($retries >= $maxRetries) {
6868
return false;
69+
} elseif ($response && $response->getStatusCode() === 409) {
70+
// Retry on 409 Conflict if it's a version conflict (deadlock) error
71+
return self::isVersionConflictResponse($response);
6972
} elseif ($response && $response->getStatusCode() > 499) {
7073
return true;
7174
} elseif ($error) {
@@ -76,6 +79,19 @@ private static function createDefaultDecider(int $maxRetries, bool $retryOnMaint
7679
};
7780
}
7881

82+
private static function isVersionConflictResponse(ResponseInterface $response): bool
83+
{
84+
$body = (string) $response->getBody();
85+
$response->getBody()->rewind();
86+
87+
$data = json_decode($body, true);
88+
if (!is_array($data)) {
89+
return false;
90+
}
91+
92+
return isset($data['code']) && $data['code'] === 'storage.components.configurations.versionConflict';
93+
}
94+
7995
private static function createExponentialDelay(): callable
8096
{
8197
return function ($retries) {

0 commit comments

Comments
 (0)