{"record":{"id":"09ae07eed947ac30","repo":"vxcontrol/pentagi","slug":"failed-to-delete-merged-source-directory-q-w","errorCode":null,"errorMessage":"failed to delete merged source directory %q: %w","messagePattern":"failed to delete merged source directory %q: %w","errorType":"http","errorClass":null,"httpStatus":500,"severity":"error","filePath":"backend/pkg/server/services/resources.go","lineNumber":1110,"sourceCode":"\t\t\tif err := tx.Delete(&dest).Error; err != nil {\n\t\t\t\treturn result, fmt.Errorf(\"failed to delete destination for overwrite: %w\", err)\n\t\t\t}\n\t\t\tresult.DeletedBefore = append(result.DeletedBefore, convertResource(dest))\n\t\t\tif dest.Hash != \"\" {\n\t\t\t\tresult.OrphanHashes = append(result.OrphanHashes, dest.Hash)\n\t\t\t}\n\t\t}\n\n\t\tupdated, err := updateMovedResource(tx, entry, newPath, now)\n\t\tif err != nil {\n\t\t\treturn result, err\n\t\t}\n\t\tresult.Updated = append(result.Updated, convertResource(updated))\n\t}\n\n\tfor _, dir := range sourceDirsToDelete {\n\t\tif err := tx.Delete(&dir).Error; err != nil {\n\t\t\treturn result, fmt.Errorf(\"failed to delete merged source directory %q: %w\", dir.Path, err)\n\t\t}\n\t\tresult.DeletedAfter = append(result.DeletedAfter, convertResource(dir))\n\t}\n\tif sourceRoot != nil {\n\t\tif err := tx.Delete(sourceRoot).Error; err != nil {\n\t\t\treturn result, fmt.Errorf(\"failed to delete source directory %q: %w\", sourceRoot.Path, err)\n\t\t}\n\t\tresult.DeletedAfter = append(result.DeletedAfter, convertResource(*sourceRoot))\n\t}\n\n\treturn result, nil\n}\n\nfunc listResourceTree(tx *gorm.DB, uid uint64, rootPath string) ([]models.UserResource, error) {\n\tescapedRoot := resources.EscapeLike(rootPath)\n\tvar entries []models.UserResource\n\tif err := tx.Where(\n\t\t\"user_id = ? AND (path = ? OR path LIKE ?)\",","sourceCodeStart":1092,"sourceCodeEnd":1128,"githubUrl":"https://github.com/vxcontrol/pentagi/blob/ea665308baaff015b226f308438a68d929d0f29b/backend/pkg/server/services/resources.go#L1092-L1128","documentation":"After relocating entries during a directory merge, the merge deletes each source subdirectory row that was emptied into the destination. This error wraps a failed delete of one such source directory row (identified by %q of its path), aborting the transaction so the merge is atomic.","triggerScenarios":"moveDirResourceMerge collected source subdirectories to delete, and tx.Delete on one fails — FK constraints referencing the directory row, lock contention, or connection loss.","commonSituations":"Other flows/records still referencing the source directory while a merge is in flight; migrations lacking cascade rules; DB instability during large merges.","solutions":["Check the wrapped DB error for the offending constraint or driver error","Add ON DELETE CASCADE or clean up referencing rows before merging","Avoid concurrent writes to the source subtree; retry after contention clears"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"err := svc.MoveResource(ctx, uid, srcDir, dstDir, true)\nif err != nil && strings.Contains(err.Error(), \"failed to delete merged source directory\") {\n    // log wrapped cause; transaction rolled back, safe to retry\n}","preventionTips":["Remove external references to source directories before merging","Add ON DELETE CASCADE to all referencing tables","Keep merge transactions short to reduce lock windows"],"tags":["database","gorm","delete","merge"],"backgroundTag":"database-delete-failed","analyzedSha":"ea665308baaff015b226f308438a68d929d0f29b","analyzedAt":"2026-09-01T14:16:31.421Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}