Skip to content

Commit

Permalink
add new LatestVersion changefeed mode that has same behavior as Incre…
Browse files Browse the repository at this point in the history
…mental; renamed FullFidelity to AllVersionsAndDeletes (#3596)
  • Loading branch information
philipthomas-MSFT committed Jan 4, 2023
1 parent 5c05fbb commit 73c9e08
Show file tree
Hide file tree
Showing 8 changed files with 42 additions and 18 deletions.
16 changes: 15 additions & 1 deletion Microsoft.Azure.Cosmos/src/ChangeFeed/ChangeFeedMode.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,20 @@ internal ChangeFeedMode()
/// <returns>A <see cref="ChangeFeedMode"/> to receive incremental item changes.</returns>
public static ChangeFeedMode Incremental => ChangeFeedModeIncremental.Instance;

/// <summary>
/// Creates a <see cref="ChangeFeedMode"/> to receive latest version item changes.
/// </summary>
/// <remarks>
/// Latest version mode includes item creations and updates, not deletions.
/// </remarks>
/// <returns>A <see cref="ChangeFeedMode"/> to receive latest version item changes.</returns>
#if PREVIEW
public
#else
internal
#endif
static ChangeFeedMode LatestVersion => ChangeFeedModeIncremental.Instance;

/// <summary>
/// Creates a <see cref="ChangeFeedMode"/> to receive notifications for creations, deletes, as well as all intermediary snapshots for updates.
/// </summary>
Expand All @@ -49,6 +63,6 @@ internal ChangeFeedMode()
#else
internal
#endif
static ChangeFeedMode FullFidelity => ChangeFeedModeFullFidelity.Instance;
static ChangeFeedMode AllVersionsAndDeletes => ChangeFeedModeFullFidelity.Instance;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Microsoft.Azure.Cosmos
using Newtonsoft.Json;

/// <summary>
/// The typed response that contains the current, previous, and metadata change feed resource when <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.FullFidelity"/>.
/// The typed response that contains the current, previous, and metadata change feed resource when <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.AllVersionsAndDeletes"/>.
/// </summary>
/// <example>
/// <code>
Expand All @@ -19,7 +19,7 @@ namespace Microsoft.Azure.Cosmos
/// public string status { get; set; }
/// }
///
/// ChangeFeedMode changeFeedMode = ChangeFeedMode.FullFidelity;
/// ChangeFeedMode changeFeedMode = ChangeFeedMode.AllVersionsAndDeletes;
/// PartitionKey partitionKey = new PartitionKey(@"learning");
/// ChangeFeedStartFrom changeFeedStartFrom = ChangeFeedStartFrom.Now(FeedRange.FromPartitionKey(partitionKey));
///
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ namespace Microsoft.Azure.Cosmos
using Newtonsoft.Json.Converters;

/// <summary>
/// The metadata of a change feed resource with <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.FullFidelity"/>.
/// The metadata of a change feed resource with <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.AllVersionsAndDeletes"/>.
/// </summary>
#if PREVIEW
public
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ namespace Microsoft.Azure.Cosmos
using System.Runtime.Serialization;

/// <summary>
/// The operation type of a change feed resource with <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.FullFidelity"/>. Upsert operations will yield <see cref="Create"/> or <see cref="Replace"/>.
/// The operation type of a change feed resource with <see cref="ChangeFeedMode"/> is initialized to <see cref="ChangeFeedMode.AllVersionsAndDeletes"/>. Upsert operations will yield <see cref="Create"/> or <see cref="Replace"/>.
/// </summary>
#if PREVIEW
public
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ namespace Microsoft.Azure.Cosmos
/// <example>
/// The example below creates a new container with a custom change feed policy for full fidelity change feed with a retention window of 5 minutes - so intermediary snapshots of changes as well as deleted documents would be
/// available for processing for 5 minutes before they vanish.
/// Processing the change feed with <see cref="ChangeFeedMode.FullFidelity"/> will only be able within this retention window - if you attempt to process a change feed after more
/// Processing the change feed with <see cref="ChangeFeedMode.AllVersionsAndDeletes"/> will only be able within this retention window - if you attempt to process a change feed after more
/// than the retention window (5 minutes in this sample) an error (Status Code 400) will be returned.
/// It would still be possible to process changes using <see cref="ChangeFeedMode.Incremental"/> mode even when configuring a full fidelity change
/// feed policy with retention window on the container and when using Incremental mode it doesn't matter whether your are out of the retention window or not.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -788,7 +788,7 @@ public async Task ChangeFeedIteratorCore_WithFullFidelityReadFromBeginning()
// FF does not work with StartFromBeginning currently, capture error
FeedIterator<ToDoActivityWithMetadata> fullFidelityIterator = container.GetChangeFeedIterator<ToDoActivityWithMetadata>(
ChangeFeedStartFrom.Beginning(),
ChangeFeedMode.FullFidelity);
ChangeFeedMode.AllVersionsAndDeletes);

