ATLAS-3227: fixed removal of indexes while deleting typedefs
(cherry picked from commit e4f0b09e216360022f004126efcc2670c1038136)
(cherry picked from commit d887d8aef09bf8c6ceb9e4af9758d2bf7342c5df)
diff --git a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
index 4327d77..02bc7d6 100755
--- a/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
+++ b/repository/src/main/java/org/apache/atlas/repository/graph/GraphBackedSearchIndexer.java
@@ -176,7 +176,7 @@
// Invalidate the property key for deleted types
if (CollectionUtils.isNotEmpty(changedTypeDefs.getDeletedTypeDefs())) {
for (AtlasBaseTypeDef typeDef : changedTypeDefs.getDeletedTypeDefs()) {
- cleanupIndices(management, typeDef);
+ deleteIndexForType(management, typeDef);
}
}
@@ -319,6 +319,27 @@
}
}
+ private void deleteIndexForType(AtlasGraphManagement management, AtlasBaseTypeDef typeDef) {
+ Preconditions.checkNotNull(typeDef, "Cannot process null typedef");
+
+ if (LOG.isDebugEnabled()) {
+ LOG.debug("Deleting indexes for type {}", typeDef.getName());
+ }
+
+ if (typeDef instanceof AtlasStructDef) {
+ AtlasStructDef structDef = (AtlasStructDef) typeDef;
+ List<AtlasAttributeDef> attributeDefs = structDef.getAttributeDefs();
+
+ if (CollectionUtils.isNotEmpty(attributeDefs)) {
+ for (AtlasAttributeDef attributeDef : attributeDefs) {
+ deleteIndexForAttribute(management, typeDef.getName(), attributeDef);
+ }
+ }
+ }
+
+ LOG.info("Completed deleting indexes for type {}", typeDef.getName());
+ }
+
private void createIndexForAttribute(AtlasGraphManagement management, String typeName, AtlasAttributeDef attributeDef) {
final String propertyName = AtlasGraphUtilsV2.encodePropertyKey(typeName + "." + attributeDef.getName());
AtlasCardinality cardinality = toAtlasCardinality(attributeDef.getCardinality());
@@ -393,6 +414,20 @@
}
}
+ private void deleteIndexForAttribute(AtlasGraphManagement management, String typeName, AtlasAttributeDef attributeDef) {
+ final String propertyName = AtlasGraphUtilsV2.encodePropertyKey(typeName + "." + attributeDef.getName());
+
+ try {
+ if (management.containsPropertyKey(propertyName)) {
+ LOG.info("Deleting propertyKey {}, for attribute {}.{}", propertyName, typeName, attributeDef.getName());
+
+ management.deletePropertyKey(propertyName);
+ }
+ } catch (Exception excp) {
+ LOG.warn("Failed to delete propertyKey {}, for attribute {}.{}", propertyName, typeName, attributeDef.getName());
+ }
+ }
+
private void createLabelIfNeeded(final AtlasGraphManagement management, final String propertyName, final String attribTypeName) {
// If any of the referenced typename is of type Entity or Struct then the edge label needs to be created
for (String typeName : AtlasTypeUtil.getReferencedTypeNames(attribTypeName)) {
@@ -718,61 +753,6 @@
}
}
- private void cleanupIndices(AtlasGraphManagement management, AtlasBaseTypeDef typeDef) {
- Preconditions.checkNotNull(typeDef, "Cannot process null typedef");
- if (LOG.isDebugEnabled()) {
- LOG.debug("Cleaning up index for {}", typeDef);
- }
-
- if (typeDef instanceof AtlasEnumDef) {
- // Only handle complex types like Struct, Classification and Entity
- return;
- }
-
- if (typeDef instanceof AtlasStructDef) {
- AtlasStructDef structDef = (AtlasStructDef) typeDef;
- List<AtlasAttributeDef> attributeDefs = structDef.getAttributeDefs();
- if (CollectionUtils.isNotEmpty(attributeDefs)) {
- for (AtlasAttributeDef attributeDef : attributeDefs) {
- cleanupIndexForAttribute(management, typeDef.getName(), attributeDef);
- }
- }
- } else if (!AtlasTypeUtil.isBuiltInType(typeDef.getName())){
- throw new IllegalArgumentException("bad data type" + typeDef.getName());
- }
- }
-
- private void cleanupIndexForAttribute(AtlasGraphManagement management, String typeName, AtlasAttributeDef attributeDef) {
- final String propertyName = AtlasGraphUtilsV2.encodePropertyKey(typeName + "." + attributeDef.getName());
- String attribTypeName = attributeDef.getTypeName();
- boolean isBuiltInType = AtlasTypeUtil.isBuiltInType(attribTypeName);
- boolean isArrayType = isArrayType(attribTypeName);
- boolean isMapType = isMapType(attribTypeName);
-
- try {
- AtlasType atlasType = typeRegistry.getType(attribTypeName);
-
- if (isClassificationType(atlasType) || isEntityType(atlasType)) {
- LOG.warn("Ignoring non-indexable attribute {}", attribTypeName);
- } else if (isBuiltInType || isEnumType(atlasType) || isArrayType || isMapType) {
- cleanupIndex(management, propertyName);
- } else if (isStructType(atlasType)) {
- AtlasStructDef structDef = typeRegistry.getStructDefByName(attribTypeName);
- cleanupIndices(management, structDef);
- }
- } catch (AtlasBaseException e) {
- LOG.error("No type exists for {}", attribTypeName, e);
- }
- }
-
- private void cleanupIndex(AtlasGraphManagement management, String propertyKey) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("Invalidating property key = {}", propertyKey);
- }
-
- management.deletePropertyKey(propertyKey);
- }
-
private void attemptRollback(ChangedTypeDefs changedTypeDefs, AtlasGraphManagement management)
throws AtlasBaseException {
if (null != management) {