workaround for rare race condition in trans_logger

This commit is contained in:
Thomas Schoebel-Theuer 2012-01-30 13:47:45 +01:00 committed by Thomas Schoebel-Theuer
parent fd5c6abc6c
commit 92a4684692
3 changed files with 18 additions and 9 deletions

View File

@ -654,12 +654,17 @@ static int _server_thread(void *data)
MARS_INF("-------- cleaning up ----------\n");
if (brick) {
//FIXME: this hangs up. Leaving a minor memleak for now.
//mars_put_socket(&brick->handler_socket);
//status = mars_kill_brick((void*)brick);
//if(status < 0) {
//BRICK_WRN("kill status = %d, giving up\n", status);
//}
MARS_DBG("cleaning up unused brick\n");
#if 0 // FIXME
if (brick->handler_socket.s_socket) {
MARS_DBG("put socket\n");
mars_put_socket(&brick->handler_socket);
}
status = mars_kill_brick((void*)brick);
if (unlikely(status < 0)) {
BRICK_WRN("kill status = %d, giving up\n", status);
}
#endif
brick = NULL;
}

View File

@ -878,6 +878,7 @@ static noinline
void free_writeback(struct writeback_info *wb)
{
struct list_head *tmp;
int cleanup_count = 0;
if (unlikely(wb->w_error < 0)) {
MARS_ERR("writeback error = %d at pos = %lld len = %d, writeback is incomplete\n", wb->w_error, wb->w_pos, wb->w_len);
@ -887,9 +888,11 @@ void free_writeback(struct writeback_info *wb)
* This code is only for cleanup in case of errors.
*/
while (unlikely((tmp = wb->w_sub_read_list.next) != &wb->w_sub_read_list)) {
cleanup_count++;
_free_one(tmp);
}
while (unlikely((tmp = wb->w_sub_write_list.next) != &wb->w_sub_write_list)) {
cleanup_count++;
_free_one(tmp);
}
@ -906,8 +909,9 @@ void free_writeback(struct writeback_info *wb)
CHECK_ATOMIC(&orig_mref->ref_count, 1);
#if 1
if (!orig_mref_a->is_completed) {
MARS_ERR("request %lld (len = %d) was not completed\n", orig_mref->ref_pos, orig_mref->ref_len);
while (!orig_mref_a->is_completed) {
MARS_ERR("request %lld (len = %d) was not completed, cleanup_count = %d\n", orig_mref->ref_pos, orig_mref->ref_len, cleanup_count);
msleep(10000);
}
#endif
if (likely(wb->w_error >= 0)) {

View File

@ -1022,7 +1022,7 @@ int mars_kill_brick(struct mars_brick *brick)
CHECK_PTR(brick, done);
global = brick->global;
MARS_DBG("===> killing brick %s path = '%s' name = '%s'\n", SAFE_STR(brick->type->type_name), SAFE_STR(brick->brick_path), SAFE_STR(brick->brick_name));
MARS_DBG("===> killing brick %s path = '%s' name = '%s'\n", brick->type ? SAFE_STR(brick->type->type_name) : "undef", SAFE_STR(brick->brick_path), SAFE_STR(brick->brick_name));
if (global) {
down_write(&global->brick_mutex);