Fwd: Issue when using agent mobility in Cougaar

Todd Wright twright at bbn.com
Fri Jun 27 17:15:38 EDT 2008


Okay, this makes sense.

First, it's unusual to do a blackboard query in "load()".  This is usually done 
in "setupSubscriptions()", as seen in the PingSender "getInitialCounter()" example.

Second, the query should find all objects, not just the "getAddedCollection()". 
  So it makes sense that it would find the old messages.

Lastly, subscriptions should be made in the first transaction, which is (by 
default) the "setupSubscriptions()" method.  This will rehydrate the 
subscription with its pending add/change/remove lists that were saved in the 
persistence snapshot's per-plugin "SubscriberState" object.

For example, say we have two plugins, a ping sender and receiver, and they 
publish blackboard objects back and forth to one another as fast as possible. 
There will always be an outstanding "ping" or "ack" message that's "in flight" 
between the two plugins, waiting to be delivered and processed in the target 
plugin's "execute()" method.  This pending message is saved in the mobile 
agent's persistence snapshot's SubscriberState and will be restored if the 
subscription is recreated in the "setupSubscriptions()" method, otherwise it 
will be discarded.  So, it's important to create subscriptions in the 
"setupSubscriptions()" method if you want to rehydrate these add/change/remove 
messages.

Todd

