/**
  * Attempt to find a handler to migrate to a new NonBlockingIOThread.
  *
  * @param imbalance describing a snapshot of NonBlockingIOThread load
  * @return the handler to migrate to a new NonBlockingIOThread or null if no handler needs to be
  *     migrated.
  */
 @Override
 public MigratableHandler findHandlerToMigrate(LoadImbalance imbalance) {
   Set<? extends MigratableHandler> candidates =
       imbalance.getHandlersOwnerBy(imbalance.sourceSelector);
   long migrationThreshold =
       (long)
           ((imbalance.maximumEvents - imbalance.minimumEvents)
               * MAXIMUM_NO_OF_EVENTS_AFTER_MIGRATION_COEFFICIENT);
   MigratableHandler candidate = null;
   long eventCountInSelectedHandler = 0;
   for (MigratableHandler handler : candidates) {
     long eventCount = imbalance.getEventCount(handler);
     if (eventCount > eventCountInSelectedHandler) {
       if (eventCount < migrationThreshold) {
         eventCountInSelectedHandler = eventCount;
         candidate = handler;
       }
     }
   }
   return candidate;
 }
Esempio n. 2
0
  private void updateNewFinalImbalance() {
    imbalance.minimumEvents = Long.MAX_VALUE;
    imbalance.maximumEvents = Long.MIN_VALUE;
    imbalance.sourceSelector = null;
    imbalance.destinationSelector = null;
    for (NonBlockingIOThread selector : ioThreads) {
      long eventCount = selectorEvents.get(selector);
      int handlerCount = selectorToHandlers.get(selector).size();

      if (eventCount > imbalance.maximumEvents && handlerCount > 1) {
        // if a selector has only 1 handle, there is no point in making it a source selector since
        // there is no handler that can be migrated anyway. In that case it is better to move on to
        // the next selector.
        imbalance.maximumEvents = eventCount;
        imbalance.sourceSelector = selector;
      }

      if (eventCount < imbalance.minimumEvents) {
        imbalance.minimumEvents = eventCount;
        imbalance.destinationSelector = selector;
      }
    }
  }