docs: def _process_synccopy_descriptor(self, sd):
          # type: (SyncCopy, blobxfer.models.synccopy.Descriptor) -> None
          """Process synccopy descriptor
          :param SyncCopy self: this
          :param blobxfer.models.synccopy.Descriptor sd: synccopy descriptor
          """
          # update progress bar
          self._update_progress_bar()
          # get download offsets
          offsets, resume_bytes = sd.next_offsets()
          # add resume bytes to counter
          if resume_bytes is not None:
              with self._transfer_lock:
                  self._synccopy_bytes_sofar += resume_bytes
                  logger.debug('adding {} sofar {} from {}'.format(
                      resume_bytes, self._synccopy_bytes_sofar,
                      sd.dst_entity.name))
              del resume_bytes
          # check if all operations completed
          if offsets is None and sd.all_operations_completed:
              # finalize upload for non-one shots
              if not sd.is_one_shot_block_blob:
                  self._finalize_upload(sd)
              else:
                  # set access tier for one shots
                  if sd.requires_access_tier_set:
                      blobxfer.operations.azure.blob.block.set_blob_access_tier(
                          sd.dst_entity)
              # accounting
              with self._transfer_lock:
                  self._transfer_set.remove(
                      blobxfer.operations.synccopy.SyncCopy.
                      create_unique_transfer_operation_id(
                          sd.src_entity, sd.dst_entity))
                  self._synccopy_sofar += 1
              return
          # re-enqueue for finalization if no offsets
          if offsets is None:
              self._transfer_queue.put(sd)
              return
          # prepare upload
          if offsets.chunk_num == 0:
              self._prepare_upload(sd.dst_entity)
          # prepare replica targets
          if blobxfer.util.is_not_empty(sd.dst_entity.replica_targets):
              for ase in sd.dst_entity.replica_targets:
                  if offsets.chunk_num == 0:
                      self._prepare_upload(ase)
          # re-enqueue for other threads to download next offset if not append
          if sd.src_entity.mode != blobxfer.models.azure.StorageModes.Append:
              self._transfer_queue.put(sd)
          # issue get range
          if sd.src_entity.mode == blobxfer.models.azure.StorageModes.File:
              data = blobxfer.operations.azure.file.get_file_range(
                  sd.src_entity, offsets)
          else:
              data = blobxfer.operations.azure.blob.get_blob_range(
                  sd.src_entity, offsets)
          # process data for upload
          self._process_data(sd, sd.dst_entity, offsets, data)
          # iterate replicas
          if blobxfer.util.is_not_empty(sd.dst_entity.replica_targets):
              for ase in sd.dst_entity.replica_targets:
                  self._process_data(sd, ase, offsets, data)
          # re-enqueue for append blobs
          if sd.src_entity.mode == blobxfer.models.azure.StorageModes.Append:
              self._transfer_queue.put(sd)