You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@airavata.apache.org by la...@apache.org on 2026/03/02 19:27:45 UTC

(airavata-data-catalog) branch main updated: Fix FrameworkConfig cache: use content equality instead of reference comparison for schema change detection, included indexes

This is an automated email from the ASF dual-hosted git repository.

lahirujayathilake pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airavata-data-catalog.git


The following commit(s) were added to refs/heads/main by this push:
     new 203e9e2  Fix FrameworkConfig cache: use content equality instead of reference comparison for schema change detection, included indexes
203e9e2 is described below

commit 203e9e2653001fba1387e78c78045e1eff5eab4b
Author: lahiruj <la...@gmail.com>
AuthorDate: Mon Mar 2 14:27:37 2026 -0500

    Fix FrameworkConfig cache: use content equality instead of reference comparison for schema change detection, included indexes
---
 .../impl/MetadataSchemaQueryExecutorImpl.java      | 23 +++++++------
 .../2026/02/2026-02-25-performance-indexes.xml     | 40 ++++++++++++++++++++++
 2 files changed, 53 insertions(+), 10 deletions(-)

diff --git a/data-catalog-api/server/service/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java b/data-catalog-api/server/service/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
index d73f6c3..e4ca109 100644
--- a/data-catalog-api/server/service/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
+++ b/data-catalog-api/server/service/src/main/java/org/apache/airavata/datacatalog/api/query/impl/MetadataSchemaQueryExecutorImpl.java
@@ -1,11 +1,6 @@
 package org.apache.airavata.datacatalog.api.query.impl;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
+import jakarta.persistence.EntityManager;
 import org.apache.airavata.datacatalog.api.DataProduct;
 import org.apache.airavata.datacatalog.api.FieldValueType;
 import org.apache.airavata.datacatalog.api.exception.MetadataSchemaSqlParseException;
@@ -49,7 +44,11 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import jakarta.persistence.EntityManager;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 @Component
 public class MetadataSchemaQueryExecutorImpl implements MetadataSchemaQueryExecutor {
@@ -69,12 +68,16 @@ public class MetadataSchemaQueryExecutorImpl implements MetadataSchemaQueryExecu
     DataProductMapper dataProductMapper;
 
     private volatile FrameworkConfig cachedConfig = null;
-    private volatile List<MetadataSchemaEntity> lastSchemas = null;
+    private volatile List<String> lastSchemaNames = null;
 
     private synchronized FrameworkConfig getOrBuildConfig(List<MetadataSchemaEntity> schemas) {
-        if (cachedConfig == null || lastSchemas != schemas) {
+        List<String> currentNames = schemas.stream()
+                .map(MetadataSchemaEntity::getSchemaName)
+                .toList();
+        if (cachedConfig == null || !currentNames.equals(lastSchemaNames)) {
+            logger.debug("Rebuilding FrameworkConfig for schemas: {}", currentNames);
             cachedConfig = buildFrameworkConfig(schemas);
-            lastSchemas = schemas;
+            lastSchemaNames = currentNames;
         }
         return cachedConfig;
     }
diff --git a/data-catalog-api/server/service/src/main/resources/db/changelog/2026/02/2026-02-25-performance-indexes.xml b/data-catalog-api/server/service/src/main/resources/db/changelog/2026/02/2026-02-25-performance-indexes.xml
new file mode 100644
index 0000000..cdb3e3e
--- /dev/null
+++ b/data-catalog-api/server/service/src/main/resources/db/changelog/2026/02/2026-02-25-performance-indexes.xml
@@ -0,0 +1,40 @@
+<?xml version="1.1" encoding="UTF-8" standalone="no"?>
+<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
+    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
+    xmlns:pro="http://www.liquibase.org/xml/ns/pro"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd
+                        http://www.liquibase.org/xml/ns/pro http://www.liquibase.org/xml/ns/pro/liquibase-pro-latest.xsd
+                        http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-latest.xsd">
+
+    <changeSet id="2026-02-25-idx-dpms-schema-id" author="performance">
+        <!-- CRITICAL: Speeds up the CTE inner join that filters by schema on every search -->
+        <createIndex tableName="data_product_metadata_schema" indexName="idx_dpms_schema_id">
+            <column name="metadata_schema_id"/>
+        </createIndex>
+    </changeSet>
+
+    <changeSet id="2026-02-25-idx-sus-user-perm" author="performance">
+        <!-- HIGH: Speeds up user permission lookups in the recursive CTE -->
+        <createIndex tableName="simple_user_sharing" indexName="idx_sus_user_perm">
+            <column name="simple_user_id"/>
+            <column name="permission_id"/>
+        </createIndex>
+    </changeSet>
+
+    <changeSet id="2026-02-25-idx-sgs-group-perm" author="performance">
+        <!-- HIGH: Speeds up group permission lookups -->
+        <createIndex tableName="simple_group_sharing" indexName="idx_sgs_group_perm">
+            <column name="simple_group_id"/>
+            <column name="permission_id"/>
+        </createIndex>
+    </changeSet>
+
+    <changeSet id="2026-02-25-idx-sg-external-id" author="performance">
+        <!-- MEDIUM: Speeds up group ID lookups for token-based group filtering -->
+        <createIndex tableName="simple_group" indexName="idx_sg_external_id">
+            <column name="external_id"/>
+        </createIndex>
+    </changeSet>
+
+</databaseChangeLog>