X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=blobdiff_plain;f=sync_filter.c;h=6a2a09462f9b1d452c8c997ac04dbfaba1f30521;hp=8c3570fda92d23ef25214cbcd1344e1831296a41;hb=40afd4dc544c8405b5eabcc4222692d357ddf48e;hpb=32a81d7eecfa5c8585d7095631ff2cd8b7b1bf7a diff --git a/sync_filter.c b/sync_filter.c index 8c3570fd..6a2a0946 100644 --- a/sync_filter.c +++ b/sync_filter.c @@ -61,18 +61,17 @@ struct sync_filter_config { static void sync_close_buddy(struct sync_buddy *buddy) { - if (buddy->fd < 0) - return; - PARA_DEBUG_LOG("closing %s\n", buddy->sbi->url); + PARA_DEBUG_LOG("closing %s, fd %d\n", buddy->sbi->url, buddy->fd); close(buddy->fd); - buddy->fd = -1; + list_del(&buddy->node); + free(buddy); } static void sync_close_buddies(struct sync_filter_context *ctx) { - struct sync_buddy *buddy; + struct sync_buddy *buddy, *tmp; - FOR_EACH_BUDDY(buddy, &ctx->buddies) + FOR_EACH_BUDDY_SAFE(buddy, tmp, &ctx->buddies) sync_close_buddy(buddy); } @@ -244,6 +243,8 @@ static void sync_disable_active_buddies(struct sync_filter_context *ctx) FOR_EACH_BUDDY(buddy, &ctx->buddies) { if (buddy->sbi->disabled) continue; + if (buddy->ping_received == true) + continue; PARA_NOTICE_LOG("disabling %s\n", buddy->sbi->url); buddy->sbi->disabled = true; } @@ -328,11 +329,10 @@ static int sync_post_select(__a_unused struct sched *s, void *context) buddy->sbi->url, buddy->sbi->disabled? "disabled" : "enabled"); ret = xwrite(buddy->fd, &c, 1); - sync_close_buddy(buddy); if (ret < 0) { PARA_WARNING_LOG("failed to write to %s: %s\n", buddy->sbi->url, para_strerror(-ret)); - list_del(&buddy->node); + sync_close_buddy(buddy); } } ctx->ping_sent = true; @@ -361,7 +361,7 @@ static int sync_post_select(__a_unused struct sched *s, void *context) buddy->sbi->url); buddy->sbi->disabled = false; } - list_del(&buddy->node); + buddy->ping_received = true; } } if (!sync_complete(ctx))