1
0
Fork 0

Merging upstream version 4.3+20240412.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-14 06:34:22 +01:00
parent 8e1e76d6e6
commit 9a795ca236
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
67 changed files with 2247 additions and 2747 deletions

View file

@ -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;