From e79ce5fe0795bf6b02a1f2834a9c8167ee5bffd1 Mon Sep 17 00:00:00 2001 From: Sriharsha Chintalapani Date: Thu, 12 Oct 2023 16:07:50 -0700 Subject: [PATCH] Remove jdbi unit of work (#13550) * Remove JDBI Unit of Work transactions * Remove JDBI Unit of Work transactions * Remove JDBI Unit of Work transactions --- .../java/org/openmetadata/csv/EntityCsv.java | 2 + .../service/OpenMetadataApplication.java | 10 +- .../service/events/ChangeEventHandler.java | 3 +- .../service/jdbi3/BotRepository.java | 2 + .../service/jdbi3/ChartRepository.java | 2 + .../jdbi3/ClassificationRepository.java | 2 + .../service/jdbi3/ContainerRepository.java | 2 + .../jdbi3/DashboardDataModelRepository.java | 2 + .../service/jdbi3/DashboardRepository.java | 2 + .../service/jdbi3/DataProductRepository.java | 2 + .../service/jdbi3/DatabaseRepository.java | 2 + .../jdbi3/DatabaseSchemaRepository.java | 2 + .../service/jdbi3/DocumentRepository.java | 2 + .../service/jdbi3/DomainRepository.java | 2 + .../service/jdbi3/EntityRepository.java | 31 +++++ .../jdbi3/EntityTimeSeriesRepository.java | 2 + .../jdbi3/EventSubscriptionRepository.java | 5 + .../service/jdbi3/FeedRepository.java | 13 +++ .../service/jdbi3/GlossaryRepository.java | 2 + .../service/jdbi3/GlossaryTermRepository.java | 2 + .../jdbi3/IngestionPipelineRepository.java | 3 + .../service/jdbi3/KpiRepository.java | 4 + .../service/jdbi3/LineageRepository.java | 3 + .../service/jdbi3/MlModelRepository.java | 2 + .../service/jdbi3/PersonaRepository.java | 2 + .../service/jdbi3/PipelineRepository.java | 2 + .../service/jdbi3/PolicyRepository.java | 2 + .../service/jdbi3/QueryRepository.java | 2 + .../service/jdbi3/RoleRepository.java | 2 + .../service/jdbi3/SearchIndexRepository.java | 2 + .../jdbi3/ServiceEntityRepository.java | 2 + .../jdbi3/StoredProcedureRepository.java | 2 + .../service/jdbi3/SystemRepository.java | 2 + .../service/jdbi3/TableRepository.java | 6 + .../service/jdbi3/TagRepository.java | 2 + .../service/jdbi3/TeamRepository.java | 2 + .../service/jdbi3/TestCaseRepository.java | 5 + .../TestConnectionDefinitionRepository.java | 2 + .../jdbi3/TestDefinitionRepository.java | 2 + .../service/jdbi3/TestSuiteRepository.java | 2 + .../service/jdbi3/TopicRepository.java | 2 + .../service/jdbi3/TypeRepository.java | 2 + .../service/jdbi3/UsageRepository.java | 6 + .../service/jdbi3/UserRepository.java | 2 + .../service/jdbi3/WorkflowRepository.java | 2 + .../jdbi3/unitofwork/JdbiHandleManager.java | 23 ---- .../unitofwork/JdbiTransactionManager.java | 100 ----------------- ...dbiUnitOfWorkApplicationEventListener.java | 33 ------ .../unitofwork/JdbiUnitOfWorkProvider.java | 69 ------------ .../LinkedRequestScopedJdbiHandleManager.java | 106 ------------------ .../ManagedHandleInvocationHandler.java | 83 -------------- ...GetRequestJdbiUnitOfWorkEventListener.java | 40 ------- .../RequestScopedJdbiHandleManager.java | 49 -------- .../service/resources/apps/AppResource.java | 28 +---- .../service/util/NotificationHandler.java | 3 +- 55 files changed, 153 insertions(+), 538 deletions(-) delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkApplicationEventListener.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkProvider.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/NonHttpGetRequestJdbiUnitOfWorkEventListener.java delete mode 100644 openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java diff --git a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java index 55a7f6e7070..47a99887a6f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java +++ b/openmetadata-service/src/main/java/org/openmetadata/csv/EntityCsv.java @@ -35,6 +35,7 @@ import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVFormat.Builder; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.type.EntityReference; @@ -335,6 +336,7 @@ public abstract class EntityCsv { } } + @Transaction private void createEntity(CSVPrinter resultsPrinter, CSVRecord csvRecord, T entity) throws IOException { entity.setId(UUID.randomUUID()); entity.setUpdatedBy(importedBy); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java b/openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java index 5b96b04f9f6..58c514badb5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/OpenMetadataApplication.java @@ -13,7 +13,6 @@ package org.openmetadata.service; -import static org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider.getWrappedInstanceForDaoClass; import static org.openmetadata.service.util.MicrometerBundleSingleton.webAnalyticEvents; import io.dropwizard.Application; @@ -41,7 +40,6 @@ import java.security.NoSuchAlgorithmException; import java.security.cert.CertificateException; import java.time.temporal.ChronoUnit; import java.util.EnumSet; -import java.util.HashSet; import java.util.Optional; import javax.naming.ConfigurationException; import javax.servlet.DispatcherType; @@ -84,9 +82,6 @@ import org.openmetadata.service.jdbi3.CollectionDAO; import org.openmetadata.service.jdbi3.EntityRepository; import org.openmetadata.service.jdbi3.locator.ConnectionAwareAnnotationSqlLocator; import org.openmetadata.service.jdbi3.locator.ConnectionType; -import org.openmetadata.service.jdbi3.unitofwork.JdbiTransactionManager; -import org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkApplicationEventListener; -import org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider; import org.openmetadata.service.migration.Migration; import org.openmetadata.service.migration.api.MigrationWorkflow; import org.openmetadata.service.monitoring.EventMonitor; @@ -139,11 +134,8 @@ public class OpenMetadataApplication extends Application())); // initialize Search Repository, all repositories use SearchRepository this line should always before initializing // repository diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/events/ChangeEventHandler.java b/openmetadata-service/src/main/java/org/openmetadata/service/events/ChangeEventHandler.java index e404b5de0e0..d7a33e5cebd 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/events/ChangeEventHandler.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/events/ChangeEventHandler.java @@ -16,7 +16,6 @@ package org.openmetadata.service.events; import static org.openmetadata.common.utils.CommonUtil.listOrEmpty; import static org.openmetadata.service.events.subscription.AlertsRuleEvaluator.getEntity; import static org.openmetadata.service.formatter.util.FormatterUtil.getChangeEventFromResponseContext; -import static org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider.getWrappedInstanceForDaoClass; import com.fasterxml.jackson.databind.ObjectMapper; import java.util.List; @@ -56,7 +55,7 @@ public class ChangeEventHandler implements EventHandler { SecurityContext securityContext = requestContext.getSecurityContext(); String loggedInUserName = securityContext.getUserPrincipal().getName(); try { - CollectionDAO collectionDAO = (CollectionDAO) getWrappedInstanceForDaoClass(CollectionDAO.class); + CollectionDAO collectionDAO = Entity.getCollectionDAO(); CollectionDAO.ChangeEventDAO changeEventDAO = collectionDAO.changeEventDAO(); FeedRepository feedRepository = new FeedRepository(); if (responseContext.getEntity() != null && responseContext.getEntity().getClass().equals(Thread.class)) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/BotRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/BotRepository.java index 202a85f06ac..192f64a11f6 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/BotRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/BotRepository.java @@ -14,6 +14,7 @@ package org.openmetadata.service.jdbi3; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.Bot; import org.openmetadata.schema.entity.teams.User; import org.openmetadata.schema.type.EntityReference; @@ -84,6 +85,7 @@ public class BotRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateUser(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ChartRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ChartRepository.java index 973214a0517..837b1b6e992 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ChartRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ChartRepository.java @@ -17,6 +17,7 @@ import static org.openmetadata.schema.type.Include.ALL; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Chart; import org.openmetadata.schema.entity.services.DashboardService; @@ -104,6 +105,7 @@ public class ChartRepository extends EntityRepository { super(chart, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("chartType", original.getChartType(), updated.getChartType()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ClassificationRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ClassificationRepository.java index 308cf9354a5..2354ee0cde9 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ClassificationRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ClassificationRepository.java @@ -23,6 +23,7 @@ import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.jdbi.v3.core.mapper.RowMapper; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.classification.Classification; import org.openmetadata.schema.type.Include; import org.openmetadata.schema.type.ProviderType; @@ -106,6 +107,7 @@ public class ClassificationRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { // TODO handle name change diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ContainerRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ContainerRepository.java index 66d2ff29bf5..20f02e37a6f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ContainerRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ContainerRepository.java @@ -12,6 +12,7 @@ import static org.openmetadata.service.Entity.STORAGE_SERVICE; import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.List; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.Container; @@ -292,6 +293,7 @@ public class ContainerRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateDataModel(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardDataModelRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardDataModelRepository.java index 0e3ba729d61..d7d8c5fbf5a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardDataModelRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DashboardDataModelRepository.java @@ -21,6 +21,7 @@ import static org.openmetadata.service.Entity.FIELD_TAGS; import java.util.List; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.DashboardDataModel; @@ -232,6 +233,7 @@ public class DashboardDataModelRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { update(Entity.CHART, "charts", listOrEmpty(updated.getCharts()), listOrEmpty(original.getCharts())); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataProductRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataProductRepository.java index 4b91b70a204..a8da3fa8098 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataProductRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DataProductRepository.java @@ -21,6 +21,7 @@ import static org.openmetadata.service.util.EntityUtil.entityReferenceMatch; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.domains.DataProduct; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Relationship; @@ -95,6 +96,7 @@ public class DataProductRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateAssets(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java index 45bc37dfe4d..cc745273d6b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseRepository.java @@ -18,6 +18,7 @@ import static org.openmetadata.service.Entity.DATABASE_SERVICE; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Database; import org.openmetadata.schema.entity.services.DatabaseService; @@ -129,6 +130,7 @@ public class DatabaseRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("retentionPeriod", original.getRetentionPeriod(), updated.getRetentionPeriod()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java index ed14105f40e..6ca62f83eda 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DatabaseSchemaRepository.java @@ -18,6 +18,7 @@ import static org.openmetadata.schema.type.Include.ALL; import java.util.Collections; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Database; import org.openmetadata.schema.entity.data.DatabaseSchema; @@ -140,6 +141,7 @@ public class DatabaseSchemaRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("retentionPeriod", original.getRetentionPeriod(), updated.getRetentionPeriod()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DocumentRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DocumentRepository.java index e86ca02b34d..ae971c451d3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DocumentRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DocumentRepository.java @@ -16,6 +16,7 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.service.Entity.DOCUMENT; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entities.docStore.Document; import org.openmetadata.service.Entity; import org.openmetadata.service.resources.docstore.DocStoreResource; @@ -84,6 +85,7 @@ public class DocumentRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("data", original.getData(), updated.getData(), true); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java index ca86609edd4..e6ae51efdef 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/DomainRepository.java @@ -18,6 +18,7 @@ import static org.openmetadata.schema.type.Include.ALL; import static org.openmetadata.service.Entity.DOMAIN; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.domains.Domain; import org.openmetadata.schema.type.EntityReference; @@ -121,6 +122,7 @@ public class DomainRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("domainType", original.getDomainType(), updated.getDomainType()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java index beacb3c4366..2f5a34e0ab2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityRepository.java @@ -91,6 +91,7 @@ import lombok.NonNull; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.schema.CreateEntity; import org.openmetadata.schema.EntityInterface; @@ -415,6 +416,7 @@ public abstract class EntityRepository { } /** Initialize a given entity if it does not exist. */ + @Transaction public void initializeEntity(T entity) { String existingJson = dao.findJsonByFqn(entity.getFullyQualifiedName(), ALL); if (existingJson != null) { @@ -732,6 +734,7 @@ public abstract class EntityRepository { return entity; } + @Transaction public final PutResponse createOrUpdate(UriInfo uriInfo, T updated) { T original = JsonUtils.readValue(dao.findJsonByFqn(updated.getFullyQualifiedName(), ALL), entityClass); if (original == null) { // If an original entity does not exist then create it, else update @@ -754,6 +757,7 @@ public abstract class EntityRepository { } } + @Transaction public PutResponse update(UriInfo uriInfo, T original, T updated) { // Get all the fields in the original entity that can be updated during PUT operation setFieldsInternal(original, putFields); @@ -771,6 +775,7 @@ public abstract class EntityRepository { return new PutResponse<>(Status.OK, withHref(uriInfo, updated), change); } + @Transaction public final PatchResponse patch(UriInfo uriInfo, UUID id, String user, JsonPatch patch) { // Get all the fields in the original entity that can be updated during PATCH operation T original = setFieldsInternal(dao.findEntityById(id), patchFields); @@ -792,6 +797,7 @@ public abstract class EntityRepository { return new PatchResponse<>(Status.OK, withHref(uriInfo, updated), change); } + @Transaction public PutResponse addFollower(String updatedBy, UUID entityId, UUID userId) { // Get entity T entity = dao.findEntityById(entityId); @@ -827,6 +833,7 @@ public abstract class EntityRepository { return new PutResponse<>(Status.OK, changeEvent, RestUtil.ENTITY_FIELDS_CHANGED); } + @Transaction public PutResponse updateVote(String updatedBy, UUID entityId, VoteRequest request) { T originalEntity = dao.findEntityById(entityId); @@ -871,12 +878,14 @@ public abstract class EntityRepository { return new PutResponse<>(Status.OK, changeEvent, RestUtil.ENTITY_FIELDS_CHANGED); } + @Transaction public final DeleteResponse delete(String updatedBy, UUID id, boolean recursive, boolean hardDelete) { DeleteResponse response = deleteInternal(updatedBy, id, recursive, hardDelete); postDelete(response.getEntity()); return response; } + @Transaction public final DeleteResponse deleteByName(String updatedBy, String name, boolean recursive, boolean hardDelete) { name = quoteFqn ? quoteName(name) : name; DeleteResponse response = deleteInternalByName(updatedBy, name, recursive, hardDelete); @@ -907,6 +916,7 @@ public abstract class EntityRepository { } } + @Transaction private DeleteResponse delete(String deletedBy, T original, boolean recursive, boolean hardDelete) { checkSystemEntityDeletion(original); preDelete(original, deletedBy); @@ -930,6 +940,7 @@ public abstract class EntityRepository { return new DeleteResponse<>(updated, changeType); } + @Transaction public final DeleteResponse deleteInternalByName( String updatedBy, String name, boolean recursive, boolean hardDelete) { // Validate entity @@ -937,12 +948,14 @@ public abstract class EntityRepository { return delete(updatedBy, entity, recursive, hardDelete); } + @Transaction public final DeleteResponse deleteInternal(String updatedBy, UUID id, boolean recursive, boolean hardDelete) { // Validate entity T entity = dao.findEntityById(id, ALL); return delete(updatedBy, entity, recursive, hardDelete); } + @Transaction private void deleteChildren(UUID id, boolean recursive, boolean hardDelete, String updatedBy) { // If an entity being deleted contains other **non-deleted** children entities, it can't be deleted List childrenRecords = @@ -970,6 +983,7 @@ public abstract class EntityRepository { } } + @Transaction protected void cleanup(T entityInterface) { UUID id = entityInterface.getId(); @@ -1008,6 +1022,7 @@ public abstract class EntityRepository { CACHE_WITH_NAME.invalidate(new ImmutablePair<>(entityType, entity.getFullyQualifiedName())); } + @Transaction public PutResponse deleteFollower(String updatedBy, UUID entityId, UUID userId) { T entity = find(entityId, NON_DELETED); @@ -1045,6 +1060,7 @@ public abstract class EntityRepository { return new ResultList<>(entities, errors, beforeCursor, afterCursor, total); } + @Transaction private T createNewEntity(T entity) { storeEntity(entity, false); storeExtension(entity); @@ -1054,6 +1070,7 @@ public abstract class EntityRepository { return entity; } + @Transaction protected void store(T entity, boolean update) { // Don't store owner, database, href and tags as JSON. Build it on the fly based on relationships entity.withHref(null); @@ -1091,10 +1108,12 @@ public abstract class EntityRepository { entity.setExperts(experts); } + @Transaction protected void storeTimeSeries(String fqn, String extension, String jsonSchema, String entityJson, Long timestamp) { daoCollection.entityExtensionTimeSeriesDao().insert(fqn, extension, jsonSchema, entityJson); } + @Transaction public String getExtensionAtTimestamp(String fqn, String extension, Long timestamp) { return daoCollection.entityExtensionTimeSeriesDao().getExtensionAtTimestamp(fqn, extension, timestamp); } @@ -1116,10 +1135,12 @@ public abstract class EntityRepository { .listBetweenTimestampsByOrder(fqn, extension, startTs, endTs, orderBy); } + @Transaction public void deleteExtensionAtTimestamp(String fqn, String extension, Long timestamp) { daoCollection.entityExtensionTimeSeriesDao().deleteAtTimestamp(fqn, extension, timestamp); } + @Transaction public void deleteExtensionBeforeTimestamp(String fqn, String extension, Long timestamp) { daoCollection.entityExtensionTimeSeriesDao().deleteBeforeTimestamp(fqn, extension, timestamp); } @@ -1230,6 +1251,7 @@ public abstract class EntityRepository { } } + @Transaction /** Apply tags {@code tagLabels} to the entity or field identified by {@code targetFQN} */ public void applyTags(List tagLabels, String targetFQN) { for (TagLabel tagLabel : listOrEmpty(tagLabels)) { @@ -1318,6 +1340,7 @@ public abstract class EntityRepository { return RestUtil.getHref(uriInfo, collectionPath, id); } + @Transaction public PutResponse restoreEntity(String updatedBy, String entityType, UUID id) { // If an entity being restored contains other **deleted** children entities, restore them List records = @@ -1352,6 +1375,7 @@ public abstract class EntityRepository { addRelationship(fromId, toId, fromEntity, toEntity, relationship, null, bidirectional); } + @Transaction public void addRelationship( UUID fromId, UUID toId, @@ -1371,6 +1395,7 @@ public abstract class EntityRepository { daoCollection.relationshipDAO().insert(from, to, fromEntity, toEntity, relationship.ordinal(), json); } + @Transaction public final void bulkAddToRelationship( UUID fromId, List toId, String fromEntity, String toEntity, Relationship relationship) { daoCollection @@ -1577,6 +1602,7 @@ public abstract class EntityRepository { EntityUtil.copy(ref, owner); } + @Transaction protected void storeOwner(T entity, EntityReference owner) { if (supportsOwner && owner != null) { // Add relationship owner --- owns ---> ownedEntity @@ -1590,6 +1616,7 @@ public abstract class EntityRepository { } } + @Transaction protected void storeDomain(T entity, EntityReference domain) { if (supportsDomain && domain != null) { // Add relationship domain --- has ---> entity @@ -1598,6 +1625,7 @@ public abstract class EntityRepository { } } + @Transaction protected void storeDataProducts(T entity, List dataProducts) { if (supportsDataProducts && !nullOrEmpty(dataProducts)) { for (EntityReference dataProduct : dataProducts) { @@ -1609,6 +1637,7 @@ public abstract class EntityRepository { } } + @Transaction /** Remove owner relationship for a given entity */ private void removeOwner(T entity, EntityReference owner) { if (EntityUtil.getId(owner) != null) { @@ -1617,6 +1646,7 @@ public abstract class EntityRepository { } } + @Transaction public void updateOwner(T ownedEntity, EntityReference originalOwner, EntityReference newOwner) { // TODO inefficient use replace instead of delete and add and check for orig and new owners being the same validateOwner(newOwner); @@ -1779,6 +1809,7 @@ public abstract class EntityRepository { : getEntityByName(Entity.USER, updated.getUpdatedBy(), "", NON_DELETED); } + @Transaction /** Compare original and updated entities and perform updates. Update the entity version and track changes. */ public final void update() { if (operation.isDelete()) { // DELETE Operation diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityTimeSeriesRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityTimeSeriesRepository.java index 7b623a26e4b..234c7a3e74b 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityTimeSeriesRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/EntityTimeSeriesRepository.java @@ -2,6 +2,7 @@ package org.openmetadata.service.jdbi3; import java.util.UUID; import lombok.Getter; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityTimeSeriesInterface; import org.openmetadata.service.Entity; import org.openmetadata.service.search.SearchRepository; @@ -27,6 +28,7 @@ public abstract class EntityTimeSeriesRepository deletePost(Thread thread, Post post, String userName) { List posts = thread.getPosts(); // Remove the post to be deleted from the posts list @@ -442,12 +451,14 @@ public class FeedRepository { return new DeleteResponse<>(post, RestUtil.ENTITY_DELETED); } + @Transaction public DeleteResponse deleteThread(Thread thread, String deletedByUser) { deleteThreadInternal(thread.getId()); LOG.info("{} deleted thread with id {}", deletedByUser, thread.getId()); return new DeleteResponse<>(thread, RestUtil.ENTITY_DELETED); } + @Transaction public void deleteThreadInternal(UUID id) { // Delete all the relationships to other entities dao.relationshipDAO().deleteAll(id, Entity.THREAD); @@ -459,6 +470,7 @@ public class FeedRepository { dao.feedDAO().delete(id); } + @Transaction public void deleteByAbout(UUID entityId) { List threadIds = listOrEmpty(dao.feedDAO().findByEntityId(entityId.toString())); for (String threadId : threadIds) { @@ -611,6 +623,7 @@ public class FeedRepository { return new ResultList<>(threads, beforeCursor, afterCursor, total); } + @Transaction private void storeReactions(Thread thread, String user) { // Reactions are captured at the thread level. If the user reacted to a post of a thread, // it will still be tracked as "user reacted to thread" since this will only be used to filter diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java index 64ff994f614..35cd30ff1d0 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryRepository.java @@ -38,6 +38,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.csv.CsvUtil; import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.EntityInterface; @@ -270,6 +271,7 @@ public class GlossaryRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateReviewers(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java index 68ef5efc353..833eb6233b2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/GlossaryTermRepository.java @@ -36,6 +36,7 @@ import java.util.UUID; import javax.json.JsonPatch; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.data.TermReference; import org.openmetadata.schema.api.feed.CloseTask; @@ -368,6 +369,7 @@ public class GlossaryTermRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { validateParent(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/IngestionPipelineRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/IngestionPipelineRepository.java index d4535ec6d25..a995d25a395 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/IngestionPipelineRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/IngestionPipelineRepository.java @@ -17,6 +17,7 @@ import java.util.List; import java.util.UUID; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.json.JSONObject; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.services.ingestionPipelines.AirflowConfig; @@ -87,6 +88,7 @@ public class IngestionPipelineRepository extends EntityRepository { addRelationship(kpi.getId(), kpi.getDataInsightChart().getId(), KPI, DATA_INSIGHT_CHART, Relationship.USES); } + @Transaction public RestUtil.PutResponse addKpiResult(UriInfo uriInfo, String fqn, KpiResult kpiResult) { // Validate the request content Kpi kpi = dao.findEntityByName(fqn); @@ -114,6 +116,7 @@ public class KpiRepository extends EntityRepository { return new RestUtil.PutResponse<>(Response.Status.CREATED, changeEvent, RestUtil.ENTITY_FIELDS_CHANGED); } + @Transaction public RestUtil.PutResponse deleteKpiResult(String fqn, Long timestamp) { // Validate the request content Kpi kpi = dao.findEntityByName(fqn); @@ -185,6 +188,7 @@ public class KpiRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateToRelationship( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/LineageRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/LineageRepository.java index 3fdf1d2defc..369fb799d9d 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/LineageRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/LineageRepository.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.ColumnsEntityInterface; import org.openmetadata.schema.api.lineage.AddLineage; import org.openmetadata.schema.entity.data.Table; @@ -51,6 +52,7 @@ public class LineageRepository { return getLineage(ref, upstreamDepth, downstreamDepth); } + @Transaction public void addLineage(AddLineage addLineage) { // Validate from entity EntityReference from = addLineage.getEdge().getFromEntity(); @@ -119,6 +121,7 @@ public class LineageRepository { || !(to.getType().equals(Entity.TABLE) || to.getType().equals(Entity.DASHBOARD_DATA_MODEL)); } + @Transaction public boolean deleteLineage(String fromEntity, String fromId, String toEntity, String toId) { // Validate from entity EntityReference from = Entity.getEntityReferenceById(fromEntity, UUID.fromString(fromId), Include.NON_DELETED); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelRepository.java index c273455a882..9895e93c29c 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/MlModelRepository.java @@ -26,6 +26,7 @@ import static org.openmetadata.service.util.EntityUtil.mlHyperParameterMatch; import java.util.ArrayList; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.MlModel; @@ -325,6 +326,7 @@ public class MlModelRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateAlgorithm(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PersonaRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PersonaRepository.java index 223febb242b..680b47662d1 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PersonaRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PersonaRepository.java @@ -18,6 +18,7 @@ import static org.openmetadata.service.Entity.PERSONA; import java.util.List; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.teams.Persona; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Relationship; @@ -106,6 +107,7 @@ public class PersonaRepository extends EntityRepository { updateUsers(original, updated); } + @Transaction private void updateUsers(Persona origPersona, Persona updatedPersona) { List origUsers = listOrEmpty(origPersona.getUsers()); List updatedUsers = listOrEmpty(updatedPersona.getUsers()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java index d6bb03b41ec..936fc379e27 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PipelineRepository.java @@ -23,6 +23,7 @@ import static org.openmetadata.service.util.EntityUtil.taskMatch; import java.util.ArrayList; import java.util.List; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.Pipeline; @@ -341,6 +342,7 @@ public class PipelineRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateTasks(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PolicyRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PolicyRepository.java index 0403d618962..c3c8aa8fed5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PolicyRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/PolicyRepository.java @@ -30,6 +30,7 @@ import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.policies.Policy; import org.openmetadata.schema.entity.policies.accessControl.Rule; import org.openmetadata.schema.type.EntityReference; @@ -149,6 +150,7 @@ public class PolicyRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange(ENABLED, original.getEnabled(), updated.getEnabled()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/QueryRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/QueryRepository.java index 26fff1e7f60..d513af4c580 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/QueryRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/QueryRepository.java @@ -9,6 +9,7 @@ import java.util.*; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import lombok.SneakyThrows; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.data.Query; import org.openmetadata.schema.entity.services.DatabaseService; import org.openmetadata.schema.entity.teams.User; @@ -214,6 +215,7 @@ public class QueryRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateFromRelationships( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/RoleRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/RoleRepository.java index a0a432feddd..108a68e24b2 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/RoleRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/RoleRepository.java @@ -22,6 +22,7 @@ import java.util.ArrayList; import java.util.List; import lombok.NonNull; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.teams.Role; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.Relationship; @@ -123,6 +124,7 @@ public class RoleRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updatePolicies(listOrEmpty(original.getPolicies()), listOrEmpty(updated.getPolicies())); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchIndexRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchIndexRepository.java index 1a2a45cb3a6..618f5b9fec6 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchIndexRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SearchIndexRepository.java @@ -30,6 +30,7 @@ import java.util.UUID; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.stream.Collectors; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.SearchIndex; @@ -377,6 +378,7 @@ public class SearchIndexRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { if (updated.getFields() != null) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java index d7c8b2b66bf..61319a70415 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/ServiceEntityRepository.java @@ -16,6 +16,7 @@ import static org.openmetadata.service.util.EntityUtil.objectMatch; import java.util.UUID; import lombok.Getter; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.ServiceConnectionEntityInterface; import org.openmetadata.schema.ServiceEntityInterface; import org.openmetadata.schema.entity.services.ServiceType; @@ -111,6 +112,7 @@ public abstract class ServiceEntityRepository< super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateConnection(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java index c637e25a5d6..9470bda55b3 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/StoredProcedureRepository.java @@ -5,6 +5,7 @@ import static org.openmetadata.service.Entity.DATABASE_SCHEMA; import static org.openmetadata.service.Entity.FIELD_FOLLOWERS; import static org.openmetadata.service.Entity.STORED_PROCEDURE; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.DatabaseSchema; import org.openmetadata.schema.entity.data.StoredProcedure; @@ -116,6 +117,7 @@ public class StoredProcedureRepository extends EntityRepository super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { // storedProcedureCode is a required field. Cannot be null. diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SystemRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SystemRepository.java index 11ddb6d17ac..1047ae896ae 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SystemRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/SystemRepository.java @@ -6,6 +6,7 @@ import javax.json.JsonValue; import javax.ws.rs.core.Response; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.api.configuration.SlackAppConfiguration; import org.openmetadata.schema.email.SmtpSettings; import org.openmetadata.schema.settings.Settings; @@ -99,6 +100,7 @@ public class SystemRepository { return null; } + @Transaction public Response createOrUpdate(Settings setting) { Settings oldValue = getConfigWithKey(setting.getConfigType().toString()); try { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java index 988e302f748..239ed09b807 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TableRepository.java @@ -41,6 +41,7 @@ import java.util.stream.Stream; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Triple; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.data.CreateTableProfile; @@ -179,6 +180,7 @@ public class TableRepository extends EntityRepository { ColumnUtil.setColumnFQN(table.getFullyQualifiedName(), table.getColumns()); } + @Transaction public Table addJoins(UUID tableId, TableJoins joins) { // Validate the request content Table table = dao.findEntityById(tableId); @@ -210,6 +212,7 @@ public class TableRepository extends EntityRepository
{ return table.withJoins(getJoins(table)); } + @Transaction public Table addSampleData(UUID tableId, TableData tableData) { // Validate the request content Table table = dao.findEntityById(tableId); @@ -255,6 +258,7 @@ public class TableRepository extends EntityRepository
{ return table; } + @Transaction public Table deleteSampleData(UUID tableId) { // Validate the request content Table table = dao.findEntityById(tableId); @@ -284,6 +288,7 @@ public class TableRepository extends EntityRepository
{ .orElse(null); } + @Transaction public Table addTableProfilerConfig(UUID tableId, TableProfilerConfig tableProfilerConfig) { // Validate the request content Table table = dao.findEntityById(tableId); @@ -313,6 +318,7 @@ public class TableRepository extends EntityRepository
{ return table.withTableProfilerConfig(tableProfilerConfig); } + @Transaction public Table deleteTableProfilerConfig(UUID tableId) { // Validate the request content Table table = dao.findEntityById(tableId); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TagRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TagRepository.java index 929c205e453..b9e7a14f918 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TagRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TagRepository.java @@ -23,6 +23,7 @@ import java.util.Objects; import java.util.UUID; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.ImmutablePair; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.classification.Tag; import org.openmetadata.schema.type.EntityReference; import org.openmetadata.schema.type.ProviderType; @@ -135,6 +136,7 @@ public class TagRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("mutuallyExclusive", original.getMutuallyExclusive(), updated.getMutuallyExclusive()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java index c05ccd4dab7..1b3a17db507 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TeamRepository.java @@ -53,6 +53,7 @@ import java.util.stream.Collectors; import lombok.extern.slf4j.Slf4j; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.api.teams.CreateTeam.TeamType; @@ -664,6 +665,7 @@ public class TeamRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { if (original.getTeamType() != updated.getTeamType()) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java index e25fa09e6e9..73d2f4ff1ab 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestCaseRepository.java @@ -18,6 +18,7 @@ import java.util.stream.Collectors; import javax.json.JsonPatch; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.tests.ResultSummary; import org.openmetadata.schema.tests.TestCase; @@ -418,6 +419,7 @@ public class TestCaseRepository extends EntityRepository { } } + @Transaction public RestUtil.PutResponse addTestCasesToLogicalTestSuite(TestSuite testSuite, List testCaseIds) { bulkAddToRelationship(testSuite.getId(), testCaseIds, TEST_SUITE, TEST_CASE, Relationship.CONTAINS); List testCasesEntityReferences = new ArrayList<>(); @@ -459,6 +461,7 @@ public class TestCaseRepository extends EntityRepository { return new RestUtil.PutResponse<>(Response.Status.OK, testSuite, LOGICAL_TEST_CASES_ADDED); } + @Transaction public RestUtil.DeleteResponse deleteTestCaseFromLogicalTestSuite(UUID testSuiteId, UUID testCaseId) { TestCase testCase = Entity.getEntity(Entity.TEST_CASE, testCaseId, null, null); deleteRelationship(testSuiteId, TEST_SUITE, testCaseId, TEST_CASE, Relationship.CONTAINS); @@ -469,6 +472,7 @@ public class TestCaseRepository extends EntityRepository { return new RestUtil.DeleteResponse<>(testCase, RestUtil.ENTITY_DELETED); } + @Transaction /** Remove test case from test suite summary and update test suite */ private void removeTestCaseFromTestSuiteResultSummary(UUID testSuiteId, String testCaseFqn) { TestSuite testSuite = Entity.getEntity(TEST_SUITE, testSuiteId, "*", Include.ALL, false); @@ -569,6 +573,7 @@ public class TestCaseRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { EntityLink origEntityLink = EntityLink.parse(original.getEntityLink()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestConnectionDefinitionRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestConnectionDefinitionRepository.java index 6ff6cb1648c..aa069400c45 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestConnectionDefinitionRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestConnectionDefinitionRepository.java @@ -2,6 +2,7 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.service.Entity.TEST_CONNECTION_DEFINITION; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.common.utils.CommonUtil; import org.openmetadata.schema.entity.services.connections.TestConnectionDefinition; import org.openmetadata.service.Entity; @@ -76,6 +77,7 @@ public class TestConnectionDefinitionRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("testPlatforms", original.getTestPlatforms(), updated.getTestPlatforms()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java index f092094036d..b7e0eae832d 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TestSuiteRepository.java @@ -11,6 +11,7 @@ import java.util.Map; import java.util.UUID; import javax.ws.rs.core.SecurityContext; import lombok.extern.slf4j.Slf4j; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.data.Table; import org.openmetadata.schema.tests.ResultSummary; import org.openmetadata.schema.tests.TestCase; @@ -198,6 +199,7 @@ public class TestSuiteRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { List origTests = listOrEmpty(original.getTests()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TopicRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TopicRepository.java index c38dbd5594e..2c3a248e46e 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TopicRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TopicRepository.java @@ -30,6 +30,7 @@ import java.util.UUID; import java.util.function.BiPredicate; import java.util.function.Function; import java.util.stream.Collectors; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.api.feed.ResolveTask; import org.openmetadata.schema.entity.data.Topic; @@ -385,6 +386,7 @@ public class TopicRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("maximumMessageSize", original.getMaximumMessageSize(), updated.getMaximumMessageSize()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TypeRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TypeRepository.java index bfce528514f..c54fde50ed7 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TypeRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/TypeRepository.java @@ -28,6 +28,7 @@ import java.util.UUID; import javax.ws.rs.core.UriInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.tuple.Triple; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.Type; import org.openmetadata.schema.entity.type.Category; import org.openmetadata.schema.entity.type.CustomProperty; @@ -156,6 +157,7 @@ public class TypeRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateCustomProperties(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UsageRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UsageRepository.java index 3055a7e0d60..b0bdaa40620 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UsageRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UsageRepository.java @@ -28,6 +28,7 @@ import javax.ws.rs.core.Response; import lombok.extern.slf4j.Slf4j; import org.jdbi.v3.core.mapper.RowMapper; import org.jdbi.v3.core.statement.StatementContext; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.EntityInterface; import org.openmetadata.schema.entity.data.Chart; import org.openmetadata.schema.entity.data.Dashboard; @@ -71,28 +72,33 @@ public class UsageRepository { return new EntityUsage().withUsage(usageDetails).withEntity(ref); } + @Transaction public RestUtil.PutResponse create(String entityType, UUID id, DailyCount usage) { // Validate data entity for which usage is being collected Entity.getEntityReferenceById(entityType, id, Include.NON_DELETED); return addUsage(POST, entityType, id, usage); } + @Transaction public RestUtil.PutResponse createByName(String entityType, String fullyQualifiedName, DailyCount usage) { EntityReference ref = Entity.getEntityReferenceByName(entityType, fullyQualifiedName, Include.NON_DELETED); return addUsage(POST, entityType, ref.getId(), usage); } + @Transaction public RestUtil.PutResponse createOrUpdate(String entityType, UUID id, DailyCount usage) { // Validate data entity for which usage is being collected Entity.getEntityReferenceById(entityType, id, Include.NON_DELETED); return addUsage(PUT, entityType, id, usage); } + @Transaction public RestUtil.PutResponse createOrUpdateByName(String entityType, String fullyQualifiedName, DailyCount usage) { EntityReference ref = Entity.getEntityReferenceByName(entityType, fullyQualifiedName, Include.NON_DELETED); return addUsage(PUT, entityType, ref.getId(), usage); } + @Transaction public void computePercentile(String entityType, String date) { dao.usageDAO().computePercentile(entityType, date); } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java index 8095c058e63..10751e2faac 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/UserRepository.java @@ -37,6 +37,7 @@ import javax.ws.rs.core.UriInfo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.csv.CSVPrinter; import org.apache.commons.csv.CSVRecord; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.csv.EntityCsv; import org.openmetadata.schema.api.teams.CreateTeam.TeamType; import org.openmetadata.schema.entity.teams.AuthenticationMechanism; @@ -498,6 +499,7 @@ public class UserRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { updateRoles(original, updated); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/WorkflowRepository.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/WorkflowRepository.java index 5eb6fe9a730..11247a26711 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/WorkflowRepository.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/WorkflowRepository.java @@ -2,6 +2,7 @@ package org.openmetadata.service.jdbi3; import static org.openmetadata.service.Entity.WORKFLOW; +import org.jdbi.v3.sqlobject.transaction.Transaction; import org.openmetadata.schema.entity.automations.Workflow; import org.openmetadata.schema.services.connections.metadata.OpenMetadataConnection; import org.openmetadata.service.Entity; @@ -80,6 +81,7 @@ public class WorkflowRepository extends EntityRepository { super(original, updated, operation); } + @Transaction @Override public void entitySpecificUpdate() { recordChange("status", original.getStatus(), updated.getStatus()); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java deleted file mode 100644 index 77e2eba5eaa..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import java.util.concurrent.ThreadFactory; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.core.Jdbi; - -public interface JdbiHandleManager { - Jdbi getJdbi(); - - Handle get(); - - boolean handleExists(); - - void clear(); - - default ThreadFactory createThreadFactory() { - throw new UnsupportedOperationException("Thread factory creation is not supported"); - } - - default String getConversationId() { - return String.valueOf(Thread.currentThread().getId()); - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java deleted file mode 100644 index 76ad37a36ab..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java +++ /dev/null @@ -1,100 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import java.util.Collections; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import lombok.extern.slf4j.Slf4j; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.core.Handles; - -@Slf4j -public class JdbiTransactionManager { - private static JdbiTransactionManager instance; - private static volatile boolean initialized = false; - private final JdbiHandleManager handleManager; - private final Set IN_TRANSACTION_HANDLES = Collections.newSetFromMap(new ConcurrentHashMap<>()); - - private JdbiTransactionManager(JdbiHandleManager handleManager) { - this.handleManager = handleManager; - } - - public static void initialize(JdbiHandleManager handleManager) { - if (!initialized) { - instance = new JdbiTransactionManager(handleManager); - initialized = true; - } else { - LOG.info("Jdbi Transaction Manager is already initialized"); - } - } - - public static JdbiTransactionManager getInstance() { - return instance; - } - - public void begin(boolean autoCommit) { - try { - Handle handle = handleManager.get(); - if (!autoCommit) { - handle.getConnection().setAutoCommit(false); - handle.getConfig(Handles.class).setForceEndTransactions(false); - handle.begin(); - IN_TRANSACTION_HANDLES.add(handle.hashCode()); - LOG.debug( - "Begin Transaction Thread Id [{}] has handle id [{}] Transaction {} Level {}", - Thread.currentThread().getId(), - handle.hashCode(), - handle.isInTransaction(), - handle.getTransactionIsolationLevel()); - } - } catch (Exception ex) { - terminateHandle(); - } - } - - public void commit() { - if (handleManager.handleExists()) { - Handle handle = handleManager.get(); - try { - handle.getConnection().commit(); - LOG.debug( - "Performing commit Thread Id [{}] has handle id [{}] Transaction {} Level {}", - Thread.currentThread().getId(), - handle.hashCode(), - handle.isInTransaction(), - handle.getTransactionIsolationLevel()); - } catch (Exception ex) { - rollback(); - } - } - } - - public void rollback() { - if (handleManager.handleExists()) { - Handle handle = handleManager.get(); - if (handle == null) { - LOG.debug("Handle was found to be null during rollback for [{}]", Thread.currentThread().getId()); - return; - } - try { - handle.getConnection().rollback(); - LOG.debug( - "Performed rollback on Thread Id [{}] has handle id [{}] Transaction {} Level {}", - Thread.currentThread().getId(), - handle.hashCode(), - handle.isInTransaction(), - handle.getTransactionIsolationLevel()); - } catch (Exception e) { - LOG.debug("Failed to rollback transaction due to", e); - } finally { - terminateHandle(); - } - } - } - - public void terminateHandle() { - if (handleManager.handleExists()) { - IN_TRANSACTION_HANDLES.remove(handleManager.get().hashCode()); - handleManager.clear(); - } - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkApplicationEventListener.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkApplicationEventListener.java deleted file mode 100644 index e006042da65..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkApplicationEventListener.java +++ /dev/null @@ -1,33 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import java.util.Set; -import javax.annotation.Nullable; -import lombok.extern.slf4j.Slf4j; -import org.glassfish.jersey.server.monitoring.ApplicationEvent; -import org.glassfish.jersey.server.monitoring.ApplicationEventListener; -import org.glassfish.jersey.server.monitoring.RequestEvent; -import org.glassfish.jersey.server.monitoring.RequestEventListener; - -@Slf4j -public class JdbiUnitOfWorkApplicationEventListener implements ApplicationEventListener { - private final Set excludedPaths; - - public JdbiUnitOfWorkApplicationEventListener(Set excludedPaths) { - this.excludedPaths = excludedPaths; - } - - @Override - public void onEvent(ApplicationEvent event) { - LOG.debug("Received Application event {}", event.getType()); - } - - @Override - @Nullable - public RequestEventListener onRequest(RequestEvent event) { - String path = event.getUriInfo().getPath(); - if (excludedPaths.stream().anyMatch(path::contains)) { - return null; - } - return new NonHttpGetRequestJdbiUnitOfWorkEventListener(); - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkProvider.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkProvider.java deleted file mode 100644 index b30db8fe221..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiUnitOfWorkProvider.java +++ /dev/null @@ -1,69 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import com.google.common.reflect.Reflection; -import lombok.extern.slf4j.Slf4j; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.core.Jdbi; - -@Slf4j -@SuppressWarnings({"UnstableApiUsage", "rawtypes", "unchecked"}) -public class JdbiUnitOfWorkProvider { - private static JdbiUnitOfWorkProvider instance; - private static volatile boolean initialized = false; - private final JdbiHandleManager handleManager; - - private JdbiUnitOfWorkProvider(JdbiHandleManager handleManager) { - this.handleManager = handleManager; - } - - public static JdbiUnitOfWorkProvider withDefault(Jdbi dbi) { - return initialize(new RequestScopedJdbiHandleManager(dbi)); - } - - public static JdbiUnitOfWorkProvider withLinked(Jdbi dbi) { - return initialize(new LinkedRequestScopedJdbiHandleManager(dbi)); - } - - public static JdbiUnitOfWorkProvider getInstance() { - return instance; - } - - private static JdbiUnitOfWorkProvider initialize(JdbiHandleManager handleManager) { - if (!initialized) { - instance = new JdbiUnitOfWorkProvider(handleManager); - initialized = true; - } else { - LOG.info("JdbiUnitOfWorkProvider is already initialized"); - } - return instance; - } - - public JdbiHandleManager getHandleManager() { - return handleManager; - } - - public Handle getHandle() { - return handleManager.get(); - } - - /** - * getWrappedInstanceForDaoClass generates a proxy instance of the dao class for which the jdbi unit of work aspect - * would be wrapped around with. This method however may be used in case the classpath scanning is disabled. If the - * original class is null or contains no relevant JDBI annotations, this method throws an exception - * - * @param daoClass the DAO class for which a proxy needs to be created fo - * @return the wrapped instance ready to be passed around - */ - public static Object getWrappedInstanceForDaoClass(Class daoClass) { - if (daoClass == null) { - throw new IllegalArgumentException("DAO Class cannot be null"); - } - LOG.debug( - "Binding class [{}] with proxy handler [{}] ", - daoClass.getSimpleName(), - JdbiUnitOfWorkProvider.getInstance().getHandleManager().getClass().getSimpleName()); - ManagedHandleInvocationHandler handler = new ManagedHandleInvocationHandler<>(daoClass); - Object proxiedInstance = Reflection.newProxy(daoClass, handler); - return daoClass.cast(proxiedInstance); - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java deleted file mode 100644 index f19d52ae86a..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import com.google.common.util.concurrent.ThreadFactoryBuilder; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ThreadFactory; -import javax.annotation.Nullable; -import lombok.extern.slf4j.Slf4j; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.core.Jdbi; - -/** - * This implementation provides a handle scoped to a thread and all other threads Y spawned from X All Y threads must - * follow a particular name format extracted from the conversation id This is one of the ways the manager can know of - * the grouping and establish re-usability of handles across such grouped threads.
- *
- * It can be used to service requests where only a single handle instance has to be used by multiple threads that are - * spawned with the specified name format from an initial thread. Use this only when you have complete control over the - * threads you create. The threads must not run once the parent thread is returned to the pool or else the handles will - * be invalid or in other words parent thread must block on the results of children.
- * It relies on the fact that the {@code Jdbi.Handle} is inherently thread safe and can be used to service dao requests - * between multiple threads. Note: Not suitable when you can not set the name format for the newly spawned threads. - */ -@Slf4j -class LinkedRequestScopedJdbiHandleManager implements JdbiHandleManager { - - private final Map parentThreadHandleMap = new ConcurrentHashMap<>(); - private final Jdbi dbi; - - public LinkedRequestScopedJdbiHandleManager(Jdbi dbi) { - this.dbi = dbi; - } - - @Override - public Jdbi getJdbi() { - return dbi; - } - - @Override - public Handle get() { - String parent = substringBetween(Thread.currentThread().getName()); - Handle handle; - if (parent == null) { - handle = getHandle(); - LOG.debug("Owner of handle [{}] : Parent Thread Id [{}]", handle.hashCode(), Thread.currentThread().getId()); - - } else { - handle = parentThreadHandleMap.get(parent); - if (handle == null) { - throw new IllegalStateException( - String.format( - "Handle to be reused in child thread [%s] is null for parent thread [%s]", - Thread.currentThread().getId(), parent)); - } - LOG.debug("Reusing parent thread handle [{}] for [{}]", handle.hashCode(), Thread.currentThread().getId()); - } - return handle; - } - - @Override - public boolean handleExists() { - // TODO - return false; - } - - @Override - public void clear() { - String parent = getConversationId(); - Handle handle = parentThreadHandleMap.get(parent); - if (handle != null) { - handle.close(); - LOG.debug("Closed handle Thread Id [{}] has handle id [{}]", Thread.currentThread().getId(), handle.hashCode()); - - parentThreadHandleMap.remove(parent); - LOG.debug("Clearing handle member for parent thread [{}] ", Thread.currentThread().getId()); - } - } - - @Override - public ThreadFactory createThreadFactory() { - String threadName = String.format("[%s]-%%d", getConversationId()); - return new ThreadFactoryBuilder().setNameFormat(threadName).build(); - } - - private Handle getHandle() { - String threadIdentity = getConversationId(); - if (parentThreadHandleMap.containsKey(threadIdentity)) { - return parentThreadHandleMap.get(threadIdentity); - } - Handle handle = dbi.open(); - parentThreadHandleMap.putIfAbsent(threadIdentity, handle); - return handle; - } - - @Nullable - private String substringBetween(String threadName) { - final int start = threadName.indexOf("["); - if (start != -1) { - final int end = threadName.indexOf("]", start + "[".length()); - if (end != -1) { - return threadName.substring(start + "[".length(), end); - } - } - return null; - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java deleted file mode 100644 index d54e347df5f..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java +++ /dev/null @@ -1,83 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import static org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider.getWrappedInstanceForDaoClass; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import lombok.extern.slf4j.Slf4j; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.sqlobject.CreateSqlObject; -import org.openmetadata.service.jdbi3.CollectionDAO; - -@Slf4j -public class ManagedHandleInvocationHandler implements InvocationHandler { - private static final Object[] NO_ARGS = {}; - private final Class underlying; - - public ManagedHandleInvocationHandler(Class underlying) { - this.underlying = underlying; - } - - /** - * {@inheritDoc} - * - *
    - *
  • {@code proxy.toString()} delegates to {@link ManagedHandleInvocationHandler#toString} - *
  • other method calls are dispatched to {@link ManagedHandleInvocationHandler#handleInvocation}. - *
- */ - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - if (args == null) { - args = NO_ARGS; - } - if (args.length == 0 && method.getName().equals("toString")) { - return toString(); - } - return handleInvocation(method, args); - } - - private Object handleInvocation(Method method, Object[] args) throws Throwable { - if (CollectionDAO.class.isAssignableFrom(underlying) && method.isAnnotationPresent(CreateSqlObject.class)) { - return getWrappedInstanceForDaoClass(method.getReturnType()); - } else { - Object dao; - Object result; - if (JdbiUnitOfWorkProvider.getInstance().getHandleManager().handleExists()) { - Handle handle = JdbiUnitOfWorkProvider.getInstance().getHandle(); - LOG.debug( - "{}.{} [{}] Thread Id [{}] with handle id [{}]", - method.getDeclaringClass().getSimpleName(), - method.getName(), - underlying.getSimpleName(), - Thread.currentThread().getId(), - handle.hashCode()); - - dao = handle.attach(underlying); - result = invokeMethod(method, dao, args); - } else { - // This is non-transactional request - Handle handle = JdbiUnitOfWorkProvider.getInstance().getHandleManager().getJdbi().open(); - try (handle) { - handle.getConnection().setAutoCommit(true); - dao = handle.attach(underlying); - result = invokeMethod(method, dao, args); - } - } - return result; - } - } - - private Object invokeMethod(Method method, Object dao, Object[] args) throws Throwable { - try { - return method.invoke(dao, args); - } catch (Exception ex) { - throw ex.getCause(); - } - } - - @Override - public String toString() { - return "Proxy[" + underlying.getSimpleName() + "]"; - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/NonHttpGetRequestJdbiUnitOfWorkEventListener.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/NonHttpGetRequestJdbiUnitOfWorkEventListener.java deleted file mode 100644 index d5804d63e0f..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/NonHttpGetRequestJdbiUnitOfWorkEventListener.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import javax.ws.rs.HttpMethod; -import lombok.extern.slf4j.Slf4j; -import org.glassfish.jersey.server.monitoring.RequestEvent; -import org.glassfish.jersey.server.monitoring.RequestEventListener; - -@Slf4j -class NonHttpGetRequestJdbiUnitOfWorkEventListener implements RequestEventListener { - - NonHttpGetRequestJdbiUnitOfWorkEventListener() {} - - @Override - public void onEvent(RequestEvent event) { - RequestEvent.Type type = event.getType(); - String httpMethod = event.getContainerRequest().getMethod(); - - LOG.debug("Handling {} Request Event {} {}", httpMethod, type, Thread.currentThread().getId()); - boolean isTransactional = isTransactional(event); - if (isTransactional) { - if (type == RequestEvent.Type.RESOURCE_METHOD_START) { - JdbiTransactionManager.getInstance().begin(false); - } else if (type == RequestEvent.Type.RESP_FILTERS_START) { - JdbiTransactionManager.getInstance().commit(); - } else if (type == RequestEvent.Type.ON_EXCEPTION) { - JdbiTransactionManager.getInstance().rollback(); - } else if (type == RequestEvent.Type.FINISHED) { - JdbiTransactionManager.getInstance().terminateHandle(); - } - } - } - - private boolean isTransactional(RequestEvent event) { - String httpMethod = event.getContainerRequest().getMethod(); - return httpMethod.equals(HttpMethod.POST) - || httpMethod.equals(HttpMethod.PUT) - || httpMethod.equals(HttpMethod.PATCH) - || httpMethod.equals(HttpMethod.DELETE); - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java deleted file mode 100644 index 4858404918f..00000000000 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java +++ /dev/null @@ -1,49 +0,0 @@ -package org.openmetadata.service.jdbi3.unitofwork; - -import lombok.extern.slf4j.Slf4j; -import org.jdbi.v3.core.Handle; -import org.jdbi.v3.core.Jdbi; - -@Slf4j -class RequestScopedJdbiHandleManager implements JdbiHandleManager { - private final Jdbi dbi; - - @SuppressWarnings("ThreadLocalUsage") - private final ThreadLocal threadLocal = new ThreadLocal<>(); - - public RequestScopedJdbiHandleManager(Jdbi dbi) { - this.dbi = dbi; - } - - @Override - public Jdbi getJdbi() { - return dbi; - } - - @Override - public Handle get() { - if (threadLocal.get() == null) { - threadLocal.set(dbi.open()); - } - Handle handle = threadLocal.get(); - LOG.debug("handle [{}] : Thread Id [{}]", handle.hashCode(), Thread.currentThread().getId()); - return handle; - } - - @Override - public boolean handleExists() { - return threadLocal.get() != null; - } - - @Override - public void clear() { - Handle handle = threadLocal.get(); - if (handle != null) { - handle.close(); - LOG.debug("Closed handle Thread Id [{}] has handle id [{}]", Thread.currentThread().getId(), handle.hashCode()); - - threadLocal.remove(); - LOG.debug("Clearing handle member for thread [{}] ", Thread.currentThread().getId()); - } - } -} diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/resources/apps/AppResource.java b/openmetadata-service/src/main/java/org/openmetadata/service/resources/apps/AppResource.java index 4727af2c9bf..0c91f87cb74 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/resources/apps/AppResource.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/resources/apps/AppResource.java @@ -58,7 +58,6 @@ import org.openmetadata.service.clients.pipeline.PipelineServiceClientFactory; import org.openmetadata.service.jdbi3.AppRepository; import org.openmetadata.service.jdbi3.CollectionDAO; import org.openmetadata.service.jdbi3.ListFilter; -import org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider; import org.openmetadata.service.resources.Collection; import org.openmetadata.service.resources.EntityResource; import org.openmetadata.service.search.SearchRepository; @@ -89,7 +88,7 @@ public class AppResource extends EntityResource { PipelineServiceClientFactory.createPipelineServiceClient(config.getPipelineServiceClientConfiguration()); // Create an On Demand DAO - CollectionDAO dao = JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class); + CollectionDAO dao = Entity.getCollectionDAO(); searchRepository = new SearchRepository(config.getElasticSearchConfiguration()); try { @@ -119,10 +118,7 @@ public class AppResource extends EntityResource { // Schedule if (app != null && app.getScheduleType().equals(ScheduleType.Scheduled)) { - ApplicationHandler.scheduleApplication( - app, - JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class), - searchRepository); + ApplicationHandler.scheduleApplication(app, Entity.getCollectionDAO(), searchRepository); } } catch (Exception ex) { @@ -373,10 +369,7 @@ public class AppResource extends EntityResource { uriInfo, create.getName(), new EntityUtil.Fields(repository.getMarketPlace().getAllowedFields())); App app = getApplication(definition, create, securityContext.getUserPrincipal().getName()); if (app.getScheduleType().equals(ScheduleType.Scheduled)) { - ApplicationHandler.scheduleApplication( - app, - JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class), - searchRepository); + ApplicationHandler.scheduleApplication(app, Entity.getCollectionDAO(), searchRepository); } return create(uriInfo, securityContext, app); } @@ -427,10 +420,7 @@ public class AppResource extends EntityResource { App app = getApplication(definition, create, securityContext.getUserPrincipal().getName()); AppScheduler.getInstance().deleteScheduledApplication(app); if (app.getScheduleType().equals(ScheduleType.Scheduled)) { - ApplicationHandler.scheduleApplication( - app, - JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class), - searchRepository); + ApplicationHandler.scheduleApplication(app, Entity.getCollectionDAO(), searchRepository); } return createOrUpdate(uriInfo, securityContext, app); } @@ -513,10 +503,7 @@ public class AppResource extends EntityResource { @Context SecurityContext securityContext) { App app = repository.getByName(uriInfo, name, new EntityUtil.Fields(repository.getAllowedFields())); if (app.getScheduleType().equals(ScheduleType.Scheduled)) { - ApplicationHandler.scheduleApplication( - app, - JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class), - searchRepository); + ApplicationHandler.scheduleApplication(app, Entity.getCollectionDAO(), searchRepository); Response.status(Response.Status.OK).entity("App Scheduled to Scheduler successfully."); } throw new IllegalArgumentException("App is not of schedule type Scheduled."); @@ -542,10 +529,7 @@ public class AppResource extends EntityResource { EntityUtil.Fields fields = getFields(String.format("%s,%s", FIELD_OWNER, "bot")); App app = repository.getByName(uriInfo, name, fields); if (app.getAppType().equals(AppType.Internal)) { - ApplicationHandler.triggerApplicationOnDemand( - app, - JdbiUnitOfWorkProvider.getInstance().getHandle().getJdbi().onDemand(CollectionDAO.class), - searchRepository); + ApplicationHandler.triggerApplicationOnDemand(app, Entity.getCollectionDAO(), searchRepository); return Response.status(Response.Status.OK).entity("Application Triggered").build(); } else { app.setOpenMetadataServerConnection( diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/util/NotificationHandler.java b/openmetadata-service/src/main/java/org/openmetadata/service/util/NotificationHandler.java index b91dc879c70..de9b274946f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/util/NotificationHandler.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/util/NotificationHandler.java @@ -15,7 +15,6 @@ package org.openmetadata.service.util; import static org.openmetadata.service.Entity.TEAM; import static org.openmetadata.service.Entity.USER; -import static org.openmetadata.service.jdbi3.unitofwork.JdbiUnitOfWorkProvider.getWrappedInstanceForDaoClass; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; @@ -58,7 +57,7 @@ public class NotificationHandler { threadScheduler.submit( () -> { try { - CollectionDAO collectionDAO = (CollectionDAO) getWrappedInstanceForDaoClass(CollectionDAO.class); + CollectionDAO collectionDAO = Entity.getCollectionDAO(); handleNotifications(responseContext, collectionDAO); } catch (Exception ex) { LOG.error("[NotificationHandler] Failed to use mapper in converting to Json", ex);