fix: Backup schedules and pruning
All checks were successful
Deploy to Staging / Build Images (push) Successful in 4m30s
Deploy to Staging / Deploy to Staging (push) Successful in 37s
Deploy to Staging / Verify Staging (push) Successful in 6s
Deploy to Staging / Notify Staging Ready (push) Successful in 5s
Deploy to Staging / Notify Staging Failure (push) Has been skipped
@@ -13,12 +13,12 @@ The `DistributedLockService` in `redis.ts` provides Redis-based distributed lock
|
|||||||
**All scheduled jobs MUST use distributed locking** to prevent duplicate execution when multiple backend containers are running.
|
**All scheduled jobs MUST use distributed locking** to prevent duplicate execution when multiple backend containers are running.
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
|
import { randomUUID } from 'crypto';
|
||||||
import { lockService } from '../core/config/redis';
|
import { lockService } from '../core/config/redis';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
|
||||||
|
|
||||||
// Acquire lock (returns false if already held)
|
// Acquire lock (returns false if already held)
|
||||||
const lockKey = 'job:my-scheduled-task';
|
const lockKey = 'job:my-scheduled-task';
|
||||||
const lockValue = uuidv4(); // Unique identifier for this execution
|
const lockValue = randomUUID(); // Unique identifier for this execution
|
||||||
const ttlSeconds = 300; // Auto-release after 5 minutes
|
const ttlSeconds = 300; // Auto-release after 5 minutes
|
||||||
|
|
||||||
const acquired = await lockService.acquireLock(lockKey, ttlSeconds, lockValue);
|
const acquired = await lockService.acquireLock(lockKey, ttlSeconds, lockValue);
|
||||||
|
|||||||
@@ -22,13 +22,13 @@ The scheduler runs periodic background jobs. In blue-green deployments, **multip
|
|||||||
### Pattern for New Jobs
|
### Pattern for New Jobs
|
||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { randomUUID } from 'crypto';
|
||||||
import { lockService } from '../../core/config/redis';
|
import { lockService } from '../../core/config/redis';
|
||||||
import { logger } from '../../core/logging/logger';
|
import { logger } from '../../core/logging/logger';
|
||||||
|
|
||||||
export async function processMyJob(): Promise<void> {
|
export async function processMyJob(): Promise<void> {
|
||||||
const lockKey = 'job:my-job-name';
|
const lockKey = 'job:my-job-name';
|
||||||
const lockValue = uuidv4();
|
const lockValue = randomUUID();
|
||||||
const lockTtlSeconds = 300; // 5 minutes - adjust based on expected job duration
|
const lockTtlSeconds = 300; // 5 minutes - adjust based on expected job duration
|
||||||
|
|
||||||
// Try to acquire lock
|
// Try to acquire lock
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import { Pool } from 'pg';
|
import { Pool } from 'pg';
|
||||||
import { v4 as uuidv4 } from 'uuid';
|
import { randomUUID } from 'crypto';
|
||||||
import { logger } from '../../../core/logging/logger';
|
import { logger } from '../../../core/logging/logger';
|
||||||
import { lockService } from '../../../core/config/redis';
|
import { lockService } from '../../../core/config/redis';
|
||||||
import { BackupRepository } from '../data/backup.repository';
|
import { BackupRepository } from '../data/backup.repository';
|
||||||
@@ -59,7 +59,7 @@ export async function processScheduledBackups(): Promise<ScheduledBackupJobResul
|
|||||||
for (const schedule of dueSchedules) {
|
for (const schedule of dueSchedules) {
|
||||||
// Generate unique lock value for this execution
|
// Generate unique lock value for this execution
|
||||||
const lockKey = `backup:schedule:${schedule.id}`;
|
const lockKey = `backup:schedule:${schedule.id}`;
|
||||||
const lockValue = uuidv4();
|
const lockValue = randomUUID();
|
||||||
|
|
||||||
// Try to acquire lock for this schedule
|
// Try to acquire lock for this schedule
|
||||||
const lockAcquired = await lockService.acquireLock(lockKey, BACKUP_LOCK_TTL_SECONDS, lockValue);
|
const lockAcquired = await lockService.acquireLock(lockKey, BACKUP_LOCK_TTL_SECONDS, lockValue);
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 96 KiB After Width: | Height: | Size: 96 KiB |
|
Before Width: | Height: | Size: 180 KiB After Width: | Height: | Size: 180 KiB |
|
Before Width: | Height: | Size: 255 KiB After Width: | Height: | Size: 255 KiB |
|
Before Width: | Height: | Size: 67 KiB After Width: | Height: | Size: 67 KiB |