You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by ch...@apache.org on 2012/11/05 21:32:11 UTC

svn commit: r1405940 - /activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala

Author: chirino
Date: Mon Nov  5 20:32:11 2012
New Revision: 1405940

URL: http://svn.apache.org/viewvc?rev=1405940&view=rev
Log:
Added a FullSink (a sink which is always full) and you can now poll sink items out of a SessionMux

Modified:
    activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala

Modified: activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala
URL: http://svn.apache.org/viewvc/activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala?rev=1405940&r1=1405939&r2=1405940&view=diff
==============================================================================
--- activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala (original)
+++ activemq/activemq-apollo/trunk/apollo-broker/src/main/scala/org/apache/activemq/apollo/broker/Sink.scala Mon Nov  5 20:32:11 2012
@@ -74,6 +74,13 @@ abstract class Sink[T] {
   }
 }
 
+case class FullSink[T]() extends Sink[T] {
+  def refiller:Task = null
+  def refiller_=(value:Task) = {}
+  def full = true
+  def offer(value: T) = false
+}
+
 case class BlackHoleSink[T]() extends Sink[T] {
   var refiller:Task = null
   def full = false
@@ -427,26 +434,35 @@ class SessionSinkMux[T](val downstream:S
 
   def drain_overflow:Unit = {
     while( !overflowed_sessions.isEmpty) {
-      val session = overflowed_sessions.getHead.session
       if( !downstream.full ) {
-        val value = session.overflow.removeFirst()
-        val accepted = downstream.offer((session, value))
+        val accepted = downstream.offer(poll)
         assert(accepted)
-        if( session.stall_counter > 0 ) {
-          schedual_rebalance
-        }
-        if( session.overflow.isEmpty ) {
-          session.overflow_node.unlink()
-        } else {
-          // to fairly consume values from all sessions.
-          overflowed_sessions.rotate()
-        }
       } else {
         return
       }
     }
   }
 
+  def poll:(Session[T], T) = {
+    consumer_queue.assertExecuting()
+    if(overflowed_sessions.isEmpty) {
+      null
+    } else {
+      val session = overflowed_sessions.getHead.session
+      val value = session.overflow.removeFirst()
+      if( session.stall_counter > 0 ) {
+        schedual_rebalance
+      }
+      if( session.overflow.isEmpty ) {
+        session.overflow_node.unlink()
+      } else {
+        // to fairly consume values from all sessions.
+        overflowed_sessions.rotate()
+      }
+      (session, value)
+    }
+  }
+
   def delivered(session:Session[Delivery], size:Int) = {
     session.credit(1, size)
   }