You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by al...@apache.org on 2020/08/03 15:36:15 UTC
[cassandra] branch trunk updated: Throw FSWriteError upon write
failures in order to apply DiskFailurePolicy
This is an automated email from the ASF dual-hosted git repository.
aleksey pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/cassandra.git
The following commit(s) were added to refs/heads/trunk by this push:
new 0e65e85 Throw FSWriteError upon write failures in order to apply DiskFailurePolicy
0e65e85 is described below
commit 0e65e85861b84e87691d576ba80c5c3b3b7020d5
Author: yifan-c <yc...@gmail.com>
AuthorDate: Mon Jul 13 10:16:30 2020 -0700
Throw FSWriteError upon write failures in order to apply DiskFailurePolicy
patch by Yifan Cai; reviewed by Aleksey Yeschenko for CASSANDRA-15928
---
CHANGES.txt | 1 +
.../apache/cassandra/io/compress/CompressionMetadata.java | 6 +++++-
.../cassandra/io/sstable/metadata/MetadataSerializer.java | 8 ++++++++
src/java/org/apache/cassandra/io/util/FileUtils.java | 13 +++++++++++--
.../org/apache/cassandra/triggers/CustomClassLoader.java | 10 +++++-----
5 files changed, 30 insertions(+), 8 deletions(-)
diff --git a/CHANGES.txt b/CHANGES.txt
index e74f330..05ec961 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
4.0-beta2
+ * Throw FSWriteError upon write failures in order to apply DiskFailurePolicy (CASSANDRA-15928)
* Forbid altering UDTs used in partition keys (CASSANDRA-15933)
* Fix version parsing logic when upgrading from 3.0 (CASSANDRA-15973)
* Optimize NoSpamLogger use in hot paths (CASSANDRA-15766)
diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
index 3f08fe2..45cf7af 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
@@ -422,9 +422,13 @@ public class CompressionMetadata
out.flush();
SyncUtil.sync(fos);
}
+ catch (FileNotFoundException fnfe)
+ {
+ throw Throwables.propagate(fnfe);
+ }
catch (IOException e)
{
- throw Throwables.propagate(e);
+ throw new FSWriteError(e, filePath);
}
}
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
index 0ae7c32..d886338 100644
--- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
@@ -22,10 +22,13 @@ import java.util.*;
import java.util.function.Function;
import java.util.zip.CRC32;
+import com.google.common.base.Throwables;
import com.google.common.collect.Lists;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.io.FSWriteError;
import org.apache.cassandra.io.sstable.Component;
import org.apache.cassandra.io.sstable.CorruptSSTableException;
import org.apache.cassandra.io.sstable.Descriptor;
@@ -255,6 +258,11 @@ public class MetadataSerializer implements IMetadataSerializer
serialize(currentComponents, out, descriptor.version);
out.flush();
}
+ catch (IOException e)
+ {
+ Throwables.throwIfInstanceOf(e, FileNotFoundException.class);
+ throw new FSWriteError(e, filePath);
+ }
// we cant move a file on top of another file in windows:
if (FBUtilities.isWindows)
FileUtils.delete(descriptor.filenameFor(Component.STATS));
diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java
index 7c940c5..c24ce81 100644
--- a/src/java/org/apache/cassandra/io/util/FileUtils.java
+++ b/src/java/org/apache/cassandra/io/util/FileUtils.java
@@ -23,6 +23,7 @@ import java.lang.invoke.MethodHandles;
import java.lang.reflect.Method;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
+import java.nio.channels.ClosedChannelException;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
@@ -280,9 +281,13 @@ public final class FileUtils
{
channel.truncate(size);
}
+ catch (NoSuchFileException | FileNotFoundException nfe)
+ {
+ throw new RuntimeException(nfe);
+ }
catch (IOException e)
{
- throw new RuntimeException(e);
+ throw new FSWriteError(e, path);
}
}
@@ -730,9 +735,13 @@ public final class FileUtils
SyncUtil.force(fc, false);
}
}
+ catch (ClosedChannelException cce)
+ {
+ throw new RuntimeException(cce);
+ }
catch (IOException ex)
{
- throw new RuntimeException(ex);
+ throw new FSWriteError(ex, file);
}
}
diff --git a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
index cb0918c..6948c2d 100644
--- a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
+++ b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
@@ -23,7 +23,6 @@ package org.apache.cassandra.triggers;
import java.io.File;
import java.io.FilenameFilter;
-import java.io.IOError;
import java.io.IOException;
import java.net.URL;
import java.net.URLClassLoader;
@@ -35,6 +34,7 @@ import org.slf4j.LoggerFactory;
import com.google.common.io.Files;
+import org.apache.cassandra.io.FSWriteError;
import org.apache.cassandra.io.util.FileUtils;
/**
@@ -84,17 +84,17 @@ public class CustomClassLoader extends URLClassLoader
lib.mkdir();
lib.deleteOnExit();
}
+ File out = FileUtils.createTempFile("cassandra-", ".jar", lib);
+ out.deleteOnExit();
+ logger.info("Loading new jar {}", inputJar.getAbsolutePath());
try
{
- File out = FileUtils.createTempFile("cassandra-", ".jar", lib);
- out.deleteOnExit();
- logger.info("Loading new jar {}", inputJar.getAbsolutePath());
Files.copy(inputJar, out);
addURL(out.toURI().toURL());
}
catch (IOException ex)
{
- throw new IOError(ex);
+ throw new FSWriteError(ex, out);
}
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@cassandra.apache.org
For additional commands, e-mail: commits-help@cassandra.apache.org