matanper opened a new issue, #69371:
URL: https://github.com/apache/doris/issues/69371

   ### Search before asking
   
   - [x] I had searched in the 
[issues](https://github.com/apache/doris/issues?q=is%3Aissue) and found no 
similar issues.
   
   ### Version
   
   4.1.4 (cloud mode). master is the same (351d9388d5):
   
   - FE 
`fe/fe-core/src/main/java/org/apache/doris/cloud/datasource/CloudInternalCatalog.java:690-692`
 builds the initial `[0-1]` rowset id with `String.format("%016X", ...)` 
(upper-case hex).
   - BE `be/src/util/uid_util.h:48-61` `from_hex()` only handles `0-9` and 
`a-f`; any other character is mapped with `c - 'a' + 10`.
   - BE `be/src/storage/rowset_id.cpp:57-63` `RowsetId::init(std::string_view)` 
parses the 48-char id with `from_hex()`.
   
   ### Description
   
   In cloud mode the FE creates the empty `[0-1]` rowset of every new tablet 
with a V2 rowset id formatted as upper-case hex:
   
   ```java
   String rowsetIdV2Str = String.format("%016X", 2L << 56)
           + String.format("%016X", uuid.getMostSignificantBits())
           + String.format("%016X", uuid.getLeastSignificantBits());
   ```
   
   The BE parses rowset ids with `from_hex()`, which treats every non-digit as 
lower-case:
   
   ```cpp
   if (i >= '0' && i <= '9') {
       buf_val = i - '0';
   } else {
       buf_val = i - 'a' + 10;   // 'A'..'F' -> -22..-17
   }
   val <<= 4;
   val = val | buf_val;          // a negative nibble sets all upper bits
   ```
   
   For `'A'`..`'F'` the nibble is negative, so `val | buf_val` sets every 
higher bit. Any UUID half that contains an upper-case letter parses to a value 
like `0xffffffffffffffea`. The BE then shows these rowsets as, e.g.,
   
   ```
   0200000000000000ffffffffffffffeafffffffffffffffe
   ```
   
   Consequences:
   
   1. The parse is lossy: everything before the last letter in each 16-char 
half is lost, so `[0-1]` rowset ids of different tablets can parse to the same 
`RowsetId`.
   2. `RowsetId::to_string()` never round-trips to the id stored in the 
meta-service, so any code that compares the BE-side id string with the stored 
one sees a mismatch for these rowsets.
   3. These ids look like version-hole rowsets in BE logs, which is confusing 
when diagnosing rowset reference counts.
   
   The `[0-1]` rowset is empty (0 segments, 0 rows), so we have not seen data 
impact, but the ids are wrong and not unique.
   
   ### Solution
   
   Either side fixes it; both are one-liners:
   
   1. BE: make `from_hex()` accept upper case, e.g. `else if (i >= 'A' && i <= 
'F') buf_val = i - 'A' + 10;` (and ideally reject anything else instead of 
producing a negative nibble).
   2. FE: format with `%016x` (lower case), matching how the BE prints rowset 
ids.
   
   Doing (1) keeps existing upper-case ids already stored in the meta-service 
parsing correctly.
   
   ### How to Reproduce?
   
   1. Start a cloud-mode cluster, create any table.
   2. Look at the `[0-1]` rowset id of a tablet on the BE (e.g. in BE logs or 
via the tablet meta HTTP API): it shows as `0200000000000000ffff...`, while the 
meta-service stores `0200000000000000` + 32 upper-case hex chars.
   3. Unit level: `RowsetId id; 
id.init("0200000000000000ABCDEF0123456789ABCDEF0123456789");` gives `mi` and 
`lo` with all upper bits set (e.g. `0xffffffef0123456789`-style values 
truncated to 64 bits) instead of `0xABCDEF0123456789`.
   
   ### Anything Else?
   
   `from_hex()` is also used for `UniqueId` parsing; any other caller that can 
receive upper-case hex is affected the same way.
   
   ### Are you willing to submit PR?
   
   - [x] Yes I am willing to submit a PR!
   
   ### Code of Conduct
   
   - [x] I agree to follow this project's [Code of 
Conduct](https://www.apache.org/foundation/policies/conduct)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


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

Reply via email to