|  | @@ -34,7 +34,7 @@ from celery.utils.text import truncate
 | 
	
		
			
				|  |  |  from celery.utils.timeutils import humanize_seconds, timezone
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  from . import heartbeat, loops, pidbox
 | 
	
		
			
				|  |  | -from .state import task_reserved, maybe_shutdown
 | 
	
		
			
				|  |  | +from .state import task_reserved, maybe_shutdown, revoked
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  CLOSE = bootsteps.CLOSE
 | 
	
		
			
				|  |  |  logger = get_logger(__name__)
 | 
	
	
		
			
				|  | @@ -120,13 +120,14 @@ class Consumer(object):
 | 
	
		
			
				|  |  |          name = 'Consumer'
 | 
	
		
			
				|  |  |          default_steps = [
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Connection',
 | 
	
		
			
				|  |  | +            'celery.worker.consumer:Mingle',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Events',
 | 
	
		
			
				|  |  | +            'celery.worker.consumer:Gossip',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Heart',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Control',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Tasks',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Evloop',
 | 
	
		
			
				|  |  |              'celery.worker.consumer:Agent',
 | 
	
		
			
				|  |  | -            'celery.worker.consumer:Gossip',
 | 
	
		
			
				|  |  |          ]
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          def shutdown(self, parent):
 | 
	
	
		
			
				|  | @@ -478,8 +479,26 @@ class Agent(bootsteps.StartStopStep):
 | 
	
		
			
				|  |  |          return agent
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +class Mingle(bootsteps.StartStopStep):
 | 
	
		
			
				|  |  | +    label = 'Mingle'
 | 
	
		
			
				|  |  | +    requires = (Connection, )
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    def start(self, c):
 | 
	
		
			
				|  |  | +        info('mingle: searching for neighbors')
 | 
	
		
			
				|  |  | +        I = c.app.control.inspect(timeout=1.0, connection=c.connection)
 | 
	
		
			
				|  |  | +        replies = I.hello()
 | 
	
		
			
				|  |  | +        if replies:
 | 
	
		
			
				|  |  | +            for reply in replies.itervalues():
 | 
	
		
			
				|  |  | +                c.app.clock.adjust(reply['clock'])
 | 
	
		
			
				|  |  | +                revoked.update(reply['revoked'])
 | 
	
		
			
				|  |  | +            info('mingle: synced with %s', ', '.join(replies))
 | 
	
		
			
				|  |  | +        else:
 | 
	
		
			
				|  |  | +            info('mingle: no one here')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  class Gossip(bootsteps.ConsumerStep):
 | 
	
		
			
				|  |  | -    label = 'gossip'
 | 
	
		
			
				|  |  | +    label = 'Gossip'
 | 
	
		
			
				|  |  |      requires = (Events, )
 | 
	
		
			
				|  |  |      _cons_stamp_fields = itemgetter(
 | 
	
		
			
				|  |  |          'clock', 'hostname', 'pid', 'topic', 'action',
 | 
	
	
		
			
				|  | @@ -545,26 +564,26 @@ class Gossip(bootsteps.ConsumerStep):
 | 
	
		
			
				|  |  |                  self.consensus_requests[id],
 | 
	
		
			
				|  |  |              )
 | 
	
		
			
				|  |  |              if leader == self.hostname:
 | 
	
		
			
				|  |  | -                print('I won the election %r' % (id, ))
 | 
	
		
			
				|  |  | +                info('I won the election %r', id)
 | 
	
		
			
				|  |  |                  try:
 | 
	
		
			
				|  |  |                      handler = self.election_handlers[topic]
 | 
	
		
			
				|  |  |                  except KeyError:
 | 
	
		
			
				|  |  | -                    error('Unknown election topic %r' % (topic, ), exc_info=1)
 | 
	
		
			
				|  |  | +                    error('Unknown election topic %r', topic, exc_info=1)
 | 
	
		
			
				|  |  |                  else:
 | 
	
		
			
				|  |  |                      handler(action)
 | 
	
		
			
				|  |  |              else:
 | 
	
		
			
				|  |  | -                print('Node %s elected for %r' % (leader, id))
 | 
	
		
			
				|  |  | +                info('node %s elected for %r', leader, id)
 | 
	
		
			
				|  |  |              self.consensus_requests.pop(id, None)
 | 
	
		
			
				|  |  |              self.consensus_replies.pop(id, None)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def on_node_join(self, worker):
 | 
	
		
			
				|  |  | -        info('{0.hostname} joined the party'.format(worker))
 | 
	
		
			
				|  |  | +        info('%s joined the party', worker.hostname)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def on_node_leave(self, worker):
 | 
	
		
			
				|  |  | -        info('{0.hostname} left'.format(worker))
 | 
	
		
			
				|  |  | +        info('%s left', worker.hostname)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def on_node_lost(self, worker):
 | 
	
		
			
				|  |  | -        warn('{0.hostname} went missing!')
 | 
	
		
			
				|  |  | +        warn('%s went missing!', worker.hostname)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def register_timer(self):
 | 
	
		
			
				|  |  |          if self._tref is not None:
 |