changeset 52:555325bdb825 default tip

* avoid member to stay marked as in use if there is an exception in RRDCommandPool.getConnection()
author Peter Stamfest <peter@stamfest.at>
date Sun, 24 Jan 2016 17:47:24 +0100
parents 5063db74249e
children
files pom.xml src/main/java/net/stamfest/rrd/RRDCommandPool.java
diffstat 2 files changed, 26 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/pom.xml	Sun Jan 24 17:46:18 2016 +0100
+++ b/pom.xml	Sun Jan 24 17:47:24 2016 +0100
@@ -3,7 +3,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>net.stamfest</groupId>
 	<artifactId>java-rrd</artifactId>
-	<version>2.0.0</version>
+	<version>2.0.1</version>
 	<name>java-rrd</name>
 	<description>
 		This is a Java interface to Tobi Oetikers rrdtool. It is pure 
--- a/src/main/java/net/stamfest/rrd/RRDCommandPool.java	Sun Jan 24 17:46:18 2016 +0100
+++ b/src/main/java/net/stamfest/rrd/RRDCommandPool.java	Sun Jan 24 17:47:24 2016 +0100
@@ -128,13 +128,31 @@
 	    member.inuse = true;
 	}
 	
-	member.requestcount++;
-	if (member.rrdp == null) {
-	    member.requestcount = 0;
-	    member.rrdp = factory.createRRDCommand();
-	}
-	
-	return new RRDPoolMemberWrapper(member);
+        /* 
+        NOTE: This is a hackish way to make sure we do not block a member if anything goes
+        wrong beyond this point and an exception gets thrown: check the final return
+        value to be not null in the finally block...
+         */
+        RRDPoolMemberWrapper r = null;
+        try {
+            member.requestcount++;
+            if (member.rrdp == null) {
+                member.requestcount = 0;
+                member.rrdp = factory.createRRDCommand();
+            }
+            r = new RRDPoolMemberWrapper(member);
+            return r;
+        } finally {
+            if (r == null) {
+                /* if r is null, an exception must have been thrown and we would 
+                loose the ability to unlock the member later on. Catch this 
+                possibility right here. */
+                synchronized (this) {
+                    member.inuse = false;
+                    this.notify();
+                }
+            }
+        }
     }
     
     public void done(RRDCommand cmd) {