docs: def backup_incremental(self, snap_name=None, dry_run=False):
          """Uploads named snapshot or latest, along with any other snapshots
          required for an incremental backup.
          """
          z_snap = self._snapshot_to_backup(snap_name)
          to_upload = []
          current = z_snap
          uploaded_meta = []
          while True:
              s3_snap = self.s3_manager.get(current.name)
              if s3_snap is not None:
                  if not s3_snap.is_healthy:
                      # abort everything if we run in to unhealthy snapshots
                      raise IntegrityError(
                          "Broken snapshot detected {}, reason: '{}'".format(
                              s3_snap.name, s3_snap.reason_broken
                          ))
                  break
              to_upload.append(current)
              if current.parent is None:
                  break
              current = current.parent
          for z_snap in reversed(to_upload):
              estimated_size = self._parse_estimated_size(
                  self._cmd.shell(
                      "zfs send -nvP -i '{}' '{}'".format(
                          z_snap.parent.name, z_snap.name),
                      capture=True))
              self._cmd.pipe(
                  "zfs send -i '{}' '{}'".format(
                      z_snap.parent.name, z_snap.name),
                  self._compress(
                      self._pput_cmd(
                          estimated=estimated_size,
                          parent=z_snap.parent.name,
                          s3_prefix=self.s3_manager.s3_prefix,
                          snap_name=z_snap.name)
                  ),
                  dry_run=dry_run,
                  estimated_size=estimated_size,
              )
              uploaded_meta.append({'snap_name': z_snap.name, 'size': estimated_size})
          return uploaded_meta