We need to think about temporary vs. permanent failures in source mirroring

Background

The Source Mirroring implementation currently treats any kind of BstError raised in Source.fetch(), Source.track() or SourceFetcher.fetch()` as non-critical, and only if all fetch/track calls fail does it raise the last exception. This is going to have unexpected behaviour when the final call was a temporary error, but the previous ones were not.

Task description

  • Check whether the below plan makes sense.
  • When the error is temporary, try the next call.
  • When the error is not temporary, raise it.

Acceptance Criteria

  • When a non-temporary error is raised by Source.fetch(), Source.track() or SourceFetcher.fetch(), buildstream aborts.
  • When a temporary error is raised by the above methods, but not every call, buildstream proceeds as normal.
  • When a temporary error is raised every time the above methods are called, buildstream aborts.