fix: make import lock unique per attempt + release in finally
All checks were successful
Deploy API Server / build-and-deploy (push) Successful in 47s
All checks were successful
Deploy API Server / build-and-deploy (push) Successful in 47s
- Add timestamp to lock key to prevent blocking retries - Wrap create logic in try-finally to always release lock - Reduce lock TTL from 30min to 5min Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
433e0095ee
commit
aef8e2a416
@ -22,13 +22,15 @@ export class DocumentImportService {
|
||||
}) {
|
||||
this.logger.log(`createImport called: userId=${dto.userId}, kbId=${dto.knowledgeBaseId}, fileName=${dto.fileName}, sourceType=${dto.sourceType}`);
|
||||
try {
|
||||
const lockKey = `lock:document-import:${dto.fileName || Date.now()}`;
|
||||
this.logger.log(`Attempting Redis lock: ${lockKey}`);
|
||||
const lockToken = await this.redis.lock(lockKey, 1800);
|
||||
// Use unique lock key per upload attempt to avoid blocking retries
|
||||
const lockKey = `lock:document-import:${dto.fileName || 'file'}:${Date.now()}`;
|
||||
this.logger.log(`Acquiring lock: ${lockKey}`);
|
||||
const lockToken = await this.redis.lock(lockKey, 300); // 5 min TTL, enough for one upload
|
||||
if (!lockToken) {
|
||||
throw new Error('相同文件正在导入中,请稍候');
|
||||
}
|
||||
|
||||
try {
|
||||
this.logger.log(`Creating DB record...`);
|
||||
const job = await this.repository.create(dto);
|
||||
this.logger.log(`DB record created: ${job.id}`);
|
||||
@ -47,9 +49,10 @@ export class DocumentImportService {
|
||||
});
|
||||
this.logger.log(`Job enqueued: ${job.id}`);
|
||||
|
||||
await this.redis.unlock(lockKey, lockToken);
|
||||
|
||||
return { jobId: job.id, status: 'queued' };
|
||||
} finally {
|
||||
await this.redis.unlock(lockKey, lockToken);
|
||||
}
|
||||
} catch (err: any) {
|
||||
this.logger.error(`createImport failed: ${err.message}`, err.stack);
|
||||
throw err;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user