Skip to content

Commit 316be86

Browse files
authored
forcing reload on scripting error, using correct sha in some tests (#273)
* forcing reload on scripting error, using correct sha in some tests * revving version * fixing accidental reversion
1 parent b49806e commit 316be86

File tree

3 files changed

+69
-11
lines changed

3 files changed

+69
-11
lines changed

src/Redis.OM/Redis.OM.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@
66
<RootNamespace>Redis.OM</RootNamespace>
77
<Nullable>enable</Nullable>
88
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
9-
<PackageVersion>0.4.0</PackageVersion>
10-
<Version>0.4.0</Version>
11-
<PackageReleaseNotes>https://github.com/redis/redis-om-dotnet/releases/tag/v0.4.0</PackageReleaseNotes>
9+
<PackageVersion>0.4.1</PackageVersion>
10+
<Version>0.4.1</Version>
11+
<PackageReleaseNotes>https://github.com/redis/redis-om-dotnet/releases/tag/v0.4.1</PackageReleaseNotes>
1212
<Description>Object Mapping and More for Redis</Description>
1313
<Title>Redis OM</Title>
1414
<Authors>Steve Lorello</Authors>

src/Redis.OM/RedisCommands.cs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,19 @@ public static async Task<IDictionary<string, string>> HGetAllAsync(this IRedisCo
678678
};
679679
args.AddRange(keys);
680680
args.AddRange(argv);
681-
return await connection.ExecuteAsync("EVALSHA", args.ToArray());
681+
try
682+
{
683+
return await connection.ExecuteAsync("EVALSHA", args.ToArray());
684+
}
685+
catch (Exception)
686+
{
687+
args[0] = Scripts.ScriptCollection[scriptName];
688+
Scripts.ShaCollection.Clear(); // we don't know what the state of the scripts are in Redis anymore, clear the sha collection and start again
689+
690+
// if an EVALSHA fails it's probably because the sha hasn't been loaded (Redis has probably restarted or flushed)
691+
// We'll Run an EVAL this time, and force all scripts to be reloaded on subsequent attempts
692+
return await connection.ExecuteAsync("EVAL", args.ToArray());
693+
}
682694
}
683695

684696
/// <summary>
@@ -719,7 +731,19 @@ public static async Task<IDictionary<string, string>> HGetAllAsync(this IRedisCo
719731
};
720732
args.AddRange(keys);
721733
args.AddRange(argv);
722-
return connection.Execute("EVALSHA", args.ToArray());
734+
try
735+
{
736+
return connection.Execute("EVALSHA", args.ToArray());
737+
}
738+
catch (Exception)
739+
{
740+
args[0] = Scripts.ScriptCollection[scriptName];
741+
Scripts.ShaCollection.Clear(); // we don't know what the state of the scripts are in Redis anymore, clear the sha collection and start again
742+
743+
// if an EVALSHA fails it's probably because the sha hasn't been loaded (Redis has probably restarted or flushed)
744+
// We'll Run an EVAL this time, and force all scripts to be reloaded on subsequent attempts
745+
return connection.Execute("EVAL", args.ToArray());
746+
}
723747
}
724748

725749
/// <summary>

