Revision: b16146640918
Author: unknown <yulian@Venera.(none)>
Date: Fri Jan 18 13:27:08 2013
Log: Added 500ms cache to block duplicated
Possibly should be extended up to 16 seconds to
disallowed resend by client , but may cause high memory.
Resolved byte to int translation
http://code.google.com/p/mediaserver/source/detail?r=b16146640918
Modified:
/client/jsr-309/tck/server.log
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/GlobalTransactionManager.java
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/Transaction.java
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/TransactionManager.java
/controls/mgcp/src/test/java/org/mobicents/media/server/mgcp/tx/TransactionManagerTest.java
=======================================
--- /client/jsr-309/tck/server.log Fri Jan 18 07:58:56 2013
+++ /client/jsr-309/tck/server.log Fri Jan 18 13:27:08 2013
@@ -1,6 +1,6 @@
-2013-01-18 17:19:57,313 DEBUG [TestBase] (main) Loading
file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties
-2013-01-18 17:19:57,315 INFO [Runner] (main) Start
mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play
javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6
javadoc::Player::1 javadoc::PlayerEvent::15
-2013-01-18 17:19:57,315 DEBUG [TestBase] (main) Getting a MsControlFactory
instance
-2013-01-18 17:19:57,337 INFO [DriverImpl] (main) Initializing MGCP on
/127.0.0.1:2729
-2013-01-18 17:19:57,351 WARN [JainMgcpStackImpl] (main) Failed to locate
properties file, using default values
-2013-01-18 17:19:57,362 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack
bound to IP /127.0.0.1 and UDP port 2729
+2013-01-18 22:57:15,696 DEBUG [TestBase] (main) Loading
file:/opt/mobsource/medianew/client/jsr-309/tck/exclude-list.properties
+2013-01-18 22:57:15,697 INFO [Runner] (main) Start
mandatory.functional.mediagroup.PlayerTest.test_2_1_1_1_Play
javadoc::Joinable::1 javadoc::MediaGroup::1 javadoc::MediaGroup::6
javadoc::Player::1 javadoc::PlayerEvent::15
+2013-01-18 22:57:15,697 DEBUG [TestBase] (main) Getting a MsControlFactory
instance
+2013-01-18 22:57:15,719 INFO [DriverImpl] (main) Initializing MGCP on
/127.0.0.1:2729
+2013-01-18 22:57:15,732 WARN [JainMgcpStackImpl] (main) Failed to locate
properties file, using default values
+2013-01-18 22:57:15,742 INFO [JainMgcpStackImpl] (main) Jain Mgcp stack
bound to IP /127.0.0.1 and UDP port 2729
=======================================
---
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/GlobalTransactionManager.java
Fri Jan 18 07:58:56 2013
+++
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/GlobalTransactionManager.java
Fri Jan 18 13:27:08 2013
@@ -155,6 +155,7 @@
txManager.setNamingService(namingService);
txManager.setCallManager(new CallManager());
txManager.setMgcpProvider(provider);
+ txManager.start();
return txManager;
}
@@ -197,6 +198,8 @@
}
private void checkAddress(byte index) {
+ int intIndex = ((int)index) & 0xFF;
+
if(subManager==null)
{
try
@@ -212,15 +215,15 @@
{
subManager=new GlobalTransactionManager[256];
- subManager[index]=new
GlobalTransactionManager(scheduler);
- subManager[index].setMgcpProvider(provider);
- subManager[index].setNamingService(namingService);
- subManager[index].setPoolSize(poolSize);
+ subManager[intIndex]=new
GlobalTransactionManager(scheduler);
+ subManager[intIndex].setMgcpProvider(provider);
+ subManager[intIndex].setNamingService(namingService);
+ subManager[intIndex].setPoolSize(poolSize);
}
lock.unlock();
}
- else if(subManager[index]==null)
+ else if(subManager[intIndex]==null)
{
try
{
@@ -231,12 +234,12 @@
}
- if(subManager[index]==null)
+ if(subManager[intIndex]==null)
{
- subManager[index]=new
GlobalTransactionManager(scheduler);
- subManager[index].setMgcpProvider(provider);
- subManager[index].setNamingService(namingService);
- subManager[index].setPoolSize(poolSize);
+ subManager[intIndex]=new
GlobalTransactionManager(scheduler);
+ subManager[intIndex].setMgcpProvider(provider);
+ subManager[intIndex].setNamingService(namingService);
+ subManager[intIndex].setPoolSize(poolSize);
}
lock.unlock();
=======================================
---
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/Transaction.java
Tue Oct 23 05:48:15 2012
+++
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/Transaction.java
Fri Jan 18 13:27:08 2013
@@ -43,6 +43,8 @@
protected int id;
protected int uniqueId;
+ protected boolean completed=false;
+
//Transaction manager instance
private TransactionManager txManager;
@@ -154,9 +156,14 @@
logger.info("tx=" + id + " was executed normaly");
if (action != null && action.getEvent() != null) {
action.getEvent().recycle();
+ action=null;
}
- txManager.terminate(this);
+ if(!completed)
+ {
+ completed=true;
+ txManager.terminate(this);
+ }
}
public void onFailure(Exception e) {
@@ -176,7 +183,13 @@
logger.info("tx=" + id + " Rolled back");
if (action.getEvent() != null) {
action.getEvent().recycle();
+ action=null;
+ }
+
+ if(!completed)
+ {
+ completed=true;
+ txManager.terminate(this);
}
- txManager.terminate(this);
}
}
=======================================
---
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/TransactionManager.java
Fri Jan 18 07:58:56 2013
+++
/controls/mgcp/src/main/java/org/mobicents/media/server/mgcp/tx/TransactionManager.java
Fri Jan 18 13:27:08 2013
@@ -25,6 +25,7 @@
import org.mobicents.media.server.mgcp.MgcpProvider;
import org.mobicents.media.server.mgcp.controller.CallManager;
import org.mobicents.media.server.mgcp.controller.naming.NamingTree;
+import org.mobicents.media.server.scheduler.Task;
import org.mobicents.media.server.scheduler.Scheduler;
import org.mobicents.media.server.scheduler.ConcurrentLinkedList;
@@ -44,6 +45,12 @@
//pool of transaction objects
private ConcurrentLinkedList<Transaction> pool=new
ConcurrentLinkedList();
+
+ //cache size in 100ms units
+ private static final int cacheSize=5;
+ private ConcurrentLinkedList<Transaction>[] cache=new
ConcurrentLinkedList[cacheSize];
+ private int cleanIndex=0;
+
//currently active transactions.
private ConcurrentHashMap<Integer,Transaction> active;
@@ -58,6 +65,10 @@
//call manager
protected CallManager callManager;
+
+ //cache heartbeat
+ private Heartbeat cacheHeartbeat;
+
/**
* Creates new transaction's pool.
*
@@ -71,7 +82,17 @@
for (int i = 0; i < size; i++) {
pool.offer(new Transaction(this));
- }
+ }
+
+ for(int i=0;i<cache.length;i++)
+ cache[i]=new ConcurrentLinkedList<Transaction>();
+
+ cacheHeartbeat = new Heartbeat();
+ }
+
+ public void start()
+ {
+ scheduler.submitHeatbeat(cacheHeartbeat);
}
/**
@@ -158,10 +179,7 @@
* @param t the transaction to be terminated
*/
protected void terminate(Transaction t) {
- active.remove(t.uniqueId);
- t.id = 0;
- t.uniqueId=0;
- pool.offer(t);
+ cache[cleanIndex].offer(t);
}
/**
@@ -182,4 +200,35 @@
protected int remainder() {
return pool.size();
}
+
+ private class Heartbeat extends Task {
+ int queueToClean;
+
+ public Heartbeat() {
+ super();
+ }
+
+ @Override
+ public long perform() {
+ queueToClean=(cleanIndex+1)%cacheSize;
+ Transaction current=cache[queueToClean].poll();
+ while(current!=null)
+ {
+ active.remove(current.uniqueId);
+ current.id = 0;
+ current.uniqueId=0;
+ current.completed=false;
+ pool.offer(current);
+ current=cache[queueToClean].poll();
+ }
+
+ cleanIndex=(cleanIndex+1)%cacheSize;
+ scheduler.submitHeatbeat(this);
+ return 0;
+ }
+
+ public int getQueueNumber() {
+ return scheduler.HEARTBEAT_QUEUE;
+ }
+ }
}
=======================================
---
/controls/mgcp/src/test/java/org/mobicents/media/server/mgcp/tx/TransactionManagerTest.java
Sat Jan 5 09:44:27 2013
+++
/controls/mgcp/src/test/java/org/mobicents/media/server/mgcp/tx/TransactionManagerTest.java
Fri Jan 18 13:27:08 2013
@@ -65,7 +65,9 @@
scheduler.setClock(clock);
scheduler.start();
- txManager = new TransactionManager(scheduler, 3);
+ txManager = new TransactionManager(scheduler, 3);
+ txManager.start();
+
action = new Action();
TaskChain actionHandler = new TaskChain(2,scheduler);
@@ -105,6 +107,16 @@
assertEquals(2, txManager.remainder());
txManager.terminate(tx);
+
+ try
+ {
+ Thread.sleep(700);
+ }
+ catch(InterruptedException e)
+ {
+
+ }
+
assertEquals(3, txManager.remainder());
}
@@ -113,7 +125,7 @@
{
Transaction tx = txManager.allocateNew(id);
tx.process(action);
- Thread.sleep(1500);
+ Thread.sleep(700);
assertEquals(3, txManager.remainder());
}
catch(Exception e)