wenbang created HBASE-18743:
-------------------------------
Summary: Files that are in use by a table have same name and
namespace with default table cloned from a snapshot may be deleted when that
snapshot and default table is deleted
Key: HBASE-18743
URL: https://issues.apache.org/jira/browse/HBASE-18743
Project: HBase
Issue Type: Bug
Components: hbase
Affects Versions: 1.1.6
Reporter: wenbang
Priority: Critical
We recently had a critical production issue in which HFiles that were still in
use by a table were deleted.
This appears to have been caused by conditions in which table have the same
namespace and name with default table cloned from a snapshot.when snapshot and
default table be deleted,HFiles that are still in use may be deleted.
For example:
Table with default namespace: "table1"
The namespace of the new table is the same as the name of the default table,
and is generated by snapshot cloning : "table1: table1"
When the snapshot and the default namespace table are deleted, the new table is
also deleted in the used HFILE
This is because the creation of the BackReferenceFile get the table Name is not
normal, resulting in can not find the reference file, hfilecleaner to delete
the file is used, when the table has not been major compact
Problem code:
{code:java}
public static TableName valueOf(String namespaceAsString, String
qualifierAsString) {
if (namespaceAsString == null || namespaceAsString.length() < 1) {
namespaceAsString = NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR;
}
for (TableName tn : tableCache) {
if (qualifierAsString.equals(tn.getQualifierAsString()) &&
namespaceAsString.equals(tn.getNameAsString())) {
return tn;
}
}
return createTableNameIfNecessary(
ByteBuffer.wrap(Bytes.toBytes(namespaceAsString)),
ByteBuffer.wrap(Bytes.toBytes(qualifierAsString)));
}
{code}
"namespaceAsString.equals(tn.getNameAsString()))"
This code should be
"namespaceAsString.equals(tn.getNamespaceAsString()))"
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)