You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ib...@apache.org on 2023/01/25 07:30:42 UTC
[ignite-3] branch main updated: IGNITE-18601 Copy configuration tree when adding default values (#1570)
This is an automated email from the ASF dual-hosted git repository.
ibessonov 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 89674e022c IGNITE-18601 Copy configuration tree when adding default values (#1570)
89674e022c is described below
commit 89674e022c7c3e9e2507c200f43615ddc441cde8
Author: Alexander Polovtcev <al...@gmail.com>
AuthorDate: Wed Jan 25 09:30:35 2023 +0200
IGNITE-18601 Copy configuration tree when adding default values (#1570)
---
.../configuration/util/ConfigurationUtil.java | 13 ++++++-------
.../configuration/util/ConfigurationUtilTest.java | 22 ++++++++++++++++++++++
2 files changed, 28 insertions(+), 7 deletions(-)
diff --git a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
index f050af139d..e17c908043 100644
--- a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
+++ b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/util/ConfigurationUtil.java
@@ -321,14 +321,10 @@ public class ConfigurationUtil {
/** {@inheritDoc} */
@Override
public Object visitInnerNode(String key, InnerNode innerNode) {
- InnerNode childNode = node.traverseChild(key, innerNodeVisitor(), true);
-
- // Instantiate field in destination node before doing something else.
- if (childNode == null) {
- node.construct(key, EMPTY_CFG_SRC, true);
+ // Copy or create the element.
+ node.construct(key, EMPTY_CFG_SRC, true);
- childNode = node.traverseChild(key, innerNodeVisitor(), true);
- }
+ InnerNode childNode = node.traverseChild(key, innerNodeVisitor(), true);
addDefaults(childNode);
@@ -338,6 +334,9 @@ public class ConfigurationUtil {
/** {@inheritDoc} */
@Override
public Object visitNamedListNode(String key, NamedListNode<?> namedList) {
+ // Copy or create the element.
+ node.construct(key, EMPTY_CFG_SRC, true);
+
namedList = node.traverseChild(key, namedListNodeVisitor(), true);
for (String namedListKey : namedList.namedListKeys()) {
diff --git a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
index 0ce48e6b72..ef36ae4bb1 100644
--- a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
+++ b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/util/ConfigurationUtilTest.java
@@ -45,6 +45,7 @@ import static org.hamcrest.Matchers.matchesPattern;
import static org.hamcrest.Matchers.nullValue;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -59,6 +60,7 @@ import java.util.NoSuchElementException;
import java.util.Set;
import java.util.UUID;
import java.util.function.Consumer;
+import org.apache.ignite.configuration.NamedListView;
import org.apache.ignite.configuration.RootKey;
import org.apache.ignite.configuration.annotation.Config;
import org.apache.ignite.configuration.annotation.ConfigValue;
@@ -808,6 +810,26 @@ public class ConfigurationUtilTest {
assertEquals(List.of("0"), removeLastKey(List.of("0", "1")));
}
+ /**
+ * Tests that {@link ConfigurationUtil#addDefaults} copies the tree when adding default values.
+ */
+ @Test
+ void testAddDefaultsPurity() {
+ InnerNode parentNode = newNodeInstance(ParentConfigurationSchema.class);
+
+ ParentChange parentChange = (ParentChange) parentNode;
+
+ parentChange.changeElements(elements -> elements.create("name", element -> {}));
+
+ NamedListView<?> beforeDefaults = parentChange.elements();
+
+ addDefaults(parentNode);
+
+ NamedListView<?> afterDefaults = parentChange.elements();
+
+ assertNotSame(afterDefaults, beforeDefaults);
+ }
+
/**
* Patches super root and returns flat representation of the changes. Passed {@code superRoot} object will contain patched tree when
* method execution is completed.