{"record":{"id":"99d902229d03ba36","repo":"argoproj/argo-workflows","slug":"plugin-s-expected-unix-socket-at-q-but-it-does-n","errorCode":null,"errorMessage":"plugin %s expected unix socket at %q but it does not exist after waiting for %d seconds","messagePattern":"plugin (.+?) expected unix socket at %q but it does not exist after waiting for (.+?) seconds","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"workflow/artifacts/plugin/plugin.go","lineNumber":74,"sourceCode":"\t\tlogger.WithFields(logging.Fields{\n\t\t\t\"pluginName\": pluginName,\n\t\t\t\"socketPath\": socketPath,\n\t\t\t\"retry\":      retry,\n\t\t\t\"maxRetries\": maxRetries,\n\t\t}).Debug(ctx, \"plugin socket not found, retrying in 1s\")\n\n\t\t// Use context-aware sleep\n\t\tselect {\n\t\tcase <-time.After(time.Second):\n\t\t\t// Continue to next iteration\n\t\tcase <-ctx.Done():\n\t\t\treturn nil, fmt.Errorf(\"plugin %s context cancelled while waiting for socket at %q: %w\", pluginName, socketPath, ctx.Err())\n\t\t}\n\t}\n\n\t// If socket still doesn't exist after all retries, fail with error\n\tif !socketExists {\n\t\treturn nil, fmt.Errorf(\"plugin %s expected unix socket at %q but it does not exist after waiting for %d seconds\", pluginName, socketPath, maxRetries)\n\t}\n\n\tif (info.Mode() & os.ModeSocket) == 0 {\n\t\tlogger.WithFields(logging.Fields{\n\t\t\t\"pluginName\": pluginName,\n\t\t\t\"socketPath\": socketPath,\n\t\t\t\"mode\":       info.Mode(),\n\t\t}).Warn(ctx, \"plugin socket file exists but is not a unix socket\")\n\t}\n\tlogger.WithFields(logging.Fields{\n\t\t\"pluginName\": pluginName,\n\t\t\"socketPath\": socketPath,\n\t\t\"mode\":       info.Mode(),\n\t}).Info(ctx, \"plugin socket file exists and is a unix socket\")\n\n\tconn, err := grpc.NewClient(\n\t\t\"unix://\"+socketPath,\n\t\tgrpc.WithTransportCredentials(insecure.NewCredentials()),","sourceCodeStart":56,"sourceCodeEnd":92,"githubUrl":"https://github.com/argoproj/argo-workflows/blob/35bff19146f5a6ada77468c431f2624bd577e373/workflow/artifacts/plugin/plugin.go#L56-L92","documentation":"NewDriver waits up to 120 seconds (1s poll interval) for the plugin's unix socket file to appear. If it never does, the driver gives up with this error, indicating the plugin process did not create its gRPC socket in time or at all.","triggerScenarios":"The plugin container crashed on startup, is listening on a different socket path than configured, was never deployed (ArtifactPlugin CR / plugin config missing), or takes longer than 120s to bind.","commonSituations":"Plugin image misconfigured (wrong socket path env), plugin pod CrashLoopBackOff, plugin not installed in the namespace the workflow runs in, k3d/kind cluster where the socket volume isn't shared between plugin and executor containers.","solutions":["Check the plugin pod's logs and restart count (kubectl logs / kubectl get pod) for startup crashes","Verify the socket path configured for the plugin matches the path the plugin binary actually listens on","Confirm the ArtifactPlugin resource / plugin configuration exists and points at a running plugin","Ensure both plugin and executor containers share the same volume where the socket is created","If the plugin genuinely needs >120s to start, fix startup latency (pre-pull images, faster init) — the wait is hard-coded"],"exampleFix":"// before: plugin listens on /tmp/other.sock, config says\nsocketPath: /var/run/argo/plugins/myplug.sock\n// after: align plugin's listen path with config\nsocketPath: /var/run/argo/plugins/myplug.sock  # and plugin binds exactly this path","handlingStrategy":"fallback","validationCode":"// proactively verify the plugin is deployed and healthy before artifact work\ncli, _ := kube.NewForConfig(cfg)\npods, _ := cli.CoreV1().Pods(ns).List(ctx, metav1.ListOptions{LabelSelector: \"app.kubernetes.io/name=<plugin>\"})\nif len(pods.Items) == 0 || !podRunning(pods.Items[0]) {\n    return fmt.Errorf(\"plugin not running; refusing artifact operation\")\n}","typeGuard":null,"tryCatchPattern":"if err != nil && strings.Contains(err.Error(), \"does not exist after waiting\") {\n    // socket never appeared: alert on plugin deployment, don't blind-retry for another 120s\n    return fmt.Errorf(\"plugin %s not deployed/healthy: %w\", name, err)\n}","preventionTips":["Deploy and verify the ArtifactPlugin before submitting workflows that use it","Pin the plugin's socket path in one place shared by plugin config and workflow spec","Monitor plugin pod restarts; stale or crashed plugins surface as this error after a 120s stall"],"tags":["unix-socket","timeout","plugin-not-running","plugin-driver"],"backgroundTag":"unix-socket-not-found","analyzedSha":"35bff19146f5a6ada77468c431f2624bd577e373","analyzedAt":"2026-09-03T19:34:35.908Z","contentChangedAt":"2026-09-03T19:34:35.908Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}