sqlExecRetry keeps calling http://golang.org/pkg/database/sql/#DB.Exec on db with stmt until it succeeds or until it has been tried maxTry times. It sleeps in between tries, twice longer after each new try, starting with 100 milliseconds.
(db *sql.DB, stmt string, maxTry int)
| 348 | // It sleeps in between tries, twice longer after each new try, starting with |
| 349 | // 100 milliseconds. |
| 350 | func sqlExecRetry(db *sql.DB, stmt string, maxTry int) (sql.Result, error) { |
| 351 | if maxTry <= 0 { |
| 352 | return nil, errors.New("did not try at all") |
| 353 | } |
| 354 | interval := 100 * time.Millisecond |
| 355 | try := 0 |
| 356 | var err error |
| 357 | var result sql.Result |
| 358 | for { |
| 359 | result, err = db.Exec(stmt) |
| 360 | if err == nil { |
| 361 | return result, nil |
| 362 | } |
| 363 | try++ |
| 364 | if try == maxTry { |
| 365 | break |
| 366 | } |
| 367 | time.Sleep(interval) |
| 368 | interval *= 2 |
| 369 | } |
| 370 | return result, fmt.Errorf("failed %v times: %v", try, err) |
| 371 | } |
no outgoing calls
no test coverage detected