public TestFairCallQueue() { { RpcScheduler sched = Org.Mockito.Mockito.Mock <RpcScheduler>(); Org.Mockito.Mockito.When(sched.GetPriorityLevel(Matchers.Any <Schedulable>())).ThenReturn (0); alwaysZeroScheduler = sched; } }
public virtual void TestAllQueuesFullRemainingCapacity() { RpcScheduler sched = Org.Mockito.Mockito.Mock <RpcScheduler>(); Org.Mockito.Mockito.When(sched.GetPriorityLevel(Matchers.Any <Schedulable>())).ThenReturn (0, 0, 0, 0, 0, 1, 1, 1, 1, 1); fcq.SetScheduler(sched); while (fcq.Offer(MockCall("c"))) { } Assert.Equal(0, fcq.RemainingCapacity()); Assert.Equal(10, fcq.Count); }
public virtual void TestQueuesPartialFilledRemainingCapacity() { RpcScheduler sched = Org.Mockito.Mockito.Mock <RpcScheduler>(); Org.Mockito.Mockito.When(sched.GetPriorityLevel(Matchers.Any <Schedulable>())).ThenReturn (0, 1, 0, 1, 0); fcq.SetScheduler(sched); for (int i = 0; i < 5; i++) { fcq.Offer(MockCall("c")); } Assert.Equal(5, fcq.RemainingCapacity()); Assert.Equal(5, fcq.Count); }
public virtual void TestOfferSucceedsWhenScheduledLowPriority() { // Scheduler will schedule into queue 0 x 5, then queue 1 RpcScheduler sched = Org.Mockito.Mockito.Mock <RpcScheduler>(); Org.Mockito.Mockito.When(sched.GetPriorityLevel(Matchers.Any <Schedulable>())).ThenReturn (0, 0, 0, 0, 0, 1, 0); fcq.SetScheduler(sched); for (int i = 0; i < 5; i++) { Assert.True(fcq.Offer(MockCall("c"))); } Assert.True(fcq.Offer(MockCall("c"))); Assert.Equal(6, fcq.Count); }
/// <exception cref="System.Exception"/> public virtual void TestTakeTriesNextQueue() { // Make a FCQ filled with calls in q 1 but empty in q 0 RpcScheduler q1Scheduler = Org.Mockito.Mockito.Mock <RpcScheduler>(); Org.Mockito.Mockito.When(q1Scheduler.GetPriorityLevel(Matchers.Any <Schedulable>() )).ThenReturn(1); fcq.SetScheduler(q1Scheduler); // A mux which only draws from q 0 RpcMultiplexer q0mux = Org.Mockito.Mockito.Mock <RpcMultiplexer>(); Org.Mockito.Mockito.When(q0mux.GetAndAdvanceCurrentIndex()).ThenReturn(0); fcq.SetMultiplexer(q0mux); Schedulable call = MockCall("c"); fcq.Put(call); // Take from q1 even though mux said q0, since q0 empty Assert.Equal(call, fcq.Take()); Assert.Equal(0, fcq.Count); }
/// <summary>Create a FairCallQueue.</summary> /// <param name="capacity">the maximum size of each sub-queue</param> /// <param name="ns">the prefix to use for configuration</param> /// <param name="conf"> /// the configuration to read from /// Notes: the FairCallQueue has no fixed capacity. Rather, it has a minimum /// capacity of `capacity` and a maximum capacity of `capacity * number_queues` /// </param> public FairCallQueue(int capacity, string ns, Configuration conf) { /* Scheduler picks which queue to place in */ /* Multiplexer picks which queue to draw from */ /* Statistic tracking */ int numQueues = ParseNumQueues(ns, conf); Log.Info("FairCallQueue is in use with " + numQueues + " queues."); this.queues = new AList <BlockingQueue <E> >(numQueues); this.overflowedCalls = new AList <AtomicLong>(numQueues); for (int i = 0; i < numQueues; i++) { this.queues.AddItem(new LinkedBlockingQueue <E>(capacity)); this.overflowedCalls.AddItem(new AtomicLong(0)); } this.scheduler = new DecayRpcScheduler(numQueues, ns, conf); this.multiplexer = new WeightedRoundRobinMultiplexer(numQueues, ns, conf); // Make this the active source of metrics FairCallQueue.MetricsProxy mp = FairCallQueue.MetricsProxy.GetInstance(ns); mp.SetDelegate(this); }
public virtual void SetScheduler(RpcScheduler newScheduler) { this.scheduler = newScheduler; }