apache/druid · warning
Call returned null IP for
Error message
Call returned null IP for %s, skipping
What it means
GceAutoScaler resolves GCE instance names to IPs when scaling out. When the GCE API lookup returns null or the literal string "null" for an instance, the scaler logs this warning and skips the instance instead of adding a bogus 'null' host that callers would wait on for maxScalingDuration.
Solutions
- Wait and retry: the instance may still be provisioning; verify the instance reaches RUNNING state with an assigned IP in the GCE console.
- If instances are intentionally internal-only, configure the autoScaler to read the internal network interface IP instead of the external access config.
- Check that the instance's network interface has an access config (external IP) or that the lookup code targets the correct NIC.
- Investigate why the GCE API returned the literal "null" string — often an outdated metadata/API response; update the GCE client library version.
Example fix
// before
if (ip != null && !"null".equals(ip)) {
instanceIps.add(ip);
}
// after
String ip = getInternalIp(instance); // prefer NIC networkInterfaces[0].networkIP
if (ip != null && !"null".equals(ip) && !ip.isEmpty()) {
instanceIps.add(ip);
} else {
log.warnEvents("Instance %s has no usable IP yet; will retry next poll", instance.getName());
} Defensive patterns
Strategy: retry
Validate before calling
Instance instance = compute.instances().get(project, zone, name).execute();
boolean hasIp = instance.getNetworkInterfaces().stream()
.anyMatch(nic -> nic.getAccessConfigs() != null && nic.getAccessConfigs().stream()
.anyMatch(ac -> ac.getNatIP() != null)); Prevention
- Poll for instance readiness (RUNNING + IP assigned) before including it in scaling results.
- Assign static/ephemeral external IPs deliberately, or read the internal IP for internal-only networks.
- Keep the GCE API client library up to date to avoid literal "null" string responses.
- Set maxScalingDuration high enough that a skipped instance does not stall scaling decisions.
When it happens
Trigger: Calling idToIpLookup (via ips1/ips3) for a GCE instance that has no external/internal IP yet: instance still provisioning, instance terminated while listing, or the network interface access config missing (no external IP assigned).
Common situations: Autoscaling during rapid scale-up where new workers have not finished provisioning; GCE instances launched without external IPs on networks relying on internal-only addressing; transient GCE API inconsistencies during concurrent termination.
Understand the failure class
Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.
Related errors
- Could not fetch last modified timestamp from URI
- Error loading [ ]
- Error occurred while trying to read uri:
- Error reading response
- Error reading response from GET on url
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/630a4203c3407e6c.
Report an issue: GitHub.
Appendix: source
Thrown at extensions-contrib/gce-extensions/src/main/java/org/apache/druid/indexing/overlord/autoscaling/gce/GceAutoScaler.java:479
List<String> instanceIps = new ArrayList<>();
InstanceList response;
do {
response = request.execute();
if (response.getItems() == null) {
continue;
}
for (Instance instance : response.getItems()) {
// Assuming that every server has at least one network interface...
String ip = instance.getNetworkInterfaces().get(0).getNetworkIP();
// ...even though some IPs are reported as null on the spot but later they are ok,
// so we skip the ones that are null. fear not, they are picked up later this just
// prevents to have a machine called 'null' around which makes the caller wait for
// it for maxScalingDuration time before doing anything else
if (ip != null && !"null".equals(ip)) {
instanceIps.add(ip);
} else {
// log and skip it
log.warn("Call returned null IP for %s, skipping", instance.getName());
}
}
request.setPageToken(response.getNextPageToken());
} while (response.getNextPageToken() != null);
return instanceIps;
}
catch (Exception e) {
log.error(e, "Unable to convert IDs to IPs.");
}
return new ArrayList<>();
}
@Override
public String toString()
{
return "gceAutoScaler={" +View on GitHub (pinned to 9b90983fd2)