CosmosException cosmosException = await Assert.ThrowsExceptionAsync<CosmosException>(() => fullFidelityIterator.ReadNextAsync());
Assert.AreEqual(HttpStatusCode.BadRequest, cosmosException.StatusCode, "Full Fidelity Change Feed does not work with StartFromBeginning currently.");
Expand Down Expand Up @@ -829,7 +829,7 @@ private async Task ValidateChangeFeedIteratorCore_WithQuery(
// FF does not work with StartFromBeginning currently, so we capture an initial continuation.
FeedIterator<ChangeFeedItemChange<Document>> fullFidelityIterator = container.GetChangeFeedIteratorWithQuery<ChangeFeedItemChange<Document>>(
ChangeFeedStartFrom.Now(),
ChangeFeedMode.FullFidelity,
ChangeFeedMode.AllVersionsAndDeletes,
querySpec,
null);

Expand Down Expand Up @@ -862,7 +862,7 @@ private async Task ValidateChangeFeedIteratorCore_WithQuery(
// Resume Change Feed and verify we pickup the events where documents matches the query
fullFidelityIterator = container.GetChangeFeedIteratorWithQuery<ChangeFeedItemChange<Document>>(
ChangeFeedStartFrom.ContinuationToken(initialContinuation),
ChangeFeedMode.FullFidelity,
ChangeFeedMode.AllVersionsAndDeletes,
querySpec,
null);
int detectedEvents = 0;
Expand Down Expand Up @@ -891,7 +891,7 @@ private async Task ValidateChangeFeedIteratorCore_WithQuery(

fullFidelityIterator = container.GetChangeFeedIteratorWithQuery<ChangeFeedItemChange<Document>>(
ChangeFeedStartFrom.ContinuationToken(initialContinuation),
ChangeFeedMode.FullFidelity,
ChangeFeedMode.AllVersionsAndDeletes,
querySpec,
null);
detectedEvents = 0;
Expand Down Expand Up @@ -927,7 +927,7 @@ public async Task ChangeFeedIteratorCore_FeedRange_FromPartitionKey_VerifyingWir
string otherId = Guid.NewGuid().ToString();

PartitionKey partitionKey = new PartitionKey(id);
ChangeFeedMode changeFeedMode = ChangeFeedMode.FullFidelity;
ChangeFeedMode changeFeedMode = ChangeFeedMode.AllVersionsAndDeletes;
ChangeFeedStartFrom changeFeedStartFrom = ChangeFeedStartFrom.Now(FeedRange.FromPartitionKey(partitionKey));

using (FeedIterator<ChangeFeedItemChange<Item>> feedIterator = container.GetChangeFeedIterator<ChangeFeedItemChange<Item>>(
Expand Down Expand Up @@ -1017,7 +1017,7 @@ public async Task ChangeFeedIteratorCore_FeedRange_VerifyingWireFormatTests()

using (FeedIterator<ChangeFeedItemChange<Item>> feedIterator = container.GetChangeFeedIterator<ChangeFeedItemChange<Item>>(
changeFeedStartFrom: ChangeFeedStartFrom.Now(),
changeFeedMode: ChangeFeedMode.FullFidelity))
changeFeedMode: ChangeFeedMode.AllVersionsAndDeletes))
{
string continuation = null;
while (feedIterator.HasMoreResults)
Expand Down Expand Up @@ -1124,7 +1124,7 @@ public async Task ChangeFeedIteratorCore_FeedRange_FromPartitionKey_Dynamic_Veri
string otherId = Guid.NewGuid().ToString();
using (FeedIterator<dynamic> feedIterator = container.GetChangeFeedIterator<dynamic>(
changeFeedStartFrom: ChangeFeedStartFrom.Now(FeedRange.FromPartitionKey(new PartitionKey(id))),
changeFeedMode: ChangeFeedMode.FullFidelity))
changeFeedMode: ChangeFeedMode.AllVersionsAndDeletes))
{
string continuation = null;
while (feedIterator.HasMoreResults)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ public async Task MonadicChangeFeedAsync_ChangeFeedMode_FullFidelity()

await networkAttachedDocumentContainer.MonadicChangeFeedAsync(
feedRangeState: new FeedRangeState<ChangeFeedState>(new FeedRangePartitionKeyRange("0"), ChangeFeedState.Beginning()),
changeFeedPaginationOptions: new ChangeFeedPaginationOptions(ChangeFeedMode.FullFidelity, pageSizeHint: 10),
changeFeedPaginationOptions: new ChangeFeedPaginationOptions(ChangeFeedMode.AllVersionsAndDeletes, pageSizeHint: 10),
trace: NoOpTrace.Singleton,
cancellationToken: default);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,15 +160,25 @@
"Microsoft.Azure.Cosmos.ChangeFeedMode;System.Object;IsAbstract:True;IsSealed:False;IsInterface:False;IsEnum:False;IsClass:True;IsValueType:False;IsNested:False;IsGenericType:False;IsSerializable:False": {
"Subclasses": {},
"Members": {
"Microsoft.Azure.Cosmos.ChangeFeedMode FullFidelity": {
"Microsoft.Azure.Cosmos.ChangeFeedMode AllVersionsAndDeletes": {
"Type": "Property",
"Attributes": [],
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode FullFidelity;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_FullFidelity();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode AllVersionsAndDeletes;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_AllVersionsAndDeletes();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Microsoft.Azure.Cosmos.ChangeFeedMode get_FullFidelity()": {
"Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion": {
"Type": "Property",
"Attributes": [],
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode LatestVersion;CanRead:True;CanWrite:False;Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Microsoft.Azure.Cosmos.ChangeFeedMode get_AllVersionsAndDeletes()": {
"Type": "Method",
"Attributes": [],
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_AllVersionsAndDeletes();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion()": {
"Type": "Method",
"Attributes": [],
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_FullFidelity();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
"MethodInfo": "Microsoft.Azure.Cosmos.ChangeFeedMode get_LatestVersion();IsAbstract:False;IsStatic:True;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
}
},
"NestedTypes": {}
Expand Down

0 comments on commit 73c9e08

Please sign in to comment.