File: syncer.h

package info (click to toggle)
chromium 138.0.7204.183-1~deb12u1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-proposed-updates
  • size: 6,080,960 kB
  • sloc: cpp: 34,937,079; ansic: 7,176,967; javascript: 4,110,704; python: 1,419,954; asm: 946,768; xml: 739,971; pascal: 187,324; sh: 89,623; perl: 88,663; objc: 79,944; sql: 50,304; cs: 41,786; fortran: 24,137; makefile: 21,811; php: 13,980; tcl: 13,166; yacc: 8,925; ruby: 7,485; awk: 3,720; lisp: 3,096; lex: 1,327; ada: 727; jsp: 228; sed: 36
file content (143 lines) | stat: -rw-r--r-- 5,632 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SYNC_ENGINE_SYNCER_H_
#define COMPONENTS_SYNC_ENGINE_SYNCER_H_

#include <stdint.h>

#include "base/gtest_prod_util.h"
#include "base/memory/raw_ptr.h"
#include "components/sync/base/data_type.h"
#include "components/sync/engine/syncer_error.h"

namespace sync_pb {
enum SyncEnums_GetUpdatesOrigin : int;
}  // namespace sync_pb

namespace syncer {

class CancelationSignal;
class GetUpdatesDelegate;
class NudgeTracker;
class SyncCycle;

// This enum should be in sync with SyncerErrorValues in enums.xml. These
// values are persisted to logs. Entries should not be renumbered and numeric
// values should never be reused. Exposed for tests.
// LINT.IfChange(SyncerErrorValues)
enum class SyncerErrorValueForUma {
  // Deprecated: kUnset = 0,  // Default value.
  // Deprecated: CANNOT_DO_WORK = 1,

  kNetworkConnectionUnavailable = 2,  // Connectivity failure.
  // Deprecated: NETWORK_IO_ERROR = 3,
  kHttpError = 4,  // Non auth HTTP error.
  kHttpAuthError = 5,

  // Based on values returned by server.  Most are defined in sync.proto.
  // Deprecated: SERVER_RETURN_INVALID_CREDENTIAL = 6,
  kServerReturnUnknownError = 7,
  kServerReturnThrottled = 8,
  kServerReturnTransientError = 9,
  kServerReturnMigrationDone = 10,
  // Deprecated: kServerReturnClearPending = 11,
  kServerReturnNotMyBirthday = 12,
  kServerReturnConflict = 13,
  kProtocolViolationError = 14,
  kServerReturnDisabledByAdmin = 15,
  // Deprecated: SERVER_RETURN_USER_ROLLBACK = 16,
  // Deprecated: SERVER_RETURN_PARTIAL_FAILURE = 17,
  kServerReturnClientDataObsolete = 18,
  // Was mistakenly reported as kServerReturnClientDataObsolete until M133.
  kServerReturnEncryptionObsolete = 19,

  // Deprecated: DATATYPE_TRIGGERED_RETRY = 20,
  // Deprecated: SERVER_MORE_TO_DOWNLOAD = 21,

  kSyncerOk = 22,
  kServerReturnInvalidMessage = 23,

  kMaxValue = kServerReturnInvalidMessage,
};
// LINT.ThenChange(/tools/metrics/histograms/metadata/sync/enums.xml:SyncerErrorValues)

// A Syncer provides a control interface for driving the sync cycle.  These
// cycles consist of downloading updates, parsing the response (aka. process
// updates), applying updates while resolving conflicts, and committing local
// changes.  Some of these steps may be skipped if they're deemed to be
// unnecessary.
//
// A Syncer instance expects to run on a dedicated thread.  Calls to SyncShare()
// may take an unbounded amount of time because it may block on network I/O, on
// lock contention, or on tasks posted to other threads.
class Syncer {
 public:
  explicit Syncer(CancelationSignal* cancelation_signal);

  Syncer(const Syncer&) = delete;
  Syncer& operator=(const Syncer&) = delete;

  virtual ~Syncer();

  // Whether the syncer is in the middle of a sync cycle.
  bool IsSyncing() const;

  // Fetches and applies updates, resolves conflicts and commits local changes
  // for `request_types` as necessary until client and server states are in
  // sync.  The `nudge_tracker` contains state that describes why the client is
  // out of sync and what must be done to bring it back into sync.
  // Returns: false if an error occurred and retries should backoff, true
  // otherwise.
  virtual bool NormalSyncShare(DataTypeSet request_types,
                               NudgeTracker* nudge_tracker,
                               SyncCycle* cycle);

  // Performs an initial download for the `request_types`.  It is assumed that
  // the specified types have no local state, so none of the downloaded updates
  // will be applied to the model.  The `source` is sent up to the server for
  // debug purposes.  It describes the reason for performing this initial
  // download.
  // Returns: false if an error occurred and retries should backoff, true
  // otherwise.
  virtual bool ConfigureSyncShare(const DataTypeSet& request_types,
                                  sync_pb::SyncEnums_GetUpdatesOrigin origin,
                                  SyncCycle* cycle);

  // Requests to download updates for the `request_types`.  For a well-behaved
  // client with a working connection to the invalidations server, this should
  // be unnecessary.  It may be invoked periodically to try to keep the client
  // in sync despite bugs or transient failures.
  // Returns: false if an error occurred and retries should backoff, true
  // otherwise.
  virtual bool PollSyncShare(DataTypeSet request_types, SyncCycle* cycle);

 private:
  bool DownloadAndApplyUpdates(DataTypeSet* request_types,
                               SyncCycle* cycle,
                               const GetUpdatesDelegate& delegate);

  // This function will commit batches of unsynced items to the server until the
  // number of unsynced and ready to commit items reaches zero or an error is
  // encountered.  A request to exit early will be treated as an error and will
  // abort any blocking operations.
  SyncerError BuildAndPostCommits(const DataTypeSet& request_types,
                                  NudgeTracker* nudge_tracker,
                                  SyncCycle* cycle);

  // Whether an early exist was requested due to a cancelation signal.
  bool ExitRequested();

  bool HandleCycleEnd(SyncCycle* cycle,
                      sync_pb::SyncEnums_GetUpdatesOrigin origin);

  const raw_ptr<CancelationSignal> cancelation_signal_;

  // Whether the syncer is in the middle of a sync attempt.
  bool is_syncing_ = false;
};

}  // namespace syncer

#endif  // COMPONENTS_SYNC_ENGINE_SYNCER_H_