Add EIO retry timeout and allow to disable these retries, rename up_wait_retry_interval to client_retry_interval
parent
02d1f16bbd
commit
6bf1f539a6
|
@ -9,6 +9,8 @@
|
||||||
These parameters apply only to Vitastor clients (QEMU, fio, NBD and so on) and
|
These parameters apply only to Vitastor clients (QEMU, fio, NBD and so on) and
|
||||||
affect their interaction with the cluster.
|
affect their interaction with the cluster.
|
||||||
|
|
||||||
|
- [client_retry_interval](#client_retry_interval)
|
||||||
|
- [client_eio_retry_interval](#client_eio_retry_interval)
|
||||||
- [client_max_dirty_bytes](#client_max_dirty_bytes)
|
- [client_max_dirty_bytes](#client_max_dirty_bytes)
|
||||||
- [client_max_dirty_ops](#client_max_dirty_ops)
|
- [client_max_dirty_ops](#client_max_dirty_ops)
|
||||||
- [client_enable_writeback](#client_enable_writeback)
|
- [client_enable_writeback](#client_enable_writeback)
|
||||||
|
@ -19,6 +21,26 @@ affect their interaction with the cluster.
|
||||||
- [nbd_max_devices](#nbd_max_devices)
|
- [nbd_max_devices](#nbd_max_devices)
|
||||||
- [nbd_max_part](#nbd_max_part)
|
- [nbd_max_part](#nbd_max_part)
|
||||||
|
|
||||||
|
## client_retry_interval
|
||||||
|
|
||||||
|
- Type: milliseconds
|
||||||
|
- Default: 50
|
||||||
|
- Minimum: 10
|
||||||
|
- Can be changed online: yes
|
||||||
|
|
||||||
|
Retry time for I/O requests failed due to inactive PGs or network
|
||||||
|
connectivity errors.
|
||||||
|
|
||||||
|
## client_eio_retry_interval
|
||||||
|
|
||||||
|
- Type: milliseconds
|
||||||
|
- Default: 1000
|
||||||
|
- Can be changed online: yes
|
||||||
|
|
||||||
|
Retry time for I/O requests failed due to data corruption or unfinished
|
||||||
|
EC object deletions (has_incomplete PG state). 0 disables such retries
|
||||||
|
and clients are not blocked and just get EIO error code instead.
|
||||||
|
|
||||||
## client_max_dirty_bytes
|
## client_max_dirty_bytes
|
||||||
|
|
||||||
- Type: integer
|
- Type: integer
|
||||||
|
|
|
@ -9,6 +9,8 @@
|
||||||
Данные параметры применяются только к клиентам Vitastor (QEMU, fio, NBD и т.п.) и
|
Данные параметры применяются только к клиентам Vitastor (QEMU, fio, NBD и т.п.) и
|
||||||
затрагивают логику их работы с кластером.
|
затрагивают логику их работы с кластером.
|
||||||
|
|
||||||
|
- [client_retry_interval](#client_retry_interval)
|
||||||
|
- [client_eio_retry_interval](#client_eio_retry_interval)
|
||||||
- [client_max_dirty_bytes](#client_max_dirty_bytes)
|
- [client_max_dirty_bytes](#client_max_dirty_bytes)
|
||||||
- [client_max_dirty_ops](#client_max_dirty_ops)
|
- [client_max_dirty_ops](#client_max_dirty_ops)
|
||||||
- [client_enable_writeback](#client_enable_writeback)
|
- [client_enable_writeback](#client_enable_writeback)
|
||||||
|
@ -19,6 +21,27 @@
|
||||||
- [nbd_max_devices](#nbd_max_devices)
|
- [nbd_max_devices](#nbd_max_devices)
|
||||||
- [nbd_max_part](#nbd_max_part)
|
- [nbd_max_part](#nbd_max_part)
|
||||||
|
|
||||||
|
## client_retry_interval
|
||||||
|
|
||||||
|
- Тип: миллисекунды
|
||||||
|
- Значение по умолчанию: 50
|
||||||
|
- Минимальное значение: 10
|
||||||
|
- Можно менять на лету: да
|
||||||
|
|
||||||
|
Время повтора запросов ввода-вывода, неудачных из-за неактивных PG или
|
||||||
|
ошибок сети.
|
||||||
|
|
||||||
|
## client_eio_retry_interval
|
||||||
|
|
||||||
|
- Тип: миллисекунды
|
||||||
|
- Значение по умолчанию: 1000
|
||||||
|
- Можно менять на лету: да
|
||||||
|
|
||||||
|
Время повтора запросов ввода-вывода, неудачных из-за повреждения данных
|
||||||
|
или незавершённых удалений EC-объектов (состояния PG has_incomplete).
|
||||||
|
0 отключает повторы таких запросов и клиенты не блокируются, а вместо
|
||||||
|
этого просто получают код ошибки EIO.
|
||||||
|
|
||||||
## client_max_dirty_bytes
|
## client_max_dirty_bytes
|
||||||
|
|
||||||
- Тип: целое число
|
- Тип: целое число
|
||||||
|
|
|
@ -25,7 +25,6 @@ between clients, OSDs and etcd.
|
||||||
- [peer_connect_timeout](#peer_connect_timeout)
|
- [peer_connect_timeout](#peer_connect_timeout)
|
||||||
- [osd_idle_timeout](#osd_idle_timeout)
|
- [osd_idle_timeout](#osd_idle_timeout)
|
||||||
- [osd_ping_timeout](#osd_ping_timeout)
|
- [osd_ping_timeout](#osd_ping_timeout)
|
||||||
- [up_wait_retry_interval](#up_wait_retry_interval)
|
|
||||||
- [max_etcd_attempts](#max_etcd_attempts)
|
- [max_etcd_attempts](#max_etcd_attempts)
|
||||||
- [etcd_quick_timeout](#etcd_quick_timeout)
|
- [etcd_quick_timeout](#etcd_quick_timeout)
|
||||||
- [etcd_slow_timeout](#etcd_slow_timeout)
|
- [etcd_slow_timeout](#etcd_slow_timeout)
|
||||||
|
@ -212,17 +211,6 @@ Maximum time to wait for OSD keepalive responses. If an OSD doesn't respond
|
||||||
within this time, the connection to it is dropped and a reconnection attempt
|
within this time, the connection to it is dropped and a reconnection attempt
|
||||||
is scheduled.
|
is scheduled.
|
||||||
|
|
||||||
## up_wait_retry_interval
|
|
||||||
|
|
||||||
- Type: milliseconds
|
|
||||||
- Default: 50
|
|
||||||
- Minimum: 10
|
|
||||||
- Can be changed online: yes
|
|
||||||
|
|
||||||
OSDs respond to clients with a special error code when they receive I/O
|
|
||||||
requests for a PG that's not synchronized and started. This parameter sets
|
|
||||||
the time for the clients to wait before re-attempting such I/O requests.
|
|
||||||
|
|
||||||
## max_etcd_attempts
|
## max_etcd_attempts
|
||||||
|
|
||||||
- Type: integer
|
- Type: integer
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
- [peer_connect_timeout](#peer_connect_timeout)
|
- [peer_connect_timeout](#peer_connect_timeout)
|
||||||
- [osd_idle_timeout](#osd_idle_timeout)
|
- [osd_idle_timeout](#osd_idle_timeout)
|
||||||
- [osd_ping_timeout](#osd_ping_timeout)
|
- [osd_ping_timeout](#osd_ping_timeout)
|
||||||
- [up_wait_retry_interval](#up_wait_retry_interval)
|
|
||||||
- [max_etcd_attempts](#max_etcd_attempts)
|
- [max_etcd_attempts](#max_etcd_attempts)
|
||||||
- [etcd_quick_timeout](#etcd_quick_timeout)
|
- [etcd_quick_timeout](#etcd_quick_timeout)
|
||||||
- [etcd_slow_timeout](#etcd_slow_timeout)
|
- [etcd_slow_timeout](#etcd_slow_timeout)
|
||||||
|
@ -221,19 +220,6 @@ OSD в любом случае согласовывают реальное зн
|
||||||
Если OSD не отвечает за это время, соединение отключается и производится
|
Если OSD не отвечает за это время, соединение отключается и производится
|
||||||
повторная попытка соединения.
|
повторная попытка соединения.
|
||||||
|
|
||||||
## up_wait_retry_interval
|
|
||||||
|
|
||||||
- Тип: миллисекунды
|
|
||||||
- Значение по умолчанию: 50
|
|
||||||
- Минимальное значение: 10
|
|
||||||
- Можно менять на лету: да
|
|
||||||
|
|
||||||
Когда OSD получают от клиентов запросы ввода-вывода, относящиеся к не
|
|
||||||
поднятым на данный момент на них PG, либо к PG в процессе синхронизации,
|
|
||||||
они отвечают клиентам специальным кодом ошибки, означающим, что клиент
|
|
||||||
должен некоторое время подождать перед повторением запроса. Именно это время
|
|
||||||
ожидания задаёт данный параметр.
|
|
||||||
|
|
||||||
## max_etcd_attempts
|
## max_etcd_attempts
|
||||||
|
|
||||||
- Тип: целое число
|
- Тип: целое число
|
||||||
|
|
|
@ -1,3 +1,27 @@
|
||||||
|
- name: client_retry_interval
|
||||||
|
type: ms
|
||||||
|
min: 10
|
||||||
|
default: 50
|
||||||
|
online: true
|
||||||
|
info: |
|
||||||
|
Retry time for I/O requests failed due to inactive PGs or network
|
||||||
|
connectivity errors.
|
||||||
|
info_ru: |
|
||||||
|
Время повтора запросов ввода-вывода, неудачных из-за неактивных PG или
|
||||||
|
ошибок сети.
|
||||||
|
- name: client_eio_retry_interval
|
||||||
|
type: ms
|
||||||
|
default: 1000
|
||||||
|
online: true
|
||||||
|
info: |
|
||||||
|
Retry time for I/O requests failed due to data corruption or unfinished
|
||||||
|
EC object deletions (has_incomplete PG state). 0 disables such retries
|
||||||
|
and clients are not blocked and just get EIO error code instead.
|
||||||
|
info_ru: |
|
||||||
|
Время повтора запросов ввода-вывода, неудачных из-за повреждения данных
|
||||||
|
или незавершённых удалений EC-объектов (состояния PG has_incomplete).
|
||||||
|
0 отключает повторы таких запросов и клиенты не блокируются, а вместо
|
||||||
|
этого просто получают код ошибки EIO.
|
||||||
- name: client_max_dirty_bytes
|
- name: client_max_dirty_bytes
|
||||||
type: int
|
type: int
|
||||||
default: 33554432
|
default: 33554432
|
||||||
|
|
|
@ -243,21 +243,6 @@
|
||||||
Максимальное время ожидания ответа на запрос проверки состояния соединения.
|
Максимальное время ожидания ответа на запрос проверки состояния соединения.
|
||||||
Если OSD не отвечает за это время, соединение отключается и производится
|
Если OSD не отвечает за это время, соединение отключается и производится
|
||||||
повторная попытка соединения.
|
повторная попытка соединения.
|
||||||
- name: up_wait_retry_interval
|
|
||||||
type: ms
|
|
||||||
min: 10
|
|
||||||
default: 50
|
|
||||||
online: true
|
|
||||||
info: |
|
|
||||||
OSDs respond to clients with a special error code when they receive I/O
|
|
||||||
requests for a PG that's not synchronized and started. This parameter sets
|
|
||||||
the time for the clients to wait before re-attempting such I/O requests.
|
|
||||||
info_ru: |
|
|
||||||
Когда OSD получают от клиентов запросы ввода-вывода, относящиеся к не
|
|
||||||
поднятым на данный момент на них PG, либо к PG в процессе синхронизации,
|
|
||||||
они отвечают клиентам специальным кодом ошибки, означающим, что клиент
|
|
||||||
должен некоторое время подождать перед повторением запроса. Именно это время
|
|
||||||
ожидания задаёт данный параметр.
|
|
||||||
- name: max_etcd_attempts
|
- name: max_etcd_attempts
|
||||||
type: int
|
type: int
|
||||||
default: 5
|
default: 5
|
||||||
|
|
|
@ -86,13 +86,14 @@ const etcd_tree = {
|
||||||
client_max_buffered_bytes: 33554432,
|
client_max_buffered_bytes: 33554432,
|
||||||
client_max_buffered_ops: 1024,
|
client_max_buffered_ops: 1024,
|
||||||
client_max_writeback_iodepth: 256,
|
client_max_writeback_iodepth: 256,
|
||||||
|
client_retry_interval: 50, // ms. min: 10
|
||||||
|
client_eio_retry_interval: 1000, // ms
|
||||||
// client and osd - configurable online
|
// client and osd - configurable online
|
||||||
log_level: 0,
|
log_level: 0,
|
||||||
peer_connect_interval: 5, // seconds. min: 1
|
peer_connect_interval: 5, // seconds. min: 1
|
||||||
peer_connect_timeout: 5, // seconds. min: 1
|
peer_connect_timeout: 5, // seconds. min: 1
|
||||||
osd_idle_timeout: 5, // seconds. min: 1
|
osd_idle_timeout: 5, // seconds. min: 1
|
||||||
osd_ping_timeout: 5, // seconds. min: 1
|
osd_ping_timeout: 5, // seconds. min: 1
|
||||||
up_wait_retry_interval: 50, // ms. min: 10
|
|
||||||
max_etcd_attempts: 5,
|
max_etcd_attempts: 5,
|
||||||
etcd_quick_timeout: 1000, // ms
|
etcd_quick_timeout: 1000, // ms
|
||||||
etcd_slow_timeout: 5000, // ms
|
etcd_slow_timeout: 5000, // ms
|
||||||
|
|
|
@ -265,7 +265,7 @@ void cluster_client_t::erase_op(cluster_op_t *op)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void cluster_client_t::continue_ops(bool up_retry)
|
void cluster_client_t::continue_ops(int time_passed)
|
||||||
{
|
{
|
||||||
if (!pgs_loaded)
|
if (!pgs_loaded)
|
||||||
{
|
{
|
||||||
|
@ -277,22 +277,27 @@ void cluster_client_t::continue_ops(bool up_retry)
|
||||||
// Attempt to reenter the function
|
// Attempt to reenter the function
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
int reset_duration = 0;
|
||||||
restart:
|
restart:
|
||||||
continuing_ops = 1;
|
continuing_ops = 1;
|
||||||
for (auto op = op_queue_head; op; )
|
for (auto op = op_queue_head; op; )
|
||||||
{
|
{
|
||||||
cluster_op_t *next_op = op->next;
|
cluster_op_t *next_op = op->next;
|
||||||
if (!op->up_wait || up_retry)
|
if (op->retry_after && time_passed)
|
||||||
{
|
{
|
||||||
op->up_wait = false;
|
op->retry_after = op->retry_after > time_passed ? op->retry_after-time_passed : 0;
|
||||||
if (!op->prev_wait)
|
if (op->retry_after && (!reset_duration || op->retry_after < reset_duration))
|
||||||
{
|
{
|
||||||
if (op->opcode == OSD_OP_SYNC)
|
reset_duration = op->retry_after;
|
||||||
continue_sync(op);
|
|
||||||
else
|
|
||||||
continue_rw(op);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (!op->retry_after && !op->prev_wait)
|
||||||
|
{
|
||||||
|
if (op->opcode == OSD_OP_SYNC)
|
||||||
|
continue_sync(op);
|
||||||
|
else
|
||||||
|
continue_rw(op);
|
||||||
|
}
|
||||||
op = next_op;
|
op = next_op;
|
||||||
if (continuing_ops == 2)
|
if (continuing_ops == 2)
|
||||||
{
|
{
|
||||||
|
@ -300,6 +305,27 @@ restart:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continuing_ops = 0;
|
continuing_ops = 0;
|
||||||
|
reset_retry_timer(reset_duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
void cluster_client_t::reset_retry_timer(int new_duration)
|
||||||
|
{
|
||||||
|
if (retry_timeout_duration && retry_timeout_duration <= new_duration || !new_duration)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (retry_timeout_id)
|
||||||
|
{
|
||||||
|
tfd->clear_timer(retry_timeout_id);
|
||||||
|
}
|
||||||
|
retry_timeout_duration = new_duration;
|
||||||
|
retry_timeout_id = tfd->set_timer(retry_timeout_duration, false, [this](int)
|
||||||
|
{
|
||||||
|
int time_passed = retry_timeout_duration;
|
||||||
|
retry_timeout_id = 0;
|
||||||
|
retry_timeout_duration = 0;
|
||||||
|
continue_ops(time_passed);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void cluster_client_t::on_load_config_hook(json11::Json::object & etcd_global_config)
|
void cluster_client_t::on_load_config_hook(json11::Json::object & etcd_global_config)
|
||||||
|
@ -349,15 +375,25 @@ void cluster_client_t::on_load_config_hook(json11::Json::object & etcd_global_co
|
||||||
{
|
{
|
||||||
client_max_writeback_iodepth = DEFAULT_CLIENT_MAX_WRITEBACK_IODEPTH;
|
client_max_writeback_iodepth = DEFAULT_CLIENT_MAX_WRITEBACK_IODEPTH;
|
||||||
}
|
}
|
||||||
// up_wait_retry_interval
|
// client_retry_interval
|
||||||
up_wait_retry_interval = config["up_wait_retry_interval"].uint64_value();
|
client_retry_interval = config["client_retry_interval"].uint64_value();
|
||||||
if (!up_wait_retry_interval)
|
if (!client_retry_interval)
|
||||||
{
|
{
|
||||||
up_wait_retry_interval = 50;
|
client_retry_interval = 50;
|
||||||
}
|
}
|
||||||
else if (up_wait_retry_interval < 10)
|
else if (client_retry_interval < 10)
|
||||||
{
|
{
|
||||||
up_wait_retry_interval = 10;
|
client_retry_interval = 10;
|
||||||
|
}
|
||||||
|
// client_eio_retry_interval
|
||||||
|
client_eio_retry_interval = 1000;
|
||||||
|
if (!config["client_eio_retry_interval"].is_null())
|
||||||
|
{
|
||||||
|
client_eio_retry_interval = config["client_eio_retry_interval"].uint64_value();
|
||||||
|
if (client_eio_retry_interval && client_eio_retry_interval < 10)
|
||||||
|
{
|
||||||
|
client_eio_retry_interval = 10;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// log_level
|
// log_level
|
||||||
log_level = config["log_level"].uint64_value();
|
log_level = config["log_level"].uint64_value();
|
||||||
|
@ -716,15 +752,8 @@ resume_1:
|
||||||
// We'll need to retry again
|
// We'll need to retry again
|
||||||
if (op->parts[i].flags & PART_RETRY)
|
if (op->parts[i].flags & PART_RETRY)
|
||||||
{
|
{
|
||||||
op->up_wait = true;
|
op->retry_after = client_retry_interval;
|
||||||
if (!retry_timeout_id)
|
reset_retry_timer(client_retry_interval);
|
||||||
{
|
|
||||||
retry_timeout_id = tfd->set_timer(up_wait_retry_interval, false, [this](int)
|
|
||||||
{
|
|
||||||
retry_timeout_id = 0;
|
|
||||||
continue_ops(true);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
op->state = 1;
|
op->state = 1;
|
||||||
}
|
}
|
||||||
|
@ -780,10 +809,9 @@ resume_2:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
else if (op->retval != 0 && !(op->flags & OP_FLUSH_BUFFER) &&
|
else if (op->retval != 0 && !(op->flags & OP_FLUSH_BUFFER) &&
|
||||||
op->retval != -EPIPE && op->retval != -EIO && op->retval != -ENOSPC)
|
op->retval != -EPIPE && (op->retval != -EIO || !client_eio_retry_interval) && op->retval != -ENOSPC)
|
||||||
{
|
{
|
||||||
// Fatal error (neither -EPIPE, -EIO nor -ENOSPC)
|
// Fatal error (neither -EPIPE, -EIO nor -ENOSPC)
|
||||||
// FIXME: Add a parameter to allow to not wait for EIOs (incomplete or corrupted objects) to heal
|
|
||||||
erase_op(op);
|
erase_op(op);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -1171,16 +1199,12 @@ void cluster_client_t::handle_op_part(cluster_op_part_t *part)
|
||||||
// All next things like timer, continue_sync/rw and stop_client may affect the operation again
|
// All next things like timer, continue_sync/rw and stop_client may affect the operation again
|
||||||
// So do all these things after modifying operation state, otherwise we may hit reenterability bugs
|
// So do all these things after modifying operation state, otherwise we may hit reenterability bugs
|
||||||
// FIXME postpone such things to set_immediate here to avoid bugs
|
// FIXME postpone such things to set_immediate here to avoid bugs
|
||||||
// Mark op->up_wait = true to retry operation after a short pause (not immediately)
|
// Set op->retry_after to retry operation after a short pause (not immediately)
|
||||||
op->up_wait = true;
|
if (!op->retry_after)
|
||||||
if (!retry_timeout_id)
|
|
||||||
{
|
{
|
||||||
retry_timeout_id = tfd->set_timer(up_wait_retry_interval, false, [this](int)
|
op->retry_after = op->retval == -EIO ? client_eio_retry_interval : client_retry_interval;
|
||||||
{
|
|
||||||
retry_timeout_id = 0;
|
|
||||||
continue_ops(true);
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
reset_retry_timer(op->retry_after);
|
||||||
if (op->inflight_count == 0)
|
if (op->inflight_count == 0)
|
||||||
{
|
{
|
||||||
if (op->opcode == OSD_OP_SYNC)
|
if (op->opcode == OSD_OP_SYNC)
|
||||||
|
|
|
@ -59,7 +59,7 @@ protected:
|
||||||
void *buf = NULL;
|
void *buf = NULL;
|
||||||
cluster_op_t *orig_op = NULL;
|
cluster_op_t *orig_op = NULL;
|
||||||
bool needs_reslice = false;
|
bool needs_reslice = false;
|
||||||
bool up_wait = false;
|
int retry_after = 0;
|
||||||
int inflight_count = 0, done_count = 0;
|
int inflight_count = 0, done_count = 0;
|
||||||
std::vector<cluster_op_part_t> parts;
|
std::vector<cluster_op_part_t> parts;
|
||||||
void *part_bitmaps = NULL;
|
void *part_bitmaps = NULL;
|
||||||
|
@ -92,9 +92,11 @@ class cluster_client_t
|
||||||
uint64_t client_max_writeback_iodepth = 0;
|
uint64_t client_max_writeback_iodepth = 0;
|
||||||
|
|
||||||
int log_level = 0;
|
int log_level = 0;
|
||||||
int up_wait_retry_interval = 500; // ms
|
int client_retry_interval = 50; // ms
|
||||||
|
int client_eio_retry_interval = 1000; // ms
|
||||||
|
|
||||||
int retry_timeout_id = 0;
|
int retry_timeout_id = 0;
|
||||||
|
int retry_timeout_duration = 0;
|
||||||
std::vector<cluster_op_t*> offline_ops;
|
std::vector<cluster_op_t*> offline_ops;
|
||||||
cluster_op_t *op_queue_head = NULL, *op_queue_tail = NULL;
|
cluster_op_t *op_queue_head = NULL, *op_queue_tail = NULL;
|
||||||
writeback_cache_t *wb = NULL;
|
writeback_cache_t *wb = NULL;
|
||||||
|
@ -131,7 +133,7 @@ public:
|
||||||
|
|
||||||
bool get_immediate_commit(uint64_t inode);
|
bool get_immediate_commit(uint64_t inode);
|
||||||
|
|
||||||
void continue_ops(bool up_retry = false);
|
void continue_ops(int time_passed = 0);
|
||||||
inode_list_t *list_inode_start(inode_t inode,
|
inode_list_t *list_inode_start(inode_t inode,
|
||||||
std::function<void(inode_list_t* lst, std::set<object_id>&& objects, pg_num_t pg_num, osd_num_t primary_osd, int status)> callback);
|
std::function<void(inode_list_t* lst, std::set<object_id>&& objects, pg_num_t pg_num, osd_num_t primary_osd, int status)> callback);
|
||||||
int list_pg_count(inode_list_t *lst);
|
int list_pg_count(inode_list_t *lst);
|
||||||
|
@ -152,6 +154,7 @@ protected:
|
||||||
int continue_rw(cluster_op_t *op);
|
int continue_rw(cluster_op_t *op);
|
||||||
bool check_rw(cluster_op_t *op);
|
bool check_rw(cluster_op_t *op);
|
||||||
void slice_rw(cluster_op_t *op);
|
void slice_rw(cluster_op_t *op);
|
||||||
|
void reset_retry_timer(int new_duration);
|
||||||
bool try_send(cluster_op_t *op, int i);
|
bool try_send(cluster_op_t *op, int i);
|
||||||
int continue_sync(cluster_op_t *op);
|
int continue_sync(cluster_op_t *op);
|
||||||
void send_sync(cluster_op_t *op, cluster_op_part_t *part);
|
void send_sync(cluster_op_t *op, cluster_op_part_t *part);
|
||||||
|
|
Loading…
Reference in New Issue