Skip to content

Commit

Permalink
RavenDB-22258 Compare exchange PUT doesn't update the LastModifiedInd…
Browse files Browse the repository at this point in the history
…ex at the database level

- Initial quick & dirty fix
  • Loading branch information
ayende committed Apr 16, 2024
1 parent 8ce4c5e commit 1c81c8f
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 1 deletion.
11 changes: 10 additions & 1 deletion src/Raven.Server/ServerWide/ClusterStateMachine.cs
Expand Up @@ -820,11 +820,20 @@ private void ExecutePutSubscriptionBatch<T>(ClusterOperationContext context, Bli
}
}

private static void SetIndexForBackup(ClusterOperationContext context, string databaseName, long index, string type)
private void SetIndexForBackup(ClusterOperationContext context, string databaseName, long index, string type)
{
if (index < 0)
return;

var llt = context.Transaction.InnerTransaction.LowLevelTransaction;
llt.OnDispose += tx =>
{
if (llt.Committed)
{
ExecuteAsyncTask(index, () => Changes.OnDatabaseChanges(databaseName, index, type, DatabasesLandlord.ClusterDatabaseChangeType.ValueChanged, null));
}
};

if (string.IsNullOrEmpty(databaseName))
throw new RachisApplyException($"Command '{type}' must contain a DatabaseName property. Index {index}");

Expand Down
94 changes: 94 additions & 0 deletions test/SlowTests/Issues/RavenDB-22258.cs
@@ -0,0 +1,94 @@
using FastTests;
using Raven.Client.Documents.Operations.CompareExchange;
using Raven.Client.Documents.Session;
using Tests.Infrastructure;
using Xunit;
using Xunit.Abstractions;

namespace SlowTests.Issues;

public class RavenDB_22258 : RavenTestBase
{
[RavenFact(RavenTestCategory.CompareExchange)]
public void WithCreateCompareExchangeValueCanInclude()
{
using (var store = GetDocumentStore())
{
using (var session = store.OpenSession(new SessionOptions { TransactionMode = TransactionMode.ClusterWide }))
{
var company = new Company { Id = "companies/1", ExternalId = "someID", Name = "Apple" };
session.Store(company);
var numberOfRequests = session.Advanced.NumberOfRequests; // 0

session.Advanced.ClusterTransaction.CreateCompareExchangeValue("someID", "some content");
Assert.Equal(numberOfRequests, session.Advanced.NumberOfRequests); // 0

var value1 = session.Advanced.ClusterTransaction.GetCompareExchangeValue<string>(company.ExternalId);
Assert.Equal(numberOfRequests, session.Advanced.NumberOfRequests); // 0

session.SaveChanges();
Assert.Equal(numberOfRequests + 1, session.Advanced.NumberOfRequests); // 1
}
using (var session = store.OpenSession(new SessionOptions { TransactionMode = TransactionMode.ClusterWide }))
{
var numberOfRequests = session.Advanced.NumberOfRequests; // 0
var loadedCompany = session.Load<Company>("companies/1",
includes => includes.IncludeCompareExchangeValue(x => x.ExternalId));

Assert.Equal(numberOfRequests + 1, session.Advanced.NumberOfRequests); // 1

var value = session.Advanced.ClusterTransaction.GetCompareExchangeValue<string>(loadedCompany.ExternalId);

// This passes OK
Assert.Equal(numberOfRequests + 1, session.Advanced.NumberOfRequests);
}
}
}

[RavenFact(RavenTestCategory.CompareExchange)]
public void WithPutCompareExchangeValueOperationCanInclude()
{
using (var store = GetDocumentStore())
{
using (var session = store.OpenSession())
{
var company = new Company { Id = "companies/1", ExternalId = "someID", Name = "Apple" };
session.Store(company);
session.SaveChanges();
}

var test = store.Operations.Send(
new PutCompareExchangeValueOperation<string>("someID", "some content", 0));
Assert.Equal(true, test.Successful);


using (var session = store.OpenSession(new SessionOptions { TransactionMode = TransactionMode.ClusterWide }))
{
var numberOfRequests = session.Advanced.NumberOfRequests; // 0

var loadedCompany = session.Load<Company>("companies/1",
includes => includes.IncludeCompareExchangeValue(x => x.ExternalId));

Assert.Equal(numberOfRequests + 1, session.Advanced.NumberOfRequests); // 1

var value = session.Advanced.ClusterTransaction.GetCompareExchangeValue<string>(loadedCompany.ExternalId);
WaitForUserToContinueTheTest(store);

// This fails
// Should be 1, but it is 2
Assert.Equal(numberOfRequests + 1, session.Advanced.NumberOfRequests);
}
}
}

public class Company
{
public string ExternalId;
public string Id;
public string Name;
}

public RavenDB_22258(ITestOutputHelper output) : base(output)
{
}
}

0 comments on commit 1c81c8f

Please sign in to comment.