public RaftStorage(File dir, RaftServerConstants.StartupOption option) throws IOException { storageDir = new RaftStorageDirectory(dir); if (option == RaftServerConstants.StartupOption.FORMAT) { if (storageDir.analyzeStorage(false) == StorageState.NON_EXISTENT) { throw new IOException("Cannot format " + storageDir); } storageDir.lock(); format(); state = storageDir.analyzeStorage(false); Preconditions.assertTrue(state == StorageState.NORMAL); } else { state = analyzeAndRecoverStorage(true); // metaFile is initialized here if (state != StorageState.NORMAL) { storageDir.unlock(); throw new IOException("Cannot load " + storageDir + ". Its state: " + state); } } }
public RaftStorage(File dir, RaftServerConstants.StartupOption option) throws IOException { storageDir = new RaftStorageDirectory(dir); if (option == RaftServerConstants.StartupOption.FORMAT) { if (storageDir.analyzeStorage(false) == StorageState.NON_EXISTENT) { throw new IOException("Cannot format " + storageDir); } storageDir.lock(); format(); state = storageDir.analyzeStorage(false); Preconditions.assertTrue(state == StorageState.NORMAL); } else { state = analyzeAndRecoverStorage(true); // metaFile is initialized here if (state != StorageState.NORMAL) { storageDir.unlock(); throw new IOException("Cannot load " + storageDir + ". Its state: " + state); } } }
private StorageState analyzeAndRecoverStorage(boolean toLock) throws IOException { StorageState storageState = storageDir.analyzeStorage(toLock); if (storageState == StorageState.NORMAL) { metaFile = new MetaFile(storageDir.getMetaFile()); Preconditions.assertTrue(metaFile.exists(), () -> "Meta file " + metaFile + " does not exists."); metaFile.readFile(); // Existence of raft-meta.tmp means the change of votedFor/term has not // been committed. Thus we should delete the tmp file. cleanMetaTmpFile(); return StorageState.NORMAL; } else if (storageState == StorageState.NOT_FORMATTED && storageDir.isCurrentEmpty()) { format(); return StorageState.NORMAL; } else { return storageState; } }
private StorageState analyzeAndRecoverStorage(boolean toLock) throws IOException { StorageState storageState = storageDir.analyzeStorage(toLock); if (storageState == StorageState.NORMAL) { metaFile = new MetaFile(storageDir.getMetaFile()); Preconditions.assertTrue(metaFile.exists(), () -> "Meta file " + metaFile + " does not exists."); metaFile.readFile(); // Existence of raft-meta.tmp means the change of votedFor/term has not // been committed. Thus we should delete the tmp file. cleanMetaTmpFile(); return StorageState.NORMAL; } else if (storageState == StorageState.NOT_FORMATTED && storageDir.isCurrentEmpty()) { format(); return StorageState.NORMAL; } else { return storageState; } }
FileUtils.move(metaFile, sd.getMetaTmpFile()); Assert.assertEquals(StorageState.NOT_FORMATTED, sd.analyzeStorage(false));
FileUtils.move(metaFile, sd.getMetaTmpFile()); Assert.assertEquals(StorageState.NOT_FORMATTED, sd.analyzeStorage(false));
RaftStorageDirectory sd = new RaftStorageDirectory(storageDir); try { StorageState state = sd.analyzeStorage(true); Assert.assertEquals(StorageState.NOT_FORMATTED, state); Assert.assertTrue(sd.isCurrentEmpty()); storage.close(); Assert.assertEquals(StorageState.NORMAL, sd.analyzeStorage(false)); File m = sd.getMetaFile(); Assert.assertTrue(m.exists());
RaftStorageDirectory sd = new RaftStorageDirectory(storageDir); try { StorageState state = sd.analyzeStorage(true); Assert.assertEquals(StorageState.NOT_FORMATTED, state); Assert.assertTrue(sd.isCurrentEmpty()); storage.close(); Assert.assertEquals(StorageState.NORMAL, sd.analyzeStorage(false)); File m = sd.getMetaFile(); Assert.assertTrue(m.exists());