apache/incubator-seata · error · ServiceCallException

MCP GET Call TC Failed.

Error message

MCP GET Call TC Failed.

What it means

getCallTC wraps any RestClientException from the HTTP GET to a TC instance into ServiceCallException('MCP GET Call TC Failed.'). It fires when the transport itself fails — connection refused, timeout, unknown host — rather than when the TC returns an error status (that is error 116).

Source

Thrown at console/src/main/java/org/apache/seata/mcp/service/impl/ConsoleRemoteServiceImpl.java:167

        HttpEntity<String> entity = new HttpEntity<>(headers);
        String responseBody;
        try {
            ResponseEntity<String> response = executeRequest(url, HttpMethod.GET, entity);

            responseBody = response.getBody();

            if (!response.getStatusCode().is2xxSuccessful()) {
                String errorMsg = String.format(
                        "MCP GET request failed with status: %s, response: %s",
                        response.getStatusCode(), response.getBody());
                LOGGER.warn(errorMsg);
                throw new ServiceCallException(errorMsg, response.getStatusCode());
            }
            return responseBody;
        } catch (RestClientException e) {
            String errorMsg = "MCP GET Call TC Failed.";
            LOGGER.error(errorMsg, e);
            throw new ServiceCallException(errorMsg);
        }
    }

    @Override
    public String deleteCallTC(
            NameSpaceDetail nameSpaceDetail,
            String path,
            Object objectQueryParams,
            Map<String, String> queryParams,
            HttpHeaders headers) {
        if (headers == null) {
            headers = new HttpHeaders();
        }
        if (nameSpaceDetail == null || !nameSpaceDetail.isValid()) {
            return "If you have not specified the namespace of the TC/Server, specify the namespace first";
        } else {
            setNamespaceHeaderAndQueryParam(nameSpaceDetail, headers, queryParams);
        }

View on GitHub (pinned to e01f97c6db)

Solutions

  1. Verify the target TC process is up and its port reachable from the console host (curl the TC's health endpoint)
  2. If the TC address is stale in the naming server, wait for re-registration or restart the TC so it re-registers
  3. Raise the REST client timeouts for heavy queries like session list
  4. Add retry around the call for transient restart windows, treating ServiceCallException without a status as transport-level
Defensive patterns

Strategy: retry

Validate before calling

if (!tcHealthEndpointReachable(tcAddr)) throw new IllegalStateException("TC unreachable: " + tcAddr);

Try / catch

try { call(); } catch (ServiceCallException e) { if (isTransportFailure(e)) retryWithBackoff(max 3); else throw e; }

Prevention

When it happens

Trigger: Calling getCallTC for a TC instance that is down, restarting, network-partitioned from the console, or registered with an unreachable address in the naming server; also read timeouts on large session/lock queries.

Common situations: A seata-server pod crashed or is mid-restart but still registered in the naming server; stale TC addresses after scale-down or host migration; slow GC or load spikes on the TC causing the console's REST timeout.

Related errors


AI-assisted analysis of apache/incubator-seata@e01f97c6db (2026-08-14). Data as JSON: /api/errors/8b17d3a004f3551e. Report an issue: GitHub.