HBASE-771 Names legal in 0.1 are not in 0.2; breaks migration
git-svn-id: https://svn.apache.org/repos/asf/hadoop/hbase/trunk@680453 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
37b6f7e42e
commit
0a9f7e62f6
|
@ -218,6 +218,7 @@ Release 0.2.0
|
||||||
HBASE-770 Update HBaseRPC to match hadoop 0.17 RPC
|
HBASE-770 Update HBaseRPC to match hadoop 0.17 RPC
|
||||||
HBASE-780 Can't scan '.META.' from new shell
|
HBASE-780 Can't scan '.META.' from new shell
|
||||||
HBASE-424 Should be able to enable/disable .META. table
|
HBASE-424 Should be able to enable/disable .META. table
|
||||||
|
HBASE-771 Names legal in 0.1 are not in 0.2; breaks migration
|
||||||
|
|
||||||
IMPROVEMENTS
|
IMPROVEMENTS
|
||||||
HBASE-559 MR example job to count table rows
|
HBASE-559 MR example job to count table rows
|
||||||
|
|
|
@ -122,7 +122,7 @@ public class HTableDescriptor implements WritableComparable {
|
||||||
* @param name Table name.
|
* @param name Table name.
|
||||||
* @throws IllegalArgumentException if passed a table name
|
* @throws IllegalArgumentException if passed a table name
|
||||||
* that is made of other than 'word' characters, underscore or period: i.e.
|
* that is made of other than 'word' characters, underscore or period: i.e.
|
||||||
* <code>[a-zA-Z_0-9.].
|
* <code>[a-zA-Z_0-9-.].
|
||||||
* @see <a href="HADOOP-1581">HADOOP-1581 HBASE: Un-openable tablename bug</a>
|
* @see <a href="HADOOP-1581">HADOOP-1581 HBASE: Un-openable tablename bug</a>
|
||||||
*/
|
*/
|
||||||
public HTableDescriptor(final byte [] name) {
|
public HTableDescriptor(final byte [] name) {
|
||||||
|
@ -213,13 +213,19 @@ public class HTableDescriptor implements WritableComparable {
|
||||||
if (b == null || b.length <= 0) {
|
if (b == null || b.length <= 0) {
|
||||||
throw new IllegalArgumentException("Name is null or empty");
|
throw new IllegalArgumentException("Name is null or empty");
|
||||||
}
|
}
|
||||||
|
if (b[0] == '.' || b[0] == '-') {
|
||||||
|
throw new IllegalArgumentException("Illegal first character <" + b[0] +
|
||||||
|
">. " + "User-space table names can only start with 'word " +
|
||||||
|
"characters': i.e. [a-zA-Z_0-9]: " + Bytes.toString(b));
|
||||||
|
}
|
||||||
for (int i = 0; i < b.length; i++) {
|
for (int i = 0; i < b.length; i++) {
|
||||||
if (Character.isLetterOrDigit(b[i]) || b[i] == '_') {
|
if (Character.isLetterOrDigit(b[i]) || b[i] == '_' || b[i] == '-' ||
|
||||||
|
b[i] == '.') {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
throw new IllegalArgumentException("Illegal character <" + b[i] + ">. " +
|
throw new IllegalArgumentException("Illegal character <" + b[i] + ">. " +
|
||||||
"User-space table names can only contain 'word characters':" +
|
"User-space table names can only contain 'word characters':" +
|
||||||
"i.e. [a-zA-Z_0-9]: " + Bytes.toString(b));
|
"i.e. [a-zA-Z_0-9-.]: " + Bytes.toString(b));
|
||||||
}
|
}
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||||
import org.apache.hadoop.hbase.client.HBaseAdmin;
|
import org.apache.hadoop.hbase.client.HBaseAdmin;
|
||||||
import org.apache.hadoop.hbase.client.HTable;
|
import org.apache.hadoop.hbase.client.HTable;
|
||||||
import org.apache.hadoop.hbase.io.BatchUpdate;
|
import org.apache.hadoop.hbase.io.BatchUpdate;
|
||||||
|
import org.apache.hadoop.hbase.util.Bytes;
|
||||||
|
|
||||||
/** Tests table creation restrictions*/
|
/** Tests table creation restrictions*/
|
||||||
public class TestTable extends HBaseClusterTestCase {
|
public class TestTable extends HBaseClusterTestCase {
|
||||||
|
@ -127,17 +128,18 @@ public class TestTable extends HBaseClusterTestCase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test read only tables
|
* Test read only tables
|
||||||
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
public void testReadOnlyTable() throws Exception {
|
public void testReadOnlyTable() throws Exception {
|
||||||
HBaseAdmin admin = new HBaseAdmin(conf);
|
HBaseAdmin admin = new HBaseAdmin(conf);
|
||||||
HTableDescriptor desc = new HTableDescriptor(getName());
|
HTableDescriptor desc = new HTableDescriptor(getName());
|
||||||
byte[] colName = "test:".getBytes();
|
byte[] colName = Bytes.toBytes("test:");
|
||||||
desc.addFamily(new HColumnDescriptor(colName));
|
desc.addFamily(new HColumnDescriptor(colName));
|
||||||
desc.setReadOnly(true);
|
desc.setReadOnly(true);
|
||||||
admin.createTable(desc);
|
admin.createTable(desc);
|
||||||
HTable table = new HTable(conf, getName());
|
HTable table = new HTable(conf, getName());
|
||||||
try {
|
try {
|
||||||
byte[] value = "somedata".getBytes();
|
byte[] value = Bytes.toBytes("somedata");
|
||||||
BatchUpdate update = new BatchUpdate();
|
BatchUpdate update = new BatchUpdate();
|
||||||
update.put(colName, value);
|
update.put(colName, value);
|
||||||
table.commit(update);
|
table.commit(update);
|
||||||
|
@ -146,4 +148,33 @@ public class TestTable extends HBaseClusterTestCase {
|
||||||
// expected
|
// expected
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test that user table names can contain '-' and '.' so long as they do not
|
||||||
|
* start with same. HBASE-771
|
||||||
|
*/
|
||||||
|
public void testTableNames() {
|
||||||
|
byte[][] illegalNames = new byte[][] {
|
||||||
|
Bytes.toBytes("-bad"),
|
||||||
|
Bytes.toBytes(".bad"),
|
||||||
|
HConstants.ROOT_TABLE_NAME,
|
||||||
|
HConstants.META_TABLE_NAME
|
||||||
|
};
|
||||||
|
for (int i = 0; i < illegalNames.length; i++) {
|
||||||
|
try {
|
||||||
|
new HTableDescriptor(illegalNames[i]);
|
||||||
|
fail("Did not detect '" + Bytes.toString(illegalNames[i]) +
|
||||||
|
"' as an illegal user table name");
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
// expected
|
||||||
|
}
|
||||||
|
}
|
||||||
|
byte[] legalName = Bytes.toBytes("g-oo.d");
|
||||||
|
try {
|
||||||
|
new HTableDescriptor(legalName);
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
fail("Legal user table name: '" + Bytes.toString(legalName) +
|
||||||
|
"' caused IllegalArgumentException: " + e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue