{"record":{"id":"0309f318134dfdb1","repo":"cloudreve/cloudreve","slug":"failed-to-get-folder-w","errorCode":null,"errorMessage":"failed to get folder: %w","messagePattern":"failed to get folder: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"inventory/file.go","lineNumber":1082,"sourceCode":"func (f *fileClient) CreateFolder(ctx context.Context, root *ent.File, args *CreateFolderParameters) (*ent.File, error) {\n\tstm := f.client.File.\n\t\tCreate().\n\t\tSetOwnerID(args.Owner).\n\t\tSetType(int(types.FileTypeFolder)).\n\t\tSetIsSymbolic(args.IsSymbolic).\n\t\tSetName(args.Name)\n\tif root != nil {\n\t\tstm.SetParent(root).SetType(int(types.FileTypeFolder))\n\t}\n\n\tfid, err := stm.OnConflict(sql.ConflictColumns(file.FieldFileChildren, file.FieldName)).Ignore().ID(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to create folder: %w\", err)\n\t}\n\n\tnewFolder, err := f.client.File.Get(ctx, fid)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get folder: %w\", err)\n\t}\n\n\tif len(args.Metadata) > 0 {\n\t\t_, err := f.client.Metadata.\n\t\t\tCreateBulk(lo.MapToSlice(args.Metadata, func(key, value string) *ent.MetadataCreate {\n\t\t\t\t_, isPrivate := args.MetadataPrivateMask[key]\n\t\t\t\treturn f.client.Metadata.Create().\n\t\t\t\t\tSetName(key).\n\t\t\t\t\tSetValue(value).\n\t\t\t\t\tSetFile(newFolder).\n\t\t\t\t\tSetIsPublic(!isPrivate)\n\t\t\t})...).\n\t\t\tSave(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to create metadata: %v\", err)\n\t\t}\n\t}\n","sourceCodeStart":1064,"sourceCodeEnd":1100,"githubUrl":"https://github.com/cloudreve/cloudreve/blob/20c95ad73f3a8bcb72887fea91ff31ab24fa1011/inventory/file.go#L1064-L1100","documentation":"After the folder upsert returned an id, the follow-up f.client.File.Get(ctx, fid) failed to fetch the row. Usually fid is 0 or stale (the conflict-ignored upsert path can yield no usable id, see error 175), the folder was deleted immediately after creation, or the database errored.","triggerScenarios":"Upsert conflict returned id 0 and Get looks up a non-existent row; concurrent delete between upsert and Get; connection failure.","commonSituations":"Same scenarios as the folder-create conflict: idempotent re-runs and concurrent folder creation.","solutions":["If fid == 0 after an ignored conflict, resolve the folder by (parent, name) instead of Get-by-id","Retry the Get once on transient driver errors","Check the wrapped error with ent.IsNotFound to branch to a name-based lookup"],"exampleFix":"// before\nnewFolder, err := f.client.File.Get(ctx, fid)\n// after\nnewFolder, err := f.client.File.Get(ctx, fid)\nif err != nil && ent.IsNotFound(err) && root != nil {\n\tnewFolder, err = f.client.File.Query().Where(file.HasParentWith(file.ID(root.ID)), file.Name(args.Name)).Only(ctx)\n}","handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"folder, err := f.CreateFolder(ctx, root, args)\nif err != nil {\n\tif ent.IsNotFound(err) && root != nil {\n\t\tif existing, qerr := f.client.File.Query().Where(file.HasParentWith(file.ID(root.ID)), file.Name(args.Name)).Only(ctx); qerr == nil {\n\t\t\tfolder = existing\n\t\t\terr = nil\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn nil, err\n\t}\n}","preventionTips":["Treat fid == 0 after an ignored conflict as a lookup-by-name signal","Retry single-row Get once on transient driver errors","Log the fid value when this fails to confirm the conflict-ignored path"],"tags":["golang","ent","cloudreve","upsert","database"],"backgroundTag":null,"analyzedSha":"20c95ad73f3a8bcb72887fea91ff31ab24fa1011","analyzedAt":"2026-08-16T01:42:55.403Z","schemaVersion":2},"datasetVersion":"2026-08-16T03:17:38.424Z"}