in go/connection-refresh/btrefresh/bigtable_rotator.go [52:81]
func NewRotatingTable(dialer BtDialer, table string, refresh time.Duration) (*RotatingTable, error) {
client, err := dialer()
errors := make(chan error, 1)
if err != nil {
return nil, err
}
tbl := client.Open(table)
warmTable(tbl)
ticker := time.NewTicker(refresh)
rt := &RotatingTable{tbl, client, ticker, errors}
go func() {
for range ticker.C {
// Close the old client after waiting a bit
go func() {
oldC := rt.client
time.Sleep(lameduckTime)
oldC.Close()
}()
client, err := dialer()
if err != nil {
errors <- err
continue
}
tbl := client.Open(table)
warmTable(tbl)
rt.Table = tbl
}
}()
return rt, nil
}