[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