Implement exponential backoff for throttling repeated AU downloads.

Today we retry the same payload over and over again every hour. Ideally,
we shouldn't require ever to re-download the same payload again. But
from experience we find that post-install or firmware updates may succeed
on a second attempt. So until we have code that can do such selective
retries of those steps, we currently re-download and re-apply the whole
payload. So instead of retrying over and over again, we backoff the
successive payload download attempts at 1 day, 2 days, 4 days, etc. with
an upper limit of 16 days.

Another subtle reason for which we depend on the payload retry mechanism
today is if we've failed downloading the payload via all the URLs that are
specified in the rule, we don't want to keep re-attempting the download.
This case is different from the case discussed above, because in this case
we haven't even downloaded a payload once completely. In this case also,
there's a need for throttling the amount of bytes we end up downloading
repeatedly for a particular operation that may fail. This is done by
treating the exhaustion of all URLs as equivalent to having downloaded
a full payload and subjecting it to the same backoff behavior.

We waive backoffs for dev/test images so as not to cause any delay in
our testing or development.

BUG=chromium-os:36806
TEST=Added new unit tests. Tested all scenarios on my ZGB.
Change-Id: I6bd0d3f296a3c0da0a8026fb71b24785d825e39c
Reviewed-on: https://gerrit.chromium.org/gerrit/40220
Commit-Queue: Jay Srinivasan <jaysri@chromium.org>
Reviewed-by: Jay Srinivasan <jaysri@chromium.org>
Tested-by: Jay Srinivasan <jaysri@chromium.org>
14 files changed
tree: 6bf4c0a34f335a5b09bafe6ab7e331cbf19427eb
  1. .gitignore
  2. 99-gpio-dutflag.rules
  3. action.h
  4. action_mock.h
  5. action_pipe.h
  6. action_pipe_unittest.cc
  7. action_processor.cc
  8. action_processor.h
  9. action_processor_mock.h
  10. action_processor_unittest.cc
  11. action_unittest.cc
  12. build
  13. bzip.cc
  14. bzip.h
  15. bzip_extent_writer.cc
  16. bzip_extent_writer.h
  17. bzip_extent_writer_unittest.cc
  18. certificate_checker.cc
  19. certificate_checker.h
  20. certificate_checker_mock.h
  21. certificate_checker_unittest.cc
  22. chrome_browser_proxy_resolver.cc
  23. chrome_browser_proxy_resolver.h
  24. chrome_browser_proxy_resolver_unittest.cc
  25. chrome_proxy_resolver.cc
  26. chrome_proxy_resolver.h
  27. chrome_proxy_resolver_unittest.cc
  28. connection_manager.cc
  29. connection_manager.h
  30. connection_manager_unittest.cc
  31. cycle_breaker.cc
  32. cycle_breaker.h
  33. cycle_breaker_unittest.cc
  34. dbus_constants.h
  35. dbus_interface.h
  36. dbus_service.cc
  37. dbus_service.h
  38. delta_diff_generator.cc
  39. delta_diff_generator.h
  40. delta_diff_generator_unittest.cc
  41. delta_performer.cc
  42. delta_performer.h
  43. delta_performer_unittest.cc
  44. download_action.cc
  45. download_action.h
  46. download_action_unittest.cc
  47. extent_mapper.cc
  48. extent_mapper.h
  49. extent_mapper_unittest.cc
  50. extent_ranges.cc
  51. extent_ranges.h
  52. extent_ranges_unittest.cc
  53. extent_writer.cc
  54. extent_writer.h
  55. extent_writer_unittest.cc
  56. file_descriptor.cc
  57. file_descriptor.h
  58. file_writer.cc
  59. file_writer.h
  60. file_writer_mock.h
  61. file_writer_unittest.cc
  62. filesystem_copier_action.cc
  63. filesystem_copier_action.h
  64. filesystem_copier_action_unittest.cc
  65. filesystem_iterator.cc
  66. filesystem_iterator.h
  67. filesystem_iterator_unittest.cc
  68. full_update_generator.cc
  69. full_update_generator.h
  70. full_update_generator_unittest.cc
  71. gen_coverage_html
  72. generate_delta_main.cc
  73. gpio_handler.cc
  74. gpio_handler.h
  75. gpio_handler_unittest.cc
  76. gpio_handler_unittest.h
  77. gpio_mock_file_descriptor.cc
  78. gpio_mock_file_descriptor.h
  79. gpio_mock_udev_interface.cc
  80. gpio_mock_udev_interface.h
  81. graph_types.h
  82. graph_utils.cc
  83. graph_utils.h
  84. graph_utils_unittest.cc
  85. http_common.cc
  86. http_common.h
  87. http_fetcher.cc
  88. http_fetcher.h
  89. http_fetcher_unittest.cc
  90. http_fetcher_unittest.h
  91. inherit-review-settings-ok
  92. install_plan.h
  93. integration_unittest.cc
  94. libcurl_http_fetcher.cc
  95. libcurl_http_fetcher.h
  96. LICENSE
  97. local_coverage_rate
  98. main.cc
  99. marshal.list
  100. metadata.cc
  101. metadata.h
  102. metadata_unittest.cc
  103. mock_connection_manager.h
  104. mock_dbus_interface.h
  105. mock_file_writer.h
  106. mock_http_fetcher.cc
  107. mock_http_fetcher.h
  108. mock_payload_state.h
  109. mock_system_state.h
  110. multi_range_http_fetcher.cc
  111. multi_range_http_fetcher.h
  112. omaha_hash_calculator.cc
  113. omaha_hash_calculator.h
  114. omaha_hash_calculator_unittest.cc
  115. omaha_request_action.cc
  116. omaha_request_action.h
  117. omaha_request_action_unittest.cc
  118. omaha_request_params.cc
  119. omaha_request_params.h
  120. omaha_request_params_unittest.cc
  121. omaha_response.h
  122. omaha_response_handler_action.cc
  123. omaha_response_handler_action.h
  124. omaha_response_handler_action_unittest.cc
  125. org.chromium.UpdateEngine.service
  126. payload_signer.cc
  127. payload_signer.h
  128. payload_signer_unittest.cc
  129. payload_state.cc
  130. payload_state.h
  131. payload_state_interface.h
  132. payload_state_unittest.cc
  133. postinstall_runner_action.cc
  134. postinstall_runner_action.h
  135. postinstall_runner_action_unittest.cc
  136. prefs.cc
  137. prefs.h
  138. prefs_interface.h
  139. prefs_mock.h
  140. prefs_unittest.cc
  141. proxy_resolver.cc
  142. proxy_resolver.h
  143. run_unittests
  144. sample_omaha_v3_response.xml
  145. SConstruct
  146. setup_dev_packages
  147. simple_key_value_store.cc
  148. simple_key_value_store.h
  149. simple_key_value_store_unittest.cc
  150. subprocess.cc
  151. subprocess.h
  152. subprocess_unittest.cc
  153. system_state.cc
  154. system_state.h
  155. tarjan.cc
  156. tarjan.h
  157. tarjan_unittest.cc
  158. terminator.cc
  159. terminator.h
  160. terminator_unittest.cc
  161. test_http_server.cc
  162. test_utils.cc
  163. test_utils.h
  164. testrunner.cc
  165. topological_sort.cc
  166. topological_sort.h
  167. topological_sort_unittest.cc
  168. udev_interface.h
  169. unittest_key.pem
  170. unittest_key2.pem
  171. update_attempter.cc
  172. update_attempter.h
  173. update_attempter_mock.h
  174. update_attempter_unittest.cc
  175. update_check_scheduler.cc
  176. update_check_scheduler.h
  177. update_check_scheduler_unittest.cc
  178. update_engine.xml
  179. update_engine_client.cc
  180. update_metadata.proto
  181. UpdateEngine.conf
  182. utils.cc
  183. utils.h
  184. utils_unittest.cc
  185. WATCHLISTS
  186. zip_unittest.cc