daniel domingue wrote:
> Hello,
> 
> I tried the test you proposed with the ping demo and it works, the
> agent's subscription works as described.
> 
> By rewriting another identical plugin from scratch ,
> I was able to isolate the problem which is in the load() method of the plugin :
> 
> 	public void load()
> 	{
> 		super.load();
> 		
> 		if(blackboard.didRehydrate())
> 		{
> 			
> 			blackboard.openTransaction();
> 			Collection c = blackboard.query(new LBAgentPredicate());
> 			blackboard.closeTransactionDontReset();
> 		}
> 	}
> 
> When I try to get a blackboard element from the load(), the problem
> occurs. When the code concerning the blackboard transaction is
> commented out, it works perfectly fine.
> I don't know if using this type of calls to the blackboard in the
> load() method has a direct impact on the other elements in it, and if
> there is a good way of implementing this.
> 
> Best regards,
> 
> 	
> On Wed, Jun 25, 2008 at 8:17 PM, Todd Wright <twright at bbn.com> wrote:
>> Daniel,
>>
>> I tested this in Cougaar 12.4 using the demo "ping" society and the "/move"
>> servlet and it worked for me.
>>
>> Maybe there's something wrong with your MoveAgent request, 'though it looks
>> okay to me.  It could be a bug that doesn't happen in the ping test, e.g. a
>> race condition.
>>
>> Please run the following test:
>>
>> 1) Download and unzip Cougaar 12.4 from:
>> http://cougaar.org/frs/?group_id=17&release_id=161
>>
>> 2) Unzip the required code:
>> unzip -q cougaar.zip
>> unzip -q cougaar-support.zip
>> unzip -q demo-ping.zip
>>
>> 3) Set the required environment variables:
>> export COUGAAR_INSTALL_PATH=/opt/Cougaar12_4
>> export COUGAAR_SOCIETY_PATH=/opt/Cougaar12_4/ping
>> export COUGAAR_RUNTIME_PATH=/opt/Cougaar12_4/ping/run
>>
>> 4) Modified the ping code to add debug output:
>> cd ping
>> modify src/org/cougaar/demo/ping/PingSender.java to add line 145:
>>  log.shout("sub added="+sub.getAddedCollection()+"
>> all="+sub.getCollection());
>> ant jar
>> mv tmp/ping.jar lib
>> cd run
>>
>> 5) In one console run:
>> cougaar ../configs/PingTwoNodesSociety.xml PingTwoNodesRuntime.xml Node1
>> and then in a second console run:
>> cougaar ../configs/PingTwoNodesSociety.xml PingTwoNodesRuntime.xml Node2
>>
>> 6) The first console prints:
>>  SHOUT [PingSender] - A: sub added=[] all=[]
>> This shows that the subscription starts out empty, as expected.
>>
>> 7) Let it run for a while then load:
>> http://localhost:8800/$Node1/move?op=Move&mobileAgent=A&originNode=Node1&destNode=Node2&isForceRestart=false&action=Add
>>
>> 8) The first console prints:
>>  SHOUT [DOTS] - P+-+....
>> and the second console prints:
>>  SHOUT [PingSender] - A: sub added=[] all=[(SimpleRelay uid=A/1214417255150
>> source=A target=B query=10 reply=10)]
>> This shows that the subscription "getAddedCollection()" is empty and the
>> "iterator()" was repopulated with the prior state.
>>
>> Todd
>>
>> daniel domingue wrote:
>>> I'm trying a second attempt at the mailing list
>>>
>>>
>>> ---------- Forwarded message ----------
>>> From: daniel domingue <ddomingue at gmail.com>
>>> Date: Fri, Jun 20, 2008 at 5:07 PM
>>> Subject: Issue when using agent mobility in Cougaar
>>> To: cougaar-developers at cougaar.org
>>>
>>>
>>> Hello all,
>>>
>>> I have encountered a small problem when trying to use mobile agents.
>>> The relocated agents have an IncrementalSubscription on message
>>> elements in the blackboard which contain a specific object.
>>> Mobility is triggered by a remote agent using the following code :
>>>
>>>               /* get a ticket identification from the mobility factory */
>>>               Object ticketId = mobilityFactory.createTicketIdentifier();
>>>
>>>               /* get adresses of agent and host */
>>>               MessageAddress agentAdd =
>>> MessageAddress.getMessageAddress(agentName);
>>>               MessageAddress origHostAdd =
>>> MessageAddress.getMessageAddress(origHost);
>>>
>>>               /* create a transfer ticket with the needed information */
>>>               Ticket mTicket = new
>>> Ticket(ticketId,agentAdd,origHostAdd,this.nodeId,false);
>>>
>>>               /* create a move agent order with the created ticket */
>>>               MoveAgent ac = mobilityFactory.createMoveAgent(mTicket);
>>>
>>>               /* post the ticket to the blackboard for proceeding */
>>>               blackboard.publishAdd(ac);
>>>
>>>
>>> Everything works fine except that the relocated agents receive old
>>> messages through the getAddedCollection() performed in the execute()
>>> method after the blackboard has been rehydrated.
>>> Below is part of the code that filters the messages in the relocated
>>> agents :
>>>
>>>       for (Iterator iter = aValMsgSubs.getAddedCollection().iterator();
>>> iter.hasNext();)
>>>               {
>>>                       LS_Com_Target co = (LS_Com_Target) iter.next() ;
>>>                       Object o = co.getData();
>>>                       Msg_LBValidator m = ((Msg_LBValidator) o);
>>>
>>>                       /* placebo */
>>>                       switch(m.getLoadType())
>>>                       {
>>>                       case(ScenarioEntry.MSG):
>>>
>>> loadinfo.setRemainingMSGLoadCycles(m.getElapsed());
>>>                       loadinfo.setMsgTargets(m.getTargetAgents());
>>>                       System.out.println(this.agentId.toString()+"
>>> received MSG");
>>>                       break;
>>>
>>>                       case(ScenarioEntry.PROC):
>>>
>>> loadinfo.setRemainingCPULoadCycles(m.getElapsed());
>>>                       System.out.println(this.agentId.toString()+"
>>> received PROC");
>>>                       break;
>>>
>>>                       case(ScenarioEntry.SIZE):
>>>
>>> loadinfo.setRemainingMEMLoadCycles(m.getElapsed());
>>>                       System.out.println(this.agentId.toString()+"
>>> received SIZE");
>>>                       break;
>>>                       }
>>>
>>>                       modified=true;
>>>
>>>               }
>>>
>>> The problem I see is that when the blackboard is being rehydrated all
>>> the old messages change state and are classified as new messages,
>>> which are picked up at the first execute() call after the load().
>>>
>>> Any clue that could help would be appreciated!
>>>
>>>
>>> Thanks in advance,
>>>
>>>
>>> --
>>> Daniel Domingue
>>>
>>>
>>>
> 
> 
> 



More information about the Cougaar-developers mailing list