logger: fix opportunity for too-early input destruction

This commit is contained in:
Thomas Schoebel-Theuer 2012-12-03 14:55:54 +01:00 committed by Thomas Schoebel-Theuer
parent d1469b5b83
commit 1e369b366c

View File

@ -2250,10 +2250,9 @@ void _exit_inputs(struct trans_logger_brick *brick, bool force)
for (i = TL_INPUT_LOG1; i <= TL_INPUT_LOG2; i++) { for (i = TL_INPUT_LOG1; i <= TL_INPUT_LOG2; i++) {
struct trans_logger_input *input = brick->inputs[i]; struct trans_logger_input *input = brick->inputs[i];
struct log_status *logst = &input->logst; struct log_status *logst = &input->logst;
if (force || if (!input->connect &&
(!input->connect &&
input->is_operating && input->is_operating &&
input->is_deletable)) { (input->is_deletable || force)) {
MARS_DBG("cleaning up input %d (log = %d old = %d)\n", i, brick->log_input_nr, brick->old_input_nr); MARS_DBG("cleaning up input %d (log = %d old = %d)\n", i, brick->log_input_nr, brick->old_input_nr);
exit_logst(logst); exit_logst(logst);
input->is_operating = false; input->is_operating = false;
@ -2268,6 +2267,7 @@ static noinline
void trans_logger_log(struct trans_logger_brick *brick) void trans_logger_log(struct trans_logger_brick *brick)
{ {
struct rank_data rkd[LOGGER_QUEUES] = {}; struct rank_data rkd[LOGGER_QUEUES] = {};
int nr_flying;
_init_inputs(brick); _init_inputs(brick);
@ -2323,7 +2323,12 @@ void trans_logger_log(struct trans_logger_brick *brick)
_exit_inputs(brick, false); _exit_inputs(brick, false);
} }
while ((nr_flying = _nr_flying_inputs(brick))) {
MARS_INF("%d inputs have flying IO\n", nr_flying);
_exit_inputs(brick, true); _exit_inputs(brick, true);
brick_msleep(1000);
}
} }
////////////////////////////// log replay ////////////////////////////// ////////////////////////////// log replay //////////////////////////////
@ -2500,6 +2505,7 @@ void trans_logger_replay(struct trans_logger_brick *brick)
loff_t start_pos; loff_t start_pos;
loff_t finished_pos; loff_t finished_pos;
long long old_jiffies = jiffies; long long old_jiffies = jiffies;
int nr_flying;
int backoff = 0; int backoff = 0;
int status = 0; int status = 0;
@ -2610,7 +2616,11 @@ void trans_logger_replay(struct trans_logger_brick *brick)
brick->replay_code = 2; brick->replay_code = 2;
} }
while ((nr_flying = _nr_flying_inputs(brick))) {
MARS_INF("%d inputs have flying IO\n", nr_flying);
_exit_inputs(brick, true); _exit_inputs(brick, true);
brick_msleep(1000);
}
mars_trigger(); mars_trigger();