HDFS-8681. BlockScanner is incorrectly disabled by default. (Contributed by Arpit Agarwal)
This commit is contained in:
parent
f02c06965c
commit
0fd47fa809
|
@ -783,6 +783,9 @@ Release 2.7.1 - UNRELEASED
|
||||||
HDFS08656. Preserve compatibility of ClientProtocol#rollingUpgrade after
|
HDFS08656. Preserve compatibility of ClientProtocol#rollingUpgrade after
|
||||||
finalization. (wang)
|
finalization. (wang)
|
||||||
|
|
||||||
|
HDFS-8681. BlockScanner is incorrectly disabled by default.
|
||||||
|
(Arpit Agarwal)
|
||||||
|
|
||||||
Release 2.7.0 - 2015-04-20
|
Release 2.7.0 - 2015-04-20
|
||||||
|
|
||||||
INCOMPATIBLE CHANGES
|
INCOMPATIBLE CHANGES
|
||||||
|
|
|
@ -374,7 +374,7 @@ public class DFSConfigKeys extends CommonConfigurationKeys {
|
||||||
public static final String DFS_DATANODE_MAX_RECEIVER_THREADS_KEY = "dfs.datanode.max.transfer.threads";
|
public static final String DFS_DATANODE_MAX_RECEIVER_THREADS_KEY = "dfs.datanode.max.transfer.threads";
|
||||||
public static final int DFS_DATANODE_MAX_RECEIVER_THREADS_DEFAULT = 4096;
|
public static final int DFS_DATANODE_MAX_RECEIVER_THREADS_DEFAULT = 4096;
|
||||||
public static final String DFS_DATANODE_SCAN_PERIOD_HOURS_KEY = "dfs.datanode.scan.period.hours";
|
public static final String DFS_DATANODE_SCAN_PERIOD_HOURS_KEY = "dfs.datanode.scan.period.hours";
|
||||||
public static final int DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT = 0;
|
public static final int DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT = 21 * 24; // 3 weeks.
|
||||||
public static final String DFS_BLOCK_SCANNER_VOLUME_BYTES_PER_SECOND = "dfs.block.scanner.volume.bytes.per.second";
|
public static final String DFS_BLOCK_SCANNER_VOLUME_BYTES_PER_SECOND = "dfs.block.scanner.volume.bytes.per.second";
|
||||||
public static final long DFS_BLOCK_SCANNER_VOLUME_BYTES_PER_SECOND_DEFAULT = 1048576L;
|
public static final long DFS_BLOCK_SCANNER_VOLUME_BYTES_PER_SECOND_DEFAULT = 1048576L;
|
||||||
public static final String DFS_DATANODE_TRANSFERTO_ALLOWED_KEY = "dfs.datanode.transferTo.allowed";
|
public static final String DFS_DATANODE_TRANSFERTO_ALLOWED_KEY = "dfs.datanode.transferTo.allowed";
|
||||||
|
|
|
@ -115,6 +115,34 @@ public class BlockScanner {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine the configured block scanner interval.
|
||||||
|
*
|
||||||
|
* For compatibility with prior releases of HDFS, if the
|
||||||
|
* configured value is zero then the scan period is
|
||||||
|
* set to 3 weeks.
|
||||||
|
*
|
||||||
|
* If the configured value is less than zero then the scanner
|
||||||
|
* is disabled.
|
||||||
|
*
|
||||||
|
* @param conf Configuration object.
|
||||||
|
* @return block scan period in milliseconds.
|
||||||
|
*/
|
||||||
|
private static long getConfiguredScanPeriodMs(Configuration conf) {
|
||||||
|
long tempScanPeriodMs = getUnitTestLong(
|
||||||
|
conf, INTERNAL_DFS_DATANODE_SCAN_PERIOD_MS,
|
||||||
|
TimeUnit.MILLISECONDS.convert(conf.getLong(
|
||||||
|
DFS_DATANODE_SCAN_PERIOD_HOURS_KEY,
|
||||||
|
DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT), TimeUnit.HOURS));
|
||||||
|
|
||||||
|
if (tempScanPeriodMs == 0) {
|
||||||
|
tempScanPeriodMs = TimeUnit.MILLISECONDS.convert(
|
||||||
|
DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT, TimeUnit.HOURS);
|
||||||
|
}
|
||||||
|
|
||||||
|
return tempScanPeriodMs;
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Conf(Configuration conf) {
|
Conf(Configuration conf) {
|
||||||
this.targetBytesPerSec = Math.max(0L, conf.getLong(
|
this.targetBytesPerSec = Math.max(0L, conf.getLong(
|
||||||
|
@ -123,11 +151,7 @@ public class BlockScanner {
|
||||||
this.maxStalenessMs = Math.max(0L, getUnitTestLong(conf,
|
this.maxStalenessMs = Math.max(0L, getUnitTestLong(conf,
|
||||||
INTERNAL_DFS_BLOCK_SCANNER_MAX_STALENESS_MS,
|
INTERNAL_DFS_BLOCK_SCANNER_MAX_STALENESS_MS,
|
||||||
INTERNAL_DFS_BLOCK_SCANNER_MAX_STALENESS_MS_DEFAULT));
|
INTERNAL_DFS_BLOCK_SCANNER_MAX_STALENESS_MS_DEFAULT));
|
||||||
this.scanPeriodMs = Math.max(0L,
|
this.scanPeriodMs = getConfiguredScanPeriodMs(conf);
|
||||||
getUnitTestLong(conf, INTERNAL_DFS_DATANODE_SCAN_PERIOD_MS,
|
|
||||||
TimeUnit.MILLISECONDS.convert(conf.getLong(
|
|
||||||
DFS_DATANODE_SCAN_PERIOD_HOURS_KEY,
|
|
||||||
DFS_DATANODE_SCAN_PERIOD_HOURS_DEFAULT), TimeUnit.HOURS)));
|
|
||||||
this.cursorSaveMs = Math.max(0L, getUnitTestLong(conf,
|
this.cursorSaveMs = Math.max(0L, getUnitTestLong(conf,
|
||||||
INTERNAL_DFS_BLOCK_SCANNER_CURSOR_SAVE_INTERVAL_MS,
|
INTERNAL_DFS_BLOCK_SCANNER_CURSOR_SAVE_INTERVAL_MS,
|
||||||
INTERNAL_DFS_BLOCK_SCANNER_CURSOR_SAVE_INTERVAL_MS_DEFAULT));
|
INTERNAL_DFS_BLOCK_SCANNER_CURSOR_SAVE_INTERVAL_MS_DEFAULT));
|
||||||
|
@ -159,7 +183,7 @@ public class BlockScanner {
|
||||||
* no threads will start.
|
* no threads will start.
|
||||||
*/
|
*/
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return (conf.scanPeriodMs) > 0 && (conf.targetBytesPerSec > 0);
|
return (conf.scanPeriodMs > 0) && (conf.targetBytesPerSec > 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1059,11 +1059,14 @@
|
||||||
|
|
||||||
<property>
|
<property>
|
||||||
<name>dfs.datanode.scan.period.hours</name>
|
<name>dfs.datanode.scan.period.hours</name>
|
||||||
<value>0</value>
|
<value>504</value>
|
||||||
<description>
|
<description>
|
||||||
If this is 0 or negative, the DataNode's block scanner will be
|
If this is positive, the DataNode will not scan any
|
||||||
disabled. If this is positive, the DataNode will not scan any
|
|
||||||
individual block more than once in the specified scan period.
|
individual block more than once in the specified scan period.
|
||||||
|
If this is negative, the block scanner is disabled.
|
||||||
|
If this is set to zero, then the default value of 504 hours
|
||||||
|
or 3 weeks is used. Prior versions of HDFS incorrectly documented
|
||||||
|
that setting this key to zero will disable the block scanner.
|
||||||
</description>
|
</description>
|
||||||
</property>
|
</property>
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,7 @@ public class TestFsDatasetImpl {
|
||||||
public void testChangeVolumeWithRunningCheckDirs() throws IOException {
|
public void testChangeVolumeWithRunningCheckDirs() throws IOException {
|
||||||
RoundRobinVolumeChoosingPolicy<FsVolumeImpl> blockChooser =
|
RoundRobinVolumeChoosingPolicy<FsVolumeImpl> blockChooser =
|
||||||
new RoundRobinVolumeChoosingPolicy<>();
|
new RoundRobinVolumeChoosingPolicy<>();
|
||||||
|
conf.setLong(DFSConfigKeys.DFS_DATANODE_SCAN_PERIOD_HOURS_KEY, -1);
|
||||||
final BlockScanner blockScanner = new BlockScanner(datanode, conf);
|
final BlockScanner blockScanner = new BlockScanner(datanode, conf);
|
||||||
final FsVolumeList volumeList = new FsVolumeList(
|
final FsVolumeList volumeList = new FsVolumeList(
|
||||||
Collections.<VolumeFailureInfo>emptyList(), blockScanner, blockChooser);
|
Collections.<VolumeFailureInfo>emptyList(), blockScanner, blockChooser);
|
||||||
|
|
Loading…
Reference in New Issue