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