Author: jbellis
Date: Tue Nov  2 06:11:09 2010
New Revision: 1029959

URL: http://svn.apache.org/viewvc?rev=1029959&view=rev
Log:
fix jna errno reporting.  patch by jbellis; reviewed by brandonwilliams for 
CASSANDRA-1694

Modified:
    cassandra/branches/cassandra-0.6/CHANGES.txt
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/util/FileUtils.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/CLibrary.java
    
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java

Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=1029959&r1=1029958&r2=1029959&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Tue Nov  2 06:11:09 2010
@@ -6,6 +6,7 @@ dev
  * initMetadata wasn't loading saved partitioner from disk (CASSANDRA-1638)
  * log tpstats when dropping messages (CASSANDRA-1660)
  * Avoid dropping messages off the client request path (CASSANDRA-1676)
+ * fix jna errno reporting (CASSANDRA-1694)
 
 
 0.6.6

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/util/FileUtils.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/util/FileUtils.java?rev=1029959&r1=1029958&r2=1029959&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/util/FileUtils.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/io/util/FileUtils.java
 Tue Nov  2 06:11:09 2010
@@ -23,6 +23,7 @@ import java.text.DecimalFormat;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
 
+import com.sun.jna.LastErrorException;
 import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
 
 import org.apache.log4j.Logger;
@@ -202,25 +203,21 @@ public class FileUtils
      */
     public static void createHardLink(File sourceFile, File destinationFile) 
throws IOException
     {
-        int errno = Integer.MIN_VALUE;
         try
         {
             int result = CLibrary.link(sourceFile.getAbsolutePath(), 
destinationFile.getAbsolutePath());
-            if (result != 0)
-                errno = Native.getLastError();
+            assert result == 0; // success is always zero
         }
         catch (UnsatisfiedLinkError e)
         {
             createHardLinkWithExec(sourceFile, destinationFile);
-            return;
         }
-
-        if (errno != Integer.MIN_VALUE)
+        catch (LastErrorException e)
         {
             // there are 17 different error codes listed on the man page.  
punt until/unless we find which
             // ones actually turn up in practice.
-            throw new IOException(String.format("Unable to create hard link 
from %s to %s (errno %d)", 
-                                                sourceFile, destinationFile, 
errno));
+            throw new IOException(String.format("Unable to create hard link 
from %s to %s (errno %d)",
+                                                sourceFile, destinationFile, 
CLibrary.errno(e)));
         }
     }
 

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/CLibrary.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/CLibrary.java?rev=1029959&r1=1029958&r2=1029959&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/CLibrary.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/CLibrary.java
 Tue Nov  2 06:11:09 2010
@@ -21,6 +21,7 @@ package org.apache.cassandra.utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.sun.jna.LastErrorException;
 import com.sun.jna.Native;
 
 public final class CLibrary
@@ -48,10 +49,23 @@ public final class CLibrary
         }
     }
 
-    public static native int mlockall(int flags);
-    public static native int munlockall();
+    public static native int mlockall(int flags) throws LastErrorException;
+    public static native int munlockall() throws LastErrorException;
 
-    public static native int link(String from, String to);
+    public static native int link(String from, String to) throws 
LastErrorException;
+
+    public static int errno(LastErrorException e)
+    {
+        try
+        {
+            return e.getErrorCode();
+        }
+        catch (NoSuchMethodError x)
+        {
+            logger.warn("Obsolete version of JNA present; unable to read 
errno. Upgrade to JNA 3.2.7 or later");
+            return 0;
+        }
+    }
 
     private CLibrary() {}
 }

Modified: 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java?rev=1029959&r1=1029958&r2=1029959&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
 (original)
+++ 
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/utils/FBUtilities.java
 Tue Nov  2 06:11:09 2010
@@ -37,6 +37,7 @@ import org.apache.log4j.Logger;
 
 import org.apache.commons.collections.iterators.CollatingIterator;
 
+import com.sun.jna.LastErrorException;
 import com.sun.jna.Native;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
@@ -553,22 +554,18 @@ public class FBUtilities
 
     public static void tryMlockall()
     {
-        int errno = Integer.MIN_VALUE;
         try
         {
             int result = CLibrary.mlockall(CLibrary.MCL_CURRENT);
-            if (result != 0)
-                errno = Native.getLastError();
+            assert result == 0; // mlockall should always be zero on success
         }
         catch (UnsatisfiedLinkError e)
         {
             // this will have already been logged by CLibrary, no need to 
repeat it
-            return;
         }
-
-        if (errno != Integer.MIN_VALUE)
+        catch (LastErrorException e)
         {
-            if (errno == CLibrary.ENOMEM && 
System.getProperty("os.name").toLowerCase().contains("linux"))
+            if (CLibrary.errno(e) == CLibrary.ENOMEM && 
System.getProperty("os.name").toLowerCase().contains("linux"))
             {
                 logger_.warn("Unable to lock JVM memory (ENOMEM)."
                              + " This can result in part of the JVM being 
swapped out, especially with mmapped I/O enabled."
@@ -577,7 +574,7 @@ public class FBUtilities
             else if 
(!System.getProperty("os.name").toLowerCase().contains("mac"))
             {
                 // OS X allows mlockall to be called, but always returns an 
error
-                logger_.warn("Unknown mlockall error " + errno);
+                logger_.warn("Unknown mlockall error " + CLibrary.errno(e));
             }
         }
     }


Reply via email to