| // | 
 | // Copyright (C) 2012 The Android Open Source Project | 
 | // | 
 | // Licensed under the Apache License, Version 2.0 (the "License"); | 
 | // you may not use this file except in compliance with the License. | 
 | // You may obtain a copy of the License at | 
 | // | 
 | //      http://www.apache.org/licenses/LICENSE-2.0 | 
 | // | 
 | // Unless required by applicable law or agreed to in writing, software | 
 | // distributed under the License is distributed on an "AS IS" BASIS, | 
 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
 | // See the License for the specific language governing permissions and | 
 | // limitations under the License. | 
 | // | 
 |  | 
 | #ifndef UPDATE_ENGINE_PAYLOAD_STATE_H_ | 
 | #define UPDATE_ENGINE_PAYLOAD_STATE_H_ | 
 |  | 
 | #include <string> | 
 | #include <vector> | 
 |  | 
 | #include <base/time/time.h> | 
 | #include <gtest/gtest_prod.h>  // for FRIEND_TEST | 
 |  | 
 | #include "update_engine/common/prefs_interface.h" | 
 | #include "update_engine/metrics.h" | 
 | #include "update_engine/payload_state_interface.h" | 
 |  | 
 | namespace chromeos_update_engine { | 
 |  | 
 | class SystemState; | 
 |  | 
 | // Encapsulates all the payload state required for download. This includes the | 
 | // state necessary for handling multiple URLs in Omaha response, the backoff | 
 | // state, etc. All state is persisted so that we use the most recently saved | 
 | // value when resuming the update_engine process. All state is also cached in | 
 | // memory so that we ensure we always make progress based on last known good | 
 | // state even when there's any issue in reading/writing from the file system. | 
 | class PayloadState : public PayloadStateInterface { | 
 |  public: | 
 |   PayloadState(); | 
 |   ~PayloadState() override {} | 
 |  | 
 |   // Initializes a payload state object using the given global system state. | 
 |   // It performs the initial loading of all persisted state into memory and | 
 |   // dumps the initial state for debugging purposes.  Note: the other methods | 
 |   // should be called only after calling Initialize on this object. | 
 |   bool Initialize(SystemState* system_state); | 
 |  | 
 |   // Implementation of PayloadStateInterface methods. | 
 |   void SetResponse(const OmahaResponse& response) override; | 
 |   void DownloadComplete() override; | 
 |   void DownloadProgress(size_t count) override; | 
 |   void UpdateResumed() override; | 
 |   void UpdateRestarted() override; | 
 |   void UpdateSucceeded() override; | 
 |   void UpdateFailed(ErrorCode error) override; | 
 |   void ResetUpdateStatus() override; | 
 |   bool ShouldBackoffDownload() override; | 
 |   void Rollback() override; | 
 |   void ExpectRebootInNewVersion(const std::string& target_version_uid) override; | 
 |   void SetUsingP2PForDownloading(bool value) override; | 
 |  | 
 |   void SetUsingP2PForSharing(bool value) override { | 
 |     using_p2p_for_sharing_ = value; | 
 |   } | 
 |  | 
 |   inline std::string GetResponseSignature() override { | 
 |     return response_signature_; | 
 |   } | 
 |  | 
 |   inline int GetFullPayloadAttemptNumber() override { | 
 |     return full_payload_attempt_number_; | 
 |   } | 
 |  | 
 |   inline int GetPayloadAttemptNumber() override { | 
 |     return payload_attempt_number_; | 
 |   } | 
 |  | 
 |   inline std::string GetCurrentUrl() override { | 
 |     return candidate_urls_.size() ? candidate_urls_[url_index_] : ""; | 
 |   } | 
 |  | 
 |   inline uint32_t GetUrlFailureCount() override { | 
 |     return url_failure_count_; | 
 |   } | 
 |  | 
 |   inline uint32_t GetUrlSwitchCount() override { | 
 |     return url_switch_count_; | 
 |   } | 
 |  | 
 |   inline int GetNumResponsesSeen() override { | 
 |     return num_responses_seen_; | 
 |   } | 
 |  | 
 |   inline base::Time GetBackoffExpiryTime() override { | 
 |     return backoff_expiry_time_; | 
 |   } | 
 |  | 
 |   base::TimeDelta GetUpdateDuration() override; | 
 |  | 
 |   base::TimeDelta GetUpdateDurationUptime() override; | 
 |  | 
 |   inline uint64_t GetCurrentBytesDownloaded(DownloadSource source) override { | 
 |     return source < kNumDownloadSources ? current_bytes_downloaded_[source] : 0; | 
 |   } | 
 |  | 
 |   inline uint64_t GetTotalBytesDownloaded(DownloadSource source) override { | 
 |     return source < kNumDownloadSources ? total_bytes_downloaded_[source] : 0; | 
 |   } | 
 |  | 
 |   inline uint32_t GetNumReboots() override { | 
 |     return num_reboots_; | 
 |   } | 
 |  | 
 |   void UpdateEngineStarted() override; | 
 |  | 
 |   inline std::string GetRollbackVersion() override { | 
 |     return rollback_version_; | 
 |   } | 
 |  | 
 |   int GetP2PNumAttempts() override; | 
 |   base::Time GetP2PFirstAttemptTimestamp() override; | 
 |   void P2PNewAttempt() override; | 
 |   bool P2PAttemptAllowed() override; | 
 |  | 
 |   bool GetUsingP2PForDownloading() const override { | 
 |     return using_p2p_for_downloading_; | 
 |   } | 
 |  | 
 |   bool GetUsingP2PForSharing() const override { | 
 |     return using_p2p_for_sharing_; | 
 |   } | 
 |  | 
 |   base::TimeDelta GetScatteringWaitPeriod() override { | 
 |     return scattering_wait_period_; | 
 |   } | 
 |  | 
 |   void SetScatteringWaitPeriod(base::TimeDelta wait_period) override; | 
 |  | 
 |   void SetP2PUrl(const std::string& url) override { | 
 |     p2p_url_ = url; | 
 |   } | 
 |  | 
 |   std::string GetP2PUrl() const override { | 
 |     return p2p_url_; | 
 |   } | 
 |  | 
 |   inline ErrorCode GetAttemptErrorCode() const override { | 
 |     return attempt_error_code_; | 
 |   } | 
 |  | 
 |  private: | 
 |   enum class AttemptType { | 
 |     kUpdate, | 
 |     kRollback, | 
 |   }; | 
 |  | 
 |   friend class PayloadStateTest; | 
 |   FRIEND_TEST(PayloadStateTest, RebootAfterUpdateFailedMetric); | 
 |   FRIEND_TEST(PayloadStateTest, RebootAfterUpdateSucceed); | 
 |   FRIEND_TEST(PayloadStateTest, RebootAfterCanceledUpdate); | 
 |   FRIEND_TEST(PayloadStateTest, RollbackVersion); | 
 |   FRIEND_TEST(PayloadStateTest, UpdateSuccessWithWipedPrefs); | 
 |  | 
 |   // Helper called when an attempt has begun, is called by | 
 |   // UpdateResumed(), UpdateRestarted() and Rollback(). | 
 |   void AttemptStarted(AttemptType attempt_type); | 
 |  | 
 |   // Increments the payload attempt number used for metrics. | 
 |   void IncrementPayloadAttemptNumber(); | 
 |  | 
 |   // Increments the payload attempt number which governs the backoff behavior | 
 |   // at the time of the next update check. | 
 |   void IncrementFullPayloadAttemptNumber(); | 
 |  | 
 |   // Advances the current URL index to the next available one. If all URLs have | 
 |   // been exhausted during the current payload download attempt (as indicated | 
 |   // by the payload attempt number), then it will increment the payload attempt | 
 |   // number and wrap around again with the first URL in the list. This also | 
 |   // updates the URL switch count, if needed. | 
 |   void IncrementUrlIndex(); | 
 |  | 
 |   // Increments the failure count of the current URL. If the configured max | 
 |   // failure count is reached for this URL, it advances the current URL index | 
 |   // to the next URL and resets the failure count for that URL. | 
 |   void IncrementFailureCount(); | 
 |  | 
 |   // Updates the backoff expiry time exponentially based on the current | 
 |   // payload attempt number. | 
 |   void UpdateBackoffExpiryTime(); | 
 |  | 
 |   // Updates the value of current download source based on the current URL | 
 |   // index. If the download source is not one of the known sources, it's set | 
 |   // to kNumDownloadSources. | 
 |   void UpdateCurrentDownloadSource(); | 
 |  | 
 |   // Updates the various metrics corresponding with the given number of bytes | 
 |   // that were downloaded recently. | 
 |   void UpdateBytesDownloaded(size_t count); | 
 |  | 
 |   // Calculates the PayloadType we're using. | 
 |   PayloadType CalculatePayloadType(); | 
 |  | 
 |   // Collects and reports the various metrics related to an update attempt. | 
 |   void CollectAndReportAttemptMetrics(ErrorCode code); | 
 |  | 
 |   // Persists values related to the UpdateEngine.Attempt.* metrics so | 
 |   // we can identify later if an update attempt ends abnormally. | 
 |   void PersistAttemptMetrics(); | 
 |  | 
 |   // Clears persistent state previously set using AttemptMetricsPersist(). | 
 |   void ClearPersistedAttemptMetrics(); | 
 |  | 
 |   // Checks if persistent state previously set using AttemptMetricsPersist() | 
 |   // exists and, if so, emits it with |attempt_result| set to | 
 |   // metrics::AttemptResult::kAbnormalTermination. | 
 |   void ReportAndClearPersistedAttemptMetrics(); | 
 |  | 
 |   // Collects and reports the various metrics related to a successful update. | 
 |   void CollectAndReportSuccessfulUpdateMetrics(); | 
 |  | 
 |   // Checks if we were expecting to be running in the new version but the | 
 |   // boot into the new version failed for some reason. If that's the case, an | 
 |   // UMA metric is sent reporting the number of attempts the same applied | 
 |   // payload was attempted to reboot. This function is called by UpdateAttempter | 
 |   // every time the update engine starts and there's no reboot pending. | 
 |   void ReportFailedBootIfNeeded(); | 
 |  | 
 |   // Resets all the persisted state values which are maintained relative to the | 
 |   // current response signature. The response signature itself is not reset. | 
 |   void ResetPersistedState(); | 
 |  | 
 |   // Resets the appropriate state related to download sources that need to be | 
 |   // reset on a new update. | 
 |   void ResetDownloadSourcesOnNewUpdate(); | 
 |  | 
 |   // Returns the persisted value from prefs_ for the given key. It also | 
 |   // validates that the value returned is non-negative. | 
 |   int64_t GetPersistedValue(const std::string& key); | 
 |  | 
 |   // Calculates the response "signature", which is basically a string composed | 
 |   // of the subset of the fields in the current response that affect the | 
 |   // behavior of the PayloadState. | 
 |   std::string CalculateResponseSignature(); | 
 |  | 
 |   // Initializes the current response signature from the persisted state. | 
 |   void LoadResponseSignature(); | 
 |  | 
 |   // Sets the response signature to the given value. Also persists the value | 
 |   // being set so that we resume from the save value in case of a process | 
 |   // restart. | 
 |   void SetResponseSignature(const std::string& response_signature); | 
 |  | 
 |   // Initializes the payload attempt number from the persisted state. | 
 |   void LoadPayloadAttemptNumber(); | 
 |  | 
 |   // Initializes the payload attempt number for full payloads from the persisted | 
 |   // state. | 
 |   void LoadFullPayloadAttemptNumber(); | 
 |  | 
 |   // Sets the payload attempt number to the given value. Also persists the | 
 |   // value being set so that we resume from the same value in case of a process | 
 |   // restart. | 
 |   void SetPayloadAttemptNumber(int payload_attempt_number); | 
 |  | 
 |   // Sets the payload attempt number for full updates to the given value. Also | 
 |   // persists the value being set so that we resume from the same value in case | 
 |   // of a process restart. | 
 |   void SetFullPayloadAttemptNumber(int payload_attempt_number); | 
 |  | 
 |   // Initializes the current URL index from the persisted state. | 
 |   void LoadUrlIndex(); | 
 |  | 
 |   // Sets the current URL index to the given value. Also persists the value | 
 |   // being set so that we resume from the same value in case of a process | 
 |   // restart. | 
 |   void SetUrlIndex(uint32_t url_index); | 
 |  | 
 |   // Initializes the current URL's failure count from the persisted stae. | 
 |   void LoadUrlFailureCount(); | 
 |  | 
 |   // Sets the current URL's failure count to the given value. Also persists the | 
 |   // value being set so that we resume from the same value in case of a process | 
 |   // restart. | 
 |   void SetUrlFailureCount(uint32_t url_failure_count); | 
 |  | 
 |   // Sets |url_switch_count_| to the given value and persists the value. | 
 |   void SetUrlSwitchCount(uint32_t url_switch_count); | 
 |  | 
 |   // Initializes |url_switch_count_| from the persisted stae. | 
 |   void LoadUrlSwitchCount(); | 
 |  | 
 |   // Initializes the backoff expiry time from the persisted state. | 
 |   void LoadBackoffExpiryTime(); | 
 |  | 
 |   // Sets the backoff expiry time to the given value. Also persists the value | 
 |   // being set so that we resume from the same value in case of a process | 
 |   // restart. | 
 |   void SetBackoffExpiryTime(const base::Time& new_time); | 
 |  | 
 |   // Initializes |update_timestamp_start_| from the persisted state. | 
 |   void LoadUpdateTimestampStart(); | 
 |  | 
 |   // Sets |update_timestamp_start_| to the given value and persists the value. | 
 |   void SetUpdateTimestampStart(const base::Time& value); | 
 |  | 
 |   // Sets |update_timestamp_end_| to the given value. This is not persisted | 
 |   // as it happens at the end of the update process where state is deleted | 
 |   // anyway. | 
 |   void SetUpdateTimestampEnd(const base::Time& value); | 
 |  | 
 |   // Initializes |update_duration_uptime_| from the persisted state. | 
 |   void LoadUpdateDurationUptime(); | 
 |  | 
 |   // Helper method used in SetUpdateDurationUptime() and | 
 |   // CalculateUpdateDurationUptime(). | 
 |   void SetUpdateDurationUptimeExtended(const base::TimeDelta& value, | 
 |                                        const base::Time& timestamp, | 
 |                                        bool use_logging); | 
 |  | 
 |   // Sets |update_duration_uptime_| to the given value and persists | 
 |   // the value and sets |update_duration_uptime_timestamp_| to the | 
 |   // current monotonic time. | 
 |   void SetUpdateDurationUptime(const base::TimeDelta& value); | 
 |  | 
 |   // Adds the difference between current monotonic time and | 
 |   // |update_duration_uptime_timestamp_| to |update_duration_uptime_| and | 
 |   // sets |update_duration_uptime_timestamp_| to current monotonic time. | 
 |   void CalculateUpdateDurationUptime(); | 
 |  | 
 |   // Returns the full key for a download source given the prefix. | 
 |   std::string GetPrefsKey(const std::string& prefix, DownloadSource source); | 
 |  | 
 |   // Loads the number of bytes that have been currently downloaded through the | 
 |   // previous attempts from the persisted state for the given source. It's | 
 |   // reset to 0 everytime we begin a full update and is continued from previous | 
 |   // attempt if we're resuming the update. | 
 |   void LoadCurrentBytesDownloaded(DownloadSource source); | 
 |  | 
 |   // Sets the number of bytes that have been currently downloaded for the | 
 |   // given source. This value is also persisted. | 
 |   void SetCurrentBytesDownloaded(DownloadSource source, | 
 |                                  uint64_t current_bytes_downloaded, | 
 |                                  bool log); | 
 |  | 
 |   // Loads the total number of bytes that have been downloaded (since the last | 
 |   // successful update) from the persisted state for the given source. It's | 
 |   // reset to 0 everytime we successfully apply an update and counts the bytes | 
 |   // downloaded for both successful and failed attempts since then. | 
 |   void LoadTotalBytesDownloaded(DownloadSource source); | 
 |  | 
 |   // Sets the total number of bytes that have been downloaded so far for the | 
 |   // given source. This value is also persisted. | 
 |   void SetTotalBytesDownloaded(DownloadSource source, | 
 |                                uint64_t total_bytes_downloaded, | 
 |                                bool log); | 
 |  | 
 |   // Loads the blacklisted version from our prefs file. | 
 |   void LoadRollbackVersion(); | 
 |  | 
 |   // Blacklists this version from getting AU'd to until we receive a new update | 
 |   // response. | 
 |   void SetRollbackVersion(const std::string& rollback_version); | 
 |  | 
 |   // Clears any blacklisted version. | 
 |   void ResetRollbackVersion(); | 
 |  | 
 |   inline uint32_t GetUrlIndex() { | 
 |     return url_index_; | 
 |   } | 
 |  | 
 |   // Computes the list of candidate URLs from the total list of payload URLs in | 
 |   // the Omaha response. | 
 |   void ComputeCandidateUrls(); | 
 |  | 
 |   // Sets |num_responses_seen_| and persist it to disk. | 
 |   void SetNumResponsesSeen(int num_responses_seen); | 
 |  | 
 |   // Initializes |num_responses_seen_| from persisted state. | 
 |   void LoadNumResponsesSeen(); | 
 |  | 
 |   // Initializes |num_reboots_| from the persisted state. | 
 |   void LoadNumReboots(); | 
 |  | 
 |   // Sets |num_reboots| for the update attempt. Also persists the | 
 |   // value being set so that we resume from the same value in case of a process | 
 |   // restart. | 
 |   void SetNumReboots(uint32_t num_reboots); | 
 |  | 
 |   // Checks to see if the device rebooted since the last call and if so | 
 |   // increments num_reboots. | 
 |   void UpdateNumReboots(); | 
 |  | 
 |   // Writes the current wall-clock time to the kPrefsSystemUpdatedMarker | 
 |   // state variable. | 
 |   void CreateSystemUpdatedMarkerFile(); | 
 |  | 
 |   // Called at program startup if the device booted into a new update. | 
 |   // The |time_to_reboot| parameter contains the (wall-clock) duration | 
 |   // from when the update successfully completed (the value written | 
 |   // into the kPrefsSystemUpdatedMarker state variable) until the device | 
 |   // was booted into the update (current wall-clock time). | 
 |   void BootedIntoUpdate(base::TimeDelta time_to_reboot); | 
 |  | 
 |   // Loads the |kPrefsP2PFirstAttemptTimestamp| state variable from disk | 
 |   // into |p2p_first_attempt_timestamp_|. | 
 |   void LoadP2PFirstAttemptTimestamp(); | 
 |  | 
 |   // Loads the |kPrefsP2PNumAttempts| state variable into |p2p_num_attempts_|. | 
 |   void LoadP2PNumAttempts(); | 
 |  | 
 |   // Sets the |kPrefsP2PNumAttempts| state variable to |value|. | 
 |   void SetP2PNumAttempts(int value); | 
 |  | 
 |   // Sets the |kPrefsP2PFirstAttemptTimestamp| state variable to |time|. | 
 |   void SetP2PFirstAttemptTimestamp(const base::Time& time); | 
 |  | 
 |   // Loads the persisted scattering wallclock-based wait period. | 
 |   void LoadScatteringWaitPeriod(); | 
 |  | 
 |   // The global state of the system. | 
 |   SystemState* system_state_; | 
 |  | 
 |   // Interface object with which we read/write persisted state. This must | 
 |   // be set by calling the Initialize method before calling any other method. | 
 |   PrefsInterface* prefs_; | 
 |  | 
 |   // Interface object with which we read/write persisted state. This must | 
 |   // be set by calling the Initialize method before calling any other method. | 
 |   // This object persists across powerwashes. | 
 |   PrefsInterface* powerwash_safe_prefs_; | 
 |  | 
 |   // This is the current response object from Omaha. | 
 |   OmahaResponse response_; | 
 |  | 
 |   // Whether P2P is being used for downloading and sharing. | 
 |   bool using_p2p_for_downloading_; | 
 |   bool using_p2p_for_sharing_; | 
 |  | 
 |   // Stores the P2P download URL, if one is used. | 
 |   std::string p2p_url_; | 
 |  | 
 |   // The cached value of |kPrefsP2PFirstAttemptTimestamp|. | 
 |   base::Time p2p_first_attempt_timestamp_; | 
 |  | 
 |   // The cached value of |kPrefsP2PNumAttempts|. | 
 |   int p2p_num_attempts_; | 
 |  | 
 |   // This stores a "signature" of the current response. The signature here | 
 |   // refers to a subset of the current response from Omaha.  Each update to | 
 |   // this value is persisted so we resume from the same value in case of a | 
 |   // process restart. | 
 |   std::string response_signature_; | 
 |  | 
 |   // The number of times we've tried to download the payload. This is | 
 |   // incremented each time we download the payload successsfully or when we | 
 |   // exhaust all failure limits for all URLs and are about to wrap around back | 
 |   // to the first URL.  Each update to this value is persisted so we resume from | 
 |   // the same value in case of a process restart. | 
 |   int payload_attempt_number_; | 
 |  | 
 |   // The number of times we've tried to download the payload in full. This is | 
 |   // incremented each time we download the payload in full successsfully or | 
 |   // when we exhaust all failure limits for all URLs and are about to wrap | 
 |   // around back to the first URL.  Each update to this value is persisted so | 
 |   // we resume from the same value in case of a process restart. | 
 |   int full_payload_attempt_number_; | 
 |  | 
 |   // The index of the current URL.  This type is different from the one in the | 
 |   // accessor methods because PrefsInterface supports only int64_t but we want | 
 |   // to provide a stronger abstraction of uint32_t.  Each update to this value | 
 |   // is persisted so we resume from the same value in case of a process | 
 |   // restart. | 
 |   int64_t url_index_; | 
 |  | 
 |   // The count of failures encountered in the current attempt to download using | 
 |   // the current URL (specified by url_index_).  Each update to this value is | 
 |   // persisted so we resume from the same value in case of a process restart. | 
 |   int64_t url_failure_count_; | 
 |  | 
 |   // The number of times we've switched URLs. | 
 |   int32_t url_switch_count_; | 
 |  | 
 |   // The current download source based on the current URL. This value is | 
 |   // not persisted as it can be recomputed everytime we update the URL. | 
 |   // We're storing this so as not to recompute this on every few bytes of | 
 |   // data we read from the socket. | 
 |   DownloadSource current_download_source_; | 
 |  | 
 |   // The number of different Omaha responses seen. Increases every time | 
 |   // a new response is seen. Resets to 0 only when the system has been | 
 |   // successfully updated. | 
 |   int num_responses_seen_; | 
 |  | 
 |   // The number of system reboots during an update attempt. Technically since | 
 |   // we don't go out of our way to not update it when not attempting an update, | 
 |   // also records the number of reboots before the next update attempt starts. | 
 |   uint32_t num_reboots_; | 
 |  | 
 |   // The timestamp until which we've to wait before attempting to download the | 
 |   // payload again, so as to backoff repeated downloads. | 
 |   base::Time backoff_expiry_time_; | 
 |  | 
 |   // The most recently calculated value of the update duration. | 
 |   base::TimeDelta update_duration_current_; | 
 |  | 
 |   // The point in time (wall-clock) that the update was started. | 
 |   base::Time update_timestamp_start_; | 
 |  | 
 |   // The point in time (wall-clock) that the update ended. If the update | 
 |   // is still in progress, this is set to the Epoch (e.g. 0). | 
 |   base::Time update_timestamp_end_; | 
 |  | 
 |   // The update duration uptime | 
 |   base::TimeDelta update_duration_uptime_; | 
 |  | 
 |   // The monotonic time when |update_duration_uptime_| was last set | 
 |   base::Time update_duration_uptime_timestamp_; | 
 |  | 
 |   // The number of bytes that have been downloaded for each source for each new | 
 |   // update attempt. If we resume an update, we'll continue from the previous | 
 |   // value, but if we get a new response or if the previous attempt failed, | 
 |   // we'll reset this to 0 to start afresh. Each update to this value is | 
 |   // persisted so we resume from the same value in case of a process restart. | 
 |   // The extra index in the array is to no-op accidental access in case the | 
 |   // return value from GetCurrentDownloadSource is used without validation. | 
 |   uint64_t current_bytes_downloaded_[kNumDownloadSources + 1]; | 
 |  | 
 |   // The number of bytes that have been downloaded for each source since the | 
 |   // the last successful update. This is used to compute the overhead we incur. | 
 |   // Each update to this value is persisted so we resume from the same value in | 
 |   // case of a process restart. | 
 |   // The extra index in the array is to no-op accidental access in case the | 
 |   // return value from GetCurrentDownloadSource is used without validation. | 
 |   uint64_t total_bytes_downloaded_[kNumDownloadSources + 1]; | 
 |  | 
 |   // A small timespan used when comparing wall-clock times for coping | 
 |   // with the fact that clocks drift and consequently are adjusted | 
 |   // (either forwards or backwards) via NTP. | 
 |   static const base::TimeDelta kDurationSlack; | 
 |  | 
 |   // The ordered list of the subset of payload URL candidates which are | 
 |   // allowed as per device policy. | 
 |   std::vector<std::string> candidate_urls_; | 
 |  | 
 |   // This stores a blacklisted version set as part of rollback. When we rollback | 
 |   // we store the version of the os from which we are rolling back from in order | 
 |   // to guarantee that we do not re-update to it on the next au attempt after | 
 |   // reboot. | 
 |   std::string rollback_version_; | 
 |  | 
 |   // The number of bytes downloaded per attempt. | 
 |   int64_t attempt_num_bytes_downloaded_; | 
 |  | 
 |   // The boot time when the attempt was started. | 
 |   base::Time attempt_start_time_boot_; | 
 |  | 
 |   // The monotonic time when the attempt was started. | 
 |   base::Time attempt_start_time_monotonic_; | 
 |  | 
 |   // The connection type when the attempt started. | 
 |   metrics::ConnectionType attempt_connection_type_; | 
 |  | 
 |   // The attempt error code when the attempt finished. | 
 |   ErrorCode attempt_error_code_; | 
 |  | 
 |   // Whether we're currently rolling back. | 
 |   AttemptType attempt_type_; | 
 |  | 
 |   // The current scattering wallclock-based wait period. | 
 |   base::TimeDelta scattering_wait_period_; | 
 |  | 
 |   DISALLOW_COPY_AND_ASSIGN(PayloadState); | 
 | }; | 
 |  | 
 | }  // namespace chromeos_update_engine | 
 |  | 
 | #endif  // UPDATE_ENGINE_PAYLOAD_STATE_H_ |