diff options
author | Nick White <git@njw.name> | 2020-06-02 16:32:15 +0100 |
---|---|---|
committer | Nick White <git@njw.name> | 2020-06-02 16:32:15 +0100 |
commit | 7c564921465d2531db9308c14a21ac392fdcb289 (patch) | |
tree | baffa48cf900dae9f29d8fc98b1071c1abf485e5 | |
parent | 3d27bebcc9f0917923adcecd730d4e046c841276 (diff) |
Fix race condition that could cause errors to be silently discarded
This was a nasty one. By closing the up channel, the up() function
would finish and send to the done channel. This means that the select
between err and done would be random as to which was picked, whereas
of course if there has been an error that path must be taken.
-rw-r--r-- | cmd/bookpipeline/main.go | 18 |
1 files changed, 0 insertions, 18 deletions
diff --git a/cmd/bookpipeline/main.go b/cmd/bookpipeline/main.go index 6701fcd..7e93b9d 100644 --- a/cmd/bookpipeline/main.go +++ b/cmd/bookpipeline/main.go @@ -160,7 +160,6 @@ func preprocess(pre chan string, up chan string, errc chan error, logger *log.Lo if err != nil { for range pre { } // consume the rest of the receiving channel so it isn't blocked - close(up) errc <- err return } @@ -182,7 +181,6 @@ func wipe(towipe chan string, up chan string, errc chan error, logger *log.Logge if err != nil { for range towipe { } // consume the rest of the receiving channel so it isn't blocked - close(up) errc <- err return } @@ -204,7 +202,6 @@ func ocr(training string) func(chan string, chan string, chan error, *log.Logger if err != nil { for range toocr { } // consume the rest of the receiving channel so it isn't blocked - close(up) errc <- fmt.Errorf("Error ocring %s with training %s: %s\nStdout: %s\nStderr: %s\n", path, training, err, stdout.String(), stderr.String()) return } @@ -232,7 +229,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log if err != nil { for range toanalyse { } // consume the rest of the receiving channel so it isn't blocked - close(up) errc <- fmt.Errorf("Error retreiving confidence for %s: %s", path, err) return } @@ -250,7 +246,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log logger.Println("Saving confidences in file", fn) f, err := os.Create(fn) if err != nil { - close(up) errc <- fmt.Errorf("Error creating file %s: %s", fn, err) return } @@ -266,7 +261,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log } _, err = fmt.Fprintf(f, "%s\t%02.f\n", c.Path, c.Conf) if err != nil { - close(up) errc <- fmt.Errorf("Error writing confidences file: %s", err) return } @@ -278,7 +272,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log fn = filepath.Join(savedir, "best") f, err = os.Create(fn) if err != nil { - close(up) errc <- fmt.Errorf("Error creating file %s: %s", fn, err) return } @@ -297,21 +290,18 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log logger.Println("Downloading binarised and original images to create PDFs") bookname, err := filepath.Rel(os.TempDir(), savedir) if err != nil { - close(up) errc <- fmt.Errorf("Failed to do filepath.Rel of %s to %s: %s", os.TempDir(), savedir, err) return } colourpdf := new(bookpipeline.Fpdf) err = colourpdf.Setup() if err != nil { - close(up) errc <- fmt.Errorf("Failed to set up PDF: %s", err) return } binarisedpdf := new(bookpipeline.Fpdf) err = binarisedpdf.Setup() if err != nil { - close(up) errc <- fmt.Errorf("Failed to set up PDF: %s", err) return } @@ -343,14 +333,12 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log } else { err = binarisedpdf.AddPage(filepath.Join(savedir, pg.img), filepath.Join(savedir, pg.hocr), true) if err != nil { - close(up) errc <- fmt.Errorf("Failed to add page %s to PDF: %s", pg.img, err) return } binhascontent = true err = os.Remove(filepath.Join(savedir, pg.img)) if err != nil { - close(up) errc <- err return } @@ -361,7 +349,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log fn = filepath.Join(savedir, bookname+".binarised.pdf") err = binarisedpdf.Save(fn) if err != nil { - close(up) errc <- fmt.Errorf("Failed to save binarised pdf: %s", err) return } @@ -388,14 +375,12 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log if err == nil { err = colourpdf.AddPage(filepath.Join(savedir, colourfn), pg.hocr, true) if err != nil { - close(up) errc <- fmt.Errorf("Failed to add page %s to PDF: %s", pg.img, err) return } colourhascontent = true err = os.Remove(filepath.Join(savedir, colourfn)) if err != nil { - close(up) errc <- err return } @@ -405,7 +390,6 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log fn = filepath.Join(savedir, bookname+".colour.pdf") err = colourpdf.Save(fn) if err != nil { - close(up) errc <- fmt.Errorf("Failed to save colour pdf: %s", err) return } @@ -416,14 +400,12 @@ func analyse(conn Pipeliner) func(chan string, chan string, chan error, *log.Log fn = filepath.Join(savedir, "graph.png") f, err = os.Create(fn) if err != nil { - close(up) errc <- fmt.Errorf("Error creating file %s: %s", fn, err) return } defer f.Close() err = bookpipeline.Graph(bestconfs, filepath.Base(savedir), f) if err != nil && err.Error() != "Not enough valid confidences" { - close(up) errc <- fmt.Errorf("Error rendering graph: %s", err) return } |