예제 #1
0
      public async Task ReliableTest() {
         try {
            using (var timeout = new CancellationTokenSource(10000)) {
               var str = CreatePlaceholder<string>();

               var latch = new AsyncLatch();
               var router = receiverFacade.InboundMessageRouter;
               router.RegisterHandler<string>(async x => {
                  await TaskEx.YieldToThreadPool();

                  AssertEquals(str, x.Body);
                  latch.Set();
               });

               await receiverFacade.PeerTable.GetOrAdd(senderFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token).ConfigureAwait(false);
               await senderFacade.PeerTable.GetOrAdd(receiverFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token).ConfigureAwait(false);

               await senderFacade.Messenger.SendReliableAsync(str, receiverFacade.Identity.Id).ConfigureAwait(false);
               await latch.WaitAsync(timeout.Token).ConfigureAwait(false);
            }
         } catch (Exception e) {
            Console.WriteLine("Threw " + e);
            throw;
         } finally {
            await receiverFacade.ShutdownAsync().ConfigureAwait(false);
            await senderFacade.ShutdownAsync().ConfigureAwait(false);

            AssertEquals(0, receiverFacade.RoutingTable.Enumerate().Count());
            AssertEquals(0, senderFacade.RoutingTable.Enumerate().Count());
         }
      }
예제 #2
0
        public async Task ReliableTest()
        {
            try {
                using (var timeout = new CancellationTokenSource(10000)) {
                    var str = CreatePlaceholder <string>();

                    var latch  = new AsyncLatch();
                    var router = receiverFacade.InboundMessageRouter;
                    router.RegisterHandler <string>(async x => {
                        await TaskEx.YieldToThreadPool();

                        AssertEquals(str, x.Body);
                        latch.Set();
                    });

                    await receiverFacade.PeerTable.GetOrAdd(senderFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token).ConfigureAwait(false);

                    await senderFacade.PeerTable.GetOrAdd(receiverFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token).ConfigureAwait(false);

                    await senderFacade.Messenger.SendReliableAsync(str, receiverFacade.Identity.Id).ConfigureAwait(false);

                    await latch.WaitAsync(timeout.Token).ConfigureAwait(false);
                }
            } catch (Exception e) {
                Console.WriteLine("Threw " + e);
                throw;
            } finally {
                await receiverFacade.ShutdownAsync().ConfigureAwait(false);

                await senderFacade.ShutdownAsync().ConfigureAwait(false);

                AssertEquals(0, receiverFacade.RoutingTable.Enumerate().Count());
                AssertEquals(0, senderFacade.RoutingTable.Enumerate().Count());
            }
        }
      public async Task RunAsync() {
         Console.WriteLine(DateTime.Now);
         const int kMessagesPerWorker = 200000;
         var sink = courierFacades[0];
         var senders = courierFacades.Skip(1).ToArray();
         var counter = kMessagesPerWorker * senders.Length;
         var doneSignal = new AsyncLatch();
         int upCounter = 0;
         var set = new ConcurrentSet<int>();
         sink.InboundMessageRouter.RegisterHandler<string>(
            x => {
               set.AddOrThrow(int.Parse(x.Body));
               var newCounter = Interlocked.Decrement(ref counter);
               Interlocked.Increment(ref upCounter);
               if (upCounter % 500 == 0)
                  Console.WriteLine(newCounter + " " + upCounter);
               if (newCounter == 0) {
                  doneSignal.Set();
               }
               return Task.FromResult(false);
            });

         var sync = new AsyncCountdownLatch(senders.Length);
         var senderTasks = senders.Select((s, id) => Go(async () => {
            await s.PeerTable.GetOrAdd(sink.Identity.Id).WaitForDiscoveryAsync().ConfigureAwait(false);
            sync.Signal();
            await sync.WaitAsync().ConfigureAwait(false);
            Console.WriteLine("Sink discovered: " + DateTime.Now);

            const int kBatchFactor = 1;
            for (var batch = 0; batch < kBatchFactor; batch++) {
               var batchSize = kMessagesPerWorker / kBatchFactor;
               await Task.WhenAll(Util.Generate(
                  batchSize,
                  i => s.Messenger.SendReliableAsync(
                     "" + (batch * batchSize + i + id * kMessagesPerWorker),
                     sink.Identity.Id))
                  ).ConfigureAwait(false);
            }

            Console.WriteLine("Worker Done: " + DateTime.Now);
         }));
         await Task.WhenAll(senderTasks).ConfigureAwait(false);
         Console.WriteLine("Senders Done: " + DateTime.Now);

         await doneSignal.WaitAsync().ConfigureAwait(false);
         Console.WriteLine("Done Signalled: " + DateTime.Now);

         AssertCollectionDeepEquals(set, new ConcurrentSet<int>(Enumerable.Range(0, kMessagesPerWorker * senders.Length)));

         while (true) {
            GC.Collect();
         }
      }
