OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "update_engine/update_attempter.h" | 5 #include "update_engine/update_attempter.h" |
6 | 6 |
7 // From 'man clock_gettime': feature test macro: _POSIX_C_SOURCE >= 199309L | 7 // From 'man clock_gettime': feature test macro: _POSIX_C_SOURCE >= 199309L |
8 #ifndef _POSIX_C_SOURCE | 8 #ifndef _POSIX_C_SOURCE |
9 #define _POSIX_C_SOURCE 199309L | 9 #define _POSIX_C_SOURCE 199309L |
10 #endif // _POSIX_C_SOURCE | 10 #endif // _POSIX_C_SOURCE |
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
83 return "UPDATE_STATUS_FINALIZING"; | 83 return "UPDATE_STATUS_FINALIZING"; |
84 case UPDATE_STATUS_UPDATED_NEED_REBOOT: | 84 case UPDATE_STATUS_UPDATED_NEED_REBOOT: |
85 return "UPDATE_STATUS_UPDATED_NEED_REBOOT"; | 85 return "UPDATE_STATUS_UPDATED_NEED_REBOOT"; |
86 case UPDATE_STATUS_REPORTING_ERROR_EVENT: | 86 case UPDATE_STATUS_REPORTING_ERROR_EVENT: |
87 return "UPDATE_STATUS_REPORTING_ERROR_EVENT"; | 87 return "UPDATE_STATUS_REPORTING_ERROR_EVENT"; |
88 default: | 88 default: |
89 return "unknown status"; | 89 return "unknown status"; |
90 } | 90 } |
91 } | 91 } |
92 | 92 |
| 93 // Turns a generic kActionCodeError to a generic error code specific |
| 94 // to |action| (e.g., kActionCodeFilesystemCopierError). If |code| is |
| 95 // not kActionCodeError, or the action is not matched, returns |code| |
| 96 // unchanged. |
| 97 ActionExitCode GetErrorCodeForAction(AbstractAction* action, |
| 98 ActionExitCode code) { |
| 99 if (code != kActionCodeError) |
| 100 return code; |
| 101 |
| 102 const string type = action->Type(); |
| 103 if (type == OmahaRequestAction::StaticType()) |
| 104 return kActionCodeOmahaRequestError; |
| 105 if (type == OmahaResponseHandlerAction::StaticType()) |
| 106 return kActionCodeOmahaResponseHandlerError; |
| 107 if (type == FilesystemCopierAction::StaticType()) |
| 108 return kActionCodeFilesystemCopierError; |
| 109 if (type == PostinstallRunnerAction::StaticType()) |
| 110 return kActionCodePostinstallRunnerError; |
| 111 if (type == SetBootableFlagAction::StaticType()) |
| 112 return kActionCodeSetBootableFlagError; |
| 113 |
| 114 return code; |
| 115 } |
| 116 |
93 void UpdateAttempter::Update() { | 117 void UpdateAttempter::Update() { |
94 if (status_ == UPDATE_STATUS_UPDATED_NEED_REBOOT) { | 118 if (status_ == UPDATE_STATUS_UPDATED_NEED_REBOOT) { |
95 LOG(INFO) << "Not updating b/c we already updated and we're waiting for " | 119 LOG(INFO) << "Not updating b/c we already updated and we're waiting for " |
96 << "reboot"; | 120 << "reboot"; |
97 return; | 121 return; |
98 } | 122 } |
99 if (status_ != UPDATE_STATUS_IDLE) { | 123 if (status_ != UPDATE_STATUS_IDLE) { |
100 // Update in progress. Do nothing | 124 // Update in progress. Do nothing |
101 return; | 125 return; |
102 } | 126 } |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
239 // or otherwise. | 263 // or otherwise. |
240 void UpdateAttempter::ActionCompleted(ActionProcessor* processor, | 264 void UpdateAttempter::ActionCompleted(ActionProcessor* processor, |
241 AbstractAction* action, | 265 AbstractAction* action, |
242 ActionExitCode code) { | 266 ActionExitCode code) { |
243 // Reset download progress regardless of whether or not the download action | 267 // Reset download progress regardless of whether or not the download action |
244 // succeeded. | 268 // succeeded. |
245 const string type = action->Type(); | 269 const string type = action->Type(); |
246 if (type == DownloadAction::StaticType()) | 270 if (type == DownloadAction::StaticType()) |
247 download_progress_ = 0.0; | 271 download_progress_ = 0.0; |
248 if (code != kActionCodeSuccess) { | 272 if (code != kActionCodeSuccess) { |
249 // On failure, schedule an error event to be sent to Omaha. For | 273 // On failure, schedule an error event to be sent to Omaha. |
250 // now assume that Omaha response action failure means that | 274 CreatePendingErrorEvent(action, code); |
251 // there's no update so don't send an event. Also, double check | |
252 // that the failure has not occurred while sending an error event | |
253 // -- in which case don't schedule another. This shouldn't really | |
254 // happen but just in case... | |
255 if (type != OmahaResponseHandlerAction::StaticType() && | |
256 status_ != UPDATE_STATUS_REPORTING_ERROR_EVENT) { | |
257 CreatePendingErrorEvent(code); | |
258 } | |
259 return; | 275 return; |
260 } | 276 } |
261 // Find out which action completed. | 277 // Find out which action completed. |
262 if (type == OmahaResponseHandlerAction::StaticType()) { | 278 if (type == OmahaResponseHandlerAction::StaticType()) { |
263 SetStatusAndNotify(UPDATE_STATUS_DOWNLOADING); | 279 SetStatusAndNotify(UPDATE_STATUS_DOWNLOADING); |
264 OmahaResponseHandlerAction* omaha_response_handler_action = | 280 OmahaResponseHandlerAction* omaha_response_handler_action = |
265 dynamic_cast<OmahaResponseHandlerAction*>(action); | 281 dynamic_cast<OmahaResponseHandlerAction*>(action); |
266 CHECK(omaha_response_handler_action); | 282 CHECK(omaha_response_handler_action); |
267 const InstallPlan& plan = omaha_response_handler_action->install_plan(); | 283 const InstallPlan& plan = omaha_response_handler_action->install_plan(); |
268 last_checked_time_ = time(NULL); | 284 last_checked_time_ = time(NULL); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
325 GetCPUClockTime(&last_notify_time_); | 341 GetCPUClockTime(&last_notify_time_); |
326 update_engine_service_emit_status_update( | 342 update_engine_service_emit_status_update( |
327 dbus_service_, | 343 dbus_service_, |
328 last_checked_time_, | 344 last_checked_time_, |
329 download_progress_, | 345 download_progress_, |
330 UpdateStatusToString(status_), | 346 UpdateStatusToString(status_), |
331 new_version_.c_str(), | 347 new_version_.c_str(), |
332 new_size_); | 348 new_size_); |
333 } | 349 } |
334 | 350 |
335 void UpdateAttempter::CreatePendingErrorEvent(ActionExitCode code) { | 351 void UpdateAttempter::CreatePendingErrorEvent(AbstractAction* action, |
| 352 ActionExitCode code) { |
336 if (error_event_.get()) { | 353 if (error_event_.get()) { |
337 // This shouldn't really happen. | 354 // This shouldn't really happen. |
338 LOG(WARNING) << "There's already an existing pending error event."; | 355 LOG(WARNING) << "There's already an existing pending error event."; |
339 return; | 356 return; |
340 } | 357 } |
| 358 |
| 359 // For now assume that Omaha response action failure means that |
| 360 // there's no update so don't send an event. Also, double check that |
| 361 // the failure has not occurred while sending an error event -- in |
| 362 // which case don't schedule another. This shouldn't really happen |
| 363 // but just in case... |
| 364 if (action->Type() == OmahaResponseHandlerAction::StaticType() || |
| 365 status_ == UPDATE_STATUS_REPORTING_ERROR_EVENT) { |
| 366 return; |
| 367 } |
| 368 |
| 369 code = GetErrorCodeForAction(action, code); |
341 error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete, | 370 error_event_.reset(new OmahaEvent(OmahaEvent::kTypeUpdateComplete, |
342 OmahaEvent::kResultError, | 371 OmahaEvent::kResultError, |
343 code)); | 372 code)); |
344 } | 373 } |
345 | 374 |
346 bool UpdateAttempter::ScheduleErrorEventAction() { | 375 bool UpdateAttempter::ScheduleErrorEventAction() { |
347 if (error_event_.get() == NULL) | 376 if (error_event_.get() == NULL) |
348 return false; | 377 return false; |
349 | 378 |
350 shared_ptr<OmahaRequestAction> error_event_action( | 379 shared_ptr<OmahaRequestAction> error_event_action( |
351 new OmahaRequestAction(omaha_request_params_, | 380 new OmahaRequestAction(omaha_request_params_, |
352 error_event_.release(), // Pass ownership. | 381 error_event_.release(), // Pass ownership. |
353 new LibcurlHttpFetcher)); | 382 new LibcurlHttpFetcher)); |
354 actions_.push_back(shared_ptr<AbstractAction>(error_event_action)); | 383 actions_.push_back(shared_ptr<AbstractAction>(error_event_action)); |
355 processor_.EnqueueAction(error_event_action.get()); | 384 processor_.EnqueueAction(error_event_action.get()); |
356 SetStatusAndNotify(UPDATE_STATUS_REPORTING_ERROR_EVENT); | 385 SetStatusAndNotify(UPDATE_STATUS_REPORTING_ERROR_EVENT); |
357 processor_.StartProcessing(); | 386 processor_.StartProcessing(); |
358 return true; | 387 return true; |
359 } | 388 } |
360 | 389 |
361 } // namespace chromeos_update_engine | 390 } // namespace chromeos_update_engine |
OLD | NEW |