{"record":{"id":"0cd59df1d0033681","repo":"grpc/grpc-java","slug":"unsupported-operation-sendurgentdata","errorCode":null,"errorMessage":"Unsupported operation sendUrgentData()","messagePattern":"Unsupported operation sendUrgentData\\(\\)","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"android/src/main/java/io/grpc/android/UdsSocket.java","lineNumber":230,"sourceCode":"\n  @Override\n  public boolean isConnected() {\n    return localSocket.isConnected();\n  }\n\n  @Override\n  public synchronized boolean isInputShutdown() {\n    return inputShutdown;\n  }\n\n  @Override\n  public synchronized boolean isOutputShutdown() {\n    return outputShutdown;\n  }\n\n  @Override\n  public void sendUrgentData(int data) {\n    throw new UnsupportedOperationException(\"Unsupported operation sendUrgentData()\");\n  }\n\n  @Override\n  public void setKeepAlive(boolean on) {\n    throw new UnsupportedOperationException(\"Unsupported operation setKeepAlive()\");\n  }\n\n  @Override\n  public void setOOBInline(boolean on) {\n    throw new UnsupportedOperationException(\"Unsupported operation setOOBInline()\");\n  }\n\n  @Override\n  public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {\n    throw new UnsupportedOperationException(\"Unsupported operation setPerformancePreferences()\");\n  }\n\n  @Override","sourceCodeStart":212,"sourceCodeEnd":248,"githubUrl":"https://github.com/grpc/grpc-java/blob/64daddc1f3d1975670f769f3e97bde8b2ba32d25/android/src/main/java/io/grpc/android/UdsSocket.java#L212-L248","documentation":"Sentinel guard in UdsSocket's Socket adapter: UDS (Unix domain) local sockets have no TCP out-of-band data channel, so the Socket.sendUrgentData override unconditionally rejects the operation. It fires whenever calling code assumes a plain TCP socket and attempts to send urgent/OOB data on this wrapper.","triggerScenarios":"Calling UdsSocket.sendUrgentData(int) directly, or code performing TCP keep-alive/liveness probes via out-of-band bytes on the socket.","commonSituations":"Porting legacy TCP socket health-check code that pings the peer with urgent data; reusing a shared socket-utility class against the UDS transport.","solutions":["Do not use out-of-band data on UDS sockets; send a normal application-level ping/RPC instead","Implement liveness checks at the gRPC level (e.g. grpc.health.v1 Health checks) rather than at the socket level","Refactor shared socket utilities to branch on socket type before calling TCP-only methods"],"exampleFix":"// before\nsocket.sendUrgentData(0xFF); // TCP OOB liveness probe\n// after\n// use gRPC health checking instead of TCP urgent data\nhealthStub.check(HealthCheckRequest.getDefaultInstance());","handlingStrategy":"fallback","validationCode":"boolean supportsOob = !(socket instanceof io.grpc.android.UdsSocket);","typeGuard":"static boolean supportsUrgentData(java.net.Socket s) { return !(s instanceof io.grpc.android.UdsSocket); }","tryCatchPattern":"try { socket.sendUrgentData(data); } catch (UnsupportedOperationException e) { /* fall back to app-level ping */ }","preventionTips":["Use gRPC health checks (grpc.health.v1) for liveness instead of TCP out-of-band probes","Do not port TCP keepalive/urgent-data hacks to UDS channels"],"tags":["grpc","android","unix-domain-socket","tcp"],"backgroundTag":"unsupported-operation","analyzedSha":"64daddc1f3d1975670f769f3e97bde8b2ba32d25","analyzedAt":"2026-09-08T06:14:57.704Z","contentChangedAt":"2026-09-08T06:14:57.704Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}