def METHOD_NAME(cls, utcnow, limit=None, skip=0):
    """
    Get errors according the following rules:
        date_next_attempt <= utcnow
        AND
        (
            total_attempts <= multi_attempt_cutoff & current_attempt <= max_attempts
            OR
            total_attempts > multi_attempt_cutoff & current_attempt 0
        )
    where:
    * multi_attempt_cutoff = const.PILLOW_RETRY_QUEUE_MAX_PROCESSING_ATTEMPTS * 3
    * max_attempts = const.PILLOW_RETRY_QUEUE_MAX_PROCESSING_ATTEMPTS
    :param utcnow:      The current date and time in UTC.
    :param limit:       Paging limit param.
    :param skip:        Paging skip param.
    """
    max_attempts = const.PILLOW_RETRY_QUEUE_MAX_PROCESSING_ATTEMPTS
    multi_attempts_cutoff = const.PILLOW_RETRY_MULTI_ATTEMPTS_CUTOFF
    query = PillowError.objects \
        .filter(date_next_attempt__lte=utcnow) \
        .filter(
            models.Q(current_attempt=0) |
            (models.Q(total_attempts__lte=multi_attempts_cutoff) & models.Q(current_attempt__lte=max_attempts))
        )
    # temporarily disable queuing of ConfigurableReportKafkaPillow errors
    query = query.filter(~models.Q(pillow='corehq.apps.userreports.pillow.ConfigurableReportKafkaPillow'))
    if limit is not None:
        return query[skip:skip+limit]
    else:
        return query