You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/08/01 09:26:19 UTC
[36/47] ignite git commit: IGNITE-5816 - Fixed race in WAL segment
close leading to ClosedChannelException
IGNITE-5816 - Fixed race in WAL segment close leading to ClosedChannelException
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/770efe23
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/770efe23
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/770efe23
Branch: refs/heads/master
Commit: 770efe23ce58a62461c698b42b4d58c5791bceb2
Parents: c685e39
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Fri Jul 28 17:26:19 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jul 28 17:26:52 2017 +0300
----------------------------------------------------------------------
.../wal/FileWriteAheadLogManager.java | 32 +++++++++++++++-----
1 file changed, 24 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/770efe23/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 b655ddf..85eb480 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
@@ -1800,6 +1800,13 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
if (flush(ptr, stop))
return;
+ else if (stop) {
+ FakeRecord fr = (FakeRecord)head.get();
+
+ assert fr.stop : "Invalid fake record on top of the queue: " + fr;
+
+ expWritten = recordOffset(fr);
+ }
// Spin-wait for a while before acquiring the lock.
for (int i = 0; i < 64; i++) {
@@ -2049,14 +2056,11 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
* @throws StorageException If failed.
*/
private boolean close(boolean rollOver) throws IgniteCheckedException, StorageException {
- if (mode == WALMode.DEFAULT)
- fsync(null, true);
- else
+ if (stop.compareAndSet(false, true)) {
flushOrWait(null, true);
- assert stopped() : "Segment is not closed after close flush: " + head.get();
+ assert stopped() : "Segment is not closed after close flush: " + head.get();
- if (stop.compareAndSet(false, true)) {
try {
int switchSegmentRecSize = RecordV1Serializer.REC_TYPE_SIZE + RecordV1Serializer.FILE_WAL_POINTER_SIZE;
@@ -2070,10 +2074,22 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
buf.rewind();
- fileIO.write(buf, written);
+ int rem = buf.remaining();
+
+ while (rem > 0) {
+ int written0 = fileIO.write(buf, written);
+
+ written += written0;
+
+ rem -= written0;
+ }
+ }
+
+ // Do the final fsync.
+ if (mode == WALMode.DEFAULT) {
+ fileIO.force();
- if (mode == WALMode.DEFAULT)
- fileIO.force();
+ lastFsyncPos = written;
}
fileIO.close();