Author: jukka Date: Tue Mar 18 19:28:39 2014 New Revision: 1579024 URL: http://svn.apache.org/r1579024 Log: OAK-1530: TarMK thread logs warning
Catch the http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6539707 exceptions, and log a milder warning for those cases Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/MappedAccess.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/RandomAccess.java jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java?rev=1579024&r1=1579023&r2=1579024&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/FileStore.java Tue Mar 18 19:28:39 2014 @@ -213,11 +213,18 @@ public class FileStore implements Segmen tracker.getWriter().flush(); synchronized (this) { + boolean success = true; for (TarFile file : bulkFiles) { - file.flush(); + success = success && file.flush(); } for (TarFile file : dataFiles) { - file.flush(); + success = success && file.flush(); + } + if (!success) { + log.warn("Failed to sync one ore more tar files with" + + " the underlying file system, possibly because of" + + " http://bugs.java.com/bugdatabase/view_bug.do?bug_id=6539707." + + " Will retry later."); } journalFile.writeBytes(after + " root\n"); journalFile.getChannel().force(false); Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/MappedAccess.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/MappedAccess.java?rev=1579024&r1=1579023&r2=1579024&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/MappedAccess.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/MappedAccess.java Tue Mar 18 19:28:39 2014 @@ -66,7 +66,7 @@ class MappedAccess implements FileAccess } @Override - public synchronized void flush() { + public synchronized void flush() throws IOException { if (updated) { buffer.force(); updated = false; @@ -74,7 +74,8 @@ class MappedAccess implements FileAccess } @Override - public void close() { + public void close() throws IOException { + flush(); } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/RandomAccess.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/RandomAccess.java?rev=1579024&r1=1579023&r2=1579024&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/RandomAccess.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/RandomAccess.java Tue Mar 18 19:28:39 2014 @@ -29,6 +29,8 @@ class RandomAccess implements FileAccess private final RandomAccessFile file; + private boolean updated = false; + RandomAccess(@Nonnull RandomAccessFile file) throws IOException { this.file = checkNotNull(file); } @@ -55,16 +57,20 @@ class RandomAccess implements FileAccess throws IOException { file.seek(position); file.write(buffer, offset, length); + updated = true; } @Override - public void flush() throws IOException { - file.getFD().sync(); + public synchronized void flush() throws IOException { + if (updated) { + file.getFD().sync(); + updated = false; + } } @Override - public void close() throws IOException { - file.close(); + public synchronized void close() throws IOException { + file.close(); // will automatically sync unsaved changes } } Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java?rev=1579024&r1=1579023&r2=1579024&view=diff ============================================================================== --- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java (original) +++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/segment/file/TarFile.java Tue Mar 18 19:28:39 2014 @@ -191,13 +191,26 @@ class TarFile { access.write(position, header, 0, BLOCK_SIZE); } - public void flush() throws IOException { - access.flush(); + public boolean flush() throws IOException { + try { + access.flush(); + return true; + } catch (IOException e) { + StackTraceElement[] trace = e.getStackTrace(); + if (trace.length > 2 + && "java.nio.MappedByteBuffer".equals(trace[0].getClassName()) + && "force0".equals(trace[0].getMethodName()) + && "java.nio.MappedByteBuffer".equals(trace[1].getClassName()) + && "force".equals(trace[1].getMethodName())) { + return false; + } else { + throw e; + } + } } void close() throws IOException { - flush(); access.close(); }
