MCPcopy Create free account
hub / github.com/couchbase/sync_gateway / resolveConflict

Method resolveConflict

db/crud.go:1880–1916  ·  view source on GitHub ↗

resolveConflict runs the conflictResolverFunction with bodies and revision trees from localDoc and remoteDoc. RevTrees may be changed based on the outcome of conflict resolution - see resolveDocLocalWins, resolveDocRemoteWins and resolveDocMerge for specifics on what is changed under each scenario.

(ctx context.Context, localDoc *Document, remoteDoc *Document, docHistory []string, resolver *ConflictResolver)

Source from the content-addressed store, hash-verified

1878// RevTrees may be changed based on the outcome of conflict resolution - see resolveDocLocalWins, resolveDocRemoteWins and
1879// resolveDocMerge for specifics on what is changed under each scenario.
1880func (db *DatabaseCollectionWithUser) resolveConflict(ctx context.Context, localDoc *Document, remoteDoc *Document, docHistory []string, resolver *ConflictResolver) (resolvedRevID string, updatedHistory []string, resolveError error) {
1881
1882 if resolver == nil {
1883 return "", nil, errors.New("Conflict resolution function is nil for resolveConflict")
1884 }
1885
1886 localDocBody, remoteDocBody, err := buildResolverBody(localDoc, remoteDoc)
1887 if err != nil {
1888 base.InfofCtx(ctx, base.KeyReplicate, "Error when building local and remote documents for conflict resolution for doc %s: %v", base.UD(localDoc.ID), err)
1889 return "", nil, err
1890 }
1891
1892 conflict := Conflict{
1893 LocalDocument: localDocBody,
1894 RemoteDocument: remoteDocBody,
1895 }
1896
1897 resolvedBody, resolutionType, resolveFuncError := resolver.Resolve(ctx, conflict)
1898 if resolveFuncError != nil {
1899 base.InfofCtx(ctx, base.KeyReplicate, "Error when running conflict resolution for doc %s: %v", base.UD(localDoc.ID), resolveFuncError)
1900 return "", nil, resolveFuncError
1901 }
1902
1903 switch resolutionType {
1904 case ConflictResolutionLocal:
1905 resolvedRevID, updatedHistory, resolveError = db.resolveDocLocalWins(ctx, localDoc, remoteDoc, conflict, docHistory)
1906 return resolvedRevID, updatedHistory, resolveError
1907 case ConflictResolutionRemote:
1908 resolvedRevID, resolveError = db.resolveDocRemoteWins(ctx, localDoc, conflict)
1909 return resolvedRevID, nil, resolveError
1910 case ConflictResolutionMerge:
1911 resolvedRevID, updatedHistory, resolveError = db.resolveDocMerge(ctx, localDoc, remoteDoc, docHistory, resolvedBody)
1912 return resolvedRevID, updatedHistory, resolveError
1913 default:
1914 return "", nil, fmt.Errorf("Unexpected conflict resolution type: %v", resolutionType)
1915 }
1916}
1917
1918// resolveDocRemoteWins makes the following changes to the document:
1919// - Tombstones the local revision

Calls 8

resolveDocLocalWinsMethod · 0.95
resolveDocRemoteWinsMethod · 0.95
resolveDocMergeMethod · 0.95
InfofCtxFunction · 0.92
UDFunction · 0.92
buildResolverBodyFunction · 0.85
ResolveMethod · 0.80
ErrorfMethod · 0.80

Tested by

no test coverage detected