code: def _handledFailedSuccessor(self, jobNode, jobGraph, successorJobStoreID):
          
          logger.debug("Successor job: %s of job: %s has failed """
                       "predecessors", jobNode, jobGraph)
  
          # Add the job to the set having failed successors
          self.toilState.hasFailedSuccessors.add(jobGraph.jobStoreID)
  
          # Reduce active successor count and remove the successor as an active successor of the job
          self.toilState.successorCounts[jobGraph.jobStoreID] -= 1
          assert self.toilState.successorCounts[jobGraph.jobStoreID] >= 0
          self.toilState.successorJobStoreIDToPredecessorJobs[successorJobStoreID].remove(jobGraph)
          if len(self.toilState.successorJobStoreIDToPredecessorJobs[successorJobStoreID]) == 0:
              self.toilState.successorJobStoreIDToPredecessorJobs.pop(successorJobStoreID)
  
          # If the job now has no active successors add to active jobs
          # so it can be processed as a job with failed successors
          if self.toilState.successorCounts[jobGraph.jobStoreID] == 0:
              logger.debug("Job: %s has no successors to run "
                           "and some are failed, adding to list of jobs "
                           "with failed successors", jobGraph)
              self.toilState.successorCounts.pop(jobGraph.jobStoreID)
              self.toilState.updatedJobs.add((jobGraph, 0))
              return False
docs: Deal with the successor having failed. Return True if there are
          still active successors. Return False if all successors have failed
          and the job is queued to run to handle the failed successors.