You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@river.apache.org by pe...@apache.org on 2014/02/02 13:31:10 UTC

svn commit: r1563596 [1/3] - in /river/jtsk/skunk/qa_refactor/trunk: qa/src/com/sun/jini/test/impl/outrigger/matching/ qa/src/com/sun/jini/test/impl/servicediscovery/event/ qa/src/com/sun/jini/test/spec/lookupservice/test_set00/ qa/src/com/sun/jini/tes...

Author: peter_firmstone
Date: Sun Feb  2 12:31:09 2014
New Revision: 1563596

URL: http://svn.apache.org/r1563596
Log:
New dependency linking and call backs for Reggie and SDM.

Notes:

SDM still has a race condition where more added service events are sent than required when rediscovering discarded services.

ServiceRegistar compliance tests appear to require that services be notified in the same order that those services are registered with a registrar, this isn't documented in the spec,  but may need to be complied with for backward compatibility.  For now Reggie's event notification is single threaded to ensure these tests pass.  TaskManager.Task.runAfter didn't make any direct dependency check for this additional requirement, instead the limited scalability of TaskManager ensured compliance.

Reactivated previously failing tests.

Added:
    river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/thread/DependencyLinker.java
    river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/thread/SynchronousExecutors.java
    river/jtsk/skunk/qa_refactor/trunk/test/src/org/apache/river/impl/thread/SynchronousExecutorsTest.java
Modified:
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/outrigger/matching/StressTestInterleaved.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.java
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/NotifyEventDropProxyTaskRace.java
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrAdd.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrDel.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrMod.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNonNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNonNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNonNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNull.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set02/NotifyOnAttrSet.td
    river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/servicediscovery/AbstractBaseTest.java
    river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/reggie/RegistrarImpl.java
    river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/JoinManager.java
    river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/ServiceDiscoveryManager.java
    river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/api/util/FutureObserver.java
    river/jtsk/skunk/qa_refactor/trunk/src/org/apache/river/impl/thread/ObservableFutureTask.java

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/outrigger/matching/StressTestInterleaved.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/outrigger/matching/StressTestInterleaved.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/outrigger/matching/StressTestInterleaved.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/outrigger/matching/StressTestInterleaved.td Sun Feb  2 12:31:09 2014
@@ -6,7 +6,7 @@ include0=../outrigger.properties
 
 com.sun.jini.test.share.restart_wait=10000
 com.sun.jini.test.impl.outrigger.matching.StressTest.num_entries=10000
