Class AccountsUpdateNoteDbImpl

java.lang.Object
com.google.gerrit.server.account.AccountsUpdate
com.google.gerrit.server.account.storage.notedb.AccountsUpdateNoteDbImpl

public class AccountsUpdateNoteDbImpl extends AccountsUpdate
Creates and updates accounts which are stored in All-Users NoteDB repository.

Batch updates of multiple different accounts can be performed atomically, see AccountsUpdate.updateBatch(List). Batch creation is not supported.

For any account update the caller must provide a commit message, the account ID and an AccountsUpdate.ConfigureDeltaFromState. The account updater reads the current AccountState and prepares updates to the account by calling setters on the provided AccountDelta.Builder. If the current account state is of no interest the caller may also provide a Consumer for AccountDelta.Builder instead of the account updater.

The provided commit message is used for the update of the user branch. Using a precise and unique commit message allows to identify the code from which an update was made when looking at a commit in the user branch, and thus help debugging.

The account updates are written to NoteDb. In NoteDb accounts are represented as user branches in the All-Users repository. Optionally a user branch can contain a 'account.config' file that stores account properties, such as full name, display name, preferred email, status and the active flag. The timestamp of the first commit on a user branch denotes the registration date. The initial commit on the user branch may be empty (since having an 'account.config' is optional). See AccountConfig for details of the 'account.config' file format. In addition the user branch can contain a 'preferences.config' config file to store preferences (see StoredPreferences) and a 'watch.config' config file to store project watches (see ProjectWatches). External IDs are stored separately in the refs/meta/external-ids notes branch (see ExternalIdNotes).

On updating an account the account is evicted from the account cache and reindexed. The eviction from the account cache and the reindexing is done by the ReindexAfterRefUpdate class which receives the event about updating the user branch that is triggered by this class.

If external IDs are updated, the ExternalIdCache is automatically updated by ExternalIdNotes. In addition ExternalIdNotes takes care about evicting and reindexing corresponding accounts. This is needed because external ID updates don't touch the user branches. Hence in this case the accounts are not evicted and reindexed via ReindexAfterRefUpdate.

Reindexing and flushing accounts from the account cache can be disabled by

If there are concurrent account updates which updating the user branch in NoteDb may fail with LockFailureException. In this case the account update is automatically retried and the account updater is invoked once more with the updated account state. This means the whole read-modify-write sequence is atomic. Retrying is limited by a timeout. If the timeout is exceeded the account update can still fail with LockFailureException.