test/Redis.OM.Unit.Tests/RediSearchTests/SearchTests.cs

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -773,12 +773,46 @@ public async Task TestUpdateJson()
773773
_mock.Setup(x => x.Execute("FT.SEARCH", It.IsAny<string[]>()))
774774
.Returns(_mockReply);
775775
_mock.Setup(x => x.ExecuteAsync("EVALSHA", It.IsAny<string[]>())).ReturnsAsync("42");
776-
_mock.Setup(x => x.ExecuteAsync("SCRIPT", It.IsAny<string[]>())).ReturnsAsync("42");
776+
_mock.Setup(x => x.ExecuteAsync("SCRIPT", It.IsAny<string[]>())).ReturnsAsync("cbbf1c4fab5064f419e469cc51c563f8bf51e6fb");
777+
var collection = new RedisCollection<Person>(_mock.Object);
778+
var steve = collection.First(x => x.Name == "Steve");
779+
steve.Age = 33;
780+
await collection.UpdateAsync(steve);
781+
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "cbbf1c4fab5064f419e469cc51c563f8bf51e6fb", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
782+
Scripts.ShaCollection.Clear();
783+
}
784+
785+
[Fact]
786+
public async Task TestUpdateJsonUnloadedScriptAsync()
787+
{
788+
_mock.Setup(x => x.Execute("FT.SEARCH", It.IsAny<string[]>()))
789+
.Returns(_mockReply);
790+
_mock.Setup(x => x.ExecuteAsync("EVALSHA", It.IsAny<string[]>())).Throws(new RedisServerException("Failed on EVALSHA"));
791+
_mock.Setup(x => x.ExecuteAsync("EVAL", It.IsAny<string[]>())).ReturnsAsync("42");
792+
_mock.Setup(x => x.ExecuteAsync("SCRIPT", It.IsAny<string[]>())).ReturnsAsync("cbbf1c4fab5064f419e469cc51c563f8bf51e6fb");
777793
var collection = new RedisCollection<Person>(_mock.Object);
778794
var steve = collection.First(x => x.Name == "Steve");
779795
steve.Age = 33;
780796
await collection.UpdateAsync(steve);
781-
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "42", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
797+
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "cbbf1c4fab5064f419e469cc51c563f8bf51e6fb", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
798+
_mock.Verify(x => x.ExecuteAsync("EVAL",Scripts.JsonDiffResolution, "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
799+
Scripts.ShaCollection.Clear();
800+
}
801+
802+
[Fact]
803+
public void TestUpdateJsonUnloadedScript()
804+
{
805+
_mock.Setup(x => x.Execute("FT.SEARCH", It.IsAny<string[]>()))
806+
.Returns(_mockReply);
807+
_mock.Setup(x => x.Execute("EVALSHA", It.IsAny<string[]>())).Throws(new RedisServerException("Failed on EVALSHA"));
808+
_mock.Setup(x => x.Execute("EVAL", It.IsAny<string[]>())).Returns("42");
809+
_mock.Setup(x => x.Execute("SCRIPT", It.IsAny<string[]>())).Returns("cbbf1c4fab5064f419e469cc51c563f8bf51e6fb");
810+
var collection = new RedisCollection<Person>(_mock.Object);
811+
var steve = collection.First(x => x.Name == "Steve");
812+
steve.Age = 33;
813+
collection.Update(steve);
814+
_mock.Verify(x => x.Execute("EVALSHA", "cbbf1c4fab5064f419e469cc51c563f8bf51e6fb", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
815+
_mock.Verify(x => x.Execute("EVAL",Scripts.JsonDiffResolution, "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Age", "33"));
782816
Scripts.ShaCollection.Clear();
783817
}
784818

@@ -803,18 +837,18 @@ public async Task TestUpdateJsonNestedObject()
803837
_mock.Setup(x => x.Execute("FT.SEARCH", It.IsAny<string[]>()))
804838
.Returns(_mockReply);
805839
_mock.Setup(x => x.ExecuteAsync("EVALSHA", It.IsAny<string[]>())).ReturnsAsync("42");
806-
_mock.Setup(x => x.ExecuteAsync("SCRIPT", It.IsAny<string[]>())).ReturnsAsync("42");
840+
_mock.Setup(x => x.ExecuteAsync("SCRIPT", It.IsAny<string[]>())).ReturnsAsync("cbbf1c4fab5064f419e469cc51c563f8bf51e6fb");
807841
var collection = new RedisCollection<Person>(_mock.Object);
808842
var steve = collection.First(x => x.Name == "Steve");
809843
steve.Address = new Address { State = "Florida" };
810844
await collection.UpdateAsync(steve);
811845
var expected = $"{{{Environment.NewLine} \"State\": \"Florida\"{Environment.NewLine}}}";
812-
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "42", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Address", expected));
846+
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "cbbf1c4fab5064f419e469cc51c563f8bf51e6fb", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Address", expected));
813847

814848
steve.Address.City = "Satellite Beach";
815849
await collection.UpdateAsync(steve);
816850
expected = "\"Satellite Beach\"";
817-
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "42", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Address.City", expected));
851+
_mock.Verify(x => x.ExecuteAsync("EVALSHA", "cbbf1c4fab5064f419e469cc51c563f8bf51e6fb", "1", "Redis.OM.Unit.Tests.RediSearchTests.Person:01FVN836BNQGYMT80V7RCVY73N", "SET", "$.Address.City", expected));
818852

819853
Scripts.ShaCollection.Clear();
820854
}
@@ -2572,7 +2606,7 @@ public void SearchWithEmptyAny()
25722606
"LIMIT",
25732607
"0",
25742608
"0"));
2575-
2609+
25762610
Assert.True(any);
25772611
}
25782612
}

0 commit comments

Comments
 (0)