diff --git a/src/contrib/persistence/Akka.Persistence.Sql.Common/Snapshot/QueryExecutor.cs b/src/contrib/persistence/Akka.Persistence.Sql.Common/Snapshot/QueryExecutor.cs index 95ec17ab150..06469506e13 100644 --- a/src/contrib/persistence/Akka.Persistence.Sql.Common/Snapshot/QueryExecutor.cs +++ b/src/contrib/persistence/Akka.Persistence.Sql.Common/Snapshot/QueryExecutor.cs @@ -651,7 +651,7 @@ protected virtual SelectedSnapshot ReadSnapshot(DbDataReader reader) { var persistenceId = reader.GetString(0); var sequenceNr = reader.GetInt64(1); - var timestamp = reader.GetDateTime(2); + var timestamp = DateTime.SpecifyKind(reader.GetDateTime(2), DateTimeKind.Utc); var metadata = new SnapshotMetadata(persistenceId, sequenceNr, timestamp); var snapshot = GetSnapshot(reader); diff --git a/src/contrib/persistence/Akka.Persistence.Sqlite/Snapshot/SqliteSnapshotStore.cs b/src/contrib/persistence/Akka.Persistence.Sqlite/Snapshot/SqliteSnapshotStore.cs index 2e2f0066437..d5ddcc51258 100644 --- a/src/contrib/persistence/Akka.Persistence.Sqlite/Snapshot/SqliteSnapshotStore.cs +++ b/src/contrib/persistence/Akka.Persistence.Sqlite/Snapshot/SqliteSnapshotStore.cs @@ -85,7 +85,7 @@ protected override SelectedSnapshot ReadSnapshot(DbDataReader reader) { var persistenceId = reader.GetString(0); var sequenceNr = reader.GetInt64(1); - var timestamp = new DateTime(reader.GetInt64(2)); + var timestamp = DateTime.SpecifyKind(new DateTime(reader.GetInt64(2)), DateTimeKind.Utc); var metadata = new SnapshotMetadata(persistenceId, sequenceNr, timestamp); var snapshot = GetSnapshot(reader); diff --git a/src/core/Akka.Persistence.TCK.Tests/LocalSnapshotStoreSpec.cs b/src/core/Akka.Persistence.TCK.Tests/LocalSnapshotStoreSpec.cs index abb96739751..dc72fde1ede 100644 --- a/src/core/Akka.Persistence.TCK.Tests/LocalSnapshotStoreSpec.cs +++ b/src/core/Akka.Persistence.TCK.Tests/LocalSnapshotStoreSpec.cs @@ -42,7 +42,7 @@ protected override void AfterAll() public void LocalSnapshotStore_can_snapshot_actors_with_PersistenceId_containing_invalid_path_characters() { var pid = @"p\/:*?-1"; - SnapshotStore.Tell(new SaveSnapshot(new SnapshotMetadata(pid, 1, Sys.Scheduler.Now.DateTime), "sample data"), TestActor); + SnapshotStore.Tell(new SaveSnapshot(new SnapshotMetadata(pid, 1, Sys.Scheduler.Now.UtcDateTime), "sample data"), TestActor); ExpectMsg(); SnapshotStore.Tell(new LoadSnapshot(pid, SnapshotSelectionCriteria.Latest, long.MaxValue), TestActor); diff --git a/src/core/Akka.Persistence.TCK/Query/PersistenceIdsSpec.cs b/src/core/Akka.Persistence.TCK/Query/PersistenceIdsSpec.cs index 43c69a42dff..e05696b664d 100644 --- a/src/core/Akka.Persistence.TCK/Query/PersistenceIdsSpec.cs +++ b/src/core/Akka.Persistence.TCK/Query/PersistenceIdsSpec.cs @@ -247,7 +247,7 @@ protected IActorRef WriteSnapshot(string persistenceId, int n) ExpectMsg($"{persistenceId}-{i}-done"); } - var metadata = new SnapshotMetadata(persistenceId, n + 10, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(persistenceId, n + 10, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, $"s-{n}"), _senderProbe.Ref); _senderProbe.ExpectMsg(); diff --git a/src/core/Akka.Persistence.TCK/Serialization/SnapshotStoreSerializationSpec.cs b/src/core/Akka.Persistence.TCK/Serialization/SnapshotStoreSerializationSpec.cs index 4d8c8fad5fa..691dafc5bd9 100644 --- a/src/core/Akka.Persistence.TCK/Serialization/SnapshotStoreSerializationSpec.cs +++ b/src/core/Akka.Persistence.TCK/Serialization/SnapshotStoreSerializationSpec.cs @@ -69,7 +69,7 @@ public virtual void SnapshotStore_should_serialize_Payload() var snapshot = new Test.MySnapshot("a"); - var metadata = new SnapshotMetadata(Pid, 1, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 1, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, snapshot), probe.Ref); probe.ExpectMsg(); @@ -85,7 +85,7 @@ public virtual void SnapshotStore_should_serialize_Payload_with_string_manifest( var snapshot = new Test.MySnapshot2("a"); - var metadata = new SnapshotMetadata(Pid, 1, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 1, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, snapshot), probe.Ref); probe.ExpectMsg(); @@ -107,7 +107,7 @@ public virtual void SnapshotStore_should_serialize_AtLeastOnceDeliverySnapshot() }; var atLeastOnceDeliverySnapshot = new AtLeastOnceDeliverySnapshot(17, unconfirmed); - var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, atLeastOnceDeliverySnapshot), probe.Ref); probe.ExpectMsg(); @@ -123,7 +123,7 @@ public virtual void SnapshotStore_should_serialize_AtLeastOnceDeliverySnapshot_w var unconfirmed = Array.Empty(); var atLeastOnceDeliverySnapshot = new AtLeastOnceDeliverySnapshot(13, unconfirmed); - var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, atLeastOnceDeliverySnapshot), probe.Ref); probe.ExpectMsg(); @@ -138,7 +138,7 @@ public virtual void SnapshotStore_should_serialize_PersistentFSMSnapshot() var persistentFSMSnapshot = new PersistentFSM.PersistentFSMSnapshot("mystate", "mydata", TimeSpan.FromDays(4)); - var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 2, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, persistentFSMSnapshot), probe.Ref); probe.ExpectMsg(); diff --git a/src/core/Akka.Persistence.TCK/Snapshot/SnapshotStoreSpec.cs b/src/core/Akka.Persistence.TCK/Snapshot/SnapshotStoreSpec.cs index 68879cf8643..f090aa0eadc 100644 --- a/src/core/Akka.Persistence.TCK/Snapshot/SnapshotStoreSpec.cs +++ b/src/core/Akka.Persistence.TCK/Snapshot/SnapshotStoreSpec.cs @@ -102,7 +102,7 @@ private IEnumerable WriteSnapshots() { for (int i = 1; i <= 5; i++) { - var metadata = new SnapshotMetadata(Pid, i + 10, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, i + 10, Sys.Scheduler.Now.UtcDateTime); SnapshotStore.Tell(new SaveSnapshot(metadata, $"s-{i}"), _senderProbe.Ref); yield return _senderProbe.ExpectMsg().Metadata; } @@ -209,7 +209,7 @@ public virtual void SnapshotStore_should_delete_a_single_snapshot_identified_by_ { var md = Metadata[2]; // In previous incarnation, timestamp argument defaults to DateTime.MinValue - md = new SnapshotMetadata(md.PersistenceId, md.SequenceNr, DateTime.MinValue); + md = new SnapshotMetadata(md.PersistenceId, md.SequenceNr, DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc)); var command = new DeleteSnapshot(md); var sub = CreateTestProbe(); @@ -312,7 +312,7 @@ public virtual void SnapshotStore_should_save_and_overwrite_snapshot_with_same_s [Fact] public virtual void SnapshotStore_should_save_bigger_size_snapshot() { - var metadata = new SnapshotMetadata(Pid, 100, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 100, Sys.Scheduler.Now.UtcDateTime); var bigSnapshot = new byte[SnapshotByteSizeLimit]; new Random().NextBytes(bigSnapshot); SnapshotStore.Tell(new SaveSnapshot(metadata, bigSnapshot), _senderProbe.Ref); @@ -326,7 +326,7 @@ public virtual void ShouldSerializeSnapshots() if (!SupportsSerialization) return; var probe = CreateTestProbe(); - var metadata = new SnapshotMetadata(Pid, 100L, Sys.Scheduler.Now.DateTime); + var metadata = new SnapshotMetadata(Pid, 100L, Sys.Scheduler.Now.UtcDateTime); var snap = new TestPayload(probe.Ref); SnapshotStore.Tell(new SaveSnapshot(metadata, snap), _senderProbe.Ref); diff --git a/src/core/Akka.Persistence.TestKit.Tests/TestSnapshotStoreSpec.cs b/src/core/Akka.Persistence.TestKit.Tests/TestSnapshotStoreSpec.cs index 943b8e61acc..3ec1a1afcc1 100644 --- a/src/core/Akka.Persistence.TestKit.Tests/TestSnapshotStoreSpec.cs +++ b/src/core/Akka.Persistence.TestKit.Tests/TestSnapshotStoreSpec.cs @@ -5,6 +5,8 @@ // //----------------------------------------------------------------------- +using Xunit.Abstractions; + namespace Akka.Persistence.TestKit.Tests { using System; @@ -15,7 +17,7 @@ namespace Akka.Persistence.TestKit.Tests public sealed class TestSnapshotStoreSpec : PersistenceTestKit { - public TestSnapshotStoreSpec() + public TestSnapshotStoreSpec(ITestOutputHelper output) : base(nameof(TestSnapshotStoreSpec), output) { _probe = CreateTestProbe(); } diff --git a/src/core/Akka.Persistence/Eventsourced.cs b/src/core/Akka.Persistence/Eventsourced.cs index 4d34a40745e..94aa6cfad18 100644 --- a/src/core/Akka.Persistence/Eventsourced.cs +++ b/src/core/Akka.Persistence/Eventsourced.cs @@ -218,7 +218,7 @@ public void LoadSnapshot(string persistenceId, SnapshotSelectionCriteria criteri /// TBD public void SaveSnapshot(object snapshot) { - SnapshotStore.Tell(new SaveSnapshot(new SnapshotMetadata(SnapshotterId, SnapshotSequenceNr, Context.System.Scheduler.Now.Date), snapshot)); + SnapshotStore.Tell(new SaveSnapshot(new SnapshotMetadata(SnapshotterId, SnapshotSequenceNr, Context.System.Scheduler.Now.UtcDateTime), snapshot)); } /// @@ -230,7 +230,7 @@ public void SaveSnapshot(object snapshot) /// TBD public void DeleteSnapshot(long sequenceNr) { - SnapshotStore.Tell(new DeleteSnapshot(new SnapshotMetadata(SnapshotterId, sequenceNr, DateTime.MinValue))); + SnapshotStore.Tell(new DeleteSnapshot(new SnapshotMetadata(SnapshotterId, sequenceNr, DateTime.SpecifyKind(DateTime.MinValue, DateTimeKind.Utc)))); } /// diff --git a/src/core/Akka.Persistence/Snapshot/LocalSnapshotStore.cs b/src/core/Akka.Persistence/Snapshot/LocalSnapshotStore.cs index a051f583170..86f0cdc4761 100644 --- a/src/core/Akka.Persistence/Snapshot/LocalSnapshotStore.cs +++ b/src/core/Akka.Persistence/Snapshot/LocalSnapshotStore.cs @@ -292,7 +292,7 @@ private SnapshotMetadata ExtractSnapshotMetadata(FileInfo fileInfo) if (long.TryParse(seqNrString, out var sequenceNr) && long.TryParse(timestampTicks, out var ticks)) { - return new SnapshotMetadata(pid, sequenceNr, new DateTime(ticks)); + return new SnapshotMetadata(pid, sequenceNr, DateTime.SpecifyKind(new DateTime(ticks), DateTimeKind.Utc)); } } diff --git a/src/core/Akka.Persistence/Snapshot/MemorySnapshotStore.cs b/src/core/Akka.Persistence/Snapshot/MemorySnapshotStore.cs index 62da4611096..93b75db5462 100644 --- a/src/core/Akka.Persistence/Snapshot/MemorySnapshotStore.cs +++ b/src/core/Akka.Persistence/Snapshot/MemorySnapshotStore.cs @@ -99,7 +99,11 @@ private static SnapshotEntry ToSnapshotEntry(SnapshotMetadata metadata, object s private static SelectedSnapshot ToSelectedSnapshot(SnapshotEntry entry) { - return new SelectedSnapshot(new SnapshotMetadata(entry.PersistenceId, entry.SequenceNr, new DateTime(entry.Timestamp)), entry.Snapshot); + return new SelectedSnapshot(metadata: new SnapshotMetadata( + persistenceId: entry.PersistenceId, + sequenceNr: entry.SequenceNr, + timestamp: DateTime.SpecifyKind(new DateTime(entry.Timestamp), DateTimeKind.Utc)), + snapshot: entry.Snapshot); } }