Siyao Meng created HDDS-17239:
---------------------------------

             Summary: Bucket create takes usedBytes, usedNamespace and the 
snapshot usage counters from the request instead of initializing them to 0
                 Key: HDDS-17239
                 URL: https://issues.apache.org/jira/browse/HDDS-17239
             Project: Apache Ozone
          Issue Type: Bug
            Reporter: Siyao Meng
         Attachments: CR-12-initialize-bucket-usage-counters-on-create.patch

h3. Mechanism
{{usedBytes}}, {{usedNamespace}}, {{snapshotUsedBytes}} and 
{{snapshotUsedNamespace}} of a bucket are maintained by OM as keys and 
directories are written, deleted and purged. On create, 
{{OMBucketCreateRequest.preExecute}} sets the creation and modification time, 
resolves the encryption key and validates link and replication settings, but 
leaves the four counters of the request's {{BucketInfo}} as they are. 
{{OMBucketCreateRequest.validateAndUpdateCache}} builds the stored bucket with 
{{OmBucketInfo.getFromProtobuf}}, which copies them, and then sets only 
objectID, updateID and the default ACLs. A new bucket therefore starts with the 
counters of the request instead of 0.

{{RpcClient.createBucket}} never sets these counters, so they are sent as 0 and 
buckets created through the Ozone client, {{ozone sh}} and S3 Gateway start at 
0 today.

h3. Trigger
A {{BucketInfo}} that carries any of the four counters reaches 
{{OMBucketCreateRequest.validateAndUpdateCache}}. Nothing on the OM side resets 
them before the bucket is stored.

h3. Impact
The bucket table then holds usage that does not match the bucket content, and 
the quota checks of later writes use it. For example, an empty bucket with 
{{quotaInNamespace=1}} created with {{usedNamespace=1}} rejects its first 
directory with {{QUOTA_EXCEEDED}}. Reported usage ({{ozone sh bucket info}}) is 
off by the same amount. The values stay until a quota repair recomputes them 
(run on upgrade finalize or by an admin).

h3. Reproduction
No standalone reproduction is attached; the regression test in the patch shows 
the behaviour. It runs a CreateBucket request with all four counters set 
through {{preExecute}} and {{validateAndUpdateCache}} and, without the change, 
finds them in the stored bucket for both layouts. The example under Impact was 
checked with a request level test in {{hadoop-ozone/ozone-manager}} on 
unmodified source: a LEGACY bucket with {{quotaInNamespace=1}} created with 
counters 0 accepts one directory from {{OMDirectoryCreateRequest}}, and the 
same bucket created with {{usedBytes=1000, usedNamespace=1}} stores both values 
and rejects it. Not run on a cluster.

h3. Patch
[^CR-12-initialize-bucket-usage-counters-on-create.patch], against 
20d95ed37fe35013b5320713665db03c06ee36fa. It also applies to master at 
41d95dd3286.

{{OMBucketCreateRequest.preExecute}} clears the four counters on the 
{{BucketInfo}} builder it already uses for the creation and modification time, 
so the request written to the Ratis log already carries 0. The apply step is 
unchanged. Requests that already carry 0 behave as before.

Covered by {{testValidateAndUpdateCacheInitializesUsageCounters}} in the 
existing {{TestOMBucketCreateRequest}} (inherited by 
{{TestOMBucketCreateRequestWithFSO}}), which fails without the change for both 
layouts ({{[1000L, 10L, 100L, 1L]}} stored). 
{{TestBucketManagerImpl.testLinkedBucketResolution}} seeded its source bucket's 
usage through a CreateBucket request; it now writes the source bucket to the 
bucket table directly, so it still checks that the link reports the source's 
usage. With the change the bucket request and response suites, 
{{TestBucketManagerImpl}} and {{TestOmMetadataManager}} pass (126 tests), 
checkstyle is clean.

{{OMVolumeCreateRequest}} has the same pattern for {{refCount}} and 
{{usedNamespace}} of a volume; that is filed separately with its own patch.

Found by code review of the OM volume, bucket and snapshot lifecycle paths, as 
part of the TLA+ verification effort under HDDS-15926, on commit 
20d95ed37fe35013b5320713665db03c06ee36fa. 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