You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ir...@apache.org on 2018/08/15 11:43:56 UTC
ignite git commit: IGNITE-8761 WAL fsync at rollover should be
asynchronous in LOG_ONLY and BACKGROUND modes - Fixes #4356.
Repository: ignite
Updated Branches:
refs/heads/master a14ee5cd8 -> 3e75f9101
IGNITE-8761 WAL fsync at rollover should be asynchronous in LOG_ONLY and BACKGROUND modes - Fixes #4356.
Signed-off-by: Ivan Rakov <ir...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3e75f910
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3e75f910
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3e75f910
Branch: refs/heads/master
Commit: 3e75f9101411f0a6bf72aee1e52b2fc3507792ab
Parents: a14ee5c
Author: vd-pyatkov <vp...@gridgain.com>
Authored: Wed Aug 15 14:42:42 2018 +0300
Committer: Ivan Rakov <ir...@apache.org>
Committed: Wed Aug 15 14:42:42 2018 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 3 +
.../wal/FileWriteAheadLogManager.java | 62 +++++++++++++++++++-
2 files changed, 63 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/3e75f910/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 21f6c5f..02c8b30 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -783,6 +783,9 @@ public final class IgniteSystemProperties {
*/
public static final String IGNITE_WAL_SERIALIZER_VERSION = "IGNITE_WAL_SERIALIZER_VERSION";
+ /** Property for setup Ignite WAL segment sync timeout. */
+ public static final String IGNITE_WAL_SEGMENT_SYNC_TIMEOUT = "IGNITE_WAL_SEGMENT_SYNC_TIMEOUT";
+
/**
* If the property is set Ignite will use legacy node comparator (based on node order) inste
*
http://git-wip-us.apache.org/repos/asf/ignite/blob/3e75f910/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
----------------------------------------------------------------------
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 712dca0..ed79e11 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
@@ -124,6 +124,7 @@ import static java.nio.file.StandardOpenOption.CREATE;
import static java.nio.file.StandardOpenOption.READ;
import static java.nio.file.StandardOpenOption.WRITE;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_WAL_MMAP;
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_WAL_SEGMENT_SYNC_TIMEOUT;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_WAL_SERIALIZER_VERSION;
import static org.apache.ignite.configuration.WALMode.LOG_ONLY;
import static org.apache.ignite.events.EventType.EVT_WAL_SEGMENT_ARCHIVED;
@@ -135,12 +136,15 @@ import static org.apache.ignite.internal.processors.cache.persistence.wal.serial
import static org.apache.ignite.internal.processors.cache.persistence.wal.serializer.RecordV1Serializer.readSegmentHeader;
import static org.apache.ignite.internal.util.IgniteUtils.findField;
import static org.apache.ignite.internal.util.IgniteUtils.findNonPublicMethod;
+import static org.apache.ignite.internal.util.IgniteUtils.sleep;
/**
* File WAL manager.
*/
@SuppressWarnings("IfMayBeConditional")
public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter implements IgniteWriteAheadLogManager {
+ /** Dfault wal segment sync timeout. */
+ public static final long DFLT_WAL_SEGMENT_SYNC_TIMEOUT = 500L;
/** {@link MappedByteBuffer#force0(java.io.FileDescriptor, long, long)}. */
private static final Method force0 = findNonPublicMethod(
MappedByteBuffer.class, "force0",
@@ -351,6 +355,9 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
*/
@Nullable private volatile IgniteInClosure<FileIO> createWalFileListener;
+ /** Wal segment sync worker. */
+ private WalSegmentSyncer walSegmentSyncWorker;
+
/**
* @param ctx Kernal context.
*/
@@ -453,7 +460,10 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
walDisableContext = cctx.walState().walDisableContext();
- if (mode != WALMode.NONE) {
+ if (mode != WALMode.NONE && mode != WALMode.FSYNC) {
+ walSegmentSyncWorker = new WalSegmentSyncer(igCfg.getIgniteInstanceName(),
+ cctx.kernalContext().log(WalSegmentSyncer.class));
+
if (log.isInfoEnabled())
log.info("Started write-ahead log manager [mode=" + mode + ']');
}
@@ -562,6 +572,9 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
if (decompressor != null)
decompressor.shutdown();
+
+ if (walSegmentSyncWorker != null)
+ walSegmentSyncWorker.shutdown();
}
catch (Exception e) {
U.error(log, "Failed to gracefully close WAL segment: " + this.currHnd.fileIO, e);
@@ -583,6 +596,9 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
new IgniteThread(archiver).start();
}
+ if (walSegmentSyncWorker != null)
+ new IgniteThread(walSegmentSyncWorker).start();
+
if (compressor != null)
compressor.start();
}
@@ -3320,7 +3336,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
writeBuffer(seg.position(), seg.buffer());
}
catch (Throwable e) {
- log.error("Exception in WAL writer thread: ", e);
+ log.error("Exception in WAL writer thread:", e);
err = e;
}
@@ -3505,6 +3521,48 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
}
/**
+ * Syncs WAL segment file.
+ */
+ private class WalSegmentSyncer extends GridWorker {
+ /** Sync timeout. */
+ long syncTimeout;
+
+ /**
+ * @param igniteInstanceName Ignite instance name.
+ * @param log Logger.
+ */
+ public WalSegmentSyncer(String igniteInstanceName, IgniteLogger log) {
+ super(igniteInstanceName, "wal-segment-syncer", log);
+
+ syncTimeout = Math.max(IgniteSystemProperties.getLong(IGNITE_WAL_SEGMENT_SYNC_TIMEOUT,
+ DFLT_WAL_SEGMENT_SYNC_TIMEOUT), 100L);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void body() throws InterruptedException, IgniteInterruptedCheckedException {
+ while (!isCancelled()) {
+ sleep(syncTimeout);
+
+ try {
+ flush(null, true);
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Exception when flushing WAL.", e);
+ }
+ }
+ }
+
+ /** Shutted down the worker. */
+ private void shutdown() {
+ synchronized (this) {
+ U.cancel(this);
+ }
+
+ U.join(this, log);
+ }
+ }
+
+ /**
* Scans provided folder for a WAL segment files
* @param walFilesDir directory to scan
* @return found WAL file descriptors