cgregg
08/28/2026, 12:16 AMRocky
08/28/2026, 12:17 AMenable_pipeline_engine, enable_spill, or chunk_size.
* Configuration Changes: Tweaking fe.conf or be.conf parameters.
* Table/Catalog Properties: Modifying properties like replication_num, in_memory, or catalog-specific refresh settings.
* SQL Rewrites: Alternative ways to write the query to bypass the bug.
Please share the details and I'll do my best to find a non-code fix for you!
References
• release_notes/release-2.4.md
• sql-reference/sql-functions/date-time-functions/week_iso.md
• sql-reference/sql-functions/variant-functions/get_variant.md
• sql-reference/sql-functions/date-time-functions/weekofyear.md
• faq/operation_maintenance_faq.md
• faq/resource_isolation_faq.md
• sql-reference/data-types/string-type/STRING.md
• data_source/data_cache.mdcgregg
08/28/2026, 12:20 AMcgregg
08/28/2026, 12:20 AMload query history failed ... Access denied for user '<FE FQDN>' (using password: YES)
The FQDN deployment model appears incompatible with the internal-load bypass because a DNS name cannot equal the request source IP. The request falls back to ordinary authentication, but no documented/configurable service credential exists for this native loader.
Additional context
This affects a Kubernetes FQDN deployment with authentication enabled. It is reproducible with sanitized identifiers only; no production hostnames, account names, passwords, SQL text, or internal URLs are included here.
Current main retains the same StreamLoader credential construction and checkIsInternalLoad() predicate as 4.1.4.
Potential resolutions:
1. Make the internal check work with FQDN-based FE identities, such as comparing the request IP against the resolved/registered FE address rather than requiring string equality with the FQDN; or
2. Provide a documented, secure configuration for a dedicated internal query-history loader credential.
A workaround based on native users named after FE FQDNs would need passwords derived from generated FE node names and lifecycle reconciliation after FE membership or metadata changes. That is brittle and does not appear to be a supported deployment pattern.
StarRocks version (Required)
• 4.1.4-4a9848ecgregg
08/28/2026, 12:23 AMload query history failed ... Access denied for user '<FE FQDN>' (using password: YES)
The FQDN deployment model appears incompatible with the internal-load bypass because a DNS name cannot equal the request source IP. The request falls back to ordinary authentication, but no documented/configurable service credential exists for this native loader.
Additional context
This affects a Kubernetes FQDN deployment with authentication enabled. It is reproducible with sanitized identifiers only; no production hostnames, account names, passwords, SQL text, or internal URLs are included here.
Current main retains the same StreamLoader credential construction and checkIsInternalLoad() predicate as 4.1.4.
Potential resolutions:
1. Make the internal check work with FQDN-based FE identities, such as comparing the request IP against the resolved/registered FE address rather than requiring string equality with the FQDN; or
2. Provide a documented, secure configuration for a dedicated internal query-history loader credential.
A workaround based on native users named after FE FQDNs would need passwords derived from generated FE node names and lifecycle reconciliation after FE membership or metadata changes. That is brittle and does not appear to be a supported deployment pattern.
StarRocks version (Required)
• 4.1.4-4a9848eRocky
08/28/2026, 12:23 AMenable_pipeline_engine, enable_spill, or chunk_size.
* Configuration Changes: Tweaking fe.conf or be.conf parameters.
* Table/Catalog Properties: Modifying properties like replication_num, in_memory, or catalog-specific refresh settings.
* SQL Rewrites: Alternative ways to write the query to bypass the bug.
Please share the issue details and I'll do my best to find a non-code fix for you!
References
• quick_start/helm.md
• administration/management/enable_fqdn.md
• deployment/sr_operator.mdcgregg
08/28/2026, 12:24 AMload query history failed ... Access denied for user '<FE FQDN>' (using password: YES)
The FQDN deployment model appears incompatible with the internal-load bypass because a DNS name cannot equal the request source IP. The request falls back to ordinary authentication, but no documented/configurable service credential exists for this native loader.
Additional context
This affects a Kubernetes FQDN deployment with authentication enabled. It is reproducible with sanitized identifiers only; no production hostnames, account names, passwords, SQL text, or internal URLs are included here.
Current main retains the same StreamLoader credential construction and checkIsInternalLoad() predicate as 4.1.4.
Potential resolutions:
1. Make the internal check work with FQDN-based FE identities, such as comparing the request IP against the resolved/registered FE address rather than requiring string equality with the FQDN; or
2. Provide a documented, secure configuration for a dedicated internal query-history loader credential.
A workaround based on native users named after FE FQDNs would need passwords derived from generated FE node names and lifecycle reconciliation after FE membership or metadata changes. That is brittle and does not appear to be a supported deployment pattern.
StarRocks version (Required)
• 4.1.4-4a9848eRocky
08/28/2026, 12:24 AMStreamLoader authentication bypass in StarRocks 4.1.4.
The issue occurs because the internal loader (which persists records to _statistics_.query_history) falls back to standard authentication when it fails the checkIsInternalLoad() string comparison. Since the loader hardcodes its credentials using the FE's metadata, you can resolve this without a source code change by manually creating StarRocks users that match these internal identities.
Workaround: Manually Create Internal Service Users
To allow the query history loader to authenticate successfully, you need to create a StarRocks user for each FE node that matches the credentials it is sending.
1. Identify the Credentials
The StreamLoader sends the following:
* Username: The FE's Host string (in your case, the FQDN).
* Password: The FE's nodeName.
2. Retrieve the nodeName for each FE
You can find the nodeName for each FE in one of two ways:
* Metadata File: Check the fe/meta/image/VERSION file in your FE's persistent volume. Look for the line starting with nodeName=.
* FE Logs: Search the fe.log file for the string "node name". It usually looks like fqdn_port_timestamp or ip_port_timestamp.
3. Create the Users in StarRocks
Connect to your cluster via a MySQL client and create a user for every FE in your cluster:
sql
-- For each FE node:
CREATE USER '<FE_FQDN>'@'%' IDENTIFIED BY '<FE_NODE_NAME>';
-- Grant the necessary permission to write to the query_history table:
GRANT INSERT ON TABLE _statistics_.query_history TO '<FE_FQDN>'@'%';
Example:
If your FE FQDN is fe-0.starrocks.svc.cluster.local and its node name is fe-0.starrocks.svc.cluster.local_9010_1724800000, run:
CREATE USER 'fe-0.starrocks.svc.cluster.local'@'%' IDENTIFIED BY 'fe-0.starrocks.svc.cluster.local_9010_1724800000';
Why this works
When checkIsInternalLoad() fails due to the IP/FQDN mismatch, StarRocks doesn't immediately reject the request; it attempts to verify the credentials against its internal user table. By creating these users, the request is authenticated normally, and the query_history table will begin populating.
Is this brittle?
While you mentioned this feels brittle, in a Kubernetes environment with persistent storage:
* The FQDN is stable (provided by the StatefulSet).
* The nodeName is stable (it is generated once when the FE is initialized and stored in the metadata).
As long as you do not wipe the FE metadata or change the FE's host identity, these users will remain valid.
Summary of configurations involved
Ensure these FE parameters are also set correctly in your `fe.conf`:
* enable_collect_query_detail_info = true (Must be enabled to collect data).
* query_history_load_interval_seconds (Your current interval).
If you prefer not to manage individual users, the only other non-code solution would be to use a sidecar proxy to intercept and rewrite the Authorization header of the internal Stream Load requests, which is significantly more complex than the user creation approach.
References
• administration/management/FE_configuration.md
• administration/management/enable_fqdn.md
• administration/user_privs/authentication/native_authentication.md
• administration/http_interface/query_detail.md
References
• administration/management/FE_configuration.mdRocky
08/28/2026, 12:24 AMStreamLoader (which persists query history) expects the registered FE host to be an IP address for its "internal load bypass" logic to succeed. In an FQDN-based Kubernetes deployment, this string comparison fails, and the request falls back to standard authentication using credentials the system hasn't explicitly been told to create.
Since you want to resolve this without changing the source code, here are the three most viable workarounds:
1. The "Manual Credential" Workaround (Quickest)
You can manually create the user and password that the FE is attempting to use. While you noted this as "brittle," in a Kubernetes StatefulSet environment, the FQDNs and FE node names are typically stable unless the metadata or the cluster is fully recreated.
* Identify the Username: This is the FQDN of the FE node (e.g., starrocks-fe-0.starrocks-fe-search.default.svc.cluster.local).
* Identify the Password: This is the FE Node Name. You can find this by running:
sql
SHOW FRONTENDS;
-- Look at the 'Name' column (e.g., '172.20.1.5_9010_169283021')
* Create the User: Run the following for each FE node in your cluster:
sql
-- Replace <FE_FQDN> and <FE_NODE_NAME> with actual values
CREATE USER '<FE_FQDN>' IDENTIFIED BY '<FE_NODE_NAME>';
GRANT INSERT ON _statistics_.query_history TO USER '<FE_FQDN>';
Note: If the FE node name changes due to a metadata wipe, you will need to update this password.
2. Use the AuditLoader Plugin (Most Robust)
The built-in query_history feature is essentially a native version of the AuditLoader plugin. If the native loader is failing due to hardcoded credential logic, you can switch to the plugin, which allows for explicit credential configuration.
1. Disable the built-in history: Set enable_query_history = false in fe.conf.
2. Install AuditLoader: Download the auditloader.zip from the StarRocks repository and install it via INSTALL PLUGIN.
3. Configure Credentials: The plugin uses a configuration file (or session variables) where you can explicitly set a root user or a dedicated service account:
ini
# Example AuditLoader config
user=root
password=your_root_password
frontend_host_port=127.0.0.1:8030
By using 127.0.0.1, the request stays local to the FE pod, and you can use standard credentials that don't depend on FQDN/IP matching.
3. Kubernetes-Native Log Scraping (Best Practice)
If you prefer not to manage internal database tables for history, you can rely on the fe.audit.log which StarRocks writes to the pod's file system regardless of authentication success in the stream loader.
* Ensure enable_audit_sql = true (default) in fe.conf.
* Use a sidecar (like Fluentd, Vector, or Promtail) to scrape /opt/starrocks/fe/log/fe.audit.log.
* Ship these logs to an external observability stack (Elasticsearch, Loki) or even back into StarRocks via a regular Stream Load that you control.
Summary
* If you need a fix immediately: Use Option 1.
* If you want a stable production setup: Use Option 2 (AuditLoader plugin) or Option 3 (Log scraping), as they bypass the brittle checkIsInternalLoad() logic entirely.
For the GitHub issue, mentioning that AuditLoader provides the required "configurable service credential" (Resolution 2 in your issue) might encourage the maintainers to port that configurability to the native query_history feature.
References
• administration/management/FE_configuration.md
• administration/management/enable_fqdn.mdRocky
08/28/2026, 12:24 AM