add exponential backoff and retry