public void HandleConflictForDocument( DocumentsOperationContext documentsContext, string id, string collection, long lastModifiedTicks, BlittableJsonReaderObject doc, string changeVector, string conflictedChangeVector, DocumentFlags flags) { if (id.StartsWith("Raven/Hilo/", StringComparison.OrdinalIgnoreCase)) { HandleHiloConflict(documentsContext, id, doc, changeVector); return; } if (TryResolveIdenticalDocument( documentsContext, id, doc, lastModifiedTicks, changeVector)) { return; } var conflictedDoc = new DocumentConflict { Doc = doc, Collection = documentsContext.GetLazyStringForFieldWithCaching( collection ?? CollectionName.GetCollectionName(doc) ), LastModified = new DateTime(lastModifiedTicks), LowerId = documentsContext.GetLazyString(id), Id = documentsContext.GetLazyString(id), ChangeVector = changeVector }; if (TryResolveConflictByScript( documentsContext, conflictedDoc)) { return; } if (_conflictResolver.ConflictSolver?.ResolveToLatest == true) { if (conflictedChangeVector == null) //precaution { throw new InvalidOperationException( "Detected conflict on replication, but could not figure out conflicted vector. This is not supposed to happen and is likely a bug."); } var conflicts = new List <DocumentConflict> { conflictedDoc.Clone() }; conflicts.AddRange(documentsContext.DocumentDatabase.DocumentsStorage.ConflictsStorage.GetConflictsFor( documentsContext, id)); var localDocumentTuple = documentsContext.DocumentDatabase.DocumentsStorage.GetDocumentOrTombstone(documentsContext, id, false); var local = DocumentConflict.From(documentsContext, localDocumentTuple.Document) ?? DocumentConflict.From(localDocumentTuple.Tombstone); if (local != null) { conflicts.Add(local); } var resolved = _conflictResolver.ResolveToLatest(documentsContext, conflicts); _conflictResolver.PutResolvedDocument(documentsContext, resolved, conflictedDoc); return; } _database.DocumentsStorage.ConflictsStorage.AddConflict(documentsContext, id, lastModifiedTicks, doc, changeVector, collection, flags); }
public unsafe void HandleConflictForDocument( DocumentsOperationContext documentsContext, string id, string collection, long lastModifiedTicks, BlittableJsonReaderObject doc, string changeVector, DocumentFlags flags) { if (id.StartsWith(HiLoHandler.RavenHiloIdPrefix, StringComparison.OrdinalIgnoreCase)) { HandleHiloConflict(documentsContext, id, doc, changeVector); return; } if (TryResolveIdenticalDocument( documentsContext, id, doc, lastModifiedTicks, changeVector)) { return; } var lazyId = documentsContext.GetLazyString(id); using (DocumentIdWorker.GetLower(documentsContext.Allocator, lazyId, out var loweredKey)) { var conflictedDoc = new DocumentConflict { Doc = doc, Collection = documentsContext.GetLazyStringForFieldWithCaching( collection ?? CollectionName.GetCollectionName(doc) ), LastModified = new DateTime(lastModifiedTicks), LowerId = documentsContext.AllocateStringValue(null, loweredKey.Content.Ptr, loweredKey.Content.Length), Id = lazyId, ChangeVector = changeVector, Flags = flags }; if (TryResolveConflictByScript( documentsContext, conflictedDoc)) { return; } if (_conflictResolver.ConflictSolver?.ResolveToLatest ?? true) { var conflicts = new List <DocumentConflict> { conflictedDoc.Clone() }; conflicts.AddRange(_database.DocumentsStorage.ConflictsStorage.GetConflictsFor(documentsContext, id)); var localDocumentTuple = _database.DocumentsStorage.GetDocumentOrTombstone(documentsContext, id, false); var local = DocumentConflict.From(documentsContext, localDocumentTuple.Document) ?? DocumentConflict.From(localDocumentTuple.Tombstone); if (local != null) { conflicts.Add(local); } var resolved = _conflictResolver.ResolveToLatest(conflicts); _conflictResolver.PutResolvedDocument(documentsContext, resolved, resolvedToLatest: true, conflictedDoc); return; } _database.DocumentsStorage.ConflictsStorage.AddConflict(documentsContext, id, lastModifiedTicks, doc, changeVector, collection, flags); } }