github.com/Cloud-Foundations/Dominator@v0.3.4/lib/fsutil/waitFile.go (about) 1 package fsutil 2 3 import ( 4 "errors" 5 "io" 6 "os" 7 "time" 8 ) 9 10 func waitFile(pathname string, timeout time.Duration) (io.ReadCloser, error) { 11 stopTime := time.Now().Add(timeout) 12 interval := time.Millisecond 13 for { 14 if file, err := os.Open(pathname); err != nil { 15 if !os.IsNotExist(err) { 16 return nil, err 17 } 18 } else { 19 return file, nil 20 } 21 if timeout >= 0 && time.Now().After(stopTime) { 22 return nil, errors.New("timed out waiting for file: " + pathname) 23 } 24 time.Sleep(interval) 25 interval *= 2 26 if interval > time.Second { 27 interval = time.Second 28 } 29 } 30 }