Search in sources :

Example 1 with NodePath

use of org.elasticsearch.env.NodeEnvironment.NodePath in project elasticsearch by elastic.

the class FsProbe method stats.

public FsInfo stats(FsInfo previous, @Nullable ClusterInfo clusterInfo) throws IOException {
    if (!nodeEnv.hasNodeFile()) {
        return new FsInfo(System.currentTimeMillis(), null, new FsInfo.Path[0]);
    }
    NodePath[] dataLocations = nodeEnv.nodePaths();
    FsInfo.Path[] paths = new FsInfo.Path[dataLocations.length];
    for (int i = 0; i < dataLocations.length; i++) {
        paths[i] = getFSInfo(dataLocations[i]);
    }
    FsInfo.IoStats ioStats = null;
    if (Constants.LINUX) {
        Set<Tuple<Integer, Integer>> devicesNumbers = new HashSet<>();
        for (int i = 0; i < dataLocations.length; i++) {
            if (dataLocations[i].majorDeviceNumber != -1 && dataLocations[i].minorDeviceNumber != -1) {
                devicesNumbers.add(Tuple.tuple(dataLocations[i].majorDeviceNumber, dataLocations[i].minorDeviceNumber));
            }
        }
        ioStats = ioStats(devicesNumbers, previous);
    }
    DiskUsage leastDiskEstimate = null;
    DiskUsage mostDiskEstimate = null;
    if (clusterInfo != null) {
        leastDiskEstimate = clusterInfo.getNodeLeastAvailableDiskUsages().get(nodeEnv.nodeId());
        mostDiskEstimate = clusterInfo.getNodeMostAvailableDiskUsages().get(nodeEnv.nodeId());
    }
    return new FsInfo(System.currentTimeMillis(), ioStats, paths, leastDiskEstimate, mostDiskEstimate);
}
Also used : NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) DiskUsage(org.elasticsearch.cluster.DiskUsage) NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) Tuple(org.elasticsearch.common.collect.Tuple) HashSet(java.util.HashSet)

Example 2 with NodePath

use of org.elasticsearch.env.NodeEnvironment.NodePath in project elasticsearch by elastic.

the class FsProbeTests method testAdjustForHugeFilesystems.

public void testAdjustForHugeFilesystems() throws Exception {
    NodePath np = new FakeNodePath(createTempDir());
    assertThat(FsProbe.getFSInfo(np).total, greaterThanOrEqualTo(0L));
}
Also used : NodePath(org.elasticsearch.env.NodeEnvironment.NodePath)

Example 3 with NodePath

use of org.elasticsearch.env.NodeEnvironment.NodePath in project elasticsearch by elastic.

the class NewPathForShardTests method testSelectNewPathForShard.

public void testSelectNewPathForShard() throws Exception {
    Path path = PathUtils.get(createTempDir().toString());
    // Use 2 data paths:
    String[] paths = new String[] { path.resolve("a").toString(), path.resolve("b").toString() };
    Settings settings = Settings.builder().put(Environment.PATH_HOME_SETTING.getKey(), path).putArray(Environment.PATH_DATA_SETTING.getKey(), paths).build();
    NodeEnvironment nodeEnv = new NodeEnvironment(settings, new Environment(settings));
    // Make sure all our mocking above actually worked:
    NodePath[] nodePaths = nodeEnv.nodePaths();
    assertEquals(2, nodePaths.length);
    assertEquals("mocka", nodePaths[0].fileStore.name());
    assertEquals("mockb", nodePaths[1].fileStore.name());
    // Path a has lots of free space, but b has little, so new shard should go to a:
    aFileStore.usableSpace = 100000;
    bFileStore.usableSpace = 1000;
    ShardId shardId = new ShardId("index", "_na_", 0);
    ShardPath result = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, Collections.<Path, Integer>emptyMap());
    assertTrue(result.getDataPath().toString().contains(aPathPart));
    // Test the reverse: b has lots of free space, but a has little, so new shard should go to b:
    aFileStore.usableSpace = 1000;
    bFileStore.usableSpace = 100000;
    shardId = new ShardId("index", "_na_", 0);
    result = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, Collections.<Path, Integer>emptyMap());
    assertTrue(result.getDataPath().toString().contains(bPathPart));
    // Now a and be have equal usable space; we allocate two shards to the node, and each should go to different paths:
    aFileStore.usableSpace = 100000;
    bFileStore.usableSpace = 100000;
    Map<Path, Integer> dataPathToShardCount = new HashMap<>();
    ShardPath result1 = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, dataPathToShardCount);
    dataPathToShardCount.put(NodeEnvironment.shardStatePathToDataPath(result1.getDataPath()), 1);
    ShardPath result2 = ShardPath.selectNewPathForShard(nodeEnv, shardId, INDEX_SETTINGS, 100, dataPathToShardCount);
    // #11122: this was the original failure: on a node with 2 disks that have nearly equal
    // free space, we would always allocate all N incoming shards to the one path that
    // had the most free space, never using the other drive unless new shards arrive
    // after the first shards started using storage:
    assertNotEquals(result1.getDataPath(), result2.getDataPath());
    nodeEnv.close();
}
Also used : Path(java.nio.file.Path) NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) HashMap(java.util.HashMap) NodePath(org.elasticsearch.env.NodeEnvironment.NodePath) Environment(org.elasticsearch.env.Environment) NodeEnvironment(org.elasticsearch.env.NodeEnvironment) Settings(org.elasticsearch.common.settings.Settings) IndexSettings(org.elasticsearch.index.IndexSettings)

Aggregations

NodePath (org.elasticsearch.env.NodeEnvironment.NodePath)3 Path (java.nio.file.Path)1 HashMap (java.util.HashMap)1 HashSet (java.util.HashSet)1 DiskUsage (org.elasticsearch.cluster.DiskUsage)1 Tuple (org.elasticsearch.common.collect.Tuple)1 Settings (org.elasticsearch.common.settings.Settings)1 Environment (org.elasticsearch.env.Environment)1 NodeEnvironment (org.elasticsearch.env.NodeEnvironment)1 IndexSettings (org.elasticsearch.index.IndexSettings)1