def METHOD_NAME(
        batch,
        *,
        transfertools: Optional[list[str]] = None,
        bulk: int = 100,
        logger=logging.log,
):
    topology, requests_with_sources = batch
    if not transfertools:
        transfertools = list(transfer_core.TRANSFERTOOL_CLASSES_BY_NAME)
    start_time = time()
    try:
        admin_accounts = list_transfer_admin_accounts()
        ret = build_transfer_paths(
            topology=topology,
            protocol_factory=ProtocolFactory(),
            requests_with_sources=list(requests_with_sources.values()),
            admin_accounts=admin_accounts,
            preparer_mode=True,
            logger=logger,
        )
        requests_handled = sum(len(i) for i in ret)
        if not requests_handled:
            updated_msg = 'had nothing to do'
        else:
            candidate_paths, reqs_no_source, reqs_scheme_mismatch, reqs_only_tape_source, _ = ret
            updated_reqs, reqs_no_transfertool = prepare_transfers(candidate_paths, transfertools=transfertools, logger=logger)
            updated_msg = f'updated {len(updated_reqs)}/{bulk} requests'
            if reqs_no_transfertool:
                logger(logging.INFO, "Ignoring request because of unsupported transfertool: %s", reqs_no_transfertool)
            reqs_no_source.update(reqs_no_transfertool)
            if reqs_no_source:
                logger(logging.INFO, "Marking requests as no-sources: %s", reqs_no_source)
                set_requests_state_if_possible(reqs_no_source, RequestState.NO_SOURCES, logger=logger)
            if reqs_only_tape_source:
                logger(logging.INFO, "Marking requests as only-tape-sources: %s", reqs_only_tape_source)
                set_requests_state_if_possible(reqs_only_tape_source, RequestState.ONLY_TAPE_SOURCES, logger=logger)
            if reqs_scheme_mismatch:
                logger(logging.INFO, "Marking requests as scheme-mismatch: %s", reqs_scheme_mismatch)
                set_requests_state_if_possible(reqs_scheme_mismatch, RequestState.MISMATCH_SCHEME, logger=logger)
    except RucioException:
        logger(logging.ERROR, 'errored with a RucioException, retrying later', exc_info=True)
        updated_msg = 'errored'
    logger(logging.INFO, '%s, taking %.3f seconds' % (updated_msg, time() - start_time))