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();
     }
 


Reply via email to