This is an automated email from the ASF dual-hosted git repository.
tkalkirill pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new e6096246780 IGNITE-28796 Add a system view for PluginProvider (#13256)
e6096246780 is described below
commit e6096246780576504c086fbb51f768510c4b2f9c
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Fri Jun 19 20:19:43 2026 +0300
IGNITE-28796 Add a system view for PluginProvider (#13256)
---
.../internal/jdbc2/JdbcMetadataSelfTest.java | 3 +-
.../ignite/jdbc/thin/JdbcThinMetadataSelfTest.java | 9 ++-
.../apache/ignite/util/SystemViewCommandTest.java | 3 +-
.../org/apache/ignite/internal/IgniteKernal.java | 2 +
.../processors/plugin/IgnitePluginProcessor.java | 25 +++++++-
.../org/apache/ignite/plugin/PluginProvider.java | 5 ++
.../ignite/spi/systemview/view/PluginView.java | 67 ++++++++++++++++++++++
.../metric/SystemViewClusterActivationTest.java | 4 +-
.../ignite/internal/metric/SystemViewSelfTest.java | 50 ++++++++++++++++
.../cache/metric/SqlViewExporterSpiTest.java | 3 +-
.../processors/query/SqlSystemViewsSelfTest.java | 50 ++++++++++++++++
11 files changed, 214 insertions(+), 7 deletions(-)
diff --git
a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
index e416d417bda..3f989f2e6ae 100755
---
a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
+++
b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcMetadataSelfTest.java
@@ -368,7 +368,8 @@ public class JdbcMetadataSelfTest extends
GridCommonAbstractTest {
"STATISTICS_PARTITION_DATA",
"STATISTICS_LOCAL_DATA",
"STATISTICS_GLOBAL_DATA",
- "SQL_PLANS_HISTORY"
+ "SQL_PLANS_HISTORY",
+ "IGNITE_PLUGINS"
));
Set<String> actViews = new TreeSet<>();
diff --git
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
index 8fdb7f651e2..b1bd8246ff9 100644
---
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
+++
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java
@@ -465,7 +465,8 @@ public class JdbcThinMetadataSelfTest extends
JdbcThinAbstractSelfTest {
"SYS.STATISTICS_PARTITION_DATA",
"SYS.STATISTICS_CONFIGURATION",
"SYS.PAGES_TIMESTAMP_HISTOGRAM",
- "SYS.SQL_PLANS_HISTORY"
+ "SYS.SQL_PLANS_HISTORY",
+ "SYS.IGNITE_PLUGINS"
))
);
}
@@ -1173,7 +1174,11 @@ public class JdbcThinMetadataSelfTest extends
JdbcThinAbstractSelfTest {
"SYS.SQL_PLANS_HISTORY.LOCAL.null",
"SYS.SQL_PLANS_HISTORY.PLAN.null",
"SYS.SQL_PLANS_HISTORY.SCHEMA_NAME.null",
- "SYS.SQL_PLANS_HISTORY.SQL.null"
+ "SYS.SQL_PLANS_HISTORY.SQL.null",
+ "SYS.IGNITE_PLUGINS.NAME.null",
+ "SYS.IGNITE_PLUGINS.INFO.null",
+ "SYS.IGNITE_PLUGINS.VERSION.null",
+ "SYS.IGNITE_PLUGINS.CLASS_NAME.null"
));
Assert.assertEquals(expectedCols, actualSysCols);
diff --git
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
index ca9e839690c..288484d8a14 100644
---
a/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
+++
b/modules/control-utility/src/test/java/org/apache/ignite/util/SystemViewCommandTest.java
@@ -501,7 +501,8 @@ public class SystemViewCommandTest extends
GridCommandHandlerClusterByClassAbstr
"DS_SEMAPHORES",
"DS_QUEUES",
"PAGES_TIMESTAMP_HISTOGRAM",
- "SQL_PLANS_HISTORY"
+ "SQL_PLANS_HISTORY",
+ "IGNITE_PLUGINS"
));
Set<String> viewNames = new TreeSet<>();
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 303b0355960..8e92f8118fc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1253,6 +1253,8 @@ public class IgniteKernal implements IgniteEx,
Externalizable {
for (PluginProvider<?> provider : ctx.plugins().allProviders())
provider.onIgniteStart();
+ ctx.plugins().registerSystemView();
+
if (recon)
reconnectState.waitFirstReconnect();
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
index 59bcabd2bfa..804f5bf743a 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/plugin/IgnitePluginProcessor.java
@@ -33,6 +33,8 @@ import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.GridPluginContext;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.processors.metric.impl.MetricUtils;
+import org.apache.ignite.internal.systemview.PluginViewWalker;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.plugin.Extension;
@@ -42,6 +44,7 @@ import org.apache.ignite.plugin.PluginProvider;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoveryDataBag.GridDiscoveryData;
import
org.apache.ignite.spi.discovery.DiscoveryDataBag.JoiningNodeDiscoveryData;
+import org.apache.ignite.spi.systemview.view.PluginView;
import org.jetbrains.annotations.Nullable;
import static
org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType.PLUGIN;
@@ -50,6 +53,12 @@ import static
org.apache.ignite.internal.GridComponent.DiscoveryDataExchangeType
*
*/
public class IgnitePluginProcessor extends GridProcessorAdapter {
+ /** */
+ public static final String PLUGINS_SYS_VIEW =
MetricUtils.metricName("ignite", "plugins");
+
+ /** */
+ private static final String PLUGINS_SYS_VIEW_DESC = "Information about
configured and loaded Ignite plugins.";
+
/** */
private final Map<String, PluginProvider> plugins = new LinkedHashMap<>();
@@ -244,7 +253,7 @@ public class IgnitePluginProcessor extends
GridProcessorAdapter {
}
else {
for (PluginProvider plugin : plugins.values()) {
- U.quietAndInfo(log, " ^-- " + plugin.name() + " " +
plugin.version());
+ U.quietAndInfo(log, " ^-- " + plugin.name() + " " +
plugin.version() + " " + plugin.info());
U.quietAndInfo(log, " ^-- " + plugin.copyright());
U.quietAndInfo(log, "");
}
@@ -292,4 +301,18 @@ public class IgnitePluginProcessor extends
GridProcessorAdapter {
return extensions;
}
}
+
+ /** */
+ public void registerSystemView() {
+ if (ctx.systemView().view(PLUGINS_SYS_VIEW) != null)
+ return;
+
+ ctx.systemView().registerView(
+ PLUGINS_SYS_VIEW,
+ PLUGINS_SYS_VIEW_DESC,
+ new PluginViewWalker(),
+ plugins::values,
+ PluginView::new
+ );
+ }
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
index 46ca4196fc7..852a1a6d22e 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/PluginProvider.java
@@ -55,6 +55,11 @@ public interface PluginProvider<C extends
PluginConfiguration> {
*/
public String copyright();
+ /** @return Plugin info, {@code ""} if missing. */
+ public default String info() {
+ return "";
+ }
+
/**
* @param <T> Type of the plugin.
* @return Plugin API.
diff --git
a/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
new file mode 100644
index 00000000000..98afea43b00
--- /dev/null
+++
b/modules/core/src/main/java/org/apache/ignite/spi/systemview/view/PluginView.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.spi.systemview.view;
+
+import org.apache.ignite.internal.systemview.Filtrable;
+import org.apache.ignite.internal.systemview.Order;
+import org.apache.ignite.internal.systemview.SystemViewDescriptor;
+import org.apache.ignite.plugin.PluginProvider;
+
+/** Ignite plugin representation for a {@link SystemView}. */
+@SystemViewDescriptor
+public class PluginView {
+ /** */
+ private final PluginProvider<?> pluginProvider;
+
+ /**
+ * Constructor.
+ *
+ * @param pluginProvider Plugin provider.
+ */
+ public PluginView(PluginProvider<?> pluginProvider) {
+ this.pluginProvider = pluginProvider;
+ }
+
+ /** @return Plugin name. */
+ @Order
+ @Filtrable
+ public String name() {
+ return pluginProvider.name();
+ }
+
+ /** @return Plugin version. */
+ @Order(1)
+ @Filtrable
+ public String version() {
+ return pluginProvider.version();
+ }
+
+ /** @return Plugin class name. */
+ @Order(2)
+ @Filtrable
+ public String className() {
+ return pluginProvider.plugin().getClass().getName();
+ }
+
+ /** @return Plugin info. */
+ @Order(3)
+ @Filtrable
+ public String info() {
+ return pluginProvider.info();
+ }
+}
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
index 30a559d9301..32319c534d1 100644
---
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewClusterActivationTest.java
@@ -55,6 +55,7 @@ import static
org.apache.ignite.internal.processors.datastructures.DataStructure
import static
org.apache.ignite.internal.processors.job.GridJobProcessor.JOBS_VIEW;
import static
org.apache.ignite.internal.processors.metastorage.persistence.DistributedMetaStorageImpl.DISTRIBUTED_METASTORE_VIEW;
import static
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW;
+import static
org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW;
import static
org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW;
import static
org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW;
import static
org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW;
@@ -96,7 +97,8 @@ public class SystemViewClusterActivationTest extends
GridCommonAbstractTest {
STAMPED_VIEW,
REFERENCES_VIEW,
LONGS_VIEW,
- SEQUENCES_VIEW
+ SEQUENCES_VIEW,
+ PLUGINS_SYS_VIEW
));
IgniteEx ignite =
startGrid(getConfiguration().setClusterStateOnStart(ClusterState.INACTIVE));
diff --git
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
index b86ad16bf38..c8d08036d4a 100644
---
a/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/internal/metric/SystemViewSelfTest.java
@@ -36,6 +36,7 @@ import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
import javax.cache.Cache;
import javax.cache.expiry.CreatedExpiryPolicy;
import javax.cache.expiry.Duration;
@@ -107,6 +108,8 @@ import org.apache.ignite.lang.IgniteClosure;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteRunnable;
import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
+import org.apache.ignite.plugin.IgnitePlugin;
import org.apache.ignite.services.ServiceConfiguration;
import org.apache.ignite.spi.systemview.view.BaselineNodeAttributeView;
import org.apache.ignite.spi.systemview.view.BaselineNodeView;
@@ -128,6 +131,7 @@ import
org.apache.ignite.spi.systemview.view.NodeAttributeView;
import org.apache.ignite.spi.systemview.view.NodeMetricsView;
import org.apache.ignite.spi.systemview.view.PagesListView;
import org.apache.ignite.spi.systemview.view.PagesTimestampHistogramView;
+import org.apache.ignite.spi.systemview.view.PluginView;
import org.apache.ignite.spi.systemview.view.ScanQueryView;
import org.apache.ignite.spi.systemview.view.ServiceView;
import org.apache.ignite.spi.systemview.view.SnapshotView;
@@ -192,6 +196,7 @@ import static
org.apache.ignite.internal.processors.metastorage.persistence.Dist
import static
org.apache.ignite.internal.processors.metric.impl.MetricUtils.metricName;
import static
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_ATTR_VIEW;
import static
org.apache.ignite.internal.processors.odbc.ClientListenerProcessor.CLI_CONN_VIEW;
+import static
org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor.PLUGINS_SYS_VIEW;
import static
org.apache.ignite.internal.processors.pool.PoolProcessor.STREAM_POOL_QUEUE_VIEW;
import static
org.apache.ignite.internal.processors.pool.PoolProcessor.SYS_POOL_QUEUE_VIEW;
import static
org.apache.ignite.internal.processors.service.IgniteServiceProcessor.SVCS_VIEW;
@@ -2615,6 +2620,24 @@ public class SystemViewSelfTest extends
GridCommonAbstractTest {
}
}
+ /** */
+ @Test
+ public void testPluginView() throws Exception {
+ try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new
TestPluginProvider()))) {
+ SystemView<PluginView> view =
n.context().systemView().view(PLUGINS_SYS_VIEW);
+
+ PluginView testPluginView =
StreamSupport.stream(view.spliterator(), false)
+ .filter(v -> "FOR_SYS_VIEW_PLUGIN_NAME".equals(v.name()))
+ .findFirst()
+ .orElseThrow(() -> new AssertionError("Plugin not found"));
+
+ assertEquals("FOR_SYS_VIEW_PLUGIN_NAME", testPluginView.name());
+ assertEquals("FOR_SYS_VIEW_PLUGIN_INFO", testPluginView.info());
+ assertEquals("42", testPluginView.version());
+ assertEquals(TestPluginProvider.TestPlugin.class.getName(),
testPluginView.className());
+ }
+ }
+
/** Test node filter. */
public static class TestNodeFilter implements IgnitePredicate<ClusterNode>
{
/** {@inheritDoc} */
@@ -2701,4 +2724,31 @@ public class SystemViewSelfTest extends
GridCommonAbstractTest {
public static class InternalTask extends UserTask {
// No-op.
}
+
+ /** */
+ private static class TestPluginProvider extends AbstractTestPluginProvider
{
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "FOR_SYS_VIEW_PLUGIN_NAME";
+ }
+
+ /** {@inheritDoc} */
+ @Override public String version() {
+ return "42";
+ }
+
+ /** {@inheritDoc} */
+ @Override public String info() {
+ return "FOR_SYS_VIEW_PLUGIN_INFO";
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T extends IgnitePlugin> T plugin() {
+ return (T)new TestPlugin();
+ }
+
+ /** */
+ private static class TestPlugin implements IgnitePlugin {
+ }
+ }
}
diff --git
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
index a6a2ef70686..e2b2317c44d 100644
---
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
+++
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/metric/SqlViewExporterSpiTest.java
@@ -464,7 +464,8 @@ public class SqlViewExporterSpiTest extends
AbstractExporterSpiTest {
"DS_SEMAPHORES",
"DS_QUEUES",
"PAGES_TIMESTAMP_HISTOGRAM",
- "SQL_PLANS_HISTORY"
+ "SQL_PLANS_HISTORY",
+ "IGNITE_PLUGINS"
));
Set<String> actViews = new TreeSet<>();
diff --git
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
index 4c9d8362822..5c74bdf53aa 100644
---
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
+++
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/SqlSystemViewsSelfTest.java
@@ -85,6 +85,8 @@ import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteFuture;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.plugin.AbstractTestPluginProvider;
+import org.apache.ignite.plugin.IgnitePlugin;
import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
import org.apache.ignite.spi.systemview.view.SqlQueryView;
import org.apache.ignite.spi.systemview.view.SystemView;
@@ -1873,6 +1875,27 @@ public class SqlSystemViewsSelfTest extends
AbstractIndexingCommonTest {
}
}
+ /** */
+ @Test
+ public void testPluginView() throws Exception {
+ try (IgniteEx n = startGrid(getConfiguration().setPluginProviders(new
TestPluginProvider()))) {
+ String sql = String.format(
+ "SELECT name, info, version, class_name FROM
%s.IGNITE_PLUGINS WHERE NAME = ?",
+ systemSchemaName()
+ );
+
+ assertEquals(
+ List.of(
+ "FOR_SYS_VIEW_PLUGIN_NAME",
+ "FOR_SYS_VIEW_PLUGIN_INFO",
+ "42",
+ TestPluginProvider.TestPlugin.class.getName()
+ ),
+ execSql(n, sql, "FOR_SYS_VIEW_PLUGIN_NAME").get(0)
+ );
+ }
+ }
+
/**
* Mock for {@link ClusterMetricsImpl} that always returns big (more than
24h) duration for all duration metrics.
*/
@@ -2089,4 +2112,31 @@ public class SqlSystemViewsSelfTest extends
AbstractIndexingCommonTest {
return "CUSTOM_NODE_FILTER";
}
}
+
+ /** */
+ private static class TestPluginProvider extends AbstractTestPluginProvider
{
+ /** {@inheritDoc} */
+ @Override public String name() {
+ return "FOR_SYS_VIEW_PLUGIN_NAME";
+ }
+
+ /** {@inheritDoc} */
+ @Override public String version() {
+ return "42";
+ }
+
+ /** {@inheritDoc} */
+ @Override public String info() {
+ return "FOR_SYS_VIEW_PLUGIN_INFO";
+ }
+
+ /** {@inheritDoc} */
+ @Override public <T extends IgnitePlugin> T plugin() {
+ return (T)new TestPlugin();
+ }
+
+ /** */
+ private static class TestPlugin implements IgnitePlugin {
+ }
+ }
}