예제 #4
0
        public async Task LargeObjectTest()
        {
            try {
                ThreadPool.SetMinThreads(128, 128);
                var sw = new Stopwatch();
                sw.Start();

                logger.Info("Building large payload");
                var payload = new byte[1000 * 1000 * 1000];
                logger.Info($"Done building large payload. Size: {payload.Length / (1024f * 1024f)} MiB.");

                using (var timeout = new CancellationTokenSource(1000000)) {
                    // ensure the serialized object is large.
                    var readCompletionLatch = new AsyncLatch();
                    var router = receiverFacade.InboundMessageRouter;
                    router.RegisterHandler <byte[]>(async x => {
                        await TaskEx.YieldToThreadPool();

                        logger.Info("Received large payload.");
                        var equalityCheckResult = Util.ByteArraysEqual(payload, x.Body);
                        logger.Info("Validation result: " + equalityCheckResult);
                        AssertTrue(equalityCheckResult);
                        logger.Info("Validated large payload.");
                        readCompletionLatch.Set();
                    });

                    await receiverFacade.PeerTable.GetOrAdd(senderFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token);

                    await senderFacade.PeerTable.GetOrAdd(receiverFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token);

                    logger.Info("Sending large payload");
                    await senderFacade.Messenger.SendReliableAsync(payload, receiverFacade.Identity.Id);

                    logger.Info("Sent large payload");
                    await readCompletionLatch.WaitAsync(timeout.Token);
                }
            } catch (Exception e) {
                Console.WriteLine("Threw " + e);
                throw;
            } finally {
                await receiverFacade.ShutdownAsync();

                await senderFacade.ShutdownAsync();

                AssertEquals(0, receiverFacade.RoutingTable.Enumerate().Count());
                AssertEquals(0, senderFacade.RoutingTable.Enumerate().Count());
            }
        }
예제 #5
0
        public void HandleInboundPeerIdentityUpdate(Identity identity)
        {
//         logger.Trace($"Got announcement from peer {identity}!");
            Identity.Update(identity);

            if (Interlocked.CompareExchange(ref discoveryState, kDiscovered, kNotDiscovered) == kNotDiscovered)
            {
                Go(async() => {
                    var discoveryEvent = new PeerDiscoveryEvent {
                        Peer = this
                    };
                    await peerDiscoveryEventPoster.PostAsync(discoveryEvent).ConfigureAwait(false);
                    discoveryLatch.Set();
                }).Forget();
            }
        }
예제 #6
0
        public void SetIsClosed(bool value)
        {
            lock (synchronization) {
                if (isClosed == value)
                {
                    return;
                }
                isClosed = value;

                if (value)
                {
                    latch.Set();
                }
                else
                {
                    latch = new AsyncLatch();
                }
            }
        }
        public UdpMessagingLoadTests()
        {
            Go(async() => {
                var ch = new BlockingChannel <string>();
                var l  = new AsyncLatch();
                Go(async() => {
                    await l.WaitAsync().ConfigureAwait(false);
                    for (var i = 0; i < 10; i++)
                    {
                        await ch.WriteAsync("asdf").ConfigureAwait(false);
                        await Task.Delay(400).ConfigureAwait(false);
                    }
                }).Forget();
                l.Set();
                for (var i = 0; i < 10; i++)
                {
                    await new Select {
                        Case(Time.After(500), () => {
                            Console.WriteLine("Nay!");
                        }),
                        Case(ch, () => {
                            Console.WriteLine("Yay!");
                        })
                    }.WaitAsync().ConfigureAwait(false);
                }
                while (true)
                {
                    ;
                }
            }).Wait();
            var courierFacades = Util.Generate(
                2,
                i => CourierBuilder.Create()
                .UseUdpTransport()
                .UseTcpServerTransport(21337 + i)
                .BuildAsync().Result);

            Setup(courierFacades);
        }
        public async Task RunAsync()
        {
            Console.WriteLine(DateTime.Now);
            const int kMessagesPerWorker = 200000;
            var       sink       = courierFacades[0];
            var       senders    = courierFacades.Skip(1).ToArray();
            var       counter    = kMessagesPerWorker * senders.Length;
            var       doneSignal = new AsyncLatch();
            int       upCounter  = 0;
            var       set        = new ConcurrentSet <int>();

            sink.InboundMessageRouter.RegisterHandler <string>(
                x => {
                set.AddOrThrow(int.Parse(x.Body));
                var newCounter = Interlocked.Decrement(ref counter);
                Interlocked.Increment(ref upCounter);
                if (upCounter % 500 == 0)
                {
                    Console.WriteLine(newCounter + " " + upCounter);
                }
                if (newCounter == 0)
                {
                    doneSignal.Set();
                }
                return(Task.FromResult(false));
            });

            var sync        = new AsyncCountdownLatch(senders.Length);
            var senderTasks = senders.Select((s, id) => Go(async() => {
                await s.PeerTable.GetOrAdd(sink.Identity.Id).WaitForDiscoveryAsync().ConfigureAwait(false);
                sync.Signal();
                await sync.WaitAsync().ConfigureAwait(false);
                Console.WriteLine("Sink discovered: " + DateTime.Now);

                const int kBatchFactor = 1;
                for (var batch = 0; batch < kBatchFactor; batch++)
                {
                    var batchSize = kMessagesPerWorker / kBatchFactor;
                    await Task.WhenAll(Util.Generate(
                                           batchSize,
                                           i => s.Messenger.SendReliableAsync(
                                               "" + (batch * batchSize + i + id * kMessagesPerWorker),
                                               sink.Identity.Id))
                                       ).ConfigureAwait(false);
                }

                Console.WriteLine("Worker Done: " + DateTime.Now);
            }));
            await Task.WhenAll(senderTasks).ConfigureAwait(false);

            Console.WriteLine("Senders Done: " + DateTime.Now);

            await doneSignal.WaitAsync().ConfigureAwait(false);

            Console.WriteLine("Done Signalled: " + DateTime.Now);

            AssertCollectionDeepEquals(set, new ConcurrentSet <int>(Enumerable.Range(0, kMessagesPerWorker * senders.Length)));

            while (true)
            {
                GC.Collect();
            }
        }
 public UdpMessagingLoadTests() {
    Go(async () => {
       var ch = new BlockingChannel<string>();
       var l = new AsyncLatch();
       Go(async () => {
          await l.WaitAsync().ConfigureAwait(false);
          for (var i = 0; i < 10; i++) {
             await ch.WriteAsync("asdf").ConfigureAwait(false);
             await Task.Delay(400).ConfigureAwait(false);
          }
       }).Forget();
       l.Set();
       for (var i = 0; i < 10; i++) {
          await new Select {
             Case(Time.After(500), () => {
                Console.WriteLine("Nay!");
             }),
             Case(ch, () => {
                Console.WriteLine("Yay!");
             })
          }.WaitAsync().ConfigureAwait(false);
       }
       while (true) ;
    }).Wait();
    var courierFacades = Util.Generate(
       2,
       i => CourierBuilder.Create()
                          .UseUdpTransport()
                          .UseTcpServerTransport(21337 + i)
                          .BuildAsync().Result);
    Setup(courierFacades);
 }
예제 #10
0
      public async Task LargeObjectTest() {
         try {
            ThreadPool.SetMinThreads(128, 128);
            var sw = new Stopwatch();
            sw.Start();

            logger.Info("Building large payload");
            var payload = new byte[1000 * 1000 * 1000];
            logger.Info($"Done building large payload. Size: {payload.Length / (1024f * 1024f)} MiB." );
            
            using (var timeout = new CancellationTokenSource(1000000)) {
               // ensure the serialized object is large.
               var readCompletionLatch = new AsyncLatch();
               var router = receiverFacade.InboundMessageRouter;
               router.RegisterHandler<byte[]>(async x => {
                  await TaskEx.YieldToThreadPool();

                  logger.Info("Received large payload.");
                  var equalityCheckResult = Util.ByteArraysEqual(payload, x.Body);
                  logger.Info("Validation result: " + equalityCheckResult);
                  AssertTrue(equalityCheckResult);
                  logger.Info("Validated large payload.");
                  readCompletionLatch.Set();
               });

               await receiverFacade.PeerTable.GetOrAdd(senderFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token);
               await senderFacade.PeerTable.GetOrAdd(receiverFacade.Identity.Id).WaitForDiscoveryAsync(timeout.Token);

               logger.Info("Sending large payload");
               await senderFacade.Messenger.SendReliableAsync(payload, receiverFacade.Identity.Id);
               logger.Info("Sent large payload");
               await readCompletionLatch.WaitAsync(timeout.Token);
            }
         } catch (Exception e) {
            Console.WriteLine("Threw " + e);
            throw;
         } finally {
            await receiverFacade.ShutdownAsync();
            await senderFacade.ShutdownAsync();

            AssertEquals(0, receiverFacade.RoutingTable.Enumerate().Count());
            AssertEquals(0, senderFacade.RoutingTable.Enumerate().Count());
         }
      }