Merging upstream version 4.3+20240412.
Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
parent
8e1e76d6e6
commit
9a795ca236
67 changed files with 2247 additions and 2747 deletions
65
monitor.c
65
monitor.c
|
@ -412,6 +412,7 @@ static int read_and_act(struct active_array *a, fd_set *fds)
|
|||
int ret = 0;
|
||||
int count = 0;
|
||||
struct timeval tv;
|
||||
bool write_checkpoint = false;
|
||||
|
||||
a->next_state = bad_word;
|
||||
a->next_action = bad_action;
|
||||
|
@ -564,52 +565,40 @@ static int read_and_act(struct active_array *a, fd_set *fds)
|
|||
}
|
||||
}
|
||||
|
||||
/* Check for recovery checkpoint notifications. We need to be a
|
||||
* minimum distance away from the last checkpoint to prevent
|
||||
* over checkpointing. Note reshape checkpointing is handled
|
||||
* in the second branch.
|
||||
*/
|
||||
if (sync_completed > a->last_checkpoint &&
|
||||
sync_completed - a->last_checkpoint > a->info.component_size >> 4 &&
|
||||
a->curr_action > reshape) {
|
||||
/* A (non-reshape) sync_action has reached a checkpoint.
|
||||
* Record the updated position in the metadata
|
||||
*/
|
||||
a->last_checkpoint = sync_completed;
|
||||
a->container->ss->set_array_state(a, a->curr_state <= clean);
|
||||
} else if ((a->curr_action == idle && a->prev_action == reshape) ||
|
||||
(a->curr_action == reshape &&
|
||||
sync_completed > a->last_checkpoint)) {
|
||||
/* Reshape has progressed or completed so we need to
|
||||
* update the array state - and possibly the array size
|
||||
*/
|
||||
/* Update reshape checkpoint, depending if it finished or progressed */
|
||||
if (a->curr_action == idle && a->prev_action == reshape) {
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
|
||||
if (sync_completed != 0)
|
||||
a->last_checkpoint = sync_completed;
|
||||
/* We might need to update last_checkpoint depending on
|
||||
* the reason that reshape finished.
|
||||
* if array reshape is really finished:
|
||||
* set check point to the end, this allows
|
||||
* set_array_state() to finalize reshape in metadata
|
||||
* if reshape if broken: do not set checkpoint to the end
|
||||
* this allows for reshape restart from checkpoint
|
||||
|
||||
/*
|
||||
* If reshape really finished, set checkpoint to the end to finalize it.
|
||||
* Do not set checkpoint if reshape is broken.
|
||||
* Reshape will restart from last checkpoint.
|
||||
*/
|
||||
if ((a->curr_action != reshape) &&
|
||||
(a->prev_action == reshape)) {
|
||||
char buf[SYSFS_MAX_BUF_SIZE];
|
||||
if ((sysfs_get_str(&a->info, NULL,
|
||||
"reshape_position",
|
||||
buf,
|
||||
sizeof(buf)) >= 0) &&
|
||||
str_is_none(buf) == true)
|
||||
if (sysfs_get_str(&a->info, NULL, "reshape_position", buf, sizeof(buf)) >= 0)
|
||||
if (str_is_none(buf) == true)
|
||||
a->last_checkpoint = a->info.component_size;
|
||||
}
|
||||
a->container->ss->set_array_state(a, a->curr_state <= clean);
|
||||
a->last_checkpoint = sync_completed;
|
||||
|
||||
write_checkpoint = true;
|
||||
}
|
||||
|
||||
if (sync_completed > a->last_checkpoint)
|
||||
if (a->curr_action >= reshape && sync_completed > a->last_checkpoint) {
|
||||
/* Update checkpoint if neither reshape nor idle action */
|
||||
a->last_checkpoint = sync_completed;
|
||||
|
||||
write_checkpoint = true;
|
||||
}
|
||||
|
||||
/* Save checkpoint */
|
||||
if (write_checkpoint) {
|
||||
a->container->ss->set_array_state(a, a->curr_state <= clean);
|
||||
|
||||
if (a->curr_action <= reshape)
|
||||
a->last_checkpoint = sync_completed;
|
||||
}
|
||||
|
||||
if (sync_completed >= a->info.component_size)
|
||||
a->last_checkpoint = 0;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue