Handle errors and cancel process when encountered
This commit is contained in:
		
							parent
							
								
									a72d6f3768
								
							
						
					
					
						commit
						daf682b991
					
				| 
						 | 
					@ -1,6 +1,7 @@
 | 
				
			||||||
package server
 | 
					package server
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
	"github.com/gammazero/workerpool"
 | 
						"github.com/gammazero/workerpool"
 | 
				
			||||||
	"io/ioutil"
 | 
						"io/ioutil"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
| 
						 | 
					@ -17,6 +18,10 @@ type PooledFileWalker struct {
 | 
				
			||||||
	wg       sync.WaitGroup
 | 
						wg       sync.WaitGroup
 | 
				
			||||||
	pool     *workerpool.WorkerPool
 | 
						pool     *workerpool.WorkerPool
 | 
				
			||||||
	callback filepath.WalkFunc
 | 
						callback filepath.WalkFunc
 | 
				
			||||||
 | 
						cancel   context.CancelFunc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						err     error
 | 
				
			||||||
 | 
						errOnce sync.Once
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	Filesystem *Filesystem
 | 
						Filesystem *Filesystem
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -85,7 +90,14 @@ func (w *PooledFileWalker) push(path string) {
 | 
				
			||||||
	w.wg.Add(1)
 | 
						w.wg.Add(1)
 | 
				
			||||||
	w.pool.Submit(func() {
 | 
						w.pool.Submit(func() {
 | 
				
			||||||
		defer w.wg.Done()
 | 
							defer w.wg.Done()
 | 
				
			||||||
		w.process(path)
 | 
							if err := w.process(path); err != nil {
 | 
				
			||||||
 | 
								w.errOnce.Do(func() {
 | 
				
			||||||
 | 
									w.err = err
 | 
				
			||||||
 | 
									if w.cancel != nil {
 | 
				
			||||||
 | 
										w.cancel()
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								})
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,10 +107,17 @@ func (fs *Filesystem) Walk(dir string, callback filepath.WalkFunc) error {
 | 
				
			||||||
	w := newPooledWalker(fs)
 | 
						w := newPooledWalker(fs)
 | 
				
			||||||
	w.callback = callback
 | 
						w.callback = callback
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						_, cancel := context.WithCancel(context.Background())
 | 
				
			||||||
 | 
						w.cancel = cancel
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w.push(dir)
 | 
						w.push(dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	w.wg.Wait()
 | 
						w.wg.Wait()
 | 
				
			||||||
	w.pool.StopWait()
 | 
						w.pool.StopWait()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if w.err != nil {
 | 
				
			||||||
 | 
							return w.err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return nil
 | 
						return nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user