code: def getSuccessors(jobGraph, alreadySeenSuccessors, jobStore):
          
          successors = set()
          def successorRecursion(jobGraph):
              # For lists of successors
              for successorList in jobGraph.stack:
  
                  # For each successor in list of successors
                  for successorJobNode in successorList:
  
                      # If successor not already visited
                      if successorJobNode.jobStoreID not in alreadySeenSuccessors:
  
                          # Add to set of successors
                          successors.add(successorJobNode.jobStoreID)
                          alreadySeenSuccessors.add(successorJobNode.jobStoreID)
  
                          # Recurse if job exists
                          # (job may not exist if already completed)
                          if jobStore.exists(successorJobNode.jobStoreID):
                              successorRecursion(jobStore.load(successorJobNode.jobStoreID))
  
          successorRecursion(jobGraph)  # Recurse from jobGraph
  
          return successors
docs: Gets successors of the given job by walking the job graph recursively.
          Any successor in alreadySeenSuccessors is ignored and not traversed.
          Returns the set of found successors. This set is added to alreadySeenSuccessors.