[ 
https://issues.apache.org/jira/browse/FLINK-41435?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

LuChengxiang updated FLINK-41435:
---------------------------------
    Labels:   (was: pull-request-available)

> Hadoop delegation token refresh can target a different UGI than Hadoop clients
> ------------------------------------------------------------------------------
>
>                 Key: FLINK-41435
>                 URL: https://issues.apache.org/jira/browse/FLINK-41435
>             Project: Flink
>          Issue Type: Bug
>          Components: Runtime / Configuration
>    Affects Versions: 2.0.0, 1.20.0, 2.1.0, 2.2.0, 2.3.0, 2.4.0
>         Environment: Flink 1.20.x and 2.0 through 2.4, plus master 
> (2.5-SNAPSHOT); Kubernetes and standalone application mode with Kerberos and 
> HDFS delegation tokens.
>            Reporter: LuChengxiang
>            Priority: Major
>
> *Background*
> Flink periodically obtains HDFS delegation tokens and distributes them 
> through HadoopDelegationTokenReceiver. The receiver currently adds the new 
> credentials to UserGroupInformation.getCurrentUser() on the refresh thread. 
> Long-lived Hadoop clients capture a UGI when their DFSClient is created, and 
> subsequent RPC connections use tokens from that captured UGI.
> If the refresh thread's current UGI is not the UGI captured by the client, 
> the client continues using the startup token even though a new token was 
> obtained successfully. The job later fails with SecretManager$InvalidToken 
> when the startup token reaches its 24h deadline.
> *How it is triggered*
> This was observed in a Kubernetes application-mode job with no 
> connector-specific security setup. A token refresh generated a new HDFS token 
> and the receiver logged success, but FileSystemJobResultStore and checkpoint 
> storage continued using the token created at startup. A build containing the 
> install-idempotency change still failed: startup logged `Security 
> configuration is already installed` and did not reinstall, but the 24h expiry 
> remained.
> FLINK-27204 (1.19+) moved FileSystemJobResultStore I/O onto the shared 
> cluster-io executor. DefaultDelegationTokenManager uses the same executor for 
> periodic token refresh. Java thread-pool workers inherit the 
> AccessControlContext/Subject of the thread that first creates the worker, not 
> the Subject at executor construction. A worker can therefore see a different 
> UGI through getCurrentUser() than the login/security-context UGI captured by 
> the Hadoop client.
> This is consistent with why the older 1.18 path did not show the issue: 
> FileSystemJobResultStore I/O was synchronous, and the token-refresh executor 
> was not shared with JRS I/O. 1.15 did not have the unified delegation-token 
> manager path at all.
> *Root cause*
> HadoopDelegationTokenReceiver targets getCurrentUser() of the refresh thread. 
> That target is not guaranteed to be the UGI held by the HadoopSecurityContext 
> or the UGI captured by a long-lived FileSystemJobResultStore / checkpoint 
> DFSClient. HadoopFSDelegationTokenProvider also performs its 
> Kerberos/token-required checks using the current user and creates a 
> short-lived UGI for token acquisition.
> *Proposed change*
> * Add an accessor for the UGI held by HadoopSecurityContext.
> * In HadoopDelegationTokenReceiver, add refreshed credentials to the 
> security-context UGI, current UGI, and login UGI, deduplicated by object 
> identity.
> * In HadoopFSDelegationTokenProvider, resolve delegation-token necessity 
> under the security-context UGI and close FileSystem instances created under 
> the short-lived login UGI.
> * Add regression coverage for a refresh thread whose current user differs 
> from the security-context user.
> *Scope*
> This issue covers receiver/provider UGI targeting and client credential 
> visibility. It does not cover SecurityUtils.install idempotency, 
> partial-install rollback, or arbitrary later changes to the process login 
> user by user code.
> *Testing*
> * A JVM probe confirmed that a fixed thread pool created under Subject A but 
> first submitted under Subject B runs subsequent tasks under Subject B.
> * Unit/integration coverage should verify that refreshed credentials reach 
> the UGI held by HadoopSecurityContext and the login/current UGIs used by 
> long-lived clients.
> * A deployed build with the focused fix should survive the 24h token deadline 
> and continue checkpointing without SecretManager$InvalidToken.
> *Acceptance criteria*
> * Token refresh updates the UGI used by FileSystemJobResultStore and 
> checkpoint DFSClient.
> * Refresh does not depend on the Subject inherited by the shared cluster-io 
> worker.
> * A long-running job survives the 24h HDFS token deadline.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to