|  | @@ -203,7 +203,7 @@ class Task(object):
 | 
	
		
			
				|  |  |      name = received = sent = started = succeeded = failed = retried = \
 | 
	
		
			
				|  |  |          revoked = args = kwargs = eta = expires = retries = worker = result = \
 | 
	
		
			
				|  |  |          exception = timestamp = runtime = traceback = exchange = \
 | 
	
		
			
				|  |  | -        routing_key = None
 | 
	
		
			
				|  |  | +        routing_key = client = None
 | 
	
		
			
				|  |  |      state = states.PENDING
 | 
	
		
			
				|  |  |      clock = 0
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -211,7 +211,7 @@ class Task(object):
 | 
	
		
			
				|  |  |                 'succeeded', 'failed', 'retried', 'revoked', 'args', 'kwargs',
 | 
	
		
			
				|  |  |                 'eta', 'expires', 'retries', 'worker', 'result', 'exception',
 | 
	
		
			
				|  |  |                 'timestamp', 'runtime', 'traceback', 'exchange', 'routing_key',
 | 
	
		
			
				|  |  | -               'clock')
 | 
	
		
			
				|  |  | +               'clock', 'client')
 | 
	
		
			
				|  |  |      if not PYPY:
 | 
	
		
			
				|  |  |          __slots__ = _fields + ('__dict__', '__weakref__')
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -302,6 +302,10 @@ class Task(object):
 | 
	
		
			
				|  |  |      def __reduce__(self):
 | 
	
		
			
				|  |  |          return _depickle_task, (self.__class__, self.as_dict())
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    @property
 | 
	
		
			
				|  |  | +    def origin(self):
 | 
	
		
			
				|  |  | +        return self.client if self.worker is None else self.worker.id
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      @property
 | 
	
		
			
				|  |  |      def ready(self):
 | 
	
		
			
				|  |  |          return self.state in states.READY_STATES
 | 
	
	
		
			
				|  | @@ -500,7 +504,9 @@ class State(object):
 | 
	
		
			
				|  |  |                      task, created = get_task(uuid), False
 | 
	
		
			
				|  |  |                  except KeyError:
 | 
	
		
			
				|  |  |                      task = tasks[uuid] = Task(uuid)
 | 
	
		
			
				|  |  | -                if not is_client_event:
 | 
	
		
			
				|  |  | +                if is_client_event:
 | 
	
		
			
				|  |  | +                    task.client = hostname
 | 
	
		
			
				|  |  | +                else:
 | 
	
		
			
				|  |  |                      try:
 | 
	
		
			
				|  |  |                          worker, created = get_worker(hostname), False
 | 
	
		
			
				|  |  |                      except KeyError:
 | 
	
	
		
			
				|  | @@ -509,8 +515,9 @@ class State(object):
 | 
	
		
			
				|  |  |                      if worker is not None and local_received:
 | 
	
		
			
				|  |  |                          worker.event(None, local_received, timestamp)
 | 
	
		
			
				|  |  |                  clock = 0 if is_client_event else event.get('clock')
 | 
	
		
			
				|  |  | +                origin = hostname if is_client_event else worker.id
 | 
	
		
			
				|  |  |                  heappush(taskheap,
 | 
	
		
			
				|  |  | -                         timetuple(clock, timestamp, worker.id, ref(task)))
 | 
	
		
			
				|  |  | +                         timetuple(clock, timestamp, origin, ref(task)))
 | 
	
		
			
				|  |  |                  if len(taskheap) > maxtasks:
 | 
	
		
			
				|  |  |                      heappop(taskheap)
 | 
	
		
			
				|  |  |                  if subject == 'received':
 | 
	
	
		
			
				|  | @@ -524,7 +531,7 @@ class State(object):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      def rebuild_taskheap(self, timetuple=timetuple, heapify=heapify):
 | 
	
		
			
				|  |  |          heap = self._taskheap[:] = [
 | 
	
		
			
				|  |  | -            timetuple(t.clock, t.timestamp, t.worker.id, ref(t))
 | 
	
		
			
				|  |  | +            timetuple(t.clock, t.timestamp, t.origin, ref(t))
 | 
	
		
			
				|  |  |              for t in values(self.tasks)
 | 
	
		
			
				|  |  |          ]
 | 
	
		
			
				|  |  |          heapify(heap)
 |