Skip to content

Commit 7f12a13

Browse files
authored
fix(knowledge): skip sync and document processing when KB is deleted (#4327)
* fix(knowledge): skip sync and document processing when KB is deleted * fix(knowledge): mark connector errored and document failed when KB is deleted * fix(knowledge): mark connector errored in dispatchSync when KB is deleted
1 parent 9a4cd95 commit 7f12a13

2 files changed

Lines changed: 64 additions & 6 deletions

File tree

apps/sim/lib/knowledge/connectors/sync-engine.ts

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,19 +156,51 @@ export async function dispatchSync(
156156
const connectorRows = await db
157157
.select({
158158
knowledgeBaseId: knowledgeConnector.knowledgeBaseId,
159+
connectorArchivedAt: knowledgeConnector.archivedAt,
160+
connectorDeletedAt: knowledgeConnector.deletedAt,
159161
workspaceId: knowledgeBase.workspaceId,
160162
userId: knowledgeBase.userId,
163+
kbDeletedAt: knowledgeBase.deletedAt,
161164
})
162165
.from(knowledgeConnector)
163166
.innerJoin(knowledgeBase, eq(knowledgeBase.id, knowledgeConnector.knowledgeBaseId))
164167
.where(eq(knowledgeConnector.id, connectorId))
165168
.limit(1)
166169

167170
const row = connectorRows[0]
171+
if (!row) {
172+
logger.warn(`Skipping sync dispatch: connector not found`, { connectorId, requestId })
173+
return
174+
}
175+
if (row.kbDeletedAt) {
176+
logger.warn(`Skipping sync dispatch: knowledge base is deleted`, {
177+
connectorId,
178+
knowledgeBaseId: row.knowledgeBaseId,
179+
requestId,
180+
})
181+
await db
182+
.update(knowledgeConnector)
183+
.set({
184+
status: 'error',
185+
nextSyncAt: null,
186+
lastSyncError: 'Knowledge base deleted',
187+
updatedAt: new Date(),
188+
})
189+
.where(eq(knowledgeConnector.id, connectorId))
190+
return
191+
}
192+
if (row.connectorArchivedAt || row.connectorDeletedAt) {
193+
logger.warn(`Skipping sync dispatch: connector is archived or deleted`, {
194+
connectorId,
195+
requestId,
196+
})
197+
return
198+
}
199+
168200
const tags = [`connectorId:${connectorId}`]
169-
if (row?.knowledgeBaseId) tags.push(`knowledgeBaseId:${row.knowledgeBaseId}`)
170-
if (row?.workspaceId) tags.push(`workspaceId:${row.workspaceId}`)
171-
if (row?.userId) tags.push(`userId:${row.userId}`)
201+
if (row.knowledgeBaseId) tags.push(`knowledgeBaseId:${row.knowledgeBaseId}`)
202+
if (row.workspaceId) tags.push(`workspaceId:${row.workspaceId}`)
203+
if (row.userId) tags.push(`userId:${row.userId}`)
172204

173205
await knowledgeConnectorSync.trigger(
174206
{
@@ -261,7 +293,8 @@ export async function executeSync(
261293
.limit(1)
262294

263295
if (connectorRows.length === 0) {
264-
throw new Error(`Connector not found: ${connectorId}`)
296+
logger.warn(`Skipping sync: connector ${connectorId} not found, archived, or deleted`)
297+
return { ...result, error: 'connector_unavailable' }
265298
}
266299

267300
const connector = connectorRows[0]
@@ -278,7 +311,19 @@ export async function executeSync(
278311
.limit(1)
279312

280313
if (kbRows.length === 0) {
281-
throw new Error(`Knowledge base not found: ${connector.knowledgeBaseId}`)
314+
logger.warn(
315+
`Skipping sync: knowledge base ${connector.knowledgeBaseId} is deleted (connector ${connectorId})`
316+
)
317+
await db
318+
.update(knowledgeConnector)
319+
.set({
320+
status: 'error',
321+
nextSyncAt: null,
322+
lastSyncError: 'Knowledge base deleted',
323+
updatedAt: new Date(),
324+
})
325+
.where(eq(knowledgeConnector.id, connectorId))
326+
return { ...result, error: 'knowledge_base_deleted' }
282327
}
283328

284329
const userId = kbRows[0].userId

apps/sim/lib/knowledge/documents/service.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,20 @@ export async function processDocumentAsync(
386386
.limit(1)
387387

388388
if (kb.length === 0) {
389-
throw new Error(`Knowledge base not found: ${knowledgeBaseId}`)
389+
logger.warn(
390+
`[${documentId}] Skipping document processing: knowledge base ${knowledgeBaseId} is deleted`
391+
)
392+
await db
393+
.update(document)
394+
.set({
395+
processingStatus: 'failed',
396+
processingError: 'Knowledge base deleted',
397+
processingCompletedAt: new Date(),
398+
})
399+
.where(
400+
and(eq(document.id, documentId), isNull(document.archivedAt), isNull(document.deletedAt))
401+
)
402+
return
390403
}
391404

392405
await db

0 commit comments

Comments
 (0)