github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/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  }