Details
-
Bug
-
Status: Closed
-
Minor
-
Resolution: Duplicate
-
None
-
None
-
None
-
None
Description
There are some bugs of the class HTableDescriptor.
public HTableDescriptor(final byte [] name) { super(); setMetaFlags(this.name); this.name = this.isMetaRegion()? name: isLegalTableName(name); this.nameAsString = Bytes.toString(this.name); }
I think "setMetaFlags(this.name)" should be "setMetaFlags(name)".
/** * Check passed byte buffer, "tableName", is legal user-space table name. * @return Returns passed <code>tableName</code> param * @throws NullPointerException If passed <code>tableName</code> is null * @throws IllegalArgumentException if passed a tableName * that is made of other than 'word' characters or underscores: i.e. * <code>[a-zA-Z_0-9]. */ public static byte [] isLegalTableName(final byte [] tableName) { if (tableName == null || tableName.length <= 0) { throw new IllegalArgumentException("Name is null or empty"); }
The implementation is against the contract of throwing NullPointerException.
I'm not sure the contract is wrong or the implementation is wrong.
Also the contract of throwing IllegalArgumentException is a little different from the actual implementation, and in general we must actually call this method and catch IllegalArgumentException in order to know whether the given name can be used as a table name.
I feel HTableDescriptor allows itself to be in invalid states, and I cannot fix the class well.
I think we should start to remove implementing WritableComparable, but it might greatly break the compatibility.