This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push:
new 0799d6068b IGNITE-22674 Fix predicate in condition of
UpdateLogImpl#saveSnapshot (#4052)
0799d6068b is described below
commit 0799d6068b084949e7909f80167841788ed716ab
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Mon Jul 8 14:55:52 2024 +0300
IGNITE-22674 Fix predicate in condition of UpdateLogImpl#saveSnapshot
(#4052)
---
.../ignite/internal/catalog/storage/UpdateLogImpl.java | 11 ++++++++---
.../ignite/internal/catalog/storage/UpdateLogImplTest.java | 12 +++++++-----
2 files changed, 15 insertions(+), 8 deletions(-)
diff --git
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateLogImpl.java
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateLogImpl.java
index e14460781b..8ee8c50758 100644
---
a/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateLogImpl.java
+++
b/modules/catalog/src/main/java/org/apache/ignite/internal/catalog/storage/UpdateLogImpl.java
@@ -26,7 +26,9 @@ import static
org.apache.ignite.internal.metastorage.dsl.Operations.ops;
import static org.apache.ignite.internal.metastorage.dsl.Operations.put;
import static org.apache.ignite.internal.metastorage.dsl.Statements.iif;
import static org.apache.ignite.internal.util.ByteUtils.bytesToInt;
+import static org.apache.ignite.internal.util.ByteUtils.bytesToIntKeepingOrder;
import static org.apache.ignite.internal.util.ByteUtils.intToBytes;
+import static org.apache.ignite.internal.util.ByteUtils.intToBytesKeepingOrder;
import static
org.apache.ignite.internal.util.CompletableFutures.falseCompletedFuture;
import static
org.apache.ignite.internal.util.CompletableFutures.nullCompletedFuture;
@@ -206,13 +208,16 @@ public class UpdateLogImpl implements UpdateLog {
return falseCompletedFuture();
}
+ // We need to keep order for the comparison to work correctly.
+ byte[] snapshotVersionValue =
intToBytesKeepingOrder(snapshotVersion);
+
Condition versionIsRecent = or(
notExists(CatalogKey.snapshotVersion()),
-
value(CatalogKey.snapshotVersion()).lt(intToBytes(snapshotVersion))
+
value(CatalogKey.snapshotVersion()).lt(snapshotVersionValue)
);
Update saveSnapshotAndDropOutdatedUpdates = ops(Stream.concat(
Stream.of(
- put(CatalogKey.snapshotVersion(),
intToBytes(snapshotVersion)),
+ put(CatalogKey.snapshotVersion(),
snapshotVersionValue),
put(CatalogKey.update(snapshotVersion),
marshaller.marshall(update))
),
IntStream.range(oldSnapshotVersion,
snapshotVersion).mapToObj(ver -> Operations.remove(CatalogKey.update(ver)))
@@ -240,7 +245,7 @@ public class UpdateLogImpl implements UpdateLog {
Entry earliestVersion =
metastore.getLocally(CatalogKey.snapshotVersion(), recoveryRevision);
- int ver = earliestVersion.empty() ? 1 :
bytesToInt(Objects.requireNonNull(earliestVersion.value()));
+ int ver = earliestVersion.empty() ? 1 :
bytesToIntKeepingOrder(Objects.requireNonNull(earliestVersion.value()));
recoverUpdates(handler, recoveryRevision, ver);
}
diff --git
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
index c6f4c8424e..c6be4b35ab 100644
---
a/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
+++
b/modules/catalog/src/test/java/org/apache/ignite/internal/catalog/storage/UpdateLogImplTest.java
@@ -28,6 +28,8 @@ import static org.hamcrest.Matchers.equalTo;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import java.io.IOException;
import java.io.Serializable;
@@ -62,7 +64,6 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
-import org.mockito.Mockito;
/** Tests to verify {@link UpdateLogImpl}. */
class UpdateLogImplTest extends BaseIgniteAbstractTest {
@@ -126,7 +127,8 @@ class UpdateLogImplTest extends BaseIgniteAbstractTest {
List<VersionedUpdate> updates = List.of(
singleEntryUpdateOfVersion(1),
singleEntryUpdateOfVersion(2),
- singleEntryUpdateOfVersion(3));
+ singleEntryUpdateOfVersion(3)
+ );
appendUpdates(updateLogImpl, updates);
@@ -325,10 +327,10 @@ class UpdateLogImplTest extends BaseIgniteAbstractTest {
}
private static SnapshotEntry snapshotEntryOfVersion(int version) {
- Catalog catalog = Mockito.mock(Catalog.class);
+ Catalog catalog = mock(Catalog.class);
- Mockito.when(catalog.version()).thenReturn(version);
-
Mockito.when(catalog.defaultZone()).thenReturn(Mockito.mock(CatalogZoneDescriptor.class));
+ when(catalog.version()).thenReturn(version);
+
when(catalog.defaultZone()).thenReturn(mock(CatalogZoneDescriptor.class));
return new SnapshotEntry(catalog);
}