Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Invalid
-
None
-
None
-
None
Description
On HBase shell, major_compact command simply passes the received table_or_region_name parameter straight to java HBaseAdmin.majorCompact method.
On some corner cases, HBase tables row keys may have special characters. Then, if a region is split in such a way that row keys with special characters are now part of the region name, calling major_compact on this regions will fail, if the special character ASCII code is higher than 127. This happens because Java byte type is signed, while ruby byte type isn't, causing the region name to be converted to a wrong string at Java side.
For example, considering a region named as below:
test,\xF8\xB9B2!$\x9C\x0A\xFEG\xC0\xE3\x8B\x1B\xFF\x15,1481745228583.b4bc69356d89018bfad3ee106b717285.
Calling major_compat on it fails as follows:
hbase(main):008:0* major_compact "test,\xF8\xB9B2!$\x9C\x0A\xFEG\xC0\xE3\x8B\x1B\xFF\x15,1484177359169.8128fa75ae0cd4eba38da2667ac8ec98." ERROR: Illegal character code:44, <,> at 4. User-space table qualifiers can only contain 'alphanumeric characters': i.e. [a-zA-Z_0-9-.]: test,�B2!$� �G���1484177359169.8128fa75ae0cd4eba38da2667ac8ec98.
An easy solution is to convert table_or_region_name parameter properly, prior to calling HBaseAdmin.majorCompact in the same way as it's already done on some other shell commands, such as get:
admin.major_compact(table_or_region_name.to_s.to_java_bytes, family)
Attachments
Issue Links
- is related to
-
HBASE-8865 HBase shell split command acts incorrectly with hex split keys.
- Closed