Wellington Chevreuil created HBASE-17461:
--------------------------------------------
Summary: HBase shell *major_compact* command should properly
convert *table_or_region_name* parameter to java byte array properly before
simply calling *HBaseAdmin.majorCompact* method
Key: HBASE-17461
URL: https://issues.apache.org/jira/browse/HBASE-17461
Project: HBase
Issue Type: Bug
Components: shell
Reporter: Wellington Chevreuil
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:
{noformat}
test,\xF8\xB9B2!$\x9C\x0A\xFEG\xC0\xE3\x8B\x1B\xFF\x15,1481745228583.b4bc69356d89018bfad3ee106b717285.
{noformat}
Calling major_compat on it fails as follows:
{noformat}
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.
{noformat}
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*:
{noformat}
admin.major_compact(table_or_region_name.to_s.to_java_bytes, family)
{noformat}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)