From f5c5ee5645ecd6d57b376c14bf1b3a7ef05a6888 Mon Sep 17 00:00:00 2001 From: Etienne <45695613+etiennejouan@users.noreply.github.com> Date: Wed, 24 Sep 2025 15:18:56 +0200 Subject: [PATCH] update cleaning job to progressively delete metadata (#14596) Workspace cleaning jobs slow down the db each hours when running. We suspect the object metadata deleting query with all cascade/depending entities (field, index, ..) to be the cause. --- .../object-metadata.service.ts | 19 ++++++++++++++++++- .../workspace-manager.service.spec.ts | 7 ------- .../workspace-manager.service.ts | 9 +-------- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index fdaa3bfdd9..908143bf18 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -62,6 +62,8 @@ export class ObjectMetadataService extends TypeOrmQueryService, + @InjectRepository(FieldMetadataEntity) + private readonly fieldMetadataRepository: Repository, private readonly dataSourceService: DataSourceService, private readonly workspaceMetadataCacheService: WorkspaceMetadataCacheService, @@ -644,7 +646,22 @@ export class ObjectMetadataService extends TypeOrmQueryService { let objectMetadataService: ObjectMetadataService; let workspaceMigrationRepository: Repository; let dataSourceRepository: Repository; - let workspaceFieldMetadataRepository: Repository; let workspaceDataSourceService: WorkspaceDataSourceService; let roleTargetsRepository: Repository; let roleRepository: Repository; @@ -155,9 +154,6 @@ describe('WorkspaceManagerService', () => { dataSourceRepository = module.get>( getRepositoryToken(DataSourceEntity), ); - workspaceFieldMetadataRepository = module.get< - Repository - >(getRepositoryToken(FieldMetadataEntity)); workspaceDataSourceService = module.get( WorkspaceDataSourceService, ); @@ -177,9 +173,6 @@ describe('WorkspaceManagerService', () => { it('should delete all the workspace metadata tables and workspace schema', async () => { await service.delete('workspace-id'); expect(objectMetadataService.deleteObjectsMetadata).toHaveBeenCalled(); - expect(workspaceFieldMetadataRepository.delete).toHaveBeenCalledWith({ - workspaceId: 'workspace-id', - }); expect(workspaceMigrationRepository.delete).toHaveBeenCalledWith({ workspaceId: 'workspace-id', }); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts index 3f190f81c8..ccac06166d 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-manager.service.ts @@ -10,7 +10,6 @@ import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { AgentService } from 'src/engine/metadata-modules/agent/agent.service'; import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; -import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service'; import { RoleTargetsEntity } from 'src/engine/metadata-modules/role/role-targets.entity'; import { RoleEntity } from 'src/engine/metadata-modules/role/role.entity'; @@ -36,8 +35,6 @@ export class WorkspaceManagerService { private readonly objectMetadataService: ObjectMetadataService, private readonly dataSourceService: DataSourceService, private readonly workspaceSyncMetadataService: WorkspaceSyncMetadataService, - @InjectRepository(FieldMetadataEntity) - private readonly fieldMetadataRepository: Repository, @InjectRepository(UserWorkspace) private readonly userWorkspaceRepository: Repository, private readonly roleService: RoleService, @@ -150,11 +147,6 @@ export class WorkspaceManagerService { //TODO: delete all logs when #611 closed this.logger.log(`Deleting workspace ${workspaceId} ...`); - await this.fieldMetadataRepository.delete({ - workspaceId, - }); - this.logger.log(`workspace ${workspaceId} field metadata deleted`); - await this.roleTargetsRepository.delete({ workspaceId, }); @@ -175,6 +167,7 @@ export class WorkspaceManagerService { this.logger.log(`workspace ${workspaceId} data source deleted`); // Delete schema await this.workspaceDataSourceService.deleteWorkspaceDBSchema(workspaceId); + this.logger.log(`workspace ${workspaceId} schema deleted`); }