при сбое повторно отправить данные по TCP-сокетам - PullRequest
0 голосов
/ 15 мая 2018

Я проходил существующую реализацию отправки tcp для iscsi.

int iscsit_send_tx_data(
    struct iscsi_cmd *cmd,
    struct iscsi_conn *conn,
    int use_misc)
{
    int tx_sent, tx_size;
    u32 iov_count;
    struct kvec *iov;

send_data:
    tx_size = cmd->tx_size;

    if (!use_misc) {
        iov = &cmd->iov_data[0];
        iov_count = cmd->iov_data_count;
    } else {
        iov = &cmd->iov_misc[0];
        iov_count = cmd->iov_misc_count;
    }

    tx_sent = tx_data(conn, &iov[0], iov_count, tx_size);
    if (tx_size != tx_sent) {
        if (tx_sent == -EAGAIN) {
            pr_err("tx_data() returned -EAGAIN\n");
            goto send_data;
        } else
            return -1;
    }
    cmd->tx_size = 0;

    return 0;
}

Здесь

, если tx_size != tx_sent (включая такие условия, как tx_sent < 0 tx_sent == 0 and tx_sent < tx_size), и если tx_sent == -EAGAIN затем мы повторно отправляем данные.

Можем ли мы снова отправить оставшиеся данные, если tx_sent 0, учитывая, что вызов немедленно возвращается из-за недостатка места.

Какими должны быть идеальные шаги для обработки этого случая частичной отправки данных.

Можем ли мы увеличить буфер отправки TCP для размещения большего количества байтов, чтобы мы не возвращались из-за частичной отправки.

...