alibaba/canal · error · RuntimeException

requestPost remote error, request : {}

Error message

requestPost remote error, request : {}

What it means

Outer catch in HttpHelper.post0() (HttpHelper.java:150-151): catches any Throwable from the POST flow and rethrows it as a new RuntimeException 'requestPost remote error, request : <url>' with the original as the cause. This is the exception callers see. It covers the inner non-200 throw (error 358, preserved as cause), connect/socket timeouts (all three RequestConfig timeouts set to `timeout`), unknown host/connection refused, URIBuilder failures, JSON serialization errors from post() (JSON.toJSONString on the requestBody), and NullPointerException when httpclient is null because the constructor's SSLContext builder failed silently.

Source

Thrown at instance/manager/src/main/java/com/alibaba/otter/canal/instance/manager/plain/HttpHelper.java:151

            if (heads != null) {
                for (Map.Entry<String, String> entry : heads.entrySet()) {
                    httpPost.setHeader(entry.getKey(), entry.getValue());
                }
            }

            HttpClientContext context = HttpClientContext.create();
            context.setRequestConfig(config);

            response = httpclient.execute(httpPost, context);
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == HttpStatus.SC_OK) {
                return EntityUtils.toString(response.getEntity());
            } else {
                throw new RuntimeException("requestPost remote error, request : " + url + ", statusCode=" + statusCode
                                           + ";" + EntityUtils.toString(response.getEntity()));
            }
        } catch (Throwable t) {
            throw new RuntimeException("requestPost remote error, request : " + url, t);
        } finally {
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    // ignore
                }
            }
            if (httpPost != null) {
                httpPost.releaseConnection();
            }
        }
    }

    public void close() {
        if (httpclient != null) {
            try {
                httpclient.close();

View on GitHub (pinned to 87be50e876)

Solutions

  1. Classify via getCause(): the inner 'requestPost remote error, request : ..., statusCode=...' → handle per error 358; SocketTimeoutException → raise timeout or reduce manager load; ConnectException/UnknownHostException → network/DNS; NullPointerException → httpclient not built (constructor SSL init failed), restart and verify crypto deps; JSONException → fix the requestBody shape.
  2. Confirm manager reachability: curl -X POST -v <manager-url> from the canal host.
  3. Increase the timeout passed to post() if manager responses are slow.
  4. Validate that the payload passed to post() is POJO-serializable by fastjson2 (avoid cycles, opaque types).
  5. Monitor this RuntimeException as the signal for manager connectivity/health problems.
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-flight: confirm manager reachable and payload serializable
try {
    JSON.toJSONString(requestBody); // throws inside HttpHelper if this fails
} catch (Exception e) {
    throw new IllegalArgumentException("payload not serializable", e);
}
try (java.net.Socket s = new java.net.Socket()) {
    s.connect(managerInetSocketAddress, 3000);
} catch (IOException e) {
    throw new IllegalStateException("manager unreachable", e);
}

Try / catch

try {
    String body = helper.post(url, heads, payload, timeout);
} catch (RuntimeException e) {
    Throwable c = e.getCause();
    if (c instanceof java.net.SocketTimeoutException) {
        log.warn("manager POST timeout to {} (timeout={}ms)", url, timeout);
    } else if (c != null && c.getMessage() != null && c.getMessage().contains("statusCode=")) {
        log.error("manager POST non-200: {}", c.getMessage()); // see error 358
    } else if (c instanceof NullPointerException) {
        log.error("httpclient null — HttpHelper constructor SSL init failed; restart and verify crypto deps");
    } else {
        log.error("manager POST failed to {}", url, e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Any failure during HttpHelper.post()/post0() — non-200 manager response, network/DNS failure, timeout, malformed URL/URI, requestBody not serializable to JSON, or httpclient null due to constructor SSL init failure. All are uniformly wrapped by the outer catch.

Common situations: canal-manager unreachable or down; POST timeout configured too low for manager response; requestBody contains a non-serializable field (fastjson2 throws inside the try); httpclient left null because SSLContextBuilder threw in the constructor (then httpclient.execute NPEs); firewall dropping the manager connection; manager overloaded returning slowly.

Related errors


AI-assisted analysis of alibaba/canal@87be50e876 (2026-08-14). Data as JSON: /api/errors/46dfc888fd0199d2. Report an issue: GitHub.