Siyao Meng created HDDS-16879:
---------------------------------
Summary: 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
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]