From e941c0672e8db8028a0bafd9257d146cd5c2ef9c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Michal=20Voc=C5=AF?= Date: Tue, 28 Jun 2005 11:02:19 +0000 Subject: [PATCH] * take the file seeking business more seriously - refuse to seek into the middle of event string --- org.glite.lb.logger/src/event_store.c | 88 ++++++++++++++++++++++++++--------- 1 file changed, 67 insertions(+), 21 deletions(-) diff --git a/org.glite.lb.logger/src/event_store.c b/org.glite.lb.logger/src/event_store.c index 3ee97f3..9f56219 100644 --- a/org.glite.lb.logger/src/event_store.c +++ b/org.glite.lb.logger/src/event_store.c @@ -343,29 +343,74 @@ event_store_recover(struct event_store *es) return(-1); } - /* get the position in file to be sought */ - if(es->offset) - last = es->offset; - else { + while(1) { /* try, try, try */ + + /* get the position in file to be sought */ + if(es->offset) + last = es->offset; + else { #if !defined(IL_NOTIFICATIONS) - if(eq_b == eq_l) - last = es->last_committed_ls; - else + if(eq_b == eq_l) + last = es->last_committed_ls; + else #endif - /* last = min(ls, bs) */ - last = (es->last_committed_bs < es->last_committed_ls) ? es->last_committed_bs : es->last_committed_ls; - } - - il_log(LOG_DEBUG, " setting starting file position to %ld\n", last); - il_log(LOG_DEBUG, " bytes sent to logging server: %d\n", es->last_committed_ls); - il_log(LOG_DEBUG, " bytes sent to bookkeeping server: %d\n", es->last_committed_bs); + /* last = min(ls, bs) */ + /* I took the liberty to optimize this, + since LS is not used. */ + /* last = (es->last_committed_bs < + es->last_committed_ls) ? es->last_committed_bs : + es->last_committed_ls; */ + last = es->last_committed_bs; + } - /* skip all committed or already enqueued events */ - if(fseek(ef, last, SEEK_SET) < 0) { - set_error(IL_SYS, errno, "event_store_recover: error setting position for read"); - event_store_unlock(es); - fclose(ef); - return(-1); + il_log(LOG_DEBUG, " setting starting file position to %ld\n", last); + il_log(LOG_DEBUG, " bytes sent to logging server: %d\n", es->last_committed_ls); + il_log(LOG_DEBUG, " bytes sent to bookkeeping server: %d\n", es->last_committed_bs); + + if(last > 0) { + int c; + + /* skip all committed or already enqueued events */ + /* be careful - check, if the offset really points to the + beginning of event string */ + if(fseek(ef, last-1, SEEK_SET) < 0) { + set_error(IL_SYS, errno, "event_store_recover: error setting position for read"); + event_store_unlock(es); + fclose(ef); + return(-1); + } + /* the last enqueued event MUST end with EVENT_SEPARATOR, + even if the offset points at EOF */ + if((c=fgetc(ef)) != EVENT_SEPARATOR) { + /* Houston, we have got a problem */ + il_log(LOG_WARNING, + " file position %ld does not point at the beginning of event string, backing off!\n", + last); + /* now, where were we? */ + if(es->offset) { + /* next try will be with + last_commited_bs */ + es->offset = 0; + } else { + /* this is really weird... back off completely */ + es->last_committed_ls = es->last_committed_bs = 0; + } + } else { + /* OK, break out of the loop */ + break; + } + } else { + /* this breaks out of the loop, we are starting at + * the beginning of file + */ + if(fseek(ef, 0, SEEK_SET) < 0) { + set_error(IL_SYS, errno, "event_store_recover: error setting position for read"); + event_store_unlock(es); + fclose(ef); + return(-1); + } + break; + } } /* enqueue all remaining events */ @@ -383,7 +428,8 @@ event_store_recover(struct event_store *es) msg = server_msg_create(event_s, last); free(event_s); if(msg == NULL) { - break; + il_log(LOG_ALERT, " event file corrupted! Please move it to quarantine (ie. somewhere else) and restart interlogger.\n"); + break; } msg->es = es; -- 1.8.2.3