You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ratis.apache.org by ji...@apache.org on 2017/01/31 21:17:32 UTC
[47/54] [abbrv] incubator-ratis git commit: Renamed the packages from
raft to ratis in preperation for Apache Incubation - Moved all java packages
from org.apache.raft to org.apache.ratis. - Moved native package to
org_apache_ratis, and native lib to l
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIO.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIO.java b/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIO.java
deleted file mode 100644
index 8416941..0000000
--- a/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIO.java
+++ /dev/null
@@ -1,804 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.io.nativeio;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.apache.raft.protocol.AlreadyExistsException;
-import org.apache.raft.util.NativeCodeLoader;
-import org.apache.raft.util.RaftUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import sun.misc.Unsafe;
-
-import java.io.File;
-import java.io.FileDescriptor;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.lang.reflect.Field;
-import java.nio.ByteBuffer;
-import java.nio.MappedByteBuffer;
-import java.nio.channels.FileChannel;
-
-/**
- * JNI wrappers for various native IO-related calls not available in Java.
- * These functions should generally be used alongside a fallback to another
- * more portable mechanism.
- */
-public class NativeIO {
- private static final Logger LOG = LoggerFactory.getLogger(NativeIO.class);
-
- public static class POSIX {
- // Flags for open() call from bits/fcntl.h - Set by JNI
- public static int O_RDONLY = -1;
- public static int O_WRONLY = -1;
- public static int O_RDWR = -1;
- public static int O_CREAT = -1;
- public static int O_EXCL = -1;
- public static int O_NOCTTY = -1;
- public static int O_TRUNC = -1;
- public static int O_APPEND = -1;
- public static int O_NONBLOCK = -1;
- public static int O_SYNC = -1;
-
- // Flags for posix_fadvise() from bits/fcntl.h - Set by JNI
- /* No further special treatment. */
- public static int POSIX_FADV_NORMAL = -1;
- /* Expect random page references. */
- public static int POSIX_FADV_RANDOM = -1;
- /* Expect sequential page references. */
- public static int POSIX_FADV_SEQUENTIAL = -1;
- /* Will need these pages. */
- public static int POSIX_FADV_WILLNEED = -1;
- /* Don't need these pages. */
- public static int POSIX_FADV_DONTNEED = -1;
- /* Data will be accessed once. */
- public static int POSIX_FADV_NOREUSE = -1;
-
-
- // Updated by JNI when supported by glibc. Leave defaults in case kernel
- // supports sync_file_range, but glibc does not.
- /* Wait upon writeout of all pages
- in the range before performing the
- write. */
- public static int SYNC_FILE_RANGE_WAIT_BEFORE = 1;
- /* Initiate writeout of all those
- dirty pages in the range which are
- not presently under writeback. */
- public static int SYNC_FILE_RANGE_WRITE = 2;
- /* Wait upon writeout of all pages in
- the range after performing the
- write. */
- public static int SYNC_FILE_RANGE_WAIT_AFTER = 4;
-
- // Set to true via JNI if possible
- public static boolean fadvisePossible = false;
-
- private static boolean nativeLoaded = false;
- private static boolean syncFileRangePossible = true;
-
- private static long cacheTimeout = -1;
-
- private static CacheManipulator cacheManipulator = new CacheManipulator();
-
- public static CacheManipulator getCacheManipulator() {
- return cacheManipulator;
- }
-
- public static void setCacheManipulator(CacheManipulator cacheManipulator) {
- POSIX.cacheManipulator = cacheManipulator;
- }
-
- /**
- * Used to manipulate the operating system cache.
- */
- @VisibleForTesting
- public static class CacheManipulator {
- public void mlock(String identifier, ByteBuffer buffer,
- long len) throws IOException {
- POSIX.mlock(buffer, len);
- }
-
- public long getMemlockLimit() {
- return NativeIO.getMemlockLimit();
- }
-
- public long getOperatingSystemPageSize() {
- return NativeIO.getOperatingSystemPageSize();
- }
-
- public void posixFadviseIfPossible(String identifier,
- FileDescriptor fd, long offset, long len, int flags)
- throws NativeIOException {
- NativeIO.POSIX.posixFadviseIfPossible(identifier, fd, offset,
- len, flags);
- }
-
- public boolean verifyCanMlock() {
- return NativeIO.isAvailable();
- }
- }
-
- /**
- * A CacheManipulator used for testing which does not actually call mlock.
- * This allows many tests to be run even when the operating system does not
- * allow mlock, or only allows limited mlocking.
- */
- @VisibleForTesting
- public static class NoMlockCacheManipulator extends CacheManipulator {
- public void mlock(String identifier, ByteBuffer buffer,
- long len) throws IOException {
- LOG.info("mlocking " + identifier);
- }
-
- public long getMemlockLimit() {
- return 1125899906842624L;
- }
-
- public long getOperatingSystemPageSize() {
- return 4096;
- }
-
- public boolean verifyCanMlock() {
- return true;
- }
- }
-
- static {
- initNativeLib();
- }
-
- /**
- * Return true if the JNI-based native IO extensions are available.
- */
- public static boolean isAvailable() {
- return NativeCodeLoader.isNativeCodeLoaded() && nativeLoaded;
- }
-
- private static void assertCodeLoaded() throws IOException {
- if (!isAvailable()) {
- throw new IOException("NativeIO was not loaded");
- }
- }
-
- /** Wrapper around open(2) */
- public static native FileDescriptor open(String path, int flags, int mode) throws IOException;
- /** Wrapper around fstat(2) */
- private static native Stat fstat(FileDescriptor fd) throws IOException;
-
- /** Native chmod implementation. On UNIX, it is a wrapper around chmod(2) */
- private static native void chmodImpl(String path, int mode) throws IOException;
-
- public static void chmod(String path, int mode) throws IOException {
- if (!RaftUtils.WINDOWS) {
- chmodImpl(path, mode);
- } else {
- try {
- chmodImpl(path, mode);
- } catch (NativeIOException nioe) {
- if (nioe.getErrorCode() == 3) {
- throw new NativeIOException("No such file or directory",
- Errno.ENOENT);
- } else {
- LOG.warn(String.format("NativeIO.chmod error (%d): %s",
- nioe.getErrorCode(), nioe.getMessage()));
- throw new NativeIOException("Unknown error", Errno.UNKNOWN);
- }
- }
- }
- }
-
- /** Wrapper around posix_fadvise(2) */
- static native void posix_fadvise(
- FileDescriptor fd, long offset, long len, int flags) throws NativeIOException;
-
- /** Wrapper around sync_file_range(2) */
- static native void sync_file_range(
- FileDescriptor fd, long offset, long nbytes, int flags) throws NativeIOException;
-
- /**
- * Call posix_fadvise on the given file descriptor. See the manpage
- * for this syscall for more information. On systems where this
- * call is not available, does nothing.
- *
- * @throws NativeIOException if there is an error with the syscall
- */
- static void posixFadviseIfPossible(String identifier,
- FileDescriptor fd, long offset, long len, int flags)
- throws NativeIOException {
- if (nativeLoaded && fadvisePossible) {
- try {
- posix_fadvise(fd, offset, len, flags);
- } catch (UnsatisfiedLinkError ule) {
- fadvisePossible = false;
- }
- }
- }
-
- /**
- * Call sync_file_range on the given file descriptor. See the manpage
- * for this syscall for more information. On systems where this
- * call is not available, does nothing.
- *
- * @throws NativeIOException if there is an error with the syscall
- */
- public static void syncFileRangeIfPossible(
- FileDescriptor fd, long offset, long nbytes, int flags)
- throws NativeIOException {
- if (nativeLoaded && syncFileRangePossible) {
- try {
- sync_file_range(fd, offset, nbytes, flags);
- } catch (UnsupportedOperationException | UnsatisfiedLinkError uoe) {
- syncFileRangePossible = false;
- }
- }
- }
-
- static native void mlock_native(
- ByteBuffer buffer, long len) throws NativeIOException;
-
- /**
- * Locks the provided direct ByteBuffer into memory, preventing it from
- * swapping out. After a buffer is locked, future accesses will not incur
- * a page fault.
- *
- * See the mlock(2) man page for more information.
- */
- static void mlock(ByteBuffer buffer, long len)
- throws IOException {
- assertCodeLoaded();
- if (!buffer.isDirect()) {
- throw new IOException("Cannot mlock a non-direct ByteBuffer");
- }
- mlock_native(buffer, len);
- }
-
- /**
- * Unmaps the block from memory. See munmap(2).
- *
- * There isn't any portable way to unmap a memory region in Java.
- * So we use the sun.nio method here.
- * Note that unmapping a memory region could cause crashes if code
- * continues to reference the unmapped code. However, if we don't
- * manually unmap the memory, we are dependent on the finalizer to
- * do it, and we have no idea when the finalizer will run.
- *
- * @param buffer The buffer to unmap.
- */
- public static void munmap(MappedByteBuffer buffer) {
- if (buffer instanceof sun.nio.ch.DirectBuffer) {
- sun.misc.Cleaner cleaner =
- ((sun.nio.ch.DirectBuffer)buffer).cleaner();
- cleaner.clean();
- }
- }
-
- /** Linux only methods used for getOwner() implementation */
- private static native long getUIDforFDOwnerforOwner(FileDescriptor fd) throws IOException;
- private static native String getUserName(long uid) throws IOException;
-
- /**
- * Result type of the fstat call
- */
- public static class Stat {
- private int ownerId, groupId;
- private String owner, group;
- private int mode;
-
- // Mode constants - Set by JNI
- public static int S_IFMT = -1; /* type of file */
- public static int S_IFIFO = -1; /* named pipe (fifo) */
- public static int S_IFCHR = -1; /* character special */
- public static int S_IFDIR = -1; /* directory */
- public static int S_IFBLK = -1; /* block special */
- public static int S_IFREG = -1; /* regular */
- public static int S_IFLNK = -1; /* symbolic link */
- public static int S_IFSOCK = -1; /* socket */
- public static int S_ISUID = -1; /* set user id on execution */
- public static int S_ISGID = -1; /* set group id on execution */
- public static int S_ISVTX = -1; /* save swapped text even after use */
- public static int S_IRUSR = -1; /* read permission, owner */
- public static int S_IWUSR = -1; /* write permission, owner */
- public static int S_IXUSR = -1; /* execute/search permission, owner */
-
- Stat(int ownerId, int groupId, int mode) {
- this.ownerId = ownerId;
- this.groupId = groupId;
- this.mode = mode;
- }
-
- Stat(String owner, String group, int mode) {
- if (!RaftUtils.WINDOWS) {
- this.owner = owner;
- } else {
- this.owner = stripDomain(owner);
- }
- if (!RaftUtils.WINDOWS) {
- this.group = group;
- } else {
- this.group = stripDomain(group);
- }
- this.mode = mode;
- }
-
- @Override
- public String toString() {
- return "Stat(owner='" + owner + "', group='" + group + "'" +
- ", mode=" + mode + ")";
- }
-
- public String getOwner() {
- return owner;
- }
- public String getGroup() {
- return group;
- }
- public int getMode() {
- return mode;
- }
- }
-
- private static class CachedName {
- final long timestamp;
- final String name;
-
- public CachedName(String name, long timestamp) {
- this.name = name;
- this.timestamp = timestamp;
- }
- }
-
- public final static int MMAP_PROT_READ = 0x1;
- public final static int MMAP_PROT_WRITE = 0x2;
- public final static int MMAP_PROT_EXEC = 0x4;
-
- public static native long mmap(FileDescriptor fd, int prot,
- boolean shared, long length) throws IOException;
-
- public static native void munmap(long addr, long length)
- throws IOException;
- }
-
- private static boolean workaroundNonThreadSafePasswdCalls = false;
-
-
- public static class Windows {
- // Flags for CreateFile() call on Windows
- public static final long GENERIC_READ = 0x80000000L;
- public static final long GENERIC_WRITE = 0x40000000L;
-
- public static final long FILE_SHARE_READ = 0x00000001L;
- public static final long FILE_SHARE_WRITE = 0x00000002L;
- public static final long FILE_SHARE_DELETE = 0x00000004L;
-
- public static final long CREATE_NEW = 1;
- public static final long CREATE_ALWAYS = 2;
- public static final long OPEN_EXISTING = 3;
- public static final long OPEN_ALWAYS = 4;
- public static final long TRUNCATE_EXISTING = 5;
-
- public static final long FILE_BEGIN = 0;
- public static final long FILE_CURRENT = 1;
- public static final long FILE_END = 2;
-
- public static final long FILE_ATTRIBUTE_NORMAL = 0x00000080L;
-
- /**
- * Create a directory with permissions set to the specified mode. By setting
- * permissions at creation time, we avoid issues related to the user lacking
- * WRITE_DAC rights on subsequent chmod calls. One example where this can
- * occur is writing to an SMB share where the user does not have Full Control
- * rights, and therefore WRITE_DAC is denied.
- *
- * @param path directory to create
- * @param mode permissions of new directory
- * @throws IOException if there is an I/O error
- */
- public static void createDirectoryWithMode(File path, int mode)
- throws IOException {
- createDirectoryWithMode0(path.getAbsolutePath(), mode);
- }
-
- /** Wrapper around CreateDirectory() on Windows */
- private static native void createDirectoryWithMode0(String path, int mode)
- throws NativeIOException;
-
- /** Wrapper around CreateFile() on Windows */
- public static native FileDescriptor createFile(String path,
- long desiredAccess, long shareMode, long creationDisposition)
- throws IOException;
-
- /**
- * Create a file for write with permissions set to the specified mode. By
- * setting permissions at creation time, we avoid issues related to the user
- * lacking WRITE_DAC rights on subsequent chmod calls. One example where
- * this can occur is writing to an SMB share where the user does not have
- * Full Control rights, and therefore WRITE_DAC is denied.
- *
- * This method mimics the semantics implemented by the JDK in
- * {@link FileOutputStream}. The file is opened for truncate or
- * append, the sharing mode allows other readers and writers, and paths
- * longer than MAX_PATH are supported. (See io_util_md.c in the JDK.)
- *
- * @param path file to create
- * @param append if true, then open file for append
- * @param mode permissions of new directory
- * @return FileOutputStream of opened file
- * @throws IOException if there is an I/O error
- */
- public static FileOutputStream createFileOutputStreamWithMode(File path,
- boolean append, int mode) throws IOException {
- long shareMode = FILE_SHARE_READ | FILE_SHARE_WRITE;
- long creationDisposition = append ? OPEN_ALWAYS : CREATE_ALWAYS;
- return new FileOutputStream(createFileWithMode0(path.getAbsolutePath(),
- GENERIC_WRITE, shareMode, creationDisposition, mode));
- }
-
- /** Wrapper around CreateFile() with security descriptor on Windows */
- private static native FileDescriptor createFileWithMode0(String path,
- long desiredAccess, long shareMode, long creationDisposition, int mode)
- throws NativeIOException;
-
- /** Wrapper around SetFilePointer() on Windows */
- public static native long setFilePointer(FileDescriptor fd,
- long distanceToMove, long moveMethod) throws IOException;
-
- /** Windows only methods used for getOwner() implementation */
- private static native String getOwner(FileDescriptor fd) throws IOException;
-
- /** Supported list of Windows access right flags */
- public enum AccessRight {
- ACCESS_READ (0x0001), // FILE_READ_DATA
- ACCESS_WRITE (0x0002), // FILE_WRITE_DATA
- ACCESS_EXECUTE (0x0020); // FILE_EXECUTE
-
- private final int accessRight;
- AccessRight(int access) {
- accessRight = access;
- }
-
- public int accessRight() {
- return accessRight;
- }
- }
-
- /** Windows only method used to check if the current process has requested
- * access rights on the given path. */
- private static native boolean access0(String path, int requestedAccess);
-
- /**
- * Checks whether the current process has desired access rights on
- * the given path.
- *
- * Longer term this native function can be substituted with JDK7
- * function Files#isReadable, isWritable, isExecutable.
- *
- * @param path input path
- * @param desiredAccess ACCESS_READ, ACCESS_WRITE or ACCESS_EXECUTE
- * @return true if access is allowed
- * @throws IOException I/O exception on error
- */
- public static boolean access(String path, AccessRight desiredAccess)
- throws IOException {
- return access0(path, desiredAccess.accessRight());
- }
-
- /**
- * Extends both the minimum and maximum working set size of the current
- * process. This method gets the current minimum and maximum working set
- * size, adds the requested amount to each and then sets the minimum and
- * maximum working set size to the new values. Controlling the working set
- * size of the process also controls the amount of memory it can lock.
- *
- * @param delta amount to increment minimum and maximum working set size
- * @throws IOException for any error
- * @see POSIX#mlock(ByteBuffer, long)
- */
- public static native void extendWorkingSetSize(long delta) throws IOException;
-
- static {
- initNativeLib();
- }
- }
-
- private static boolean nativeLoaded = false;
-
- static {
- initNativeLib();
- }
-
- private static void initNativeLib() {
- if (NativeCodeLoader.isNativeCodeLoaded()) {
- try {
- initNative();
- nativeLoaded = true;
- } catch (Throwable t) {
- LOG.debug("Unable to initialize NativeIO libraries", t);
- }
- }
- }
-
- /**
- * Return true if the JNI-based native IO extensions are available.
- */
- public static boolean isAvailable() {
- return NativeCodeLoader.isNativeCodeLoaded() && nativeLoaded;
- }
-
- /** Initialize the JNI method ID and class ID cache */
- private static native void initNative();
-
- /**
- * Get the maximum number of bytes that can be locked into memory at any
- * given point.
- *
- * @return 0 if no bytes can be locked into memory;
- * Long.MAX_VALUE if there is no limit;
- * The number of bytes that can be locked into memory otherwise.
- */
- static long getMemlockLimit() {
- return isAvailable() ? getMemlockLimit0() : 0;
- }
-
- private static native long getMemlockLimit0();
-
- /**
- * @return the operating system's page size.
- */
- static long getOperatingSystemPageSize() {
- try {
- Field f = Unsafe.class.getDeclaredField("theUnsafe");
- f.setAccessible(true);
- Unsafe unsafe = (Unsafe)f.get(null);
- return unsafe.pageSize();
- } catch (Throwable e) {
- LOG.warn("Unable to get operating system page size. Guessing 4096.", e);
- return 4096;
- }
- }
-
- private static class CachedUid {
- final long timestamp;
- final String username;
- public CachedUid(String username, long timestamp) {
- this.timestamp = timestamp;
- this.username = username;
- }
- }
-
- private static boolean initialized = false;
-
- /**
- * The Windows logon name has two part, NetBIOS domain name and
- * user account name, of the format DOMAIN\UserName. This method
- * will remove the domain part of the full logon name.
- *
- * @param name full principal name containing the domain
- * @return name with domain removed
- */
- private static String stripDomain(String name) {
- int i = name.indexOf('\\');
- if (i != -1)
- name = name.substring(i + 1);
- return name;
- }
-
- /**
- * Create a FileInputStream that shares delete permission on the
- * file opened, i.e. other process can delete the file the
- * FileInputStream is reading. Only Windows implementation uses
- * the native interface.
- */
- public static FileInputStream getShareDeleteFileInputStream(File f)
- throws IOException {
- if (!RaftUtils.WINDOWS) {
- // On Linux the default FileInputStream shares delete permission
- // on the file opened.
- //
- return new FileInputStream(f);
- } else {
- // Use Windows native interface to create a FileInputStream that
- // shares delete permission on the file opened.
- //
- FileDescriptor fd = Windows.createFile(
- f.getAbsolutePath(),
- Windows.GENERIC_READ,
- Windows.FILE_SHARE_READ |
- Windows.FILE_SHARE_WRITE |
- Windows.FILE_SHARE_DELETE,
- Windows.OPEN_EXISTING);
- return new FileInputStream(fd);
- }
- }
-
- /**
- * Create a FileInputStream that shares delete permission on the
- * file opened at a given offset, i.e. other process can delete
- * the file the FileInputStream is reading. Only Windows implementation
- * uses the native interface.
- */
- public static FileInputStream getShareDeleteFileInputStream(File f, long seekOffset)
- throws IOException {
- if (!RaftUtils.WINDOWS) {
- RandomAccessFile rf = new RandomAccessFile(f, "r");
- if (seekOffset > 0) {
- rf.seek(seekOffset);
- }
- return new FileInputStream(rf.getFD());
- } else {
- // Use Windows native interface to create a FileInputStream that
- // shares delete permission on the file opened, and set it to the
- // given offset.
- //
- FileDescriptor fd = NativeIO.Windows.createFile(
- f.getAbsolutePath(),
- NativeIO.Windows.GENERIC_READ,
- NativeIO.Windows.FILE_SHARE_READ |
- NativeIO.Windows.FILE_SHARE_WRITE |
- NativeIO.Windows.FILE_SHARE_DELETE,
- NativeIO.Windows.OPEN_EXISTING);
- if (seekOffset > 0)
- NativeIO.Windows.setFilePointer(fd, seekOffset, NativeIO.Windows.FILE_BEGIN);
- return new FileInputStream(fd);
- }
- }
-
- /**
- * Create the specified File for write access, ensuring that it does not exist.
- * @param f the file that we want to create
- * @param permissions we want to have on the file (if security is enabled)
- *
- * @throws AlreadyExistsException if the file already exists
- * @throws IOException if any other error occurred
- */
- public static FileOutputStream getCreateForWriteFileOutputStream(File f, int permissions)
- throws IOException {
- if (!RaftUtils.WINDOWS) {
- // Use the native wrapper around open(2)
- try {
- FileDescriptor fd = NativeIO.POSIX.open(f.getAbsolutePath(),
- NativeIO.POSIX.O_WRONLY | NativeIO.POSIX.O_CREAT
- | NativeIO.POSIX.O_EXCL, permissions);
- return new FileOutputStream(fd);
- } catch (NativeIOException nioe) {
- if (nioe.getErrno() == Errno.EEXIST) {
- throw new AlreadyExistsException(nioe);
- }
- throw nioe;
- }
- } else {
- // Use the Windows native APIs to create equivalent FileOutputStream
- try {
- FileDescriptor fd = NativeIO.Windows.createFile(f.getCanonicalPath(),
- NativeIO.Windows.GENERIC_WRITE,
- NativeIO.Windows.FILE_SHARE_DELETE
- | NativeIO.Windows.FILE_SHARE_READ
- | NativeIO.Windows.FILE_SHARE_WRITE,
- NativeIO.Windows.CREATE_NEW);
- NativeIO.POSIX.chmod(f.getCanonicalPath(), permissions);
- return new FileOutputStream(fd);
- } catch (NativeIOException nioe) {
- if (nioe.getErrorCode() == 80) {
- // ERROR_FILE_EXISTS
- // 80 (0x50)
- // The file exists
- throw new AlreadyExistsException(nioe);
- }
- throw nioe;
- }
- }
- }
-
- /**
- * A version of renameTo that throws a descriptive exception when it fails.
- *
- * @param src The source path
- * @param dst The destination path
- *
- * @throws NativeIOException On failure.
- */
- public static void renameTo(File src, File dst)
- throws IOException {
- if (!nativeLoaded) {
- if (!src.renameTo(dst)) {
- throw new IOException("renameTo(src=" + src + ", dst=" +
- dst + ") failed.");
- }
- } else {
- renameTo0(src.getAbsolutePath(), dst.getAbsolutePath());
- }
- }
-
- /**
- * A version of renameTo that throws a descriptive exception when it fails.
- *
- * @param src The source path
- * @param dst The destination path
- *
- * @throws NativeIOException On failure.
- */
- private static native void renameTo0(String src, String dst)
- throws NativeIOException;
-
- private static native void link0(String src, String dst)
- throws NativeIOException;
-
- /**
- * Unbuffered file copy from src to dst without tainting OS buffer cache
- *
- * In POSIX platform:
- * It uses FileChannel#transferTo() which internally attempts
- * unbuffered IO on OS with native sendfile64() support and falls back to
- * buffered IO otherwise.
- *
- * It minimizes the number of FileChannel#transferTo call by passing the the
- * src file size directly instead of a smaller size as the 3rd parameter.
- * This saves the number of sendfile64() system call when native sendfile64()
- * is supported. In the two fall back cases where sendfile is not supported,
- * FileChannle#transferTo already has its own batching of size 8 MB and 8 KB,
- * respectively.
- *
- * In Windows Platform:
- * It uses its own native wrapper of CopyFileEx with COPY_FILE_NO_BUFFERING
- * flag, which is supported on Windows Server 2008 and above.
- *
- * Ideally, we should use FileChannel#transferTo() across both POSIX and Windows
- * platform. Unfortunately, the wrapper(Java_sun_nio_ch_FileChannelImpl_transferTo0)
- * used by FileChannel#transferTo for unbuffered IO is not implemented on Windows.
- * Based on OpenJDK 6/7/8 source code, Java_sun_nio_ch_FileChannelImpl_transferTo0
- * on Windows simply returns IOS_UNSUPPORTED.
- *
- * Note: This simple native wrapper does minimal parameter checking before copy and
- * consistency check (e.g., size) after copy.
- * It is recommended to use wrapper function like
- * the Storage#nativeCopyFileUnbuffered() function with pre/post copy checks.
- *
- * @param src The source path
- * @param dst The destination path
- */
- public static void copyFileUnbuffered(File src, File dst) throws IOException {
- if (nativeLoaded && RaftUtils.WINDOWS) {
- copyFileUnbuffered0(src.getAbsolutePath(), dst.getAbsolutePath());
- } else {
- FileInputStream fis = null;
- FileOutputStream fos = null;
- FileChannel input = null;
- FileChannel output = null;
- try {
- fis = new FileInputStream(src);
- fos = new FileOutputStream(dst);
- input = fis.getChannel();
- output = fos.getChannel();
- long remaining = input.size();
- long position = 0;
- long transferred;
- while (remaining > 0) {
- transferred = input.transferTo(position, remaining, output);
- remaining -= transferred;
- position += transferred;
- }
- } finally {
- RaftUtils.cleanup(LOG, output, fos, input, fis);
- }
- }
- }
-
- private static native void copyFileUnbuffered0(String src, String dst)
- throws NativeIOException;
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIOException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIOException.java b/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIOException.java
deleted file mode 100644
index c1536d4..0000000
--- a/raft-common/src/main/java/org/apache/raft/io/nativeio/NativeIOException.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.io.nativeio;
-
-import org.apache.raft.util.RaftUtils;
-
-import java.io.IOException;
-
-
-/**
- * An exception generated by a call to the native IO code.
- *
- * These exceptions simply wrap <i>errno</i> result codes on Linux,
- * or the System Error Code on Windows.
- */
-public class NativeIOException extends IOException {
- private static final long serialVersionUID = 1L;
-
- private Errno errno;
-
- // Java has no unsigned primitive error code. Use a signed 32-bit
- // integer to hold the unsigned 32-bit integer.
- private int errorCode;
-
- public NativeIOException(String msg, Errno errno) {
- super(msg);
- this.errno = errno;
- // Windows error code is always set to ERROR_SUCCESS on Linux,
- // i.e. no failure on Windows
- this.errorCode = 0;
- }
-
- public NativeIOException(String msg, int errorCode) {
- super(msg);
- this.errorCode = errorCode;
- this.errno = Errno.UNKNOWN;
- }
-
- public long getErrorCode() {
- return errorCode;
- }
-
- public Errno getErrno() {
- return errno;
- }
-
- @Override
- public String toString() {
- if (RaftUtils.WINDOWS)
- return errorCode + ": " + super.getMessage();
- else
- return errno.toString() + ": " + super.getMessage();
- }
-}
-
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/AlreadyExistsException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/AlreadyExistsException.java b/raft-common/src/main/java/org/apache/raft/protocol/AlreadyExistsException.java
deleted file mode 100644
index 760e6e8..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/AlreadyExistsException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.io.IOException;
-
-/**
- * Signals that an attempt to create a file at a given pathname has failed
- * because another file already existed at that path.
- */
-public class AlreadyExistsException extends IOException {
- private static final long serialVersionUID = 1L;
-
- public AlreadyExistsException(String msg) {
- super(msg);
- }
-
- public AlreadyExistsException(Throwable cause) {
- super(cause);
- }
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/ChecksumException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/ChecksumException.java b/raft-common/src/main/java/org/apache/raft/protocol/ChecksumException.java
deleted file mode 100644
index 801a428..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/ChecksumException.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.io.IOException;
-
-/** Thrown for checksum errors. */
-public class ChecksumException extends IOException {
- private static final long serialVersionUID = 1L;
- private long pos;
- public ChecksumException(String description, long pos) {
- super(description);
- this.pos = pos;
- }
-
- public long getPos() {
- return pos;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/Message.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/Message.java b/raft-common/src/main/java/org/apache/raft/protocol/Message.java
deleted file mode 100644
index b6d8381..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/Message.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import org.apache.raft.shaded.com.google.protobuf.ByteString;
-
-/**
- * The information clients append to the raft ring.
- */
-public interface Message {
- /**
- * @return the content of the message
- */
- ByteString getContent();
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/NotLeaderException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/NotLeaderException.java b/raft-common/src/main/java/org/apache/raft/protocol/NotLeaderException.java
deleted file mode 100644
index 6aa486f..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/NotLeaderException.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class NotLeaderException extends RaftException {
- private final RaftPeer suggestedLeader;
- /** the client may need to update its RaftPeer list */
- private final RaftPeer[] peers;
-
- public NotLeaderException(String id, RaftPeer suggestedLeader,
- RaftPeer[] peers) {
- super("Server " + id + " is not the leader (" + suggestedLeader
- + "). Request must be sent to leader.");
- this.suggestedLeader = suggestedLeader;
- this.peers = peers == null ? RaftPeer.EMPTY_PEERS : peers;
- }
-
- public RaftPeer getSuggestedLeader() {
- return suggestedLeader;
- }
-
- public RaftPeer[] getPeers() {
- return peers;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftClientAsynchronousProtocol.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientAsynchronousProtocol.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftClientAsynchronousProtocol.java
deleted file mode 100644
index 3572b7e..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientAsynchronousProtocol.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.io.IOException;
-import java.util.concurrent.CompletableFuture;
-
-/** Asynchronous version of {@link RaftClientProtocol}. */
-public interface RaftClientAsynchronousProtocol {
- CompletableFuture<RaftClientReply> submitClientRequestAsync(
- RaftClientRequest request) throws IOException;
-
- CompletableFuture<RaftClientReply> setConfigurationAsync(
- SetConfigurationRequest request) throws IOException;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftClientProtocol.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientProtocol.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftClientProtocol.java
deleted file mode 100644
index 5f8ed8d..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientProtocol.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.io.IOException;
-
-public interface RaftClientProtocol {
- RaftClientReply submitClientRequest(RaftClientRequest request) throws IOException;
-
- RaftClientReply setConfiguration(SetConfigurationRequest request) throws IOException;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftClientReply.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientReply.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftClientReply.java
deleted file mode 100644
index 4390ddf..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientReply.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class RaftClientReply extends RaftRpcMessage {
- private final String requestorId;
- private final String replierId;
- private final boolean success;
- private final long seqNum;
-
- /** non-null if the server is not leader */
- private final NotLeaderException notLeaderException;
- private final Message message;
-
- public RaftClientReply(String requestorId, String replierId, long seqNum,
- boolean success, Message message, NotLeaderException notLeaderException) {
- this.requestorId = requestorId;
- this.replierId = replierId;
- this.success = success;
- this.seqNum = seqNum;
- this.message = message;
- this.notLeaderException = notLeaderException;
- }
-
- public RaftClientReply(RaftClientRequest request,
- NotLeaderException notLeaderException) {
- this(request.getRequestorId(), request.getReplierId(), request.getSeqNum(),
- false, null, notLeaderException);
- }
-
- public RaftClientReply(RaftClientRequest request, Message message) {
- this(request.getRequestorId(), request.getReplierId(), request.getSeqNum(),
- true, message, null);
- }
-
- @Override
- public final boolean isRequest() {
- return false;
- }
-
- @Override
- public String getRequestorId() {
- return requestorId;
- }
-
- @Override
- public String getReplierId() {
- return replierId;
- }
-
- public long getSeqNum() {
- return seqNum;
- }
-
- @Override
- public String toString() {
- return super.toString() + ", seqNum: " + getSeqNum()
- + ", success: " + isSuccess();
- }
-
- public boolean isSuccess() {
- return success;
- }
-
- public Message getMessage() {
- return message;
- }
-
- public NotLeaderException getNotLeaderException() {
- return notLeaderException;
- }
-
- public boolean isNotLeader() {
- return notLeaderException != null;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftClientRequest.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientRequest.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftClientRequest.java
deleted file mode 100644
index 1955c89..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftClientRequest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class RaftClientRequest extends RaftRpcMessage {
- private final String requestorId;
- private final String replierId;
- private final long seqNum;
- private final Message message;
- private final boolean readOnly;
-
- public RaftClientRequest(String requestorId, String replierId, long seqNum,
- Message message) {
- this(requestorId, replierId, seqNum, message, false);
- }
-
- public RaftClientRequest(String requestorId, String replierId, long seqNum,
- Message message, boolean readOnly) {
- this.requestorId = requestorId;
- this.replierId = replierId;
- this.seqNum = seqNum;
- this.message = message;
- this.readOnly = readOnly;
- }
-
- @Override
- public final boolean isRequest() {
- return true;
- }
-
- @Override
- public String getRequestorId() {
- return requestorId;
- }
-
- @Override
- public String getReplierId() {
- return replierId;
- }
-
- public long getSeqNum() {
- return seqNum;
- }
-
- public Message getMessage() {
- return message;
- }
-
- public boolean isReadOnly() {
- return readOnly;
- }
-
- @Override
- public String toString() {
- return super.toString() + ", seqNum: " + seqNum + ", "
- + (isReadOnly()? "RO": "RW");
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftException.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftException.java
deleted file mode 100644
index 94db20f..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftException.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.io.IOException;
-
-public class RaftException extends IOException {
- private static final long serialVersionUID = 1L;
-
- public RaftException(String message) {
- super(message);
- }
-
- public RaftException(Throwable cause) {
- super(cause);
- }
-
- public RaftException(String message, Throwable cause) {
- super(message, cause);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftPeer.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftPeer.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftPeer.java
deleted file mode 100644
index c33412b..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftPeer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import com.google.common.net.HostAndPort;
-
-import java.net.InetSocketAddress;
-
-/**
- * A {@link RaftPeer} is a server in a Raft cluster.
- *
- * The objects of this class are immutable.
- */
-public class RaftPeer {
- public static final RaftPeer[] EMPTY_PEERS = {};
-
- /** The id of the peer. */
- private final String id;
- /** The address of the peer. */
- private final String address;
-
- /** Construct a peer with the given id and a null address. */
- public RaftPeer(String id) {
- this(id, (String)null);
- }
-
- /** Construct a peer with the given id and address. */
- public RaftPeer(String id, InetSocketAddress address) {
- this(id, address == null ? null :
- HostAndPort.fromParts(address.getAddress().getHostAddress(),
- address.getPort()).toString());
- }
-
- /** Construct a peer with the given id and address. */
- public RaftPeer(String id, String address) {
- this.id = id;
- this.address = address;
- }
-
- /** @return The id of the peer. */
- public String getId() {
- return id;
- }
-
- /** @return The address of the peer. */
- public String getAddress() {
- return address;
- }
-
- @Override
- public String toString() {
- return id + ":" + address;
- }
-
- @Override
- public boolean equals(Object o) {
- return (o instanceof RaftPeer) && id.equals(((RaftPeer) o).getId());
- }
-
- @Override
- public int hashCode() {
- return id.hashCode();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/RaftRpcMessage.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/RaftRpcMessage.java b/raft-common/src/main/java/org/apache/raft/protocol/RaftRpcMessage.java
deleted file mode 100644
index c48e75c..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/RaftRpcMessage.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public abstract class RaftRpcMessage {
-
- public abstract boolean isRequest();
-
- public abstract String getRequestorId();
-
- public abstract String getReplierId();
-
- @Override
- public String toString() {
- return getClass().getSimpleName() + "(" + getRequestorId()
- + (isRequest()? "->": "<-") + getReplierId() + ")";
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationInProgressException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationInProgressException.java b/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationInProgressException.java
deleted file mode 100644
index a27e97c..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationInProgressException.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class ReconfigurationInProgressException extends RaftException {
- public ReconfigurationInProgressException(String message) {
- super(message);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationTimeoutException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationTimeoutException.java b/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationTimeoutException.java
deleted file mode 100644
index d02d3ff..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/ReconfigurationTimeoutException.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class ReconfigurationTimeoutException extends RaftException {
- public ReconfigurationTimeoutException(String message) {
- super(message);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/SetConfigurationRequest.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/SetConfigurationRequest.java b/raft-common/src/main/java/org/apache/raft/protocol/SetConfigurationRequest.java
deleted file mode 100644
index 2b6b1c2..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/SetConfigurationRequest.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-import java.util.Arrays;
-
-public class SetConfigurationRequest extends RaftClientRequest {
- private final RaftPeer[] peers;
-
- public SetConfigurationRequest(String requestorId, String replierId,
- long seqNum, RaftPeer[] peers) {
- super(requestorId, replierId, seqNum, null);
- this.peers = peers;
- }
-
- public RaftPeer[] getPeersInNewConf() {
- return peers;
- }
-
- @Override
- public String toString() {
- return super.toString() + ", peers:" + Arrays.asList(getPeersInNewConf());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/protocol/StateMachineException.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/protocol/StateMachineException.java b/raft-common/src/main/java/org/apache/raft/protocol/StateMachineException.java
deleted file mode 100644
index 5228f87..0000000
--- a/raft-common/src/main/java/org/apache/raft/protocol/StateMachineException.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.protocol;
-
-public class StateMachineException extends RaftException {
- public StateMachineException(String serverId, Exception cause) {
- super(cause.getClass().getName() + " from Server " + serverId, cause);
- }
-
- public StateMachineException(String msg) {
- super(msg);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/AtomicFileOutputStream.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/AtomicFileOutputStream.java b/raft-common/src/main/java/org/apache/raft/util/AtomicFileOutputStream.java
deleted file mode 100644
index 28a5ea5..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/AtomicFileOutputStream.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import org.apache.raft.io.nativeio.NativeIO;
-import org.apache.raft.io.nativeio.NativeIOException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.*;
-
-/**
- * A FileOutputStream that has the property that it will only show
- * up at its destination once it has been entirely written and flushed
- * to disk. While being written, it will use a .tmp suffix.
- *
- * When the output stream is closed, it is flushed, fsynced, and
- * will be moved into place, overwriting any file that already
- * exists at that location.
- *
- * <b>NOTE</b>: on Windows platforms, it will not atomically
- * replace the target file - instead the target file is deleted
- * before this one is moved into place.
- */
-public class AtomicFileOutputStream extends FilterOutputStream {
-
- public static final String TMP_EXTENSION = ".tmp";
-
- public static final Logger LOG = LoggerFactory.getLogger(AtomicFileOutputStream.class);
-
- private final File origFile;
- private final File tmpFile;
-
- public AtomicFileOutputStream(File f) throws FileNotFoundException {
- // Code unfortunately must be duplicated below since we can't assign anything
- // before calling super
- super(new FileOutputStream(new File(f.getParentFile(), f.getName() + TMP_EXTENSION)));
- origFile = f.getAbsoluteFile();
- tmpFile = new File(f.getParentFile(), f.getName() + TMP_EXTENSION).getAbsoluteFile();
- }
-
- @Override
- public void close() throws IOException {
- boolean triedToClose = false, success = false;
- try {
- flush();
- ((FileOutputStream)out).getChannel().force(true);
-
- triedToClose = true;
- super.close();
- success = true;
- } finally {
- if (success) {
- boolean renamed = tmpFile.renameTo(origFile);
- if (!renamed) {
- // On windows, renameTo does not replace.
- if (origFile.exists() && !origFile.delete()) {
- throw new IOException("Could not delete original file " + origFile);
- }
- try {
- NativeIO.renameTo(tmpFile, origFile);
- } catch (NativeIOException e) {
- throw new IOException("Could not rename temporary file " + tmpFile
- + " to " + origFile + " due to failure in native rename. "
- + e.toString());
- }
- }
- } else {
- if (!triedToClose) {
- // If we failed when flushing, try to close it to not leak an FD
- RaftUtils.cleanup(LOG, out);
- }
- // close wasn't successful, try to delete the tmp file
- if (!tmpFile.delete()) {
- LOG.warn("Unable to delete tmp file " + tmpFile);
- }
- }
- }
- }
-
- /**
- * Close the atomic file, but do not "commit" the temporary file
- * on top of the destination. This should be used if there is a failure
- * in writing.
- */
- public void abort() {
- try {
- super.close();
- } catch (IOException ioe) {
- LOG.warn("Unable to abort file " + tmpFile, ioe);
- }
- if (!tmpFile.delete()) {
- LOG.warn("Unable to delete tmp file during abort " + tmpFile);
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/AutoCloseableLock.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/AutoCloseableLock.java b/raft-common/src/main/java/org/apache/raft/util/AutoCloseableLock.java
deleted file mode 100644
index 8276689..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/AutoCloseableLock.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.locks.Lock;
-
-/**
- * Wrap a lock with the {@link AutoCloseable} interface
- * so that the {@link #close()} method will unlock the lock.
- */
-public class AutoCloseableLock implements AutoCloseable {
- /**
- * Acquire the given lock and then wrap it with {@link AutoCloseableLock}
- * so that the given lock can be released by calling {@link #close()},
- * or by using a {@code try}-with-resources statement as shown below.
- *
- * <pre> {@code
- * try(AutoCloseableLock acl = AutoCloseableLock.acquire(lock)) {
- * ...
- * }}</pre>
- */
- public static AutoCloseableLock acquire(final Lock lock) {
- lock.lock();
- return new AutoCloseableLock(lock);
- }
-
- private final Lock underlying;
- private final AtomicBoolean closed = new AtomicBoolean(false);
-
- private AutoCloseableLock(Lock underlying) {
- this.underlying = underlying;
- }
-
- /** Unlock the underlying lock. This method is idempotent. */
- @Override
- public void close() {
- if (closed.compareAndSet(false, true)) {
- underlying.unlock();
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/CheckedFunction.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/CheckedFunction.java b/raft-common/src/main/java/org/apache/raft/util/CheckedFunction.java
deleted file mode 100644
index 696e8e6..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/CheckedFunction.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import java.util.function.Function;
-
-/** Function with a throws-clause. */
-@FunctionalInterface
-public interface CheckedFunction<INPUT, OUTPUT, THROWABLE extends Throwable> {
- /**
- * The same as {@link Function#apply(Object)}
- * except that this method is declared with a throws-clause.
- */
- OUTPUT apply(INPUT input) throws THROWABLE;
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/CheckedRunnable.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/CheckedRunnable.java b/raft-common/src/main/java/org/apache/raft/util/CheckedRunnable.java
deleted file mode 100644
index e7752a8..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/CheckedRunnable.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-/** Runnable with a throws-clause. */
-@FunctionalInterface
-public interface CheckedRunnable<THROWABLE extends Throwable> {
- /**
- * The same as {@link Runnable#run()}
- * except that this method is declared with a throws-clause.
- */
- void run() throws THROWABLE;
-}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/CodeInjectionForTesting.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/CodeInjectionForTesting.java b/raft-common/src/main/java/org/apache/raft/util/CodeInjectionForTesting.java
deleted file mode 100644
index 8de7af4..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/CodeInjectionForTesting.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-/** Inject code for testing. */
-public class CodeInjectionForTesting {
- public static final Logger LOG = LoggerFactory.getLogger(CodeInjectionForTesting.class);
-
- /** Code to be injected. */
- public interface Code {
- Logger LOG = CodeInjectionForTesting.LOG;
-
- /**
- * Execute the injected code for testing.
- * @param localId the id of the local peer
- * @param remoteId the id of the remote peer if handling a request
- * @param args other possible args
- * @return if the injected code is executed
- */
- boolean execute(String localId, String remoteId, Object... args);
- }
-
- private static final Map<String, Code> INJECTION_POINTS
- = new ConcurrentHashMap<>();
-
- /** Put an injection point. */
- public static void put(String injectionPoint, Code code) {
- LOG.debug("put: {}, {}", injectionPoint, code);
- INJECTION_POINTS.put(injectionPoint, code);
- }
-
- /** Execute the injected code, if there is any. */
- public static boolean execute(String injectionPoint, String localId,
- String remoteId, Object... args) {
- final Code code = INJECTION_POINTS.get(injectionPoint);
- if (code == null) {
- return false;
- }
- if (LOG.isDebugEnabled()) {
- LOG.debug("execute: {}, {}, localId={}, remoteId={}, args={}",
- injectionPoint, code, localId, remoteId, Arrays.toString(args));
- }
- return code.execute(localId, remoteId, args);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/Daemon.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/Daemon.java b/raft-common/src/main/java/org/apache/raft/util/Daemon.java
deleted file mode 100644
index ccb81ec..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/Daemon.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-public class Daemon extends Thread {
- {
- setDaemon(true);
- }
-
- /** Construct a daemon thread. */
- public Daemon() {
- super();
- }
-
- /** Construct a daemon thread with the given runnable. */
- public Daemon(Runnable runnable) {
- super(runnable);
- this.setName(runnable.toString());
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/ExitUtils.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/ExitUtils.java b/raft-common/src/main/java/org/apache/raft/util/ExitUtils.java
deleted file mode 100644
index 6526b5a..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/ExitUtils.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import org.slf4j.Logger;
-
-/** Facilitates hooking process termination for tests and debugging. */
-public class ExitUtils {
- public static class ExitException extends RuntimeException {
- private static final long serialVersionUID = 1L;
-
- public final int status;
-
- public ExitException(int status, String message, Throwable throwable) {
- super(message, throwable);
- this.status = status;
- }
- }
-
- private static volatile boolean systemExitDisabled = false;
- private static volatile ExitException firstExitException;
-
- /**
- * @return the first {@link ExitException} thrown, or null if none thrown yet.
- */
- public static ExitException getFirstExitException() {
- return firstExitException;
- }
-
- /**
- * Reset the tracking of process termination.
- * This is useful when some tests expect an exit but the others do not.
- */
- public static void resetFirstExitException() {
- firstExitException = null;
- }
-
- /** @return true if {@link #terminate(int, String, Throwable, Logger)} has been invoked. */
- public static boolean isTerminated() {
- // Either this member is set or System.exit is actually invoked.
- return firstExitException != null;
- }
-
- /** Disable the use of {@link System#exit(int)} for testing. */
- public static void disableSystemExit() {
- systemExitDisabled = true;
- }
-
- /**
- * Terminate the current process. Note that terminate is the *only* method
- * that should be used to terminate the daemon processes.
- *
- * @param status Exit status
- * @param message message used to create the {@code ExitException}
- * @throws ExitException if System.exit is disabled for test purposes
- */
- public static void terminate(
- int status, String message, Throwable throwable, Logger log)
- throws ExitException {
- if (log != null) {
- final String s = "Terminating with exit status " + status + ": " + message;
- if (status == 0) {
- log.info(s, throwable);
- } else {
- log.error(s, throwable);
- }
- }
-
- if (!systemExitDisabled) {
- System.exit(status);
- }
-
- final ExitException ee = new ExitException(status, message, throwable);
- if (firstExitException == null) {
- firstExitException = ee;
- }
- throw ee;
- }
-
- public static void terminate(int status, String message, Logger log) {
- terminate(status, message, null, log);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-ratis/blob/7e71a2e0/raft-common/src/main/java/org/apache/raft/util/FileUtils.java
----------------------------------------------------------------------
diff --git a/raft-common/src/main/java/org/apache/raft/util/FileUtils.java b/raft-common/src/main/java/org/apache/raft/util/FileUtils.java
deleted file mode 100644
index 603078c..0000000
--- a/raft-common/src/main/java/org/apache/raft/util/FileUtils.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF 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.apache.raft.util;
-
-import org.apache.raft.io.nativeio.NativeIO;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.nio.file.Files;
-
-public class FileUtils {
- public static final Logger LOG = LoggerFactory.getLogger(FileUtils.class);
-
- public static void truncateFile(File f, long target) throws IOException {
- try (FileOutputStream out = new FileOutputStream(f, true)) {
- out.getChannel().truncate(target);
- }
- }
-
- public static void deleteFile(File f) throws IOException {
- try {
- Files.delete(f.toPath());
- } catch (IOException e) {
- LOG.warn("Could not delete " + f);
- throw e;
- }
- }
-
- /**
- * Delete a directory and all its contents. If
- * we return false, the directory may be partially-deleted.
- * (1) If dir is symlink to a file, the symlink is deleted. The file pointed
- * to by the symlink is not deleted.
- * (2) If dir is symlink to a directory, symlink is deleted. The directory
- * pointed to by symlink is not deleted.
- * (3) If dir is a normal file, it is deleted.
- * (4) If dir is a normal directory, then dir and all its contents recursively
- * are deleted.
- */
- public static boolean fullyDelete(final File dir) {
- if (deleteImpl(dir, false)) {
- // dir is (a) normal file, (b) symlink to a file, (c) empty directory or
- // (d) symlink to a directory
- return true;
- }
- // handle nonempty directory deletion
- return fullyDeleteContents(dir) && deleteImpl(dir, true);
- }
-
- private static boolean deleteImpl(final File f, final boolean doLog) {
- if (f == null) {
- LOG.warn("null file argument.");
- return false;
- }
- final boolean wasDeleted = f.delete();
- if (wasDeleted) {
- return true;
- }
- final boolean ex = f.exists();
- if (doLog && ex) {
- LOG.warn("Failed to delete file or dir ["
- + f.getAbsolutePath() + "]: it still exists.");
- }
- return !ex;
- }
-
- /**
- * Delete the contents of a directory, not the directory itself. If
- * we return false, the directory may be partially-deleted.
- * If dir is a symlink to a directory, all the contents of the actual
- * directory pointed to by dir will be deleted.
- */
- private static boolean fullyDeleteContents(final File dir) {
- boolean deletionSucceeded = true;
- final File[] contents = dir.listFiles();
- if (contents != null) {
- for (File content : contents) {
- if (content.isFile()) {
- if (!deleteImpl(content, true)) {
- deletionSucceeded = false;
- }
- } else {
- // Either directory or symlink to another directory.
- // Try deleting the directory as this might be a symlink
- if (deleteImpl(content, false)) {
- // this was indeed a symlink or an empty directory
- continue;
- }
- // if not an empty directory or symlink let
- // fullyDelete handle it.
- if (!fullyDelete(content)) {
- deletionSucceeded = false;
- // continue deletion of other files/dirs under dir
- }
- }
- }
- }
- return deletionSucceeded;
- }
-
- /**
- * Interprets the passed string as a URI. In case of error it
- * assumes the specified string is a file.
- *
- * @param s the string to interpret
- * @return the resulting URI
- */
- public static URI stringAsURI(String s) throws IOException {
- URI u = null;
- // try to make a URI
- try {
- u = new URI(s);
- } catch (URISyntaxException e){
- LOG.error("Syntax error in URI " + s
- + ". Please check hdfs configuration.", e);
- }
-
- // if URI is null or scheme is undefined, then assume it's file://
- if(u == null || u.getScheme() == null){
- LOG.warn("Path " + s + " should be specified as a URI "
- + "in configuration files. Please update configuration.");
- u = fileAsURI(new File(s));
- }
- return u;
- }
-
- /**
- * Converts the passed File to a URI. This method trims the trailing slash if
- * one is appended because the underlying file is in fact a directory that
- * exists.
- *
- * @param f the file to convert
- * @return the resulting URI
- */
- public static URI fileAsURI(File f) throws IOException {
- URI u = f.getCanonicalFile().toURI();
-
- // trim the trailing slash, if it's present
- if (u.getPath().endsWith("/")) {
- String uriAsString = u.toString();
- try {
- u = new URI(uriAsString.substring(0, uriAsString.length() - 1));
- } catch (URISyntaxException e) {
- throw new IOException(e);
- }
- }
- return u;
- }
-
- /**
- * A wrapper for {@link File#listFiles()}. This java.io API returns null
- * when a dir is not a directory or for any I/O error. Instead of having
- * null check everywhere File#listFiles() is used, we will add utility API
- * to get around this problem. For the majority of cases where we prefer
- * an IOException to be thrown.
- * @param dir directory for which listing should be performed
- * @return list of files or empty list
- * @exception IOException for invalid directory or for a bad disk.
- */
- public static File[] listFiles(File dir) throws IOException {
- File[] files = dir.listFiles();
- if(files == null) {
- throw new IOException("Invalid directory or I/O error occurred for dir: "
- + dir.toString());
- }
- return files;
- }
-
- /**
- * Platform independent implementation for {@link File#canWrite()}
- * @param f input file
- * @return On Unix, same as {@link File#canWrite()}
- * On Windows, true if process has write access on the path
- */
- public static boolean canWrite(File f) {
- if (RaftUtils.WINDOWS) {
- try {
- return NativeIO.Windows.access(f.getCanonicalPath(),
- NativeIO.Windows.AccessRight.ACCESS_WRITE);
- } catch (IOException e) {
- return false;
- }
- } else {
- return f.canWrite();
- }
- }
-}