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
- Verify the target TC process is up and its port reachable from the console host (curl the TC's health endpoint)
- If the TC address is stale in the naming server, wait for re-registration or restart the TC so it re-registers
- Raise the REST client timeouts for heavy queries like session list
- 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
- Prune stale TC registrations from the naming server
- Purge/re-check TC health before running console batch operations
- Distinguish transport failures (no status) from upstream errors (has status) in handlers
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
- MCP DELETE Call TC Failed.
- MCP GET Call NameSpace Failed.
- MCP DELETE request returned non-success status: %s, response
- No naming servers addr configured
- The time format does not match yyyy-MM-dd
AI-assisted analysis of apache/incubator-seata@e01f97c6db (2026-08-14).
Data as JSON: /api/errors/8b17d3a004f3551e.
Report an issue: GitHub.