HBASE-26261 Store configuration loss when use update_config (#3664)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
This commit is contained in:
parent
e6508f6776
commit
96fa015043
|
@ -67,6 +67,7 @@ import org.apache.hadoop.hbase.backup.FailedArchiveException;
|
|||
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
|
||||
import org.apache.hadoop.hbase.client.RegionInfo;
|
||||
import org.apache.hadoop.hbase.client.Scan;
|
||||
import org.apache.hadoop.hbase.client.TableDescriptor;
|
||||
import org.apache.hadoop.hbase.conf.ConfigurationManager;
|
||||
import org.apache.hadoop.hbase.conf.PropagatingConfigurationObserver;
|
||||
import org.apache.hadoop.hbase.coprocessor.ReadOnlyConfiguration;
|
||||
|
@ -241,14 +242,7 @@ public class HStore implements Store, HeapSize, StoreConfigInformation,
|
|||
protected HStore(final HRegion region, final ColumnFamilyDescriptor family,
|
||||
final Configuration confParam, boolean warmup) throws IOException {
|
||||
|
||||
// 'conf' renamed to 'confParam' b/c we use this.conf in the constructor
|
||||
// CompoundConfiguration will look for keys in reverse order of addition, so we'd
|
||||
// add global config first, then table and cf overrides, then cf metadata.
|
||||
this.conf = new CompoundConfiguration()
|
||||
.add(confParam)
|
||||
.addBytesMap(region.getTableDescriptor().getValues())
|
||||
.addStringMap(family.getConfiguration())
|
||||
.addBytesMap(family.getValues());
|
||||
this.conf = StoreUtils.createStoreConfiguration(confParam, region.getTableDescriptor(), family);
|
||||
|
||||
this.region = region;
|
||||
this.storeContext = initializeStoreContext(family);
|
||||
|
@ -2523,14 +2517,10 @@ public class HStore implements Store, HeapSize, StoreConfigInformation,
|
|||
return this.offPeakHours;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
@Override
|
||||
public void onConfigurationChange(Configuration conf) {
|
||||
this.conf = new CompoundConfiguration()
|
||||
.add(conf)
|
||||
.addBytesMap(getColumnFamilyDescriptor().getValues());
|
||||
this.conf = StoreUtils.createStoreConfiguration(conf, region.getTableDescriptor(),
|
||||
getColumnFamilyDescriptor());
|
||||
this.storeEngine.compactionPolicy.setConf(conf);
|
||||
this.offPeakHours = OffPeakHours.getInstance(conf);
|
||||
}
|
||||
|
|
|
@ -28,7 +28,10 @@ import org.apache.hadoop.conf.Configuration;
|
|||
import org.apache.hadoop.hbase.Cell;
|
||||
import org.apache.hadoop.hbase.CellComparator;
|
||||
import org.apache.hadoop.hbase.CellUtil;
|
||||
import org.apache.hadoop.hbase.CompoundConfiguration;
|
||||
import org.apache.hadoop.hbase.HConstants;
|
||||
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
|
||||
import org.apache.hadoop.hbase.client.TableDescriptor;
|
||||
import org.apache.hadoop.hbase.io.hfile.HFile;
|
||||
import org.apache.hadoop.hbase.util.ChecksumType;
|
||||
import org.apache.yetus.audience.InterfaceAudience;
|
||||
|
@ -161,4 +164,11 @@ public class StoreUtils {
|
|||
HFile.DEFAULT_BYTES_PER_CHECKSUM);
|
||||
}
|
||||
|
||||
public static Configuration createStoreConfiguration(Configuration conf, TableDescriptor td,
|
||||
ColumnFamilyDescriptor cfd) {
|
||||
// CompoundConfiguration will look for keys in reverse order of addition, so we'd
|
||||
// add global config first, then table and cf overrides, then cf metadata.
|
||||
return new CompoundConfiguration().add(conf).addBytesMap(td.getValues())
|
||||
.addStringMap(cfd.getConfiguration()).addBytesMap(cfd.getValues());
|
||||
}
|
||||
}
|
||||
|
|
|
@ -36,6 +36,7 @@ import org.apache.hadoop.hbase.client.ConnectionFactory;
|
|||
import org.apache.hadoop.hbase.client.RegionInfo;
|
||||
import org.apache.hadoop.hbase.client.RegionLocator;
|
||||
import org.apache.hadoop.hbase.client.Table;
|
||||
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
|
||||
import org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration;
|
||||
import org.apache.hadoop.hbase.testclassification.MediumTests;
|
||||
import org.apache.hadoop.hbase.util.Bytes;
|
||||
|
@ -76,13 +77,16 @@ public class TestRegionServerOnlineConfigChange {
|
|||
private final static String columnFamily1Str = "columnFamily1";
|
||||
private final static TableName TABLE1 = TableName.valueOf(table1Str);
|
||||
private final static byte[] COLUMN_FAMILY1 = Bytes.toBytes(columnFamily1Str);
|
||||
private final static long MAX_FILE_SIZE = 20 * 1024 * 1024L;
|
||||
|
||||
|
||||
@BeforeClass
|
||||
public static void setUpBeforeClass() throws Exception {
|
||||
conf = hbaseTestingUtility.getConfiguration();
|
||||
hbaseTestingUtility.startMiniCluster(2);
|
||||
t1 = hbaseTestingUtility.createTable(TABLE1, COLUMN_FAMILY1);
|
||||
t1 = hbaseTestingUtility.createTable(
|
||||
TableDescriptorBuilder.newBuilder(TABLE1).setMaxFileSize(MAX_FILE_SIZE).build(),
|
||||
new byte[][] { COLUMN_FAMILY1 }, conf);
|
||||
}
|
||||
|
||||
@AfterClass
|
||||
|
@ -259,4 +263,12 @@ public class TestRegionServerOnlineConfigChange {
|
|||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testStoreConfigurationOnlineChange() {
|
||||
rs1.getConfigurationManager().notifyAllObservers(conf);
|
||||
long actualMaxFileSize = r1.getStore(COLUMN_FAMILY1).getReadOnlyConfiguration()
|
||||
.getLong(TableDescriptorBuilder.MAX_FILESIZE, -1);
|
||||
assertEquals(MAX_FILE_SIZE, actualMaxFileSize);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue