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

Siyao Meng updated HDDS-16879:
------------------------------
    Attachment: CR-2-sts-token-cleanup-read-current-metadata-manager.patch

> RevokedSTSTokenCleanupService keeps the metadata manager closed by a 
> checkpoint install, so every cleanup run fails while that OM is leader
> -------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: HDDS-16879
>                 URL: https://issues.apache.org/jira/browse/HDDS-16879
>             Project: Apache Ozone
>          Issue Type: Bug
>            Reporter: Siyao Meng
>            Priority: Minor
>         Attachments: 
> CR-2-sts-token-cleanup-read-current-metadata-manager.patch, 
> TestBugCR2StsCleanupClosedMetadataManager.java
>
>
> h3. Mechanism
> {{RevokedSTSTokenCleanupService}} stores 
> {{ozoneManager.getMetadataManager()}} in a final field in its constructor, 
> and the service is created once in {{OzoneManager.start}}. 
> {{OzoneManager.installCheckpoint}} stops the old metadata manager, which 
> closes its store, and {{reloadOMState}} creates a new 
> {{OmMetadataManagerImpl}}. The service is not stopped, recreated or updated 
> on that path, so each later run iterates {{s3RevokedStsTokenTable}} of the 
> closed store.
> The service is not in a release yet (HDDS-14094), so only master is affected. 
> The OM checkpoint servlets have the same problem, see HDDS-16878.
> h3. Trigger
> # An OM installs a checkpoint from the leader through 
> {{installSnapshotFromLeader}}.
> # That OM becomes leader (election or leadership transfer). The service only 
> runs on the leader.
> h3. Impact
> * While that OM is leader, every run fails with {{RocksDatabaseException: 
> Rocks Database is closed}}, logs "Failure while scanning 
> s3RevokedStsTokenTable" at ERROR with a stack trace, and deletes nothing, 
> until the OM restarts. With the default 
> {{ozone.om.sts.token.cleanup.service.interval}} of 3h that is one ERROR every 
> 3 hours. The scan fails on an empty table too, so the ERROR appears whether 
> or not STS is used.
> * Expired revocation entries stay in the table while that OM leads. They 
> belong to tokens past their maximum lifetime, and revocation checks read the 
> current table, so no authentication result changes. Another OM that has not 
> installed a checkpoint since it started cleans up the backlog once it becomes 
> leader (code reading).
> h3. Reproduction
> PASS on the unmodified source, deterministic. 
> [^TestBugCR2StsCleanupClosedMetadataManager.java] 
> ({{hadoop-ozone/integration-test}}) starts three OMs with one held back and 
> the cleanup interval set to 1s, advances the leader past the Ratis log purge 
> gap, starts the late OM so that Ratis installs a checkpoint on it, and 
> transfers leadership to it. One revocation entry 13 hours old is then written 
> directly into the new leader's table, because a real revoke cannot be back 
> dated; it only makes the missed cleanup visible. Output:
> {noformat}
> After omNode-3 installed a checkpoint and became leader: scan failures logged 
> = 4, 'Rocks Database is closed' in log = true, expired entry still present = 
> true
> ERROR service.RevokedSTSTokenCleanupService 
> (RevokedSTSTokenCleanupService.java:call(187)) - Failure while scanning 
> s3RevokedStsTokenTable.  It will be retried in the next interval
> org.apache.hadoop.hdds.utils.db.RocksDatabaseException: Rocks Database is 
> closed
>       at 
> org.apache.hadoop.hdds.utils.db.RocksDatabase.acquire(RocksDatabase.java:417)
>       at 
> org.apache.hadoop.hdds.utils.db.RocksDatabase.newIterator(RocksDatabase.java:809)
> {noformat}
> A passing test means the defect is present. With the patch no scan fails, the 
> service logs "Found and removed 1 revoked STS token entries." and the test 
> fails at its first defect assertion.
> h3. Patch
> [^CR-2-sts-token-cleanup-read-current-metadata-manager.patch], against 
> a6b7bdb937109ba2893688b41a89470bc95c88cf. It also applies to master at 
> 6818707698c.
> The service no longer keeps the metadata manager and reads 
> {{ozoneManager.getMetadataManager()}} at the start of each run, as 
> {{OMUpgradeFinalizeService}} already does. Nothing changes for an OM that 
> never installed a checkpoint, and no lifecycle code is added to the install 
> path.
> Covered by the new 
> {{TestRevokedSTSTokenCleanupService#scansCurrentMetadataManagerAfterItIsReplaced}}:
>  after the service is created the OM returns a new metadata manager, and one 
> run must clean the expired entry of the new table and not the one of the 
> original table. Without the change it submits the original table's entry. 
> With it {{TestRevokedSTSTokenCleanupService}}, 
> {{TestS3RevokeSTSTokenRequest}} and {{TestS3SecurityUtil}} pass (38 tests) 
> and checkstyle is clean.
> Found by code review of the OM Ratis snapshot (checkpoint) install paths, as 
> part of the TLA+ verification effort under HDDS-15926, on commit 
> a6b7bdb937109ba2893688b41a89470bc95c88cf. Checked against HDDS issues and 
> apache/ozone pull requests for duplicates before filing. The attached patch 
> is a proposal for review. Generated with Specula (Claude Opus 5.5).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to