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 {