public static string UpdateSpecificCircuit(CircuitBreakerSet set, string circuitId, int sequenceNumber) { CircuitBreakerState input = MakeBreakerState(messageSequenceNumber: sequenceNumber, id: circuitId); set.ProcessCircuitStateMessage(input); return(circuitId); }
public void can_concurrently_add_circuits() { var set = new CircuitBreakerSet(); int counter = 0; using (ManualResetEvent waithandle = new ManualResetEvent(false)) { for (int i = 0; i < 10000; i++) { ThreadPool.QueueUserWorkItem(o => { Helper.AddRandomCircuit(set); Interlocked.Increment(ref counter); if (counter == 10000) { // ReSharper disable AccessToDisposedClosure waithandle.Set(); // ReSharper restore AccessToDisposedClosure } }); } waithandle.WaitOne(10000); Assert.That(set.Circuits().Length, Is.EqualTo(10000)); } }
public static string AddRandomCircuit(CircuitBreakerSet set) { CircuitBreakerState input = MakeBreakerState(messageSequenceNumber: 15); var circuitId = input.CircuitBreakerId; set.ProcessCircuitStateMessage(input); return(circuitId); }
public void cleaning_up_a_set_with_DateTimeMinValue_does_nothing() { _set = new CircuitBreakerSet(); Helper.AddRandomCircuit(_set); _set.RemoveExpiredCircuitBreakers(DateTime.MinValue); Assert.That(_set.Circuits().Length, Is.EqualTo(1)); }
public void can_concurrently_update_circuitbreakers() { object monitor = new object(); int numcircuits = 13; int[] maxSequenceNumber = new int[numcircuits]; var set = new CircuitBreakerSet(); int counter = 0; int updateCounter = 0; using (ManualResetEvent waithandle = new ManualResetEvent(false)) { for (int i = 0; i < 10000; i++) { ThreadPool.QueueUserWorkItem(o => { int sequenceNumber; string circuitId; lock (monitor) { int currentCircuit = (counter % numcircuits); circuitId = currentCircuit.ToString(CultureInfo.InvariantCulture); sequenceNumber = counter; maxSequenceNumber[currentCircuit] = sequenceNumber; counter++; } Helper.UpdateSpecificCircuit(set, circuitId, sequenceNumber); lock (monitor) { updateCounter++; // you need a counter for both sequence and updates. Otherwise a race emerges either between setting the waithandle too early or sending multiple updates with a counter of zero. if (updateCounter == 10000) { // ReSharper disable AccessToDisposedClosure waithandle.Set(); // ReSharper restore AccessToDisposedClosure } } }); } waithandle.WaitOne(10000); Assert.That(set.Circuits().Length, Is.EqualTo(numcircuits)); for (int i = 0; i < numcircuits; i++) { Assert.That(set.TryGetCircuit(i.ToString(CultureInfo.InvariantCulture)).MessageSequenceNumber, Is.EqualTo(maxSequenceNumber[i])); } } }
public void Setup() { _set = new CircuitBreakerSet(); }