OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium 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 "chrome/browser/sync/engine/all_status.h" | 5 #include "chrome/browser/sync/engine/all_status.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/port.h" | 10 #include "base/port.h" |
(...skipping 17 matching lines...) Expand all Loading... |
28 } | 28 } |
29 | 29 |
30 sync_api::SyncManager::Status AllStatus::CreateBlankStatus() const { | 30 sync_api::SyncManager::Status AllStatus::CreateBlankStatus() const { |
31 // Status is initialized with the previous status value. Variables | 31 // Status is initialized with the previous status value. Variables |
32 // whose values accumulate (e.g. lifetime counters like updates_received) | 32 // whose values accumulate (e.g. lifetime counters like updates_received) |
33 // are not to be cleared here. | 33 // are not to be cleared here. |
34 sync_api::SyncManager::Status status = status_; | 34 sync_api::SyncManager::Status status = status_; |
35 status.unsynced_count = 0; | 35 status.unsynced_count = 0; |
36 status.conflicting_count = 0; | 36 status.conflicting_count = 0; |
37 status.initial_sync_ended = false; | 37 status.initial_sync_ended = false; |
38 status.syncer_stuck = false; | |
39 status.max_consecutive_errors = 0; | 38 status.max_consecutive_errors = 0; |
40 status.server_broken = false; | |
41 status.updates_available = 0; | 39 status.updates_available = 0; |
42 return status; | 40 return status; |
43 } | 41 } |
44 | 42 |
45 sync_api::SyncManager::Status AllStatus::CalcSyncing( | 43 sync_api::SyncManager::Status AllStatus::CalcSyncing( |
46 const SyncEngineEvent &event) const { | 44 const SyncEngineEvent &event) const { |
47 sync_api::SyncManager::Status status = CreateBlankStatus(); | 45 sync_api::SyncManager::Status status = CreateBlankStatus(); |
48 const sessions::SyncSessionSnapshot* snapshot = event.snapshot; | 46 const sessions::SyncSessionSnapshot* snapshot = event.snapshot; |
49 status.unsynced_count += static_cast<int>(snapshot->unsynced_count); | 47 status.unsynced_count += static_cast<int>(snapshot->unsynced_count); |
50 status.conflicting_count += snapshot->errors.num_conflicting_commits; | 48 status.conflicting_count += snapshot->errors.num_conflicting_commits; |
51 // The syncer may not be done yet, which could cause conflicting updates. | 49 // The syncer may not be done yet, which could cause conflicting updates. |
52 // But this is only used for status, so it is better to have visibility. | 50 // But this is only used for status, so it is better to have visibility. |
53 status.conflicting_count += snapshot->num_conflicting_updates; | 51 status.conflicting_count += snapshot->num_conflicting_updates; |
54 | 52 |
55 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_BEGIN) { | 53 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_BEGIN) { |
56 status.syncing = true; | 54 status.syncing = true; |
57 } else if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { | 55 } else if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { |
58 status.syncing = false; | 56 status.syncing = false; |
59 } | 57 } |
60 | 58 |
61 status.initial_sync_ended |= snapshot->is_share_usable; | 59 status.initial_sync_ended |= snapshot->is_share_usable; |
62 status.syncer_stuck |= snapshot->syncer_status.syncer_stuck; | |
63 | 60 |
64 const sessions::ErrorCounters& errors(snapshot->errors); | 61 const sessions::ErrorCounters& errors(snapshot->errors); |
65 if (errors.consecutive_errors > status.max_consecutive_errors) | 62 if (errors.consecutive_errors > status.max_consecutive_errors) |
66 status.max_consecutive_errors = errors.consecutive_errors; | 63 status.max_consecutive_errors = errors.consecutive_errors; |
67 | 64 |
68 // 100 is an arbitrary limit. | |
69 if (errors.consecutive_transient_error_commits > 100) | |
70 status.server_broken = true; | |
71 | |
72 status.updates_available += snapshot->num_server_changes_remaining; | 65 status.updates_available += snapshot->num_server_changes_remaining; |
73 | |
74 status.sync_protocol_error = snapshot->errors.sync_protocol_error; | 66 status.sync_protocol_error = snapshot->errors.sync_protocol_error; |
75 | 67 |
76 // Accumulate update count only once per session to avoid double-counting. | 68 // Accumulate update count only once per session to avoid double-counting. |
77 // TODO(ncarter): Make this realtime by having the syncer_status | 69 // TODO(ncarter): Make this realtime by having the syncer_status |
78 // counter preserve its value across sessions. http://crbug.com/26339 | 70 // counter preserve its value across sessions. http://crbug.com/26339 |
79 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { | 71 if (event.what_happened == SyncEngineEvent::SYNC_CYCLE_ENDED) { |
80 status.updates_received += | 72 status.updates_received += |
81 snapshot->syncer_status.num_updates_downloaded_total; | 73 snapshot->syncer_status.num_updates_downloaded_total; |
82 status.tombstone_updates_received += | 74 status.tombstone_updates_received += |
83 snapshot->syncer_status.num_tombstone_updates_downloaded_total; | 75 snapshot->syncer_status.num_tombstone_updates_downloaded_total; |
(...skipping 12 matching lines...) Expand all Loading... |
96 } else { | 88 } else { |
97 ++status.useful_sync_cycles; | 89 ++status.useful_sync_cycles; |
98 } | 90 } |
99 } | 91 } |
100 return status; | 92 return status; |
101 } | 93 } |
102 | 94 |
103 void AllStatus::CalcStatusChanges() { | 95 void AllStatus::CalcStatusChanges() { |
104 const bool unsynced_changes = status_.unsynced_count > 0; | 96 const bool unsynced_changes = status_.unsynced_count > 0; |
105 const bool online = status_.authenticated && | 97 const bool online = status_.authenticated && |
106 status_.server_reachable && status_.server_up && !status_.server_broken; | 98 status_.server_reachable && status_.server_up; |
107 if (online) { | 99 if (online) { |
108 if (status_.syncer_stuck) | 100 if (status_.syncing) |
109 status_.summary = sync_api::SyncManager::Status::CONFLICT; | |
110 else if (status_.syncing) | |
111 status_.summary = sync_api::SyncManager::Status::SYNCING; | 101 status_.summary = sync_api::SyncManager::Status::SYNCING; |
112 else | 102 else |
113 status_.summary = sync_api::SyncManager::Status::READY; | 103 status_.summary = sync_api::SyncManager::Status::READY; |
114 } else if (!status_.initial_sync_ended) { | 104 } else if (!status_.initial_sync_ended) { |
115 status_.summary = sync_api::SyncManager::Status::OFFLINE_UNUSABLE; | 105 status_.summary = sync_api::SyncManager::Status::OFFLINE_UNUSABLE; |
116 } else if (unsynced_changes) { | 106 } else if (unsynced_changes) { |
117 status_.summary = sync_api::SyncManager::Status::OFFLINE_UNSYNCED; | 107 status_.summary = sync_api::SyncManager::Status::OFFLINE_UNSYNCED; |
118 } else { | 108 } else { |
119 status_.summary = sync_api::SyncManager::Status::OFFLINE; | 109 status_.summary = sync_api::SyncManager::Status::OFFLINE; |
120 } | 110 } |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
200 : allstatus_(allstatus) { | 190 : allstatus_(allstatus) { |
201 allstatus->mutex_.Acquire(); | 191 allstatus->mutex_.Acquire(); |
202 } | 192 } |
203 | 193 |
204 ScopedStatusLock::~ScopedStatusLock() { | 194 ScopedStatusLock::~ScopedStatusLock() { |
205 allstatus_->CalcStatusChanges(); | 195 allstatus_->CalcStatusChanges(); |
206 allstatus_->mutex_.Release(); | 196 allstatus_->mutex_.Release(); |
207 } | 197 } |
208 | 198 |
209 } // namespace browser_sync | 199 } // namespace browser_sync |
OLD | NEW |