diff --git a/server/src/domain/library/library.service.ts b/server/src/domain/library/library.service.ts index a04da45c4e..5fce250f35 100644 --- a/server/src/domain/library/library.service.ts +++ b/server/src/domain/library/library.service.ts @@ -45,6 +45,7 @@ export class LibraryService extends EventEmitter { private access: AccessCore; private configCore: SystemConfigCore; private watchLibraries = false; + private watchLock = false; private watchers: Record void> = {}; constructor( @@ -73,11 +74,13 @@ export class LibraryService extends EventEmitter { const config = await this.configCore.getConfig(); const { watch, scan } = config.library; - this.watchLibraries = false; + if (watch.enabled) { // This ensures that library watching only occurs in one microservice // TODO: we could make the lock be per-library instead of global - this.watchLibraries = await this.databaseRepository.tryLock(DatabaseLock.LibraryWatch); + + this.watchLock = await this.databaseRepository.tryLock(DatabaseLock.LibraryWatch); + this.watchLibraries = this.watchLock; } this.jobRepository.addCronJob( 'libraryScan', @@ -93,7 +96,7 @@ export class LibraryService extends EventEmitter { this.configCore.config$.subscribe(async ({ library }) => { this.jobRepository.updateCronJob('libraryScan', library.scan.cronExpression, library.scan.enabled); - if (library.watch.enabled !== this.watchLibraries) { + if (this.watchLock && library.watch.enabled !== this.watchLibraries) { this.watchLibraries = library.watch.enabled; await (this.watchLibraries ? this.watchAll() : this.unwatchAll()); } diff --git a/server/src/infra/repositories/database.repository.ts b/server/src/infra/repositories/database.repository.ts index 66553d38da..b24602b899 100644 --- a/server/src/infra/repositories/database.repository.ts +++ b/server/src/infra/repositories/database.repository.ts @@ -228,7 +228,8 @@ export class DatabaseRepository implements IDatabaseRepository { } private async acquireTryLock(lock: DatabaseLock, queryRunner: QueryRunner): Promise { - return queryRunner.query('SELECT pg_try_advisory_lock($1)', [lock]); + const lockResult = await queryRunner.query('SELECT pg_try_advisory_lock($1)', [lock]); + return lockResult[0].pg_try_advisory_lock; } private async releaseLock(lock: DatabaseLock, queryRunner: QueryRunner): Promise {