示例#1
0
        @Override
        public void handle(ShuffleCycle event) {
          log.trace("{} {}", logPrefix, event);
          log.debug(
              "{} public view size:{}, private view size:{}, bootstrap nodes size:{}",
              new Object[] {
                logPrefix, publicView.size(), privateView.size(), bootstrapNodes.size()
              });

          if (!haveShufflePartners()) {
            log.warn("{} no shuffle partners - disconnected", logPrefix);
            stopShuffle();
            return;
          }

          if (!publicView.isEmpty() || !privateView.isEmpty()) {
            CroupierSample cs =
                new CroupierSample(overlayId, publicView.getAllCopy(), privateView.getAllCopy());
            log.info(
                "{} publishing sample \n public nodes:{} \n private nodes:{}",
                new Object[] {logPrefix, cs.publicSample, cs.privateSample});
            trigger(cs, croupierPort);
          }

          NatedAddress peer = selectPeerToShuffleWith(croupierConfig.softMaxTemperature);
          if (peer == null || peer.getBaseAdr().equals(self.getBaseAdr())) {
            log.error("{} this should not happen - logic error selecting peer", logPrefix);
            // throw new RuntimeException("Error selecting peer");
            return;
          }

          if (!peer.isOpen()) {
            log.debug(
                "{} did not pick a public node for shuffling - public view size:{}",
                new Object[] {logPrefix, publicView.getAllCopy().size()});
          }

          // NOTE:
          publicView.incrementDescriptorAges();
          privateView.incrementDescriptorAges();

          Set<CroupierContainer> publicDescCopy =
              publicView.initiatorCopySet(croupierConfig.shuffleSize, peer);
          Set<CroupierContainer> privateDescCopy =
              privateView.initiatorCopySet(croupierConfig.shuffleSize, peer);

          if (self.isOpen()) {
            publicDescCopy.add(new CroupierContainer(self, selfView));
          } else {
            privateDescCopy.add(new CroupierContainer(self, selfView));
          }

          OverlayHeaderImpl<NatedAddress> requestHeader =
              new OverlayHeaderImpl(new BasicHeader(self, peer, Transport.UDP), overlayId);
          CroupierShuffle.Request requestContent =
              new CroupierShuffle.Request(UUID.randomUUID(), publicDescCopy, privateDescCopy);
          CroupierShuffleNet.Request request =
              new CroupierShuffleNet.Request(requestHeader, requestContent);
          log.trace("{} sending:{} to:{}", new Object[] {logPrefix, requestContent, peer});
          trigger(request, network);
          scheduleShuffleTimeout(peer);
        }