Merge branch 'pr/11313'

This commit is contained in:
Lee Hinman 2015-06-01 15:44:38 -06:00
commit bc179a735b
4 changed files with 43 additions and 20 deletions

View File

@ -59,6 +59,10 @@ public class DiskUsage {
return 100.0 * ((double)freeBytes / totalBytes); return 100.0 * ((double)freeBytes / totalBytes);
} }
public double getUsedDiskAsPercentage() {
return 100.0 - getFreeDiskAsPercentage();
}
public long getFreeBytes() { public long getFreeBytes() {
return freeBytes; return freeBytes;
} }

View File

@ -142,20 +142,20 @@ public class DiskThresholdDecider extends AllocationDecider {
private void warnAboutDiskIfNeeded(DiskUsage usage) { private void warnAboutDiskIfNeeded(DiskUsage usage) {
// Check absolute disk values // Check absolute disk values
if (usage.getFreeBytes() < DiskThresholdDecider.this.freeBytesThresholdHigh.bytes()) { if (usage.getFreeBytes() < DiskThresholdDecider.this.freeBytesThresholdHigh.bytes()) {
logger.warn("high disk watermark [{} free] exceeded on {}, shards will be relocated away from this node", logger.warn("high disk watermark [{}] exceeded on {}, shards will be relocated away from this node",
DiskThresholdDecider.this.freeBytesThresholdHigh, usage); DiskThresholdDecider.this.freeBytesThresholdHigh, usage);
} else if (usage.getFreeBytes() < DiskThresholdDecider.this.freeBytesThresholdLow.bytes()) { } else if (usage.getFreeBytes() < DiskThresholdDecider.this.freeBytesThresholdLow.bytes()) {
logger.info("low disk watermark [{} free] exceeded on {}, replicas will not be assigned to this node", logger.info("low disk watermark [{}] exceeded on {}, replicas will not be assigned to this node",
DiskThresholdDecider.this.freeBytesThresholdLow, usage); DiskThresholdDecider.this.freeBytesThresholdLow, usage);
} }
// Check percentage disk values // Check percentage disk values
if (usage.getFreeDiskAsPercentage() < DiskThresholdDecider.this.freeDiskThresholdHigh) { if (usage.getFreeDiskAsPercentage() < DiskThresholdDecider.this.freeDiskThresholdHigh) {
logger.warn("high disk watermark [{} free] exceeded on {}, shards will be relocated away from this node", logger.warn("high disk watermark [{}] exceeded on {}, shards will be relocated away from this node",
Strings.format1Decimals(DiskThresholdDecider.this.freeDiskThresholdHigh, "%"), usage); Strings.format1Decimals(100.0 - DiskThresholdDecider.this.freeDiskThresholdHigh, "%"), usage);
} else if (usage.getFreeDiskAsPercentage() < DiskThresholdDecider.this.freeDiskThresholdLow) { } else if (usage.getFreeDiskAsPercentage() < DiskThresholdDecider.this.freeDiskThresholdLow) {
logger.info("low disk watermark [{} free] exceeded on {}, replicas will not be assigned to this node", logger.info("low disk watermark [{}] exceeded on {}, replicas will not be assigned to this node",
Strings.format1Decimals(DiskThresholdDecider.this.freeDiskThresholdLow, "%"), usage); Strings.format1Decimals(100.0 - DiskThresholdDecider.this.freeDiskThresholdLow, "%"), usage);
} }
} }
@ -234,6 +234,16 @@ public class DiskThresholdDecider extends AllocationDecider {
return freeDiskThresholdHigh; return freeDiskThresholdHigh;
} }
// For Testing
public Double getUsedDiskThresholdLow() {
return 100.0 - freeDiskThresholdLow;
}
// For Testing
public Double getUsedDiskThresholdHigh() {
return 100.0 - freeDiskThresholdHigh;
}
// For Testing // For Testing
public ByteSizeValue getFreeBytesThresholdLow() { public ByteSizeValue getFreeBytesThresholdLow() {
return freeBytesThresholdLow; return freeBytesThresholdLow;
@ -285,6 +295,8 @@ public class DiskThresholdDecider extends AllocationDecider {
@Override @Override
public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) { public Decision canAllocate(ShardRouting shardRouting, RoutingNode node, RoutingAllocation allocation) {
double usedDiskThresholdLow = 100.0 - DiskThresholdDecider.this.freeDiskThresholdLow;
double usedDiskThresholdHigh = 100.0 - DiskThresholdDecider.this.freeDiskThresholdHigh;
// Always allow allocation if the decider is disabled // Always allow allocation if the decider is disabled
if (!enabled) { if (!enabled) {
@ -342,9 +354,11 @@ public class DiskThresholdDecider extends AllocationDecider {
// First, check that the node currently over the low watermark // First, check that the node currently over the low watermark
double freeDiskPercentage = usage.getFreeDiskAsPercentage(); double freeDiskPercentage = usage.getFreeDiskAsPercentage();
// Cache the used disk percentage for displaying disk percentages consistent with documentation
double usedDiskPercentage = usage.getUsedDiskAsPercentage();
long freeBytes = usage.getFreeBytes(); long freeBytes = usage.getFreeBytes();
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Node [{}] has {}% free disk", node.nodeId(), freeDiskPercentage); logger.trace("Node [{}] has {}% used disk", node.nodeId(), usedDiskPercentage);
} }
// a flag for whether the primary shard has been previously allocated // a flag for whether the primary shard has been previously allocated
@ -387,20 +401,20 @@ public class DiskThresholdDecider extends AllocationDecider {
// If the shard is a replica or has a primary that has already been allocated before, check the low threshold // If the shard is a replica or has a primary that has already been allocated before, check the low threshold
if (!shardRouting.primary() || (shardRouting.primary() && primaryHasBeenAllocated)) { if (!shardRouting.primary() || (shardRouting.primary() && primaryHasBeenAllocated)) {
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Less than the required {} free disk threshold ({} free) on node [{}], preventing allocation", logger.debug("More than the allowed {} used disk threshold ({} used) on node [{}], preventing allocation",
Strings.format1Decimals(freeDiskThresholdLow, "%"), Strings.format1Decimals(usedDiskThresholdLow, "%"),
Strings.format1Decimals(freeDiskPercentage, "%"), node.nodeId()); Strings.format1Decimals(usedDiskPercentage, "%"), node.nodeId());
} }
return allocation.decision(Decision.NO, NAME, "less than required [%s%%] free disk on node, free: [%s%%]", return allocation.decision(Decision.NO, NAME, "more than allowed [%s%%] used disk on node, free: [%s%%]",
freeDiskThresholdLow, freeDiskPercentage); usedDiskThresholdLow, freeDiskPercentage);
} else if (freeDiskPercentage > freeDiskThresholdHigh) { } else if (freeDiskPercentage > freeDiskThresholdHigh) {
// Allow the shard to be allocated because it is primary that // Allow the shard to be allocated because it is primary that
// has never been allocated if it's under the high watermark // has never been allocated if it's under the high watermark
if (logger.isDebugEnabled()) { if (logger.isDebugEnabled()) {
logger.debug("Less than the required {} free disk threshold ({} free) on node [{}], " + logger.debug("More than the allowed {} used disk threshold ({} used) on node [{}], " +
"but allowing allocation because primary has never been allocated", "but allowing allocation because primary has never been allocated",
Strings.format1Decimals(freeDiskThresholdLow, "%"), Strings.format1Decimals(usedDiskThresholdLow, "%"),
Strings.format1Decimals(freeDiskPercentage, "%"), node.nodeId()); Strings.format1Decimals(usedDiskPercentage, "%"), node.nodeId());
} }
return allocation.decision(Decision.YES, NAME, "primary has never been allocated before"); return allocation.decision(Decision.YES, NAME, "primary has never been allocated before");
} else { } else {
@ -412,8 +426,8 @@ public class DiskThresholdDecider extends AllocationDecider {
Strings.format1Decimals(freeDiskThresholdHigh, "%"), Strings.format1Decimals(freeDiskThresholdHigh, "%"),
Strings.format1Decimals(freeDiskPercentage, "%"), node.nodeId()); Strings.format1Decimals(freeDiskPercentage, "%"), node.nodeId());
} }
return allocation.decision(Decision.NO, NAME, "less than required [%s%%] free disk on node, free: [%s%%]", return allocation.decision(Decision.NO, NAME, "more than allowed [%s%%] used disk on node, free: [%s%%]",
freeDiskThresholdLow, freeDiskPercentage); usedDiskThresholdHigh, freeDiskPercentage);
} }
} }
@ -429,10 +443,10 @@ public class DiskThresholdDecider extends AllocationDecider {
freeBytesThresholdLow, new ByteSizeValue(freeBytesAfterShard)); freeBytesThresholdLow, new ByteSizeValue(freeBytesAfterShard));
} }
if (freeSpaceAfterShard < freeDiskThresholdHigh) { if (freeSpaceAfterShard < freeDiskThresholdHigh) {
logger.warn("After allocating, node [{}] would have less than the required {} free disk threshold ({} free), preventing allocation", logger.warn("After allocating, node [{}] would have more than the allowed {} free disk threshold ({} free), preventing allocation",
node.nodeId(), Strings.format1Decimals(freeDiskThresholdHigh, "%"), Strings.format1Decimals(freeSpaceAfterShard, "%")); node.nodeId(), Strings.format1Decimals(freeDiskThresholdHigh, "%"), Strings.format1Decimals(freeSpaceAfterShard, "%"));
return allocation.decision(Decision.NO, NAME, "after allocation less than required [%s%%] free disk on node, free: [%s%%]", return allocation.decision(Decision.NO, NAME, "after allocation more than allowed [%s%%] used disk on node, free: [%s%%]",
freeDiskThresholdLow, freeSpaceAfterShard); usedDiskThresholdLow, freeSpaceAfterShard);
} }
return allocation.decision(Decision.YES, NAME, "enough disk for shard on node, free: [%s]", new ByteSizeValue(freeBytes)); return allocation.decision(Decision.YES, NAME, "enough disk for shard on node, free: [%s]", new ByteSizeValue(freeBytes));

View File

@ -30,6 +30,7 @@ public class DiskUsageTests extends ElasticsearchTestCase {
public void diskUsageCalcTest() { public void diskUsageCalcTest() {
DiskUsage du = new DiskUsage("node1", "n1", 100, 40); DiskUsage du = new DiskUsage("node1", "n1", 100, 40);
assertThat(du.getFreeDiskAsPercentage(), equalTo(40.0)); assertThat(du.getFreeDiskAsPercentage(), equalTo(40.0));
assertThat(du.getUsedDiskAsPercentage(), equalTo(100.0 - 40.0));
assertThat(du.getFreeBytes(), equalTo(40L)); assertThat(du.getFreeBytes(), equalTo(40L));
assertThat(du.getUsedBytes(), equalTo(60L)); assertThat(du.getUsedBytes(), equalTo(60L));
assertThat(du.getTotalBytes(), equalTo(100L)); assertThat(du.getTotalBytes(), equalTo(100L));
@ -67,11 +68,13 @@ public class DiskUsageTests extends ElasticsearchTestCase {
assertThat(du.getTotalBytes(), equalTo(0L)); assertThat(du.getTotalBytes(), equalTo(0L));
assertThat(du.getUsedBytes(), equalTo(-free)); assertThat(du.getUsedBytes(), equalTo(-free));
assertThat(du.getFreeDiskAsPercentage(), equalTo(100.0)); assertThat(du.getFreeDiskAsPercentage(), equalTo(100.0));
assertThat(du.getUsedDiskAsPercentage(), equalTo(0.0));
} else { } else {
assertThat(du.getFreeBytes(), equalTo(free)); assertThat(du.getFreeBytes(), equalTo(free));
assertThat(du.getTotalBytes(), equalTo(total)); assertThat(du.getTotalBytes(), equalTo(total));
assertThat(du.getUsedBytes(), equalTo(total - free)); assertThat(du.getUsedBytes(), equalTo(total - free));
assertThat(du.getFreeDiskAsPercentage(), equalTo(100.0 * ((double) free / total))); assertThat(du.getFreeDiskAsPercentage(), equalTo(100.0 * ((double) free / total)));
assertThat(du.getUsedDiskAsPercentage(), equalTo(100.0 - (100.0 * ((double) free / total))));
} }
} }
} }

View File

@ -20,6 +20,7 @@
package org.elasticsearch.cluster.routing.allocation.decider; package org.elasticsearch.cluster.routing.allocation.decider;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import org.elasticsearch.cluster.ClusterInfo; import org.elasticsearch.cluster.ClusterInfo;
import org.elasticsearch.cluster.ClusterInfoService; import org.elasticsearch.cluster.ClusterInfoService;
import org.elasticsearch.cluster.DiskUsage; import org.elasticsearch.cluster.DiskUsage;
@ -62,6 +63,7 @@ public class DiskThresholdDeciderUnitTests extends ElasticsearchTestCase {
assertThat(decider.getFreeDiskThresholdHigh(), equalTo(10.0d)); assertThat(decider.getFreeDiskThresholdHigh(), equalTo(10.0d));
assertThat(decider.getFreeBytesThresholdLow(), equalTo(ByteSizeValue.parseBytesSizeValue("0b"))); assertThat(decider.getFreeBytesThresholdLow(), equalTo(ByteSizeValue.parseBytesSizeValue("0b")));
assertThat(decider.getFreeDiskThresholdLow(), equalTo(15.0d)); assertThat(decider.getFreeDiskThresholdLow(), equalTo(15.0d));
assertThat(decider.getUsedDiskThresholdLow(), equalTo(85.0d));
assertThat(decider.getRerouteInterval().seconds(), equalTo(60L)); assertThat(decider.getRerouteInterval().seconds(), equalTo(60L));
assertTrue(decider.isEnabled()); assertTrue(decider.isEnabled());
assertTrue(decider.isIncludeRelocations()); assertTrue(decider.isIncludeRelocations());