|
From: <tho...@us...> - 2014-08-16 14:33:59
|
Revision: 8619
http://sourceforge.net/p/bigdata/code/8619
Author: thompsonbry
Date: 2014-08-16 14:33:51 +0000 (Sat, 16 Aug 2014)
Log Message:
-----------
This has been traced to a query hint override to control the operator parallelism (maxParallel=2). While the HashIndexOp does c
Workaround: Bind the maxParallel query hint more closely to a specific join or other operator (sometimes difficult or impossible).
Workaround: Do not use the maxParallel query hint if the query has solution set hash joins (which appear if there is a nested complex optional join group, sub-select, INCLUDE, etc.)
Fix: Added ISingleThreadedOp interface and modified PipelineOp.getMaxParallel() to test for that interface and ignore annotation when the interface is present on an operator. This interface was added to the following operators:
- HashIndexOp
- HTreeNamedSubqueryOp
- JVMNamedSubqueryOp
- HTreeHashJoinOp
- JVMHashJoinOp
- HTreeDistinctBindingSetsOp (also fixed unit tests that looked for UnsupportedOperationException rather than IllegalArgumentException)
- PipelinedAggregationOp (also fixed unit tests that looked for UnsupportedOperationException rather than IllegalArgumentException)
Other changes to:
- PipelineOp (added interface test and assertMaxParallelOne() method).
Note: Also reduced the #of threads for StressTestConcurrentUnisolatedIndices since it was failing in CI with "unable to create new native thread".
Modified Paths:
--------------
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/PipelineOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/HTreeNamedSubqueryOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/JVMNamedSubqueryOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HTreeHashJoinOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashIndexOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashJoinOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/JVMHashJoinOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/HTreeDistinctBindingSetsOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/PipelinedAggregationOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/join/TestJVMHashJoinOp.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/solutions/TestHTreeDistinctBindingSets.java
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/journal/StressTestUnisolatedReadWriteIndex.java
Added Paths:
-----------
branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/ISingleThreadedOp.java
Added: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/ISingleThreadedOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/ISingleThreadedOp.java (rev 0)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/ISingleThreadedOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -0,0 +1,40 @@
+/*
+
+Copyright (C) SYSTAP, LLC 2006-2008. All rights reserved.
+
+Contact:
+ SYSTAP, LLC
+ 4501 Tower Road
+ Greensboro, NC 27410
+ lic...@bi...
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; version 2 of the License.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+/*
+ * Created on Aug 26, 2010
+ */
+package com.bigdata.bop;
+
+/**
+ * Marker interface for an operator whose instances do not support concurrent
+ * execution.
+ *
+ * @author <a href="mailto:tho...@us...">Bryan Thompson</a>
+ *
+ * @see PipelineOp.Annotations#MAX_PARALLEL
+ */
+public interface ISingleThreadedOp {
+
+}
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/PipelineOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/PipelineOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/PipelineOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -122,6 +122,8 @@
* {@link #MAX_MESSAGES_PER_TASK} and {@link #PIPELINE_QUEUE_CAPACITY}
* have less effect and performance tends to be best around a modest
* value (10) for those annotations.
+ *
+ * @see ISingleThreadedOp
*/
String MAX_PARALLEL = PipelineOp.class.getName() + ".maxParallel";
@@ -505,17 +507,49 @@
//
// }
- /**
- * The maximum parallelism with which tasks may be evaluated for this
- * operator (this is a per-shard limit in scale-out). A value of ONE (1)
- * indicates that at most ONE (1) instance of this task may be executing in
- * parallel for a given shard and may be used to indicate that the operator
- * evaluation task is not thread-safe.
- *
- * @see Annotations#MAX_PARALLEL
- */
+ /**
+ * If parallel evaluation is not allowed, then throws
+ * {@link IllegalArgumentException}.
+ */
+ final protected void assertMaxParallelOne() {
+
+ /*
+ * Note: Tests the annotation, not getMaxParallel(), since we want to
+ * make sure the annotation is valid and getMaxParallel() also tests for
+ * the ISingleThreadedOp interface.
+ */
+ if (getProperty(PipelineOp.Annotations.MAX_PARALLEL,
+ PipelineOp.Annotations.DEFAULT_MAX_PARALLEL) != 1) {
+
+ throw new IllegalArgumentException(
+ PipelineOp.Annotations.MAX_PARALLEL + "="
+ + getMaxParallel());
+
+ }
+
+ }
+
+ /**
+ * The maximum parallelism with which tasks may be evaluated for this
+ * operator (this is a per-shard limit in scale-out). A value of ONE (1)
+ * indicates that at most ONE (1) instance of this task may be executing in
+ * parallel for a given shard and may be used to indicate that the operator
+ * evaluation task is not thread-safe.
+ *
+ * @see Annotations#MAX_PARALLEL
+ * @see ISingleThreadedOp
+ *
+ * @see <a href="http://trac.bigdata.com/ticket/1002"> </a>
+ */
final public int getMaxParallel() {
+ if(this instanceof ISingleThreadedOp) {
+
+ // Ignore the annotation value.
+ return 1;
+
+ }
+
return getProperty(PipelineOp.Annotations.MAX_PARALLEL,
PipelineOp.Annotations.DEFAULT_MAX_PARALLEL);
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/HTreeNamedSubqueryOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/HTreeNamedSubqueryOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/HTreeNamedSubqueryOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -40,6 +40,7 @@
import com.bigdata.bop.BOpUtility;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IQueryAttributes;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.NV;
import com.bigdata.bop.PipelineOp;
@@ -73,7 +74,8 @@
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
*/
-public class HTreeNamedSubqueryOp extends PipelineOp implements INamedSubqueryOp {
+public class HTreeNamedSubqueryOp extends PipelineOp implements
+ INamedSubqueryOp, ISingleThreadedOp {
static private final transient Logger log = Logger
.getLogger(HTreeNamedSubqueryOp.class);
@@ -123,11 +125,7 @@
+ getEvaluationContext());
}
- if (getMaxParallel() != 1) {
- throw new IllegalArgumentException(
- PipelineOp.Annotations.MAX_PARALLEL + "="
- + getMaxParallel());
- }
+ assertMaxParallelOne();
if (!isAtOnceEvaluation())
throw new IllegalArgumentException();
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/JVMNamedSubqueryOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/JVMNamedSubqueryOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/controller/JVMNamedSubqueryOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -40,6 +40,7 @@
import com.bigdata.bop.BOpUtility;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IQueryAttributes;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.NV;
import com.bigdata.bop.PipelineOp;
@@ -73,7 +74,8 @@
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
*/
-public class JVMNamedSubqueryOp extends PipelineOp implements INamedSubqueryOp {
+public class JVMNamedSubqueryOp extends PipelineOp implements INamedSubqueryOp,
+ ISingleThreadedOp {
static private final transient Logger log = Logger
.getLogger(JVMNamedSubqueryOp.class);
@@ -112,11 +114,7 @@
+ getEvaluationContext());
}
- if (getMaxParallel() != 1) {
- throw new IllegalArgumentException(
- PipelineOp.Annotations.MAX_PARALLEL + "="
- + getMaxParallel());
- }
+ assertMaxParallelOne();
if (!isAtOnceEvaluation())
throw new IllegalArgumentException();
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HTreeHashJoinOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HTreeHashJoinOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HTreeHashJoinOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -33,6 +33,7 @@
import com.bigdata.bop.BOpContext;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IPredicate;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.NV;
import com.bigdata.bop.PipelineOp;
import com.bigdata.bop.controller.INamedSolutionSetRef;
@@ -94,9 +95,9 @@
* @see HTreeHashJoinUtility
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id$
*/
-public class HTreeHashJoinOp<E> extends HashJoinOp<E> {
+public class HTreeHashJoinOp<E> extends HashJoinOp<E> implements
+ ISingleThreadedOp {
/**
*
@@ -117,7 +118,7 @@
}
- public HTreeHashJoinOp(final BOp[] args, NV... annotations) {
+ public HTreeHashJoinOp(final BOp[] args, final NV... annotations) {
this(args, NV.asMap(annotations));
@@ -132,9 +133,7 @@
super(args, annotations);
- if (getMaxParallel() != 1)
- throw new UnsupportedOperationException(Annotations.MAX_PARALLEL
- + "=" + getMaxParallel());
+ assertMaxParallelOne();
// Note: This is no longer true. It is now shared via the IQueryAttributes.
// // shared state is used to share the hash table.
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashIndexOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashIndexOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashIndexOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -38,6 +38,7 @@
import com.bigdata.bop.BOpUtility;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IQueryAttributes;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.NV;
import com.bigdata.bop.PipelineOp;
@@ -76,7 +77,7 @@
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
*/
-abstract public class HashIndexOp extends PipelineOp {
+abstract public class HashIndexOp extends PipelineOp implements ISingleThreadedOp {
// static private final transient Logger log = Logger
// .getLogger(HashIndexOp.class);
@@ -144,15 +145,11 @@
// + getEvaluationContext());
// }
- if (getMaxParallel() != 1) {
- /*
- * Parallel evaluation is not allowed. This operator writes on an
- * object that is not thread-safe for mutation.
- */
- throw new IllegalArgumentException(
- PipelineOp.Annotations.MAX_PARALLEL + "="
- + getMaxParallel());
- }
+ /*
+ * This operator writes on an object that is not thread-safe for
+ * mutation.
+ */
+ assertMaxParallelOne();
if (!isLastPassRequested()) {
/*
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashJoinOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashJoinOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/HashJoinOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -65,7 +65,6 @@
* which join are output.
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id$
*/
abstract public class HashJoinOp<E> extends PipelineOp implements
IShardwisePipelineOp<E> {
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/JVMHashJoinOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/JVMHashJoinOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/join/JVMHashJoinOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -34,6 +34,7 @@
import com.bigdata.bop.HashMapAnnotations;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IPredicate;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.NV;
import com.bigdata.bop.controller.INamedSolutionSetRef;
import com.bigdata.relation.accesspath.IAccessPath;
@@ -56,9 +57,8 @@
* @see JVMHashJoinUtility
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id$
*/
-public class JVMHashJoinOp<E> extends HashJoinOp<E> {
+public class JVMHashJoinOp<E> extends HashJoinOp<E> implements ISingleThreadedOp {
/**
*
@@ -94,9 +94,7 @@
super(args, annotations);
- if (getMaxParallel() != 1)
- throw new UnsupportedOperationException(Annotations.MAX_PARALLEL
- + "=" + getMaxParallel());
+ assertMaxParallelOne();
assertAtOnceJavaHeapOp();
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/HTreeDistinctBindingSetsOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/HTreeDistinctBindingSetsOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/HTreeDistinctBindingSetsOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -9,6 +9,7 @@
import com.bigdata.bop.HTreeAnnotations;
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IQueryAttributes;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.NV;
import com.bigdata.bop.PipelineOp;
@@ -42,10 +43,9 @@
* on the native heap and eventually the machine will begin to swap.
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id: DistinctElementFilter.java 3466 2010-08-27 14:28:04Z
- * thompsonbry $
*/
-public class HTreeDistinctBindingSetsOp extends PipelineOp {
+public class HTreeDistinctBindingSetsOp extends PipelineOp implements
+ ISingleThreadedOp {
// private final static transient Logger log = Logger
// .getLogger(DistinctBindingSetsWithHTreeOp.class);
@@ -96,9 +96,7 @@
+ getEvaluationContext());
}
- if (getMaxParallel() != 1)
- throw new UnsupportedOperationException(Annotations.MAX_PARALLEL
- + "=" + getMaxParallel());
+ assertMaxParallelOne();
// // shared state is used to share the hash table.
// if (!isSharedState()) {
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/PipelinedAggregationOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/PipelinedAggregationOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/java/com/bigdata/bop/solutions/PipelinedAggregationOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -19,6 +19,7 @@
import com.bigdata.bop.IBindingSet;
import com.bigdata.bop.IConstant;
import com.bigdata.bop.IConstraint;
+import com.bigdata.bop.ISingleThreadedOp;
import com.bigdata.bop.IValueExpression;
import com.bigdata.bop.IVariable;
import com.bigdata.bop.PipelineOp;
@@ -58,10 +59,9 @@
* the operator can still be invoked multiple times).
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id: DistinctElementFilter.java 3466 2010-08-27 14:28:04Z
- * thompsonbry $
*/
-public class PipelinedAggregationOp extends GroupByOp {
+public class PipelinedAggregationOp extends GroupByOp implements
+ ISingleThreadedOp {
private final static transient Logger log = Logger
.getLogger(PipelinedAggregationOp.class);
@@ -136,14 +136,11 @@
+ "=" + isLastPassRequested());
}
- if (getMaxParallel() != 1) {
- /*
- * Note: The operator MUST be single threaded in order to receive
- * the isLastInvocation notice.
- */
- throw new UnsupportedOperationException(Annotations.MAX_PARALLEL
- + "=" + getMaxParallel());
- }
+ /*
+ * Note: The operator MUST be single threaded in order to receive the
+ * isLastInvocation notice.
+ */
+ assertMaxParallelOne();
}
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/join/TestJVMHashJoinOp.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/join/TestJVMHashJoinOp.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/join/TestJVMHashJoinOp.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -201,8 +201,8 @@
new NV(PipelineOp.Annotations.MAX_PARALLEL, 2),//
namedSet,//
}));
- fail("Expecting: " + UnsupportedOperationException.class);
- } catch (UnsupportedOperationException ex) {
+ fail("Expecting: " + IllegalArgumentException.class);
+ } catch (IllegalArgumentException ex) {
if (log.isInfoEnabled())
log.info("Ignoring expected exception: " + ex);
}
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/solutions/TestHTreeDistinctBindingSets.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/solutions/TestHTreeDistinctBindingSets.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/bop/solutions/TestHTreeDistinctBindingSets.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -41,8 +41,6 @@
* Unit tests for {@link HTreeDistinctBindingSetsOp}.
*
* @author <a href="mailto:tho...@us...">Bryan Thompson</a>
- * @version $Id: TestDistinctBindingSets.java 4259 2011-02-28 16:24:53Z
- * thompsonbry $
*/
public class TestHTreeDistinctBindingSets extends
AbstractDistinctSolutionsTestCase {
@@ -161,8 +159,8 @@
// new NV(PipelineOp.Annotations.MAX_PARALLEL,
// 1),//
}));
- fail("Expecting: "+UnsupportedOperationException.class);
- } catch(UnsupportedOperationException ex) {
+ fail("Expecting: "+IllegalArgumentException.class);
+ } catch(IllegalArgumentException ex) {
if(log.isInfoEnabled())
log.info("Ignoring expected exception: "+ex);
}
Modified: branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/journal/StressTestUnisolatedReadWriteIndex.java
===================================================================
--- branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/journal/StressTestUnisolatedReadWriteIndex.java 2014-08-13 13:48:32 UTC (rev 8618)
+++ branches/BIGDATA_RELEASE_1_3_0/bigdata/src/test/com/bigdata/journal/StressTestUnisolatedReadWriteIndex.java 2014-08-16 14:33:51 UTC (rev 8619)
@@ -142,9 +142,9 @@
3, // 3,// nresources // 20
1, // minLocks
2, // 5 // maxLocks // 3
- 1000, //5000, // ntrials // 1000
+ 500, // ntrials // Note: fails in CI @ 1000 (java.lang.OutOfMemoryError: unable to create new native thread)
3, // keyLen
- 1000, // 1000, // nops
+ 1000, // nops
0.02d,// failureRate
0.10d // commitRate
);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|