/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.cli; import alluxio.Configuration; import alluxio.PropertyKey; import alluxio.RuntimeConstants; import alluxio.ServiceUtils; import alluxio.master.journal.Journal; import alluxio.util.io.FileUtils; import alluxio.util.io.PathUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import javax.annotation.concurrent.ThreadSafe; /** * Formats the Alluxio file system. */ @ThreadSafe public final class Format { private static final Logger LOG = LoggerFactory.getLogger(Format.class); private static final String USAGE = String.format("java -cp %s %s <MASTER/WORKER>", RuntimeConstants.ALLUXIO_JAR, Format.class.getCanonicalName()); /** * The format mode. */ public enum Mode { MASTER, WORKER, } private static void formatFolder(String name, String folder) throws IOException { LOG.info("Formatting {}:{}", name, folder); Path path = Paths.get(folder); if (Files.isDirectory(path)) { FileUtils.deletePathRecursively(folder); } Files.createDirectory(path); } /** * Formats the Alluxio file system. * * @param args either {@code MASTER} or {@code WORKER} */ public static void main(String[] args) { if (args.length != 1) { LOG.info(USAGE); System.exit(-1); } Mode mode = null; try { mode = Mode.valueOf(args[0].toUpperCase()); } catch (IllegalArgumentException e) { LOG.error("Unrecognized format mode: {}", args[0]); LOG.error("Usage: {}", USAGE); System.exit(-1); } try { format(mode); } catch (Exception e) { LOG.error("Failed to format", e); System.exit(-1); } LOG.info("Formatting complete"); System.exit(0); } /** * Formats the Alluxio file system. * * @param mode either {@code MASTER} or {@code WORKER} */ public static void format(Mode mode) throws IOException { switch (mode) { case MASTER: String masterJournal = Configuration.get(PropertyKey.MASTER_JOURNAL_FOLDER); LOG.info("MASTER JOURNAL: {}", masterJournal); Journal.Factory factory; try { factory = new Journal.Factory(new URI(masterJournal)); } catch (URISyntaxException e) { throw new IOException(e.getMessage()); } for (String masterServiceName : ServiceUtils.getMasterServiceNames()) { factory.create(masterServiceName).format(); } break; case WORKER: String workerDataFolder = Configuration.get(PropertyKey.WORKER_DATA_FOLDER); int storageLevels = Configuration.getInt(PropertyKey.WORKER_TIERED_STORE_LEVELS); for (int level = 0; level < storageLevels; level++) { PropertyKey tierLevelDirPath = PropertyKey.Template.WORKER_TIERED_STORE_LEVEL_DIRS_PATH.format(level); String[] dirPaths = Configuration.get(tierLevelDirPath).split(","); String name = "TIER_" + level + "_DIR_PATH"; for (String dirPath : dirPaths) { String dirWorkerDataFolder = PathUtils.concatPath(dirPath.trim(), workerDataFolder); if (Files.isDirectory(Paths.get(dirWorkerDataFolder))) { try { formatFolder(name, dirWorkerDataFolder); } catch (IOException e) { throw new RuntimeException(String .format("Failed to format worker data folder %s due to %s", dirWorkerDataFolder, e.getMessage())); } } } } break; default: throw new RuntimeException(String.format("Unrecognized format mode: %s", mode)); } } private Format() {} // prevent instantiation }