[ https://issues.apache.org/jira/browse/HBASE-29554?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Emil Kleszcz updated HBASE-29554: --------------------------------- Issue Type: Bug (was: Task) > Corrupted hbase:meta rowkeys cannot be deleted > ---------------------------------------------- > > Key: HBASE-29554 > URL: https://issues.apache.org/jira/browse/HBASE-29554 > Project: HBase > Issue Type: Bug > Affects Versions: 2.5.10 > Reporter: Emil Kleszcz > Priority: Major > > *Context:* > It is possible to corrupt the {{hbase:meta}} table by inserting rowkeys > containing a single comma using commands like: > {code:java} > put 'hbase:meta', 'rowkey,', 'info:regioninfo', 'test'{code} > Example of resulting rows in `{{{}hbase:meta`{}}}: > {code:java} > ROW COLUMN+CELL > , column=info:regioninfo, > timestamp=2025-08-26T21:49:33.427, value= > rowkey, column=info:regioninfo, > timestamp=2025-08-26T22:05:52.653, value= > rowkey, column=info:regioninfo, > timestamp=2025-08-26T21:36:56.560, value= > rowkey,a column=info:regioninfo, > timestamp=2025-08-26T22:29:06.576, value= {code} > *Problem:* > * When a rowkey in `{{{}hbase:meta`{}}} contains a single comma, scanners > return the rowkeys correctly, but {{{}get{}}}, {{{}delete{}}}, and > {{deleteall}} operations {*}do not work on these rowkeys{*}. > * This behavior is specific to {{hbase:meta}} and does not occur in user > tables. > *Attempted Workarounds:* > Tried deleting the corrupted row using the Java HBase client: > {code:java} > import org.apache.hadoop.hbase.client.ConnectionFactory > import org.apache.hadoop.hbase.client.Table > import org.apache.hadoop.hbase.TableName > import org.apache.hadoop.hbase.client.Delete > import org.apache.hadoop.hbase.util.Bytes > connection = ConnectionFactory.createConnection > tabletable = connection.getTable(TableName.valueOf("hbase:meta")) > keyrowKey = Bytes.toBytes("rowkey,") > delete = Delete.new(rowKey) > delete.setTimestamp(Long::MAX_VALUE) > delete.addColumn(Bytes.toBytes("info"), Bytes.toBytes("state")) > table.delete(delete) > table.close > connection.close{code} > *Result:* Unable to delete the corrupted row. > It is possible to insert a properly serialized region info for such keys: > {code:java} > rowKey = Bytes.toBytes("rowkey,") > tableName = TableName.valueOf("TEST:TEST") > Infobuilder = RegionInfoBuilder.newBuilder(tableName) > builder.setStartKey(Bytes.toBytes("")) > builder.setEndKey(Bytes.toBytes("1")) > builder.setRegionId(12345) > fakeRegion = builder.build() > serializedValue = RegionInfo.toByteArray(fakeRegion) > put = Put.new(rowKey)put.addColumn(HConstants::CATALOG_FAMILY, > HConstants::REGIONINFO_QUALIFIER, serializedValue) {code} > Resulting row in {{{}hbase:meta{}}}: > {code:java} > rowkey, column=info:regioninfo, > timestamp=2025-08-27T17:02:21.565, value={ENCODED => > a6839d33e016dc75cfb9ac9c74a576c8, NAME => 'TEST:TEST,,1.a6839d33e0 > 16dc75cfb9ac9c74a576c8.', > STARTKEY => '', ENDKEY => '1'} {code} > > *Problems / Risks:* > # Corrupted rowkeys with commas in {{hbase:meta}} cannot be fixed or removed > on a running cluster. > # Allowing insertion of such rowkeys is risky. If insertion is allowed, > there must be a mechanism for administrators to clean them up. > # {{HBCK2}} does not resolve the issue (e.g., {{fixMeta}} fails). > *Request / Suggested Action:* > * Investigate why rowkeys with a single comma break deletion in > {{{}hbase:meta{}}}. > * Consider adding safeguards to prevent insertion of rowkeys with wrong > format into {{{}hbase:meta{}}}. > * Provide an administrative method to safely remove or repair corrupted meta > rowkeys. -- This message was sent by Atlassian Jira (v8.20.10#820010)