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]