-com.sun.jini.test.impl.outrigger.matching.StressTest.num_readers=400
-com.sun.jini.test.impl.outrigger.matching.StressTest.num_writers=250
+com.sun.jini.test.impl.outrigger.matching.StressTest.num_readers=2000
+com.sun.jini.test.impl.outrigger.matching.StressTest.num_writers=2000
 com.sun.jini.test.impl.outrigger.matching.StressTest.interleave=true
 

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.java?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.java Sun Feb  2 12:31:09 2014
@@ -38,7 +38,7 @@ import java.util.logging.Level;
 /**
  * This test attempts to simulate the following race condition that
  * can occur between an instance of LookupTask and an instance of 
- * DropProxyRegTask:
+ * ProxyRegDropTask:
  *
  * - 1 LUS {L0}
  * - 1 service s0 registered in L0
@@ -48,18 +48,18 @@ import java.util.logging.Level;
  * waits a few seconds after the cache is created because if L0 is discarded
  * too quickly, L0 will be removed from the proxyRegSet before LookupTask
  * has a chance to begin any processing. After the wait period is up,
- * L0 is discarded; which initiates the DropProxyRegTask. The race occurs
+ * L0 is discarded; which initiates the ProxyRegDropTask. The race occurs
  * as follows:
- *          LookupTask                       DropProxyRegTask
+ *          LookupTask                       ProxyRegDropTask
  *   ----------------------------   ----------------------------------------
  *   o determine s0 is "new"
  *   o sleep for n seconds          o remove L0 from proxyRegSet
  *                                  o serviceIdMap is empty, do nothing else
  *   o add new s0 to serviceIdMap
  *
- * The result is that serviceIdMap should NOT be empty when DropProxyRegTask
+ * The result is that serviceIdMap should NOT be empty when ProxyRegDropTask
  * encounters it. But if LookupTask is too slow in adding s0 to the map,
- * DropProxyRegTask will have nothing to remove, and so will return without
+ * ProxyRegDropTask will have nothing to remove, and so will return without
  * modifying serviceIdMap. But when LookupTask returns, s0 will be contained
  * in serviceIdMap; even though it shouldn't.
  *
@@ -153,7 +153,7 @@ public class LookupDropProxyTaskRace ext
      *  
      *  1. Create a cache to initiate the RegisterListenerTask/LookupTask combo
      *  2. Set groups and locators so the lookup service won't be re-discovered
-     *  3. Discard the lookup service to initiate the DropProxyRegTask
+     *  3. Discard the lookup service to initiate the ProxyRegDropTask
      */
     protected void applyTestDef() throws Exception {
         int nLookupServices = getLookupServices().getnLookupServices();

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/LookupDropProxyTaskRace.td Sun Feb  2 12:31:09 2014
@@ -1,4 +1,4 @@
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 include0=../servicediscovery.properties
 testClass=LookupDropProxyTaskRace
 testCategories=servicediscovery,servicediscovery_impl,servicediscoveryevent,implservicediscovery,implservicediscoveryevent

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/NotifyEventDropProxyTaskRace.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/NotifyEventDropProxyTaskRace.java?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/NotifyEventDropProxyTaskRace.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/impl/servicediscovery/event/NotifyEventDropProxyTaskRace.java Sun Feb  2 12:31:09 2014
@@ -38,14 +38,14 @@ import java.util.logging.Level;
 /**
 * This test attempts to simulate the following race condition that
  * can occur between an instance of LookupTask and an instance of 
- * DropProxyRegTask:
+ * ProxyRegDropTask:
  *
  * - 1 LUS {L0}
  * - 1 services {s0}, to be registered in L0
  * - 1 cache C0 with template matching s0
  *
  * This test attempts to simulate the race that appears to be possible
- * between the NotifyEventTask and the DropProxyRegTask. This test 
+ * between the NotifyEventTask and the ProxyRegDropTask. This test 
  * starts lookup L0 and creates cache C0. It then registers s0 with L0
  * to generate a NOMATCH_MATCH event and ultimately initiate an instance
  * of NotifyEventTask. Suppose that before NotifyEventTask can modify the
@@ -65,7 +65,7 @@ import java.util.logging.Level;
  *                          o s0 registered with L0
  *                          o L0 sends NO_MATCH_MATCH
  *
- *          NotifyEventTask                       DropProxyRegTask
+ *          NotifyEventTask                       ProxyRegDropTask
  *   -----------------------------     ----------------------------------------
  *   o task0 determine s0 is "new"
  *   o sleep for n seconds
@@ -78,7 +78,7 @@ import java.util.logging.Level;
  *
  * The result is that serviceIdMap should be empty and L0 should not be 
  * in proxyRegSet. But if NotifyEventTask is too slow in processing the
- * new s0, DropProxyRegTask will have nothing to process and so the
+ * new s0, ProxyRegDropTask will have nothing to process and so the
  * serviceIdMap will not be empty, and the serviceRemoved event that should
  * have been sent because the [s0,L0] pair was removed from the serviceIdMap
  * is never sent.
@@ -160,7 +160,7 @@ public class NotifyEventDropProxyTaskRac
      *  
      *  1. Create a cache to initiate the RegisterListenerTask/LookupTask combo
      *  2. Destroy the lookup service so it won't be re-discovered
-     *  3. Discard the lookup service to initiate the DropProxyRegTask
+     *  3. Discard the lookup service to initiate the ProxyRegDropTask
      */
     protected void applyTestDef() throws Exception {
 	lus = (ldm.getRegistrars())[0];

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrAdd.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrAdd.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrAdd.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrAdd.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnAttrAdd
 testCategories=lookupservice,lookupservice_spec,test_set00
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrDel.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrDel.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrDel.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrDel.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnAttrDel
 testCategories=lookupservice,lookupservice_spec,test_set00
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrMod.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrMod.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrMod.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set00/NotifyOnAttrMod.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnAttrMod
 testCategories=lookupservice,lookupservice_spec,test_set00
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNonNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNonNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNonNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNonNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrAddNonNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrAddNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrAddNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNonNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNonNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNonNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNonNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrDelNonNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrDelNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrDelNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNonNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNonNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNonNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNonNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrModNonNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNull.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNull.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNull.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set01/NotifyOnComboAttrModNull.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnComboAttrModNull
 testCategories=lookupservice,lookupservice_spec,test_set01
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set02/NotifyOnAttrSet.td
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set02/NotifyOnAttrSet.td?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set02/NotifyOnAttrSet.td (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/lookupservice/test_set02/NotifyOnAttrSet.td Sun Feb  2 12:31:09 2014
@@ -1,6 +1,6 @@
 # Skip test verifier until test is confirmed by Jini Community that 
 # Events should be prioritsed in order of registered services.
-com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
+#com.sun.jini.qa.harness.verifier=com.sun.jini.qa.harness.SkipTestVerifier
 testClass=NotifyOnAttrSet
 testCategories=lookupservice,lookupservice_spec,test_set02
 include0=../lookupservice.properties

Modified: river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/servicediscovery/AbstractBaseTest.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/servicediscovery/AbstractBaseTest.java?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/servicediscovery/AbstractBaseTest.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/qa/src/com/sun/jini/test/spec/servicediscovery/AbstractBaseTest.java Sun Feb  2 12:31:09 2014
@@ -240,8 +240,8 @@ abstract public class AbstractBaseTest e
      * or changed.
      */
     public static class SrvcListener implements ServiceDiscoveryListener {
-        private QAConfig util;
-        private String classname;
+        private final QAConfig util;
+        private final String classname;
         private int nAdded   = 0;
         private int nRemoved = 0;
         private int nChanged = 0;
@@ -253,24 +253,27 @@ abstract public class AbstractBaseTest e
 	public void serviceAdded(ServiceDiscoveryEvent event) {
             ServiceItem srvcItem = event.getPostEventServiceItem();
             ServiceID srvcID = srvcItem.serviceID;
-            logger.log(Level.FINE, "{0} -- serviceAdded()-{1}-{2}", new Object[]{nAdded, srvcItem.service, srvcID});
             synchronized(lock) {
+                logger.log(Level.FINE, "{0} -- serviceAdded()-{1}-{2}", 
+                        new Object[]{nAdded, srvcItem.service, srvcID});
                 nAdded++;
             }
 	}//end serviceAdded
 	public void serviceRemoved(ServiceDiscoveryEvent event) {
             ServiceItem srvcItem = event.getPreEventServiceItem();
             ServiceID srvcID = srvcItem.serviceID;
-            logger.log(Level.FINE, "{0} -- serviceRemoved()-{1}-{2}", new Object[]{nRemoved, srvcItem.service, srvcID});
             synchronized(lock) {
+                logger.log(Level.FINE, "{0} -- serviceRemoved()-{1}-{2}", 
+                        new Object[]{nRemoved, srvcItem.service, srvcID});
                 nRemoved++;
             }
 	}//end serviceRemoved
 	public void serviceChanged(ServiceDiscoveryEvent event) {
             ServiceItem srvcItem = event.getPreEventServiceItem();
             ServiceID srvcID = srvcItem.serviceID;
-            logger.log(Level.FINE, "{0} -- serviceChanged()-{1}-{2}", new Object[]{nChanged, srvcItem.service, srvcID});
             synchronized(lock) {
+                logger.log(Level.FINE, "{0} -- serviceChanged()-{1}-{2}", 
+                        new Object[]{nChanged, srvcItem.service, srvcID});
                 nChanged++;
             }
 	}//end serviceChanged

Modified: river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/reggie/RegistrarImpl.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/reggie/RegistrarImpl.java?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/reggie/RegistrarImpl.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/com/sun/jini/reggie/RegistrarImpl.java Sun Feb  2 12:31:09 2014
@@ -80,16 +80,27 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.NoSuchElementException;
+import java.util.Queue;
 import java.util.Random;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
 import java.util.TreeSet;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.PriorityBlockingQueue;
+import java.util.concurrent.RunnableFuture;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -139,13 +150,20 @@ import net.jini.jeri.BasicILFactory;
 import net.jini.jeri.BasicJeriExporter;
 import net.jini.jeri.tcp.TcpServerEndpoint;
 import net.jini.lookup.JoinManager;
+import net.jini.lookup.ServiceDiscoveryManager;
 import net.jini.lookup.entry.ServiceInfo;
 import net.jini.security.BasicProxyPreparer;
 import net.jini.security.ProxyPreparer;
 import net.jini.security.TrustVerifier;
 import net.jini.security.proxytrust.ServerProxyTrust;
+import org.apache.river.api.util.FutureObserver;
+import org.apache.river.api.util.FutureObserver.ObservableFuture;
 import org.apache.river.api.util.Startable;
+import org.apache.river.impl.thread.ExtensibleExecutorService;
+import org.apache.river.impl.thread.ExtensibleExecutorService.RunnableFutureFactory;
 import org.apache.river.impl.thread.NamedThreadFactory;
+import org.apache.river.impl.thread.ObservableFutureTask;
+import org.apache.river.impl.thread.SynchronousExecutors;
 
 /**
  * Base server-side implementation of a lookup service, subclassed by
@@ -305,7 +323,9 @@ class RegistrarImpl implements Registrar
     /** Manager for joining other lookup services */
     private volatile JoinManager joiner; // accessed without lock from DestroyThread
     /** Executors for sending events and discovery responses */
-    private final ExecutorService eventNotifierExec;
+    private final SynchronousExecutors eventNotifierExec;
+    private final Map<EventReg,ExecutorService> eventTaskMap;
+//    private final EventTaskQueue eventTaskQueue;
     private final ExecutorService discoveryResponseExec;
     /** Service lease expiration thread */
     private final Thread serviceExpirer;
@@ -398,6 +418,7 @@ class RegistrarImpl implements Registrar
     private Configuration config;
     private Exception constructionException;
     private AccessControlContext context;
+    
 
     /**
      * Constructs RegistrarImpl based on a configuration obtained using the
@@ -522,8 +543,27 @@ class RegistrarImpl implements Registrar
         multicastAnnouncementConstraints = init.multicastAnnouncementConstraints;
         unicastDiscoveryConstraints = init.unicastDiscoveryConstraints;
         context = init.context;
-        eventNotifierExec = init.eventNotifierExec;
-        discoveryResponseExec = init.discoveryResponseExec;
+        eventNotifierExec = new SynchronousExecutors(init.scheduledExecutor);
+                
+//                new ExtensibleExecutorService(init.executor,
+//            new RunnableFutureFactory(){
+//
+//                @Override
+//                public <T> RunnableFuture<T> newTaskFor(Runnable r, T value) {
+//                     if (r instanceof ObservableFutureTask) return (RunnableFuture<T>) r;
+//                     return new ObservableFutureTask(r, value);
+//                }
+//
+//                @Override
+//                public <T> RunnableFuture<T> newTaskFor(Callable<T> c) {
+//                    if (c instanceof ObservableFutureTask) return (RunnableFuture<T>) c;
+//                    return new ObservableFutureTask(c);
+//                }
+//
+//            });
+//        eventTaskQueue = new EventTaskQueue(eventNotifierExec);
+        eventTaskMap = new TreeMap<EventReg,ExecutorService>();
+        discoveryResponseExec = init.executor;
         ReliableLog log = null;
         Thread serviceExpirer = null;
         Thread eventExpirer = null;
@@ -2010,8 +2050,110 @@ class RegistrarImpl implements Registrar
 	}
     }
     
+//    private static class DependencyLinker implements FutureObserver {
+//        private final ExecutorService executor;
+//        private final ObservableFuture precedent;
+//        private final FutureTask dependant;
+//
+//        public DependencyLinker(ExecutorService ex, ObservableFuture precedent, FutureTask dep) {
+//            executor = ex;
+//            this.precedent = precedent;
+//            dependant = dep;
+//        }
+//
+//        public synchronized void register() {
+//            precedent.addObserver(this);
+//        }
+//
+//        @Override
+//        public synchronized void futureCompleted(Future e) {
+//            if (precedent.equals(e)) executor.submit(dependant);
+//        }
+//
+//    }
+//     /**
+//     * 
+//     */
+//    static final class EventTaskWrapper extends ObservableFutureTask 
+//    {
+//        private final EventTask task;
+//
+//        private EventTaskWrapper(Runnable r, Object result) {
+//            super(r, result);
+//            if (r instanceof EventTask) task = (EventTask) r;
+//            else task = null;
+//        }
+//
+//        private EventTaskWrapper(Callable c)
+//        {
+//            super(c);
+//            task = null;
+//        }
+//        
+//        private EventTask getTask(){
+//            return task;
+//        }
+//    }
+//    
+//    private static class EventTaskWrapperComparator 
+//        implements Comparator<EventTaskWrapper> {
+//
+//        @Override
+//        public int compare(EventTaskWrapper o1, EventTaskWrapper o2) {
+//            EventTask t1 = o1.getTask();
+//            EventTask t2 = o2.getTask();
+//            if (t1.seqNo < t2.seqNo) return -1;
+//            if (t1.seqNo > t2.seqNo) return 1;
+//            return 0;
+//        }
+//        
+//    }
+//    
+//    private static final class EventTaskQueue implements FutureObserver {
+//        // CacheTasks pending completion.
+//        private final List<EventTaskWrapper> pending;
+//        private final ExecutorService executor;
+//        
+//        private EventTaskQueue(ExecutorService e){
+//            this.pending = new ArrayList<EventTaskWrapper>(200);
+//            executor = e;
+//        }
+//        
+//        private EventTaskWrapper submit(EventTask t){
+//            EventTaskWrapper future = new EventTaskWrapper(t, null);
+//            EventTaskWrapper precedent = null;
+//            synchronized (pending){
+//                pending.add(future);
+//                future.addObserver(this);
+//                Iterator<EventTaskWrapper> it = pending.iterator();
+//                while (it.hasNext()){
+//                    EventTaskWrapper w = it.next();
+//                    EventTask c = w.getTask();
+//                    if (t.dependsOn(c)) {
+//                        precedent = w;
+//                        break;
+//                    }
+//                }
+//            }
+//            if (precedent == null){
+//                executor.submit(future);
+//            } else {
+//                DependencyLinker linker = new DependencyLinker(executor, precedent, future);
+//                linker.register();
+//            }
+//            return future;
+//        }
+//
+//        @Override
+//        public void futureCompleted(Future e) {
+//            synchronized (pending){
+//                pending.remove(e);
+//            }
+//        }
+//    }
+//    
     /** An event to be sent, and the listener to send it to. */
-    private static final class EventTask implements Runnable, Comparable<EventTask> {
+    private static final class EventTask implements Callable<Boolean>, Comparable<EventTask> {
 
 	/** The event registration */
 	private final EventReg reg;
@@ -2043,7 +2185,7 @@ class RegistrarImpl implements Registrar
 	}
 
 	/** Send the event */
-	public void run() {
+	public Boolean call() throws Exception {
 	    if (logger.isLoggable(Level.FINE)) {
 		logger.log(
 		    Level.FINE,
@@ -2054,6 +2196,7 @@ class RegistrarImpl implements Registrar
 		reg.listener.notify(new RegistrarEvent(proxy, reg.eventID,
 						       seqNo, reg.handback,
 						       sid, transition, item));
+                return Boolean.TRUE;
 	    } catch (Throwable e) {
 		switch (ThrowableConstants.retryable(e)) {
 		case ThrowableConstants.BAD_OBJECT:
@@ -2082,9 +2225,21 @@ class RegistrarImpl implements Registrar
 			    e);
 		    }
 		}
+                return Boolean.FALSE;
 	    }
 	}
-
+        
+        /** Keep events going to the same listener ordered. 
+         * Returns a positive integer if depends, 0 if 
+         * no dependency exists and a negative integer if 
+         * precedes.
+         */
+	public boolean dependsOn(EventTask obj) {
+            if (obj == null) return false;
+            if (reg.listener.equals(obj.reg.listener)) return true;
+	    return false;
+	}
+        
         /**
          * This is inconsistent with Object.equals, it is simply intended to
          * order tasks by priority.
@@ -4242,6 +4397,7 @@ class RegistrarImpl implements Registrar
 	Long id = Long.valueOf(reg.eventID);
 	eventByID.put(id, reg);
 	eventByTime.put(reg, reg);
+        eventTaskMap.put(reg, eventNotifierExec.newSerialExecutor(new PriorityBlockingQueue()) );
 	if (reg.tmpl.serviceID != null) {
 	    Object val = subEventByService.get(reg.tmpl.serviceID);
 	    if (val == null)
@@ -4274,6 +4430,7 @@ class RegistrarImpl implements Registrar
 	Long id = Long.valueOf(reg.eventID);
 	eventByID.remove(id);
 	eventByTime.remove(reg);
+        eventTaskMap.remove(reg);
 	if (reg.tmpl.serviceID != null) {
 	    Object val = subEventByService.get(reg.tmpl.serviceID);
 	    if (val == reg) {
@@ -4705,8 +4862,8 @@ class RegistrarImpl implements Registrar
          String unicastDiscoveryHost;
          Configuration config;
          AccessControlContext context;
-         ExecutorService eventNotifierExec;
-         ExecutorService discoveryResponseExec;
+         ExecutorService executor;
+         ScheduledExecutorService scheduledExecutor;
         
         
         
@@ -4896,22 +5053,18 @@ class RegistrarImpl implements Registrar
             double blocking_coefficient = 0.9; // 0 CPU intensive to 0.9 IO intensive
             int numberOfCores = Runtime.getRuntime().availableProcessors();
             int poolSizeLimit = (int) (numberOfCores / ( 1 - blocking_coefficient));
-            this.eventNotifierExec = Config.getNonNullEntry(
+            this.scheduledExecutor = Config.getNonNullEntry(
                 config, 
                 COMPONENT, 
                 "eventNotifierExecutor",
-                ExecutorService.class, 
-                new ThreadPoolExecutor(
-                    poolSizeLimit, 
-                    poolSizeLimit, /* Ignored */
-                    15L, 
-                    TimeUnit.MINUTES, 
-                    new PriorityBlockingQueue(poolSizeLimit * 4), /* Unbounded Ordered Queue */
+                ScheduledExecutorService.class, 
+                new ScheduledThreadPoolExecutor(
+                    1,
                     new NamedThreadFactory("Reggie_Event_Notifier", true)   
                 )
             );
             // Set up Executor to perform discovery responses
-            this.discoveryResponseExec = Config.getNonNullEntry(
+            this.executor = Config.getNonNullEntry(
                 config, 
                 COMPONENT, 
                 "discoveryResponseExecutor", 
@@ -5029,6 +5182,7 @@ class RegistrarImpl implements Registrar
                     unicaster.start();
                     multicaster.start();
                     announcer.start();
+                    eventNotifierExec.start();
 
                     /* Shutdown hook so reggie sends a final announcement
                      * packet if VM is terminated.  If reggie is terminated
@@ -5823,7 +5977,8 @@ class RegistrarImpl implements Registrar
     {
 	if (item != null)
 	    item = copyItem(item);
-	eventNotifierExec.execute(new EventTask(reg, sid, item, transition, proxy, this, now));
+        // Should never be null.
+	eventTaskMap.get(reg).submit(new EventTask(reg, sid, item, transition, proxy, this, now));
     }
 
     /** Generate a new service ID */

Modified: river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/JoinManager.java
URL: http://svn.apache.org/viewvc/river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/JoinManager.java?rev=1563596&r1=1563595&r2=1563596&view=diff
==============================================================================
--- river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/JoinManager.java (original)
+++ river/jtsk/skunk/qa_refactor/trunk/src/net/jini/lookup/JoinManager.java Sun Feb  2 12:31:09 2014
@@ -1036,7 +1036,7 @@ public class JoinManager {
      *  should be registered.
      */
     private class ProxyReg implements FutureObserver{
-       
+
         /** Class that is registered as a listener with this join manager's
          *  lease renewal manager. That lease renewal manager manages the
          *  lease granted to this join manager's associated service by the