@Test(expected=IllegalArgumentException.class) public void testModifyInexistentFamily() { byte[] familyName = Bytes.toBytes("cf"); HColumnDescriptor hcd = new HColumnDescriptor(familyName); TableDescriptor htd = TableDescriptorBuilder .newBuilder(TableName.valueOf(name.getMethodName())) .modifyColumnFamily(hcd) .build(); }
@Override public TableDescriptor get() throws IOException { TableDescriptor old = getTableDescriptors().get(tableName); if (!old.hasColumnFamily(descriptor.getName())) { throw new InvalidFamilyOperationException("Family '" + descriptor.getNameAsString() + "' does not exist, so it cannot be modified"); } return TableDescriptorBuilder.newBuilder(old).modifyColumnFamily(descriptor).build(); } }, nonceGroup, nonce);
/** * Enable in memory caching for hbase:meta */ public static TableDescriptor setInfoFamilyCachingForMeta(TableDescriptor metaDescriptor, final boolean b) { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(metaDescriptor); for (ColumnFamilyDescriptor hcd: metaDescriptor.getColumnFamilies()) { if (Bytes.equals(hcd.getName(), HConstants.CATALOG_FAMILY)) { builder.modifyColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(hcd) .setBlockCacheEnabled(b) .setInMemory(b) .build()); } } return builder.build(); }
@Test public void testRollbackAndDoubleExecutionOnMobTable() throws Exception { final TableName tableName = TableName.valueOf(name.getMethodName()); TableDescriptor htd = MasterProcedureTestingUtility.createHTD(tableName, F1, F2); TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd) .modifyColumnFamily(ColumnFamilyDescriptorBuilder .newBuilder(htd.getColumnFamily(Bytes.toBytes(F1))) .setMobEnabled(true) .build()); testRollbackAndDoubleExecution(builder); }
@Override public TableDescriptor preModifyTable(ObserverContext<MasterCoprocessorEnvironment> env, TableName tableName, final TableDescriptor currentDescriptor, final TableDescriptor newDescriptor) throws IOException { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(newDescriptor); for (ColumnFamilyDescriptor cfd : newDescriptor.getColumnFamilies()) { builder.modifyColumnFamily( ColumnFamilyDescriptorBuilder.newBuilder(cfd).setMaxVersions(1).build()); } return builder.build(); } }
@Override public TableDescriptor preCreateTableRegionsInfos( ObserverContext<MasterCoprocessorEnvironment> ctx, TableDescriptor desc) throws IOException { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(desc); for (ColumnFamilyDescriptor cfd : desc.getColumnFamilies()) { builder.modifyColumnFamily( ColumnFamilyDescriptorBuilder.newBuilder(cfd).setMaxVersions(1).build()); } return builder.build(); }
/** * Apply a transform to all columns in a given table. If there are no columns in a table or if the context is stopping does nothing. * @param tableName the table to modify * @param transform the modification to perform. Callers will have the column name as a string and a column family builder available to them */ protected void modifyAllTableColumns(TableName tableName, BiConsumer<String, ColumnFamilyDescriptorBuilder> transform) throws IOException { HBaseTestingUtility util = this.context.getHBaseIntegrationTestingUtility(); Admin admin = util.getAdmin(); TableDescriptor tableDescriptor = admin.getDescriptor(tableName); ColumnFamilyDescriptor[] columnDescriptors = tableDescriptor.getColumnFamilies(); if (columnDescriptors == null || columnDescriptors.length == 0) { return; } TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableDescriptor); for (ColumnFamilyDescriptor descriptor : columnDescriptors) { ColumnFamilyDescriptorBuilder cfd = ColumnFamilyDescriptorBuilder.newBuilder(descriptor); transform.accept(descriptor.getNameAsString(), cfd); builder.modifyColumnFamily(cfd.build()); } // Don't try the modify if we're stopping if (this.context.isStopping()) { return; } admin.modifyTable(builder.build()); }
@Test public void testMasterObserverToModifyTableSchema() throws IOException { TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(TABLENAME); for (int i = 1; i <= 3; i++) { builder.setColumnFamily( ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf" + i)).setMaxVersions(i) .build()); } try (Admin admin = UTIL.getAdmin()) { admin.createTable(builder.build()); assertOneVersion(admin.getDescriptor(TABLENAME)); builder.modifyColumnFamily(ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("cf1")) .setMaxVersions(Integer.MAX_VALUE).build()); admin.modifyTable(builder.build()); assertOneVersion(admin.getDescriptor(TABLENAME)); } }
.build(); TableDescriptor td = TableDescriptorBuilder.newBuilder(selected) .modifyColumnFamily(cfd) .build(); admin.modifyTable(td);
.build(); TableDescriptor td = TableDescriptorBuilder.newBuilder(selected) .modifyColumnFamily(cfd) .build(); admin.modifyTable(td);
.newBuilder(td) .removeColumnFamily(Bytes.toBytes("cf1")) .modifyColumnFamily(modCf2) .modifyColumnFamily(modCf3) .setColumnFamily(cf5) .setColumnFamily(cf6)
@Test public void testModifyFamily() { byte[] familyName = Bytes.toBytes("cf"); ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName) .setBlocksize(1000) .setDFSReplication((short) 3) .build(); TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())) .setColumnFamily(hcd) .build(); assertEquals(1000, htd.getColumnFamily(familyName).getBlocksize()); assertEquals(3, htd.getColumnFamily(familyName).getDFSReplication()); hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName) .setBlocksize(2000) .setDFSReplication((short) 1) .build(); htd = TableDescriptorBuilder.newBuilder(htd) .modifyColumnFamily(hcd) .build(); assertEquals(2000, htd.getColumnFamily(familyName).getBlocksize()); assertEquals(1, htd.getColumnFamily(familyName).getDFSReplication()); }
/** * Synchronize column family properties using the default cf properties for a given table * @param tableDesc table descriptor of table to modify * @param defaultColFam default column family used as the baseline for property synchronization * @param syncedProps Map of properties to be kept in sync as read from the default column family descriptor * @return modified table descriptor builder */ private static TableDescriptorBuilder syncColFamProperties(TableDescriptor tableDesc, ColumnFamilyDescriptor defaultColFam, Map<String, Object> syncedProps) { TableDescriptorBuilder tableDescBuilder = TableDescriptorBuilder.newBuilder(tableDesc); // Ensure that all column families have necessary properties in sync (including local index cf if present) for (ColumnFamilyDescriptor currentColFam: tableDesc.getColumnFamilies()) { if (!currentColFam.equals(defaultColFam)) { ColumnFamilyDescriptorBuilder colFamDescBuilder = ColumnFamilyDescriptorBuilder.newBuilder(currentColFam); for (String prop: MetaDataUtil.SYNCED_DATA_TABLE_AND_INDEX_COL_FAM_PROPERTIES) { String existingPropVal = Bytes.toString(currentColFam.getValue(Bytes.toBytes(prop))); String expectedPropVal = syncedProps.get(prop).toString(); if (existingPropVal == null || !existingPropVal.toLowerCase().equals(expectedPropVal.toLowerCase())) { // Need to synchronize this property for the current column family descriptor colFamDescBuilder.setValue(prop, expectedPropVal); } } if (!colFamDescBuilder.equals(ColumnFamilyDescriptorBuilder.newBuilder(currentColFam))) { tableDescBuilder.modifyColumnFamily(colFamDescBuilder.build()); } } } return tableDescBuilder; }
@Test(expected=IllegalArgumentException.class) public void testModifyInexistentFamily() { byte[] familyName = Bytes.toBytes("cf"); HColumnDescriptor hcd = new HColumnDescriptor(familyName); TableDescriptor htd = TableDescriptorBuilder .newBuilder(TableName.valueOf(name.getMethodName())) .modifyColumnFamily(hcd) .build(); }
tableDescriptorBuilder.modifyColumnFamily(columnDescriptorBuilder.build());
ColumnFamilyDescriptorBuilder cfdb = ColumnFamilyDescriptorBuilder.newBuilder(cfd); modifySyncedPropsForCF(cfdb); tableDescBuilder.modifyColumnFamily(cfdb.build()); tableDescBuilder.modifyColumnFamily(cfdb.build());
.newBuilder(td) .removeColumnFamily(Bytes.toBytes("cf1")) .modifyColumnFamily(modCf2) .modifyColumnFamily(modCf3) .setColumnFamily(cf5) .setColumnFamily(cf6)
@Test public void testModifyFamily() { byte[] familyName = Bytes.toBytes("cf"); ColumnFamilyDescriptor hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName) .setBlocksize(1000) .setDFSReplication((short) 3) .build(); TableDescriptor htd = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName())) .setColumnFamily(hcd) .build(); assertEquals(1000, htd.getColumnFamily(familyName).getBlocksize()); assertEquals(3, htd.getColumnFamily(familyName).getDFSReplication()); hcd = ColumnFamilyDescriptorBuilder.newBuilder(familyName) .setBlocksize(2000) .setDFSReplication((short) 1) .build(); htd = TableDescriptorBuilder.newBuilder(htd) .modifyColumnFamily(hcd) .build(); assertEquals(2000, htd.getColumnFamily(familyName).getBlocksize()); assertEquals(1, htd.getColumnFamily(familyName).getDFSReplication()); }
@Test public void testRollbackAndDoubleExecutionOnMobTable() throws Exception { final TableName tableName = TableName.valueOf(name.getMethodName()); TableDescriptor htd = MasterProcedureTestingUtility.createHTD(tableName, F1, F2); TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(htd) .modifyColumnFamily(ColumnFamilyDescriptorBuilder .newBuilder(htd.getColumnFamily(Bytes.toBytes(F1))) .setMobEnabled(true) .build()); testRollbackAndDoubleExecution(builder); }
/** * Apply a transform to all columns in a given table. If there are no columns in a table or if the context is stopping does nothing. * @param tableName the table to modify * @param transform the modification to perform. Callers will have the column name as a string and a column family builder available to them */ protected void modifyAllTableColumns(TableName tableName, BiConsumer<String, ColumnFamilyDescriptorBuilder> transform) throws IOException { HBaseTestingUtility util = this.context.getHBaseIntegrationTestingUtility(); Admin admin = util.getAdmin(); TableDescriptor tableDescriptor = admin.getDescriptor(tableName); ColumnFamilyDescriptor[] columnDescriptors = tableDescriptor.getColumnFamilies(); if (columnDescriptors == null || columnDescriptors.length == 0) { return; } TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableDescriptor); for (ColumnFamilyDescriptor descriptor : columnDescriptors) { ColumnFamilyDescriptorBuilder cfd = ColumnFamilyDescriptorBuilder.newBuilder(descriptor); transform.accept(descriptor.getNameAsString(), cfd); builder.modifyColumnFamily(cfd.build()); } // Don't try the modify if we're stopping if (this.context.isStopping()) { return; } admin.modifyTable(builder.build()); }