[Mulgara-svn] r389 - in trunk/src/jar: resolver/java/org/mulgara/resolver tuples/java/org/mulgara/store/tuples

ronald at mulgara.org ronald at mulgara.org
Wed Aug 29 01:21:25 UTC 2007


Author: ronald
Date: 2007-08-28 20:21:25 -0500 (Tue, 28 Aug 2007)
New Revision: 389

Modified:
   trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java
   trunk/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java
Log:
Fix file-descriptor leak: close tuples after use. TuplesOperations methods such
as append(), join(), and subtract() make copies of the input tuples, so those
inputs need to be explicitly closed. The missing closes were causing a file
leak (and eventually a too-many-open-files error) in materialized HybridTuples.


Modified: trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java
===================================================================
--- trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java	2007-08-29 01:16:15 UTC (rev 388)
+++ trunk/src/jar/resolver/java/org/mulgara/resolver/LocalQueryResolver.java	2007-08-29 01:21:25 UTC (rev 389)
@@ -129,17 +129,31 @@
         new NVPair(ModelUnion.class, new ModelResolutionHandler() {
           public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr,
                                 Constraint constraint) throws Exception {
-            return TuplesOperations.append(
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint),
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint));
+            Tuples lhs = ConstraintOperations.
+                resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint);
+            Tuples rhs = ConstraintOperations.
+                resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint);
+            try {
+              return TuplesOperations.append(lhs, rhs);
+            } finally {
+              lhs.close();
+              rhs.close();
+            }
           }
         }),
         new NVPair(ModelIntersection.class, new ModelResolutionHandler() {
           public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr,
                                 Constraint constraint) throws Exception {
-            return TuplesOperations.join(
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint),
-                ConstraintOperations.resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint));
+            Tuples lhs = ConstraintOperations.
+                resolveModelExpression(context, ((ModelOperation)modelExpr).getLHS(), constraint);
+            Tuples rhs = ConstraintOperations.
+                resolveModelExpression(context, ((ModelOperation)modelExpr).getRHS(), constraint);
+            try {
+              return TuplesOperations.join(lhs, rhs);
+            } finally {
+              lhs.close();
+              rhs.close();
+            }
           }
         }),
         new NVPair(ModelResource.class, new ModelResolutionHandler() {
@@ -157,21 +171,42 @@
       {
         new NVPair(ConstraintConjunction.class, new ConstraintResolutionHandler() {
           public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return TuplesOperations.join(
-              context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr));
+            List l =
+                context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr);
+            try {
+              return TuplesOperations.join(l);
+            } finally {
+              Iterator i = l.iterator();
+              while (i.hasNext()) {
+                ((Tuples)i.next()).close();
+              }
+            }
           }
         }),
         new NVPair(ConstraintDisjunction.class, new ConstraintResolutionHandler() {
           public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
-            return TuplesOperations.append(
-                context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr));
+            List l =
+                context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr);
+            try {
+              return TuplesOperations.append(l);
+            } finally {
+              Iterator i = l.iterator();
+              while (i.hasNext()) {
+                ((Tuples)i.next()).close();
+              }
+            }
           }
         }),
         new NVPair(ConstraintDifference.class, new ConstraintResolutionHandler() {
           public Tuples resolve(QueryEvaluationContext context, ModelExpression modelExpr, ConstraintExpression constraintExpr) throws Exception {
             List args = context.resolveConstraintOperation(modelExpr, (ConstraintOperation)constraintExpr);
             assert args.size() == 2;
-            return TuplesOperations.subtract((Tuples)args.get(0), (Tuples)args.get(1));
+            try {
+              return TuplesOperations.subtract((Tuples)args.get(0), (Tuples)args.get(1));
+            } finally {
+              ((Tuples)args.get(0)).close();
+              ((Tuples)args.get(1)).close();
+            }
           }
         }),
         new NVPair(ConstraintIs.class, new ConstraintResolutionHandler() {

Modified: trunk/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java
===================================================================
--- trunk/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java	2007-08-29 01:16:15 UTC (rev 388)
+++ trunk/src/jar/tuples/java/org/mulgara/store/tuples/TuplesOperations.java	2007-08-29 01:21:25 UTC (rev 389)
@@ -322,7 +322,13 @@
         sortedSubtrahend = (null == subtrahend.getComparator()) ? sort(subtrahend) : subtrahend;
       }
       // return the difference
-      return new Difference(minuend, sortedSubtrahend);
+      try {
+        return new Difference(minuend, sortedSubtrahend);
+      } finally {
+        if (sortedSubtrahend != subtrahend) {
+          sortedSubtrahend.close();
+        }
+      }
 
     } catch (RuntimeException re) {
       logger.warn("RuntimeException thrown in subtraction", re);




More information about the Mulgara-svn mailing list