[jboss-cvs] JBoss Messaging SVN: r3750 - in projects/jaio/trunk/jaio/java: src/org/jboss/jaio/api/logging and 2 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Feb 20 18:16:12 EST 2008


Author: clebert.suconic at jboss.com
Date: 2008-02-20 18:16:11 -0500 (Wed, 20 Feb 2008)
New Revision: 3750

Added:
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/LogFactory.java
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/Logger.java
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLog.java
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLogFactory.java
Modified:
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/AIOController.java
   projects/jaio/trunk/jaio/java/src/org/jboss/jaio/libaioimpl/LibAIOController.java
   projects/jaio/trunk/jaio/java/tests/org/jboss/jaio/libaioimpl/test/TestController.java
Log:
Logging and Threading

Modified: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/AIOController.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/AIOController.java	2008-02-20 23:15:24 UTC (rev 3749)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/AIOController.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -10,7 +10,13 @@
     
     void close();
     
-    void open(String fileName);
+    /**
+     * 
+     * Note: If you are using a native Linux implementation, maxIO can't be higher than what's defined on /proc/sys/fs/aio-max-nr, or you would get an error 
+     * @param fileName
+     * @param maxIO The number of max concurrent asynchrnous IO operations. It has to be balanced between the size of your writes and the capacity of your disk.
+     */
+    void open(String fileName, int maxIO);
 
     /** 
      * Warning: This function will perform a synchronous IO, probably translating to a fstat call

Added: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/LogFactory.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/LogFactory.java	                        (rev 0)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/LogFactory.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -0,0 +1,25 @@
+package org.jboss.jaio.api.logging;
+
+/** 
+ * I'm kind of tired of arguing about what's the best wrapper Log API in the world, and decided to abstract that.
+ * For this project I will be using System.out (i.e. what your grand father would be using 30 years ago if he was programming in Cobol)
+ * If you need any other fancy thing, just call LogFactory.setFactory, providing your own implementation, since I don't plan to have any dependencies on any Log4J, SysYXLogYJ or anything yet to be invented
+ * 
+ * @author Clebert Suconic
+ * */
+public abstract class LogFactory
+{
+    public abstract Logger createLogger(String className);
+    
+    // Default implementation = System.out
+    static LogFactory factory = new SystemOutLogFactory();
+    public static LogFactory getFactory()
+    {
+        return factory;
+    }
+    
+    public static void setFactory(LogFactory factory)
+    {
+        LogFactory.factory = factory;
+    }
+}


Property changes on: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/LogFactory.java
___________________________________________________________________
Name: svn:keywords
   + Id LastChangedDate Author Revision

Added: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/Logger.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/Logger.java	                        (rev 0)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/Logger.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -0,0 +1,18 @@
+package org.jboss.jaio.api.logging;
+
+
+/** 
+ * I'm kind of tired of arguing about what's the best wrapper Log API in the world, and decided to abstract that.
+ * For this project I will be using System.out (i.e. what your grand father would be using 30 years ago if he was programming in Cobol)
+ * If you need any other fancy thing, just call LogFactory.setFactory, providing your own implementation, since I don't plan to have any dependencies on any Log4J, SysJ or anything yet to be invented
+ * 
+ * @author Clebert Suconic
+ * */
+public abstract class Logger
+{
+     public abstract void debug(String log);
+     public abstract void warn(String log);
+     public abstract void info(String log);
+     public abstract void error(String log, Throwable ex);
+     public abstract void error(String log);
+}


Property changes on: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/Logger.java
___________________________________________________________________
Name: svn:keywords
   + Id LastChangedDate Author Revision

Added: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLog.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLog.java	                        (rev 0)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLog.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -0,0 +1,63 @@
+package org.jboss.jaio.api.logging;
+
+public class SystemOutLog extends Logger
+{
+
+    private String classname;
+    
+    public SystemOutLog (String classname)
+    {
+        this.classname = classname;
+    }
+    private void maskMsg(String level, String msg)
+    {
+        System.out.println(Thread.currentThread().getName() + ":" + classname + ":" + level + ":" + msg);
+        System.out.flush(); System.out.flush();
+    }
+    
+    @Override
+    public void debug(String msg)
+    {
+        maskMsg("debug", msg);
+    }
+
+    @Override
+    public void info(String msg)
+    {
+        maskMsg("info", msg);
+        
+    }
+
+    @Override
+    public void warn(String msg)
+    {
+        maskMsg("warn", msg);
+        
+    }
+
+    @Override
+    public void error(String msg)
+    {
+        error(msg, null);
+    }
+    
+    @Override
+    public void error(String msg, Throwable e)
+    {
+     
+        synchronized (System.out)
+        {
+            maskMsg("warn", msg);
+            
+            if (e == null)
+            {
+                e = new Exception ("trace");
+            }
+            
+            e.printStackTrace();
+            
+        }
+        
+    }
+
+}


Property changes on: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLog.java
___________________________________________________________________
Name: svn:keywords
   + Id LastChangedDate Author Revision

Added: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLogFactory.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLogFactory.java	                        (rev 0)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLogFactory.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -0,0 +1,11 @@
+package org.jboss.jaio.api.logging;
+
+public class SystemOutLogFactory extends LogFactory
+{
+
+    public Logger createLogger(String className)
+    {
+        return new SystemOutLog(className);
+    }
+
+}


Property changes on: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/api/logging/SystemOutLogFactory.java
___________________________________________________________________
Name: svn:keywords
   + Id LastChangedDate Author Revision

Modified: projects/jaio/trunk/jaio/java/src/org/jboss/jaio/libaioimpl/LibAIOController.java
===================================================================
--- projects/jaio/trunk/jaio/java/src/org/jboss/jaio/libaioimpl/LibAIOController.java	2008-02-20 23:15:24 UTC (rev 3749)
+++ projects/jaio/trunk/jaio/java/src/org/jboss/jaio/libaioimpl/LibAIOController.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -5,6 +5,8 @@
 import org.jboss.jaio.api.AIOController;
 import org.jboss.jaio.api.AIOPackage;
 import org.jboss.jaio.api.AIORecoveryCallback;
+import org.jboss.jaio.api.logging.LogFactory;
+import org.jboss.jaio.api.logging.Logger;
 
 /**
  * 
@@ -13,6 +15,7 @@
  */
 public class LibAIOController implements AIOController
 {
+    private static Logger log = LogFactory.getFactory().createLogger(LibAIOController.class.getCanonicalName());
     private boolean opened = false;
     private String fileName;
     private Thread poller;
@@ -27,22 +30,22 @@
     {
         try
         {
-            System.out.println("Jaio being loaded");
+            log.info("JLibAIO being loaded");
             System.loadLibrary("Jaio");
         }
         catch (Throwable e)
         {
-            e.printStackTrace();
+            log.error(e.getLocalizedMessage(), e);
             throw new RuntimeException (e.toString(), e);
         }
     }
 
     
-    public void open(String fileName)
+    public void open(String fileName, int maxIO)
     {
         opened = true;
         this.fileName=fileName;
-        handler = init (fileName, AIOPackage.class);
+        handler = init (fileName, AIOPackage.class, maxIO, LogFactory.getFactory().createLogger(this.getClass().getCanonicalName()+".native"));
         startPoller();
     }
     
@@ -66,12 +69,6 @@
         poller.start();
     }
     
-    public void open(String fileName, int pageSize) 
-    {
-        opened = true;
-        handler = init (fileName, pageSize, AIOPackage.class);
-    }
-    
     public void close()
     {
         if (poller!=null)
@@ -125,11 +122,11 @@
     }
     
     @SuppressWarnings("unchecked")
-    private static native long init(String fileName, Class aioPackageClazz);
+    /** 
+     * I'm sending aioPackageClazz here, as you could have multiple classLoaders with the same class, and I don't want the hassle of doing classLoading in the Native layer
+     */
+    private static native long init(String fileName, Class aioPackageClazz, int maxIO, Logger logger);
     
-    @SuppressWarnings("unchecked")
-    private static native long init(String fileName, int pageSize, Class aioPackageClazz);
-    
     private static native void append(long handle, AIOPackage aioPackage);
     
     private static native void preAllocate(long handle, int blocks, long size);
@@ -138,6 +135,7 @@
     
     /** Poll asynchrounous events from internal queues */
     private static native void internalPollEvents(long handler);
+
    
     
 }

Modified: projects/jaio/trunk/jaio/java/tests/org/jboss/jaio/libaioimpl/test/TestController.java
===================================================================
--- projects/jaio/trunk/jaio/java/tests/org/jboss/jaio/libaioimpl/test/TestController.java	2008-02-20 23:15:24 UTC (rev 3749)
+++ projects/jaio/trunk/jaio/java/tests/org/jboss/jaio/libaioimpl/test/TestController.java	2008-02-20 23:16:11 UTC (rev 3750)
@@ -27,29 +27,60 @@
         file.delete();
     }
 
-    public void aatestOpen()throws Exception
+    // If an AIO encode blocks is blocked, we should be able to finish execution (validating the thread model)
+    public void testBlockOnSize() throws Exception
     {
-        LibAIOController controller = new LibAIOController();
-        controller.open(FILE_NAME);
-        controller.close();
-    }
-    
-    public void aatestAddData() throws Exception
-    {
-        LibAIOController controller = new LibAIOController();
-        controller.open(FILE_NAME, 1024*1024);
-        LocalAIO aio = new LocalAIO();
+        System.out.println("++testDirectDataNoPage"); System.out.flush();
+        final LibAIOController controller = new LibAIOController();
+        controller.open(FILE_NAME, 100);
+        controller.preAllocate(1, 100 * 512);
+
+        final CountDownLatch releaseSize = new CountDownLatch(1);
+        final CountDownLatch releaseEncode = new CountDownLatch(1);
+        final CountDownLatch latchDone = new CountDownLatch(2);
+        final AIOBlocker block1 = new AIOBlocker(true, false, releaseSize, latchDone);
+        final AIOBlocker block2 = new AIOBlocker(false, true, releaseEncode, latchDone);
         
-        controller.append(aio);
-        controller.append(aio);
-        controller.append(aio);
-        assertTrue(aio.encodeCalled);
-        assertTrue(aio.encodeSizeCalled);
-        assertFalse(aio.doneCalled);
+        Thread blocker = new Thread()
+        {
+          public void run()
+          {
+              controller.append(block1);
+              controller.append(block2);
+          }
+        };
         
-//        controller.pollEvents();
         
-        assertTrue(aio.doneCalled);
+        blocker.start();
+
+        Thread.sleep(1000); // some time to the other thread wake up (a lot of time actually)
+        
+        ArrayList<LocalAIO> aios = new ArrayList<LocalAIO>();
+        
+        
+        CountDownLatch latchDoneOnRegularblocks = new CountDownLatch(10);
+        
+        for (int i=0;i<10;i++) aios.add(new LocalAIO(512, latchDoneOnRegularblocks));
+        
+        for (LocalAIO tmp: aios)
+        {
+            controller.append(tmp);
+        }
+        
+        latchDoneOnRegularblocks.await();
+        
+        for (LocalAIO tmp: aios)
+        {
+            assertTrue(tmp.doneCalled);
+        }
+        
+        releaseSize.countDown();
+        releaseEncode.countDown();
+        latchDone.await();
+        
+        assertTrue (block1.doneCalled);
+        assertTrue (block2.doneCalled);
+
         controller.close();
         
     }
@@ -65,7 +96,7 @@
             
             CountDownLatch latchDone = new CountDownLatch(NUMBER_LINES);
             final LibAIOController controller = new LibAIOController();
-            controller.open(FILE_NAME);
+            controller.open(FILE_NAME, 20000);
             System.out.println("Pre allocating file"); System.out.flush();
             
             long startPreAllocate = System.currentTimeMillis();
@@ -82,7 +113,6 @@
             
            
             long valueInitial = System.currentTimeMillis();
-            int counterFile=0;
     
             System.out.println("Adding data");
             
@@ -140,7 +170,7 @@
             //final int SIZE = 512;
             
             final LibAIOController controller = new LibAIOController();
-            controller.open(FILE_NAME);
+            controller.open(FILE_NAME, 2000);
             
             long startPreAllocate = System.currentTimeMillis();
             controller.preAllocate(1, NUMBER_LINES * SIZE);
@@ -148,7 +178,6 @@
             if (endPreAllocate != 0) System.out.println("PreAllocated the file in " + endPreAllocate + " seconds, What means " + ((100 * 1024*1024)/endPreAllocate) + " bytes per millisecond");
 
             long valueInitial = System.currentTimeMillis();
-            int counterFile=0;
     
             System.out.println("Adding data");
             
@@ -186,22 +215,81 @@
         catch (Exception e)
         {
             System.out.println("Received " + LocalAIO.staticDone + " before it failed");
+            throw e;
         }
         
     }
     
-    public void aatestPage() throws Exception
+    private static class AIOBlocker implements AIOPackage
     {
-        LibAIOController controller = new LibAIOController();
-        controller.open("/tmp/libaio.log", 8);
-        LocalAIO aio = new LocalAIO(500);
         
-        controller.append(aio);
-//        controller.pollEvents();
-        assertTrue(aio.doneCalled);
-        assertEquals(1, aio.timesDoneCalled);
-        controller.close();
+        boolean doneCalled = false;
         
+        private boolean blockSize;
+        private boolean blockEncode;
+        private CountDownLatch latch;
+        private CountDownLatch latchDone;
+        
+        public AIOBlocker(boolean blockSize, boolean blockEncode, CountDownLatch latch, CountDownLatch latchDone)
+        {
+            this.blockSize = blockSize;
+            this.blockEncode = blockEncode;
+            this.latch = latch;
+            this.latchDone = latchDone;
+        }
+
+        public void decode(int length, ByteBuffer buffer)
+        {
+        }
+
+        public void done()
+        {
+            latchDone.countDown();
+            doneCalled = true;
+        }
+
+        public void encode(ByteBuffer buffer)
+        {
+            if (blockEncode)
+            {
+                try
+                {
+                    latch.await();
+                } catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+            
+            for (int i=0;i<511;i++)
+            {
+                buffer.put((byte)'b');
+            }
+            buffer.put((byte)'\n');
+            
+            
+        }
+
+        public int encodeSize()
+        {
+            if (blockSize)
+            {
+                try
+                {
+                    latch.await();
+                } catch (InterruptedException e)
+                {
+                    e.printStackTrace();
+                }
+            }
+            return 512;
+        }
+
+        public void onError(int errorCode, String errorMessage)
+        {
+            
+        }
+        
     }
     
     private static class LocalAIO implements AIOPackage




More information about the jboss-cvs-commits mailing list