{"record":{"id":"4e98c953f67031c3","repo":"dagger/dagger","slug":"failed-to-get-client-caller-w","errorCode":null,"errorMessage":"failed to get client caller: %w","messagePattern":"failed to get client caller: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"engine/engineutil/client.go","lineNumber":1015,"sourceCode":"\tpipeIOClient, err := pipe.NewPipeClient(caller.Conn()).IO(ctx)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to open pipe: %w\", err)\n\t}\n\t// io.ReadWriter wrapper\n\treturn &pipe.PipeIO{GRPC: pipeIOClient}, nil\n}\n\nfunc (c *Client) WriteImage(\n\tctx context.Context,\n\tname string,\n) (*ImageWriter, error) {\n\tmd, err := engine.ClientMetadataFromContext(ctx)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\tcaller, err := c.GetHostServiceCaller(ctx, md.ClientID)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to get client caller: %w\", err)\n\t}\n\n\tif callerSupports(caller, &contentapi.Content_ServiceDesc) {\n\t\treturn &ImageWriter{\n\t\t\tContentStore: contentproxy.NewContentStore(contentapi.NewContentClient(caller.Conn())),\n\t\t\tImagesStore:  containerd.NewImageStoreFromClient(imagesapi.NewImagesClient(caller.Conn())),\n\t\t\tLeaseManager: leasesproxy.NewLeaseManager(leasesapi.NewLeasesClient(caller.Conn())),\n\t\t}, nil\n\t}\n\n\tif callerSupports(caller, &store.BasicStore_serviceDesc) {\n\t\tloadClient := store.NewBasicStoreClient(caller.Conn())\n\t\tctx = metadata.AppendToOutgoingContext(ctx, store.ImageTagKey, name)\n\t\ttarballWriter, err := loadClient.WriteTarball(ctx)\n\t\tif err != nil {\n\t\t\treturn nil, fmt.Errorf(\"failed to open tarball pipe: %w\", err)\n\t\t}\n\t\treturn &ImageWriter{","sourceCodeStart":997,"sourceCodeEnd":1033,"githubUrl":"https://github.com/dagger/dagger/blob/82ba2681dbe30d3547a1dc50ea495900ab5b6047/engine/engineutil/client.go#L997-L1033","documentation":"Client.WriteImage resolves the host-service caller for the requesting client (md.ClientID) via GetHostServiceCaller. If that lookup fails, the error is wrapped as \"failed to get client caller: %w\". This is the engine's way of saying it couldn't establish the back-connection to the calling client needed to stream image content.","triggerScenarios":"engine.ClientMetadataFromContext succeeded but GetHostServiceCaller(ctx, md.ClientID) fails — the client's host service is no longer registered, the client ID is stale, or the session was torn down.","commonSituations":"Containerd export of an image (e.g. Image.export in a function) while the CLI client disconnected; long-running functions outliving the client session; engine restart invalidating client IDs.","solutions":["Verify the dagger CLI session that started the function is still running","Re-run the operation with a fresh `dagger call`","Check engine connectivity (`dagger core version`) before long exports","Upgrade CLI/engine if session teardown during long functions recurs"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"img, err := dag.Container().From(\"alpine\")\nif err != nil { /* ... */ }\n// on export failure mentioning 'failed to get client caller', restart the dagger call:\nif strings.Contains(err.Error(), \"failed to get client caller\") {\n    return retryWithFreshSession(ctx)\n}","preventionTips":["Keep the originating `dagger call` process alive for the whole function duration","Avoid exporting images from functions that outlive the client session","Check engine connectivity before long-running export operations"],"tags":["grpc","session","image-export"],"backgroundTag":"stale-client-session","analyzedSha":"82ba2681dbe30d3547a1dc50ea495900ab5b6047","analyzedAt":"2026-09-05T07:21:37.930Z","contentChangedAt":"2026-09-05T07:21:37.930Z","schemaVersion":2},"datasetVersion":"2026-09-12T12:17:11.808Z"}