From 216ae9cf99b4ac7018dfcaf362a60926e0310bcb Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Tue, 20 Apr 2010 21:55:40 +0100 Subject: [PATCH] New state diagrams for new startup/drop arrangements --- backends/innduct.c | 193 ++++++++++++++++++++++----------------------- 1 file changed, 94 insertions(+), 99 deletions(-) diff --git a/backends/innduct.c b/backends/innduct.c index 9fcd2ff..85a2799 100644 --- a/backends/innduct.c +++ b/backends/innduct.c @@ -62,27 +62,13 @@ START | - check D, F - | - <--------------------------------------'| - Nothing F, D both ENOENT | - F: ENOENT | - D: ENOENT | - duct: not not reading anything | - | | - |`---------------------. | - | | duct times out waiting for F | - V innd creates F | duct exits | - | V | - Noduct GO TO Dropped | - F: innd writing | - D: ENOENT | - duct: not running or not reading anything | - | | - | | - ,-->--+ <---------------------------------'| - | | duct opens F F exists | - | | D ENOENT | + ,-->--. check F, D + | | | + | | | + | | <----------------<---------------------------------'| + | | F exists | + | | D ENOENT | + | | duct opens F | | V | | Normal | | F: innd writing, duct reading | @@ -96,31 +82,35 @@ | F == D: innd writing, duct reading both exist | ^ | | | | duct unlinks F | - | V | - | Moved <----+------------<--'| - | F: ENOENT | F ENOENT | - | D: innd writing, duct reading | D exists | - | | | | - | | duct requests flush of feed | | - | | (others can too, harmlessly) | | - | V | | - | Flushing | | - | F: ENOENT | | - | D: innd flushing, duct reading | | - | | | | - | | inndcomm flush fails | | - | |`-------------------------->---------' | - | | | + | | <-----------<-------------<--'| + | | open D F ENOENT | + | | if exists | + | | | + | V <---------------------. | + | Moved | | + | F: ENOENT | | + | D: innd writing, duct reading; or ENOENT | | + | | | | + | | duct requests flush of feed | | + | | (others can too, harmlessly) | | + | V | | + | Flushing | | + | F: ENOENT | | + | D: innd flushing, duct; or ENOENT | | + | | | | + | | inndcomm flush fails | | + | |`-------------------------->------------------' | + | | | | | inndcomm reports no such site | | |`---------------------------------------------------- | -. - | | | | + | | | | | | innd finishes writing D, creates F | | | | inndcomm reports flush successful | | | | | | | V | | | Separated <----------------' | | F: innd writing F!=D / - | D: duct reading both exist / + | D: duct reading; or ENOENT both exist / | | / | | duct gets to the end of D / | | duct opens F too / @@ -1420,78 +1410,83 @@ static void inputfile_tailing_stop(InputFile *ipf) { /* See official state diagram at top of file. We implement * this as follows: - ================ - WAITING - [Nothing/Noduct] - poll for F - ================ - | - | TIMEOUT and no defer, no backlog - |`--------------------------. - | | - | OPEN F SUCCEEDS | exit - ,--------->| V - | V ========= - | ======== (ESRCH) - | NORMAL [Dropped] - | [Normal] ========= - | main F tail - | ======== - | | - | | F IS SO BIG WE SHOULD FLUSH - ^ | hardlink F to D - | [Hardlinked] - | | unlink F - | | our handle onto F is now onto D - | [Moved] - | | - | |<---------------------------------------------------. + .=======. + ||START|| + `=======' + | + | open F + | + | F ENOENT + |`---------------------------------------------------. + F OPEN OK | | + |`---------------- - - - | + D ENOENT | D EXISTS see OVERALL STATES diagram | + | for full startup logic | + ,--------->| | + | V | + | ============ try to | + | NORMAL open D | + | [Normal] | + | main F tail | + | ============ V + | | | + | | F IS SO BIG WE SHOULD FLUSH, OR TIMEOUT | + ^ | hardlink F to D | + | [Hardlinked] | + | | unlink F | + | | our handle onto F is now onto D | + | [Moved] | + | | | + | |<-------------------<---------------------<---------+ | | | | | spawn inndcomm flush | | V | - | ========== | + | ================ | | FLUSHING | | [Flushing] | - | main D tail | - | ========== | + | main D tail/none | + | ================ | | | | | | INNDCOMM FLUSH FAILS ^ | |`----------------------->----------. | | | | | | | NO SUCH SITE V | - ^ |`--------------->----. =========== | - | | \ FLUSHFAIL | - | | \ [Moved] | - | | \ main D tail | - | | \ =========== | + ^ |`--------------->----. ================ | + | | \ FLUSHFAIL | + | | \ [Moved] | + | | FLUSH OK \ main D tail/none | + | | open F \ ================ | | | \ | | | | \ | TIME TO RETRY | - | | \ `----------------' - | | FLUSH OK \ - | | open F \ - | V V - | ============= ============ - | SEPARATED/ DROPPING/ - | flsh->fd>=0 flsh->fd>=0 - | [Separated] [Dropping] - | main F idle main none - | old D tail old D tail - | ============= ============ - | | | - ^ | EOF ON D | EOF ON D - | V V - | =============== =============== - | SEPARATED/ DROPPING/ - | flsh->fd==-1 flsh->fd==-1 - | [Finishing] [Dropping] - | main F tail main none - | old D closed old D closed - | =============== =============== - | | | - | | ALL D PROCESSED | ALL D PROCESSED - | V install defer as backlog V install defer as backlog - ^ | close D | close D - | | unlink D | unlink D + |<--------'| ,---<---'\ `----------------' + | D NONE | | D NONE \ + | | | \ + | | | | + | | V | + | V | V + | ============= | ============ + | SEPARATED/ | DROPPING/ + | flsh->fd>=0 | flsh->fd>=0 + | [Separated] | [Dropping] + | main F idle | main none + | old D tail | old D tail + | ============= | ============ + | | | | + ^ | EOF ON D | | EOF ON D + | V | V + | =============== | =============== + | SEPARATED/ | DROPPING/ + | flsh->fd==-1 V flsh->fd==-1 + | [Finishing] | [Dropping] + | main F tail `. main none + | old D closed `. old D closed + | =============== `. =============== + | | `. | + | | ALL D PROCESSED `. | ALL D PROCESSED + | V install defer as backlog `. V install defer as backlog + ^ | close D \| close D + | | unlink D | unlink D + | | | unlink lock | | | exit `----------' V ========== @@ -1994,7 +1989,7 @@ EVERY(filepoll, {5,0}, { if (main_input_file && main_input_file->readable_callback) filemon_callback(main_input_file); }); - + #define DEBUGF_IPF(wh) " " #wh "=%p/%s:ip=%ld,off=%ld,fd=%d%s" \ #define DEBUG_IPF(sh) \ wh##_input_file, debug_ipf_path(wh##_input_file), \ -- 2.30.2