code: def _finalize_upload(self, sd):
          # type: (SyncCopy, blobxfer.models.synccopy.Descriptor) -> None
          
          metadata = sd.src_entity.raw_metadata
          if blobxfer.util.is_not_empty(sd.src_entity.md5):
              digest = sd.src_entity.md5
          else:
              digest = None
          if sd.requires_put_block_list:
              # put block list for non one-shot block blobs
              self._finalize_block_blob(sd, metadata, digest)
          elif sd.remote_is_page_blob or sd.remote_is_append_blob:
              # append and page blob finalization
              self._finalize_nonblock_blob(sd, metadata, digest)
          elif sd.remote_is_file:
              # azure file finalization
              self._finalize_azure_file(sd, metadata, digest)
          # set access tier
          if sd.requires_access_tier_set:
              blobxfer.operations.azure.blob.block.set_blob_access_tier(
                  sd.dst_entity)
docs: Finalize file upload
          :param SyncCopy self: this
          :param blobxfer.models.synccopy.Descriptor sd: synccopy descriptor