chiark
/
gitweb
/
~ian
/
inn-innduct.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
e7e211b
)
Abolish SEPARATED2 and DROPPING2; recordeofness in ipf->fd
author
Ian Jackson
<ian@liberator.(none)>
Sun, 11 Apr 2010 12:07:09 +0000
(13:07 +0100)
committer
Ian Jackson
<ian@liberator.(none)>
Sun, 11 Apr 2010 12:07:09 +0000
(13:07 +0100)
backends/innduct.c
patch
|
blob
|
history
diff --git
a/backends/innduct.c
b/backends/innduct.c
index f3be2b7613f07014e5174e4c274b9c70765c0611..6a6e51a8a2172e1d30a007d2c7c8b1032c234448 100644
(file)
--- a/
backends/innduct.c
+++ b/
backends/innduct.c
@@
-272,10
+272,8
@@
typedef enum {
sm_NORMAL,
sm_FLUSHING,
sm_FLUSHFAIL,
sm_NORMAL,
sm_FLUSHING,
sm_FLUSHFAIL,
- sm_SEPARATED1,
- sm_SEPARATED2, /* must follow SEPARATED2 - see feedfile_eof */
- sm_DROPPING1,
- sm_DROPPING2, /* must follow DROPPING1 - see feedfile_eof */
+ sm_SEPARATED,
+ sm_DROPPING,
} StateMachineState;
struct Conn {
} StateMachineState;
struct Conn {
@@
-1050,11
+1048,13
@@
static void feedfile_eof(InputFile *ipf) {
assert(ipf != main_input_file); /* promised by tailing_try_read */
assert(ipf == old_input_file);
assert(ipf != main_input_file); /* promised by tailing_try_read */
assert(ipf == old_input_file);
- if (sms==sm_SEPARATED1) SMS(SEPARATED2, 0, "eof on old feed file");
- else if (sms==sm_DROPPING1) SMS(DROPPING2, 0, "eof on dead feed file");
- else abort();
-
inputfile_tailing_stop(ipf);
inputfile_tailing_stop(ipf);
+ assert(ipf->fd >= 0);
+ if (close(ipf->fd)) sysdie("could not close input file %s", ipf->path);
+ ipf->fd= -1;
+
+ assert(sms==sm_SEPARATED || sms==sm_DROPPING);
+
if (main_input_file)
inputfile_tailing_start(main_input_file);
}
if (main_input_file)
inputfile_tailing_start(main_input_file);
}
@@
-1085,7
+1085,8
@@
static void close_input_file(InputFile *ipf) {
assert(!ipf->rd); /* must have had inputfile_tailing_stop */
assert(!ipf->inprogress); /* no dangling pointers pointing here */
assert(!ipf->rd); /* must have had inputfile_tailing_stop */
assert(!ipf->inprogress); /* no dangling pointers pointing here */
- if (close(ipf->fd)) sysdie("could not close input file %s", ipf->path);
+ if (ipf->fd>=0)
+ if (close(ipf->fd)) sysdie("could not close input file %s", ipf->path);
free(ipf);
}
free(ipf);
}
@@
-1203,8
+1204,17
@@
static ssize_t tailing_try_read(struct oop_readable *rable, void *buffer,
return r;
}
if (!r) {
return r;
}
if (!r) {
- if (ipf==main_input_file) { errno=EAGAIN; return -1; }
- assert(sms==sm_SEPARATED1 || sms==sm_DROPPING1);
+ if (ipf==main_input_file) {
+ errno=EAGAIN;
+ return -1;
+ } else if (ipf==old_input_file) {
+ assert(ipf->fd>=0);
+ assert(sms==sm_SEPARATED || sms==sm_DROPPING);
+ } else if (ipf==backlog_input_file) {
+ assert(ipf->fd>=0);
+ } else {
+ abort();
+ }
}
return r;
}
}
return r;
}
@@
-1387,7
+1397,8
@@
static void inputfile_tailing_stop(InputFile *ipf) {
| | open F \
| V V
| ============= ============
| | open F \
| V V
| ============= ============
- | SEPARATED1 DROPPING1
+ | SEPARATED/ DROPPING/
+ | old->fd>=0 old->fd>=0
| [Separated] [Dropping]
| main F idle main none
| old D tail old D tail
| [Separated] [Dropping]
| main F idle main none
| old D tail old D tail
@@
-1395,12
+1406,13
@@
static void inputfile_tailing_stop(InputFile *ipf) {
| | |
^ | EOF ON D | EOF ON D
| V V
| | |
^ | EOF ON D | EOF ON D
| V V
- | ============= ============
- | SEPARATED2 DROPPING2
+ | =============== ===============
+ | SEPARATED/ DROPPING/
+ | old->fd==-1 old->fd==-1
| [Finishing] [Dropping]
| main F tail main none
| [Finishing] [Dropping]
| main F tail main none
- | old D
idle old D idle
- | =============
============
+ | old D
closed old D closed
+ | =============
== ===
============
| | |
| | ALL D PROCESSED | ALL D PROCESSED
| V install defer as backlog V install defer as backlog
| | |
| | ALL D PROCESSED | ALL D PROCESSED
| V install defer as backlog V install defer as backlog
@@
-1539,7
+1551,7
@@
static void statemc_init(void) {
spawn_inndcomm_flush(); /* => Flushing, sets sms to sm_FLUSHING */
} else {
/* F!=D => Separated */
spawn_inndcomm_flush(); /* => Flushing, sets sms to sm_FLUSHING */
} else {
/* F!=D => Separated */
- SMS(SEPARATED
1
, 0, "found both old and current feed files");
+ SMS(SEPARATED, 0, "found both old and current feed files");
startup_set_input_file(file_d);
}
} else { /*!file_d*/
startup_set_input_file(file_d);
}
} else { /*!file_d*/
@@
-1583,8
+1595,9
@@
static void *statemc_check_oldinput_done(oop_source *lp,
struct timeval now, void *u) {
struct stat stab;
struct timeval now, void *u) {
struct stat stab;
- int done= (sms==sm_SEPARATED2 || sms==sm_DROPPING2)
- && old_input_file->inprogress;
+ int done= (sms==sm_SEPARATED || sms==sm_DROPPING)
+ && old_input_file->fd==-1
+ && !old_input_file->inprogress;
if (!done) return;
r= fstat(fileno(defer), &stab);
if (!done) return;
r= fstat(fileno(defer), &stab);
@@
-1606,7
+1619,7
@@
static void *statemc_check_oldinput_done(oop_source *lp,
if (unlink(path_duct))
sysdie("could not unlink old duct file %s", path_duct);
if (unlink(path_duct))
sysdie("could not unlink old duct file %s", path_duct);
- if (sms==sm_DROPPING
2
) {
+ if (sms==sm_DROPPING) {
notice("feed dropped and our work is complete"
" (but check for backlog files)");
exit(0);
notice("feed dropped and our work is complete"
" (but check for backlog files)");
exit(0);
@@
-1654,7
+1667,7
@@
static void *inndcomm_event(oop_source *lp, int fd, oop_event e, void *u) {
warn("feed has been dropped by innd, finishing up");
old_input_file= main_input_file;
main_input_file= 0;
warn("feed has been dropped by innd, finishing up");
old_input_file= main_input_file;
main_input_file= 0;
- SMS(DROPPING
1
, 0, "dropped by innd");
+ SMS(DROPPING, 0, "dropped by innd");
return OOP_CONTINUE;
case 0:
return OOP_CONTINUE;
case 0:
@@
-1662,7
+1675,7
@@
static void *inndcomm_event(oop_source *lp, int fd, oop_event e, void *u) {
main_input_file= open_input_file(feedfile);
if (!main_input_file)
die("flush succeeded but feedfile %s does not exist!", feedfile);
main_input_file= open_input_file(feedfile);
if (!main_input_file)
die("flush succeeded but feedfile %s does not exist!", feedfile);
- SMS(SEPARATED
1
, 0, "feed file missing");
+ SMS(SEPARATED, 0, "feed file missing");
return OOP_CONTINUE;
default:
return OOP_CONTINUE;
default: