/* * Licensed to ElasticSearch and Shay Banon under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. ElasticSearch licenses this * file to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.elasticsearch.index.store.fs; import org.elasticsearch.ElasticSearchIllegalStateException; import org.elasticsearch.common.io.FileSystemUtils; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.common.unit.ByteSizeValue; import org.elasticsearch.env.NodeEnvironment; import org.elasticsearch.index.Index; import org.elasticsearch.index.service.IndexService; import org.elasticsearch.index.settings.IndexSettings; import org.elasticsearch.index.shard.ShardId; import org.elasticsearch.index.store.support.AbstractIndexStore; import org.elasticsearch.indices.store.IndicesStore; import java.io.File; import java.io.IOException; /** * */ public abstract class FsIndexStore extends AbstractIndexStore { private final NodeEnvironment nodeEnv; private final File[] locations; public FsIndexStore(Index index, @IndexSettings Settings indexSettings, IndexService indexService, IndicesStore indicesStore, NodeEnvironment nodeEnv) { super(index, indexSettings, indexService, indicesStore); this.nodeEnv = nodeEnv; if (nodeEnv.hasNodeFile()) { this.locations = nodeEnv.indexLocations(index); } else { this.locations = null; } } @Override public boolean persistent() { return true; } @Override public ByteSizeValue backingStoreTotalSpace() { if (locations == null) { return new ByteSizeValue(0); } long totalSpace = 0; for (File location : locations) { totalSpace += location.getTotalSpace(); } return new ByteSizeValue(totalSpace); } @Override public ByteSizeValue backingStoreFreeSpace() { if (locations == null) { return new ByteSizeValue(0); } long usableSpace = 0; for (File location : locations) { usableSpace += location.getUsableSpace(); } return new ByteSizeValue(usableSpace); } @Override public boolean canDeleteUnallocated(ShardId shardId) { if (locations == null) { return false; } if (indexService.hasShard(shardId.id())) { return false; } for (File location : shardLocations(shardId)) { if (location.exists()) { return true; } } return false; } @Override public void deleteUnallocated(ShardId shardId) throws IOException { if (locations == null) { return; } if (indexService.hasShard(shardId.id())) { throw new ElasticSearchIllegalStateException(shardId + " allocated, can't be deleted"); } FileSystemUtils.deleteRecursively(shardLocations(shardId)); } public File[] shardLocations(ShardId shardId) { return nodeEnv.shardLocations(shardId); } public File[] shardIndexLocations(ShardId shardId) { File[] shardLocations = shardLocations(shardId); File[] shardIndexLocations = new File[shardLocations.length]; for (int i = 0; i < shardLocations.length; i++) { shardIndexLocations[i] = new File(shardLocations[i], "index"); } return shardIndexLocations; } // not used currently, but here to state that this store also defined a file based translog location public File[] shardTranslogLocations(ShardId shardId) { File[] shardLocations = shardLocations(shardId); File[] shardTranslogLocations = new File[shardLocations.length]; for (int i = 0; i < shardLocations.length; i++) { shardTranslogLocations[i] = new File(shardLocations[i], "translog"); } return shardTranslogLocations; } }