Fix build activation race condition

This commit is contained in:
Khushboo Verma 2025-06-03 14:23:17 +05:30
parent 7a465dc8f8
commit 2088792d09
3 changed files with 26 additions and 15 deletions

12
composer.lock generated
View file

@ -4807,16 +4807,16 @@
"packages-dev": [
{
"name": "appwrite/sdk-generator",
"version": "0.41.0",
"version": "0.41.1",
"source": {
"type": "git",
"url": "https://github.com/appwrite/sdk-generator.git",
"reference": "96316272a3cee1a3abf5b9f05ae49ebbff03725e"
"reference": "6d9318abf4542a757c87abf056557d6afa1dc06b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/96316272a3cee1a3abf5b9f05ae49ebbff03725e",
"reference": "96316272a3cee1a3abf5b9f05ae49ebbff03725e",
"url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6d9318abf4542a757c87abf056557d6afa1dc06b",
"reference": "6d9318abf4542a757c87abf056557d6afa1dc06b",
"shasum": ""
},
"require": {
@ -4852,9 +4852,9 @@
"description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms",
"support": {
"issues": "https://github.com/appwrite/sdk-generator/issues",
"source": "https://github.com/appwrite/sdk-generator/tree/0.41.0"
"source": "https://github.com/appwrite/sdk-generator/tree/0.41.1"
},
"time": "2025-05-26T09:47:45+00:00"
"time": "2025-06-01T04:20:04+00:00"
},
{
"name": "doctrine/annotations",

View file

@ -213,7 +213,7 @@ services:
appwrite-console:
<<: *x-logging
container_name: appwrite-console
image: appwrite/console:6.0.32
image: appwrite/console:6.0.35
restart: unless-stopped
networks:
- appwrite

View file

@ -275,6 +275,7 @@ class Builds extends Action
$deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment);
if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) {
$resource = $dbForProject->getDocument($resource->getCollection(), $resource->getId());
$resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', ''));
$dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource);
}
@ -525,6 +526,7 @@ class Builds extends Action
$deployment = $dbForProject->updateDocument('deployments', $deployment->getId(), $deployment);
if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) {
$resource = $dbForProject->getDocument($resource->getCollection(), $resource->getId());
$resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', ''));
$dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource);
}
@ -1056,6 +1058,7 @@ class Builds extends Action
$deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment);
if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) {
$resource = $dbForProject->getDocument($resource->getCollection(), $resource->getId());
$resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', ''));
$dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource);
}
@ -1073,15 +1076,22 @@ class Builds extends Action
/** Set auto deploy */
if ($deployment->getAttribute('activate') === true) {
// Check if current active deployment started later than this deployment
$currentDeploymentId = $resource->getAttribute('deploymentId', '');
if (!empty($currentDeploymentId)) {
$currentDeployment = $dbForProject->getDocument('deployments', $currentDeploymentId);
if (!$currentDeployment->isEmpty()) {
$currentStartTime = $currentDeployment->getAttribute('buildStartedAt', '');
$newStartTime = $deployment->getAttribute('buildStartedAt', '');
$resource = $dbForProject->getDocument($resource->getCollection(), $resource->getId());
$currentActiveDeploymentId = $resource->getAttribute('deploymentId', '');
if (!empty($currentActiveDeploymentId)) {
$currentActiveDeployment = $dbForProject->getDocument('deployments', $currentActiveDeploymentId);
if (!$currentActiveDeployment->isEmpty()) {
$currentActiveStartTime = $currentActiveDeployment->getAttribute('buildStartedAt', '');
$currentActiveEndTime = $currentActiveDeployment->getAttribute('buildEndedAt', '');
$deploymentStartTime = $deployment->getAttribute('buildStartedAt', '');
$deploymentEndTime = $deployment->getAttribute('buildEndedAt', '');
if (!empty($currentStartTime) && !empty($newStartTime) && $currentStartTime > $newStartTime) {
Console::info('Skipping auto-activation as current deployment started later');
// Skip auto-activation if:
// 1. Current active deployment started later than deployment that is being activated, AND
// 2. Current active deployment finished earlier than deployment that is being activated
if ((!empty($currentActiveStartTime) && !empty($deploymentStartTime) && $currentActiveStartTime > $deploymentStartTime) &&
(!empty($currentActiveEndTime) && !empty($deploymentEndTime) && $currentActiveEndTime < $deploymentEndTime)) {
Console::info('Skipping auto-activation as current deployment is more recent');
return;
}
}
@ -1263,6 +1273,7 @@ class Builds extends Action
$deployment = $dbForProject->updateDocument('deployments', $deploymentId, $deployment);
if ($deployment->getInternalId() === $resource->getAttribute('latestDeploymentInternalId', '')) {
$resource = $dbForProject->getDocument($resource->getCollection(), $resource->getId());
$resource = $resource->setAttribute('latestDeploymentStatus', $deployment->getAttribute('status', ''));
$dbForProject->updateDocument($resource->getCollection(), $resource->getId(), $resource);
}