docs: def _on_completion(self):
          """ Checks to see if the Job has completed, and cleans up if it has. """
  
          logger.debug('Job {0} running _on_completion check'.format(self.name))
          if self.state.status != 'running' or (not self._is_complete()):
              return
  
          for job, results in self.run_log['tasks'].iteritems():
              if results.get('success', False) == False:
                  self._set_status('failed')
                  try:
                      self.backend.acquire_lock()
                      if self.event_handler:
                          self.event_handler.emit('job_failed',
                                                  self._serialize(include_run_logs=True))
                  except:
                      logger.exception("Error in handling events.")
                  finally:
                      self.backend.release_lock()
                  break
  
          if self.state.status != 'failed':
              self._set_status('waiting')
              self.run_log = {}
              try:
                  self.backend.acquire_lock()
                  if self.event_handler:
                      self.event_handler.emit('job_complete',
                                              self._serialize(include_run_logs=True))
              except:
                  logger.exception("Error in handling events.")
              finally:
                  self.backend.release_lock()
  
          self.destroy_snapshot()