This is an automated email from the ASF dual-hosted git repository.

alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new 03a8a00  IGNITE-12254 IO errors during write header of WAL files in 
FSYNC mode should be handled by failure handler
03a8a00 is described below

commit 03a8a004a53b7b775454f74169bf793a449178f8
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Mon Oct 14 16:01:59 2019 +0300

    IGNITE-12254 IO errors during write header of WAL files in FSYNC mode 
should be handled by failure handler
---
 .../persistence/wal/FileWriteAheadLogManager.java  |  4 +-
 .../wal/filehandle/FsyncFileWriteHandle.java       |  6 +--
 .../persistence/IgnitePdsCorruptedStoreTest.java   | 46 +++++++++++++++++++++-
 3 files changed, 50 insertions(+), 6 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
index d337944..c22ed28 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
@@ -1268,8 +1268,6 @@ public class FileWriteAheadLogManager extends 
GridCacheSharedManagerAdapter impl
                 throw e;
             }
 
-            next.writeHeader();
-
             if (rec != null) {
                 WALPointer ptr = next.addRecord(rec);
 
@@ -1435,6 +1433,8 @@ public class FileWriteAheadLogManager extends 
GridCacheSharedManagerAdapter impl
                 }
             }
 
+            hnd.writeHeader();
+
             return hnd;
         }
         catch (IgniteCheckedException e) {
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FsyncFileWriteHandle.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FsyncFileWriteHandle.java
index 9bfedd2..b1c7585 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FsyncFileWriteHandle.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FsyncFileWriteHandle.java
@@ -188,9 +188,9 @@ class FsyncFileWriteHandle extends AbstractFileHandle 
implements FileWriteHandle
      * Write serializer version to current handle. NOTE: Method mutates {@code 
fileIO} position, written and
      * lastFsyncPos fields.
      *
-     * @throws IgniteCheckedException If fail to write serializer version.
+     * @throws StorageException If fail to write serializer version.
      */
-    @Override public void writeHeader() throws IgniteCheckedException {
+    @Override public void writeHeader() throws StorageException {
         try {
             assert fileIO.position() == 0 : "Serializer version can be written 
only at the begin of file " +
                 fileIO.position();
@@ -203,7 +203,7 @@ class FsyncFileWriteHandle extends AbstractFileHandle 
implements FileWriteHandle
             head.set(new FakeRecord(new FileWALPointer(getSegmentId(), 
(int)updatedPosition, 0), false));
         }
         catch (IOException e) {
-            throw new IgniteCheckedException("Unable to write serializer 
version for segment " + getSegmentId(), e);
+            throw new StorageException("Unable to write serializer version for 
segment " + getSegmentId(), e);
         }
     }
 
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
index 64cef84..318cb61 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePdsCorruptedStoreTest.java
@@ -20,6 +20,7 @@ package 
org.apache.ignite.internal.processors.cache.persistence;
 import java.io.File;
 import java.io.IOException;
 import java.io.Serializable;
+import java.nio.ByteBuffer;
 import java.nio.file.OpenOption;
 import java.nio.file.StandardOpenOption;
 import java.util.Arrays;
@@ -37,6 +38,7 @@ import org.apache.ignite.configuration.ConnectorConfiguration;
 import org.apache.ignite.configuration.DataRegionConfiguration;
 import org.apache.ignite.configuration.DataStorageConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.WALMode;
 import org.apache.ignite.failure.AbstractFailureHandler;
 import org.apache.ignite.failure.FailureContext;
 import org.apache.ignite.internal.IgniteEx;
@@ -44,6 +46,8 @@ import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.pagemem.PageIdAllocator;
 import org.apache.ignite.internal.pagemem.PageIdUtils;
+import org.apache.ignite.internal.pagemem.wal.record.CheckpointRecord;
+import org.apache.ignite.internal.pagemem.wal.record.RolloverType;
 import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 import org.apache.ignite.internal.processors.cache.persistence.file.FileIO;
 import 
org.apache.ignite.internal.processors.cache.persistence.file.FileIODecorator;
@@ -112,6 +116,7 @@ public class IgnitePdsCorruptedStoreTest extends 
GridCommonAbstractTest {
                     .setMaxSize(100 * 1024 * 1024)
                     .setPersistenceEnabled(true)
             )
+            .setWalMode(WALMode.FSYNC)
             .setFileIOFactory(failingFileIOFactory);
 
         cfg.setDataStorageConfiguration(memCfg);
@@ -379,7 +384,6 @@ public class IgnitePdsCorruptedStoreTest extends 
GridCommonAbstractTest {
         fut.cancel();
     }
 
-
     /**
      * Test node invalidation due to checkpoint error.
      */
@@ -443,6 +447,46 @@ public class IgnitePdsCorruptedStoreTest extends 
GridCommonAbstractTest {
     }
 
     /**
+     * Test node invalidation due to error on WAL write header.
+     */
+    @Test
+    public void testWalFsyncWriteHeaderFailure() throws Exception {
+        IgniteEx ignite = startGrid(0);
+
+        ignite.cluster().active(true);
+
+        ignite.cache(CACHE_NAME1).put(0, 0);
+
+        failingFileIOFactory.createClosure((file, options) -> {
+            FileIO delegate = 
failingFileIOFactory.delegateFactory().create(file, options);
+
+            if (file.getName().endsWith(".wal")) {
+                return new FileIODecorator(delegate) {
+                    @Override public int write(ByteBuffer srcBuf) throws 
IOException {
+                        throw new IOException("No space left on device");
+                    }
+                };
+            }
+
+            return delegate;
+        });
+
+        ignite.context().cache().context().database().checkpointReadLock();
+
+        try {
+            ignite.context().cache().context().wal().log(new 
CheckpointRecord(null), RolloverType.NEXT_SEGMENT);
+        }
+        catch (StorageException expected) {
+            // No-op.
+        }
+        finally {
+            
ignite.context().cache().context().database().checkpointReadUnlock();
+        }
+
+        waitFailure(StorageException.class);
+    }
+
+    /**
      * @param expError Expected error.
      */
     private void waitFailure(Class<? extends Throwable> expError) throws 
IgniteInterruptedCheckedException {

Reply via email to