Avoids duplicate recovery attempts when data is synched.

This commit is contained in:
Andrea Mazzoleni 2014-03-02 17:12:42 +01:00
parent 97c7daedee
commit 8aac2965f9

View file

@ -283,6 +283,7 @@ static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsign
unsigned j;
int n;
int something_to_recover;
int something_unsynched;
error = 0;
@ -405,6 +406,7 @@ static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsign
/* and we are not interested to recover DELETED ones. */
n = 0;
something_to_recover = 0; /* keep track if there is at least one block to fix */
something_unsynched = 0; /* keep track if we have some unsynched info to process */
for(j=0;j<failed_count;++j) {
unsigned block_state = block_state_get(failed[j].block);
@ -418,6 +420,7 @@ static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsign
/* because the parity is computed with old content, and not with the new one. */
/* Note that this recovering is done just to make possible to recover any other BLK one, */
/* we are not really interested in DELETED, CHG (old version) and REP (old version). */
something_unsynched = 1;
if (block_state == BLOCK_STATE_CHG
&& hash_is_zero(failed[j].block->hash)
@ -465,7 +468,8 @@ static int repair(struct snapraid_state* state, int rehash, unsigned pos, unsign
}
/* if nothing to fix, we just don't try */
if (something_to_recover) {
/* if nothing unsynched we also don't retry, because it's the same try as before */
if (something_to_recover && something_unsynched) {
ret = repair_step(state, rehash, pos, diskmax, failed, failed_map, n, buffer, buffer_recov, buffer_zero);
if (ret == 0) {
/* we alreay marked as outdated CHG and REP blocks, we don't need to do it again */