Commit eb98bfe7 by Suma Shivaprasad

ATLAS-1122 Change trait edge labels to have trait name alone (sumasai)

parent 6fddccd6
...@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES: ...@@ -6,6 +6,7 @@ INCOMPATIBLE CHANGES:
ATLAS-1060 Add composite indexes for exact match performance improvements for all attributes (sumasai via shwethags) ATLAS-1060 Add composite indexes for exact match performance improvements for all attributes (sumasai via shwethags)
ALL CHANGES: ALL CHANGES:
ATLAS-1122 Change trait edge labels to have trait name alone (sumasai)
ATLAS-1121 NPE while submitting topology in StormHook (ayubkhan via sumasai) ATLAS-1121 NPE while submitting topology in StormHook (ayubkhan via sumasai)
ATLAS-1119 Add retries for edge label creation (sumasai via shwethags) ATLAS-1119 Add retries for edge label creation (sumasai via shwethags)
ATLAS-1111 Data loss is observed when atlas is restarted while hive_table metadata ingestion into kafka topic is in-progress(shwethags via sumasai) ATLAS-1111 Data loss is observed when atlas is restarted while hive_table metadata ingestion into kafka topic is in-progress(shwethags via sumasai)
......
...@@ -433,7 +433,7 @@ public final class GraphHelper { ...@@ -433,7 +433,7 @@ public final class GraphHelper {
} }
public static String getTraitLabel(String typeName, String attrName) { public static String getTraitLabel(String typeName, String attrName) {
return typeName + "." + attrName; return attrName;
} }
public static List<String> getTraitNames(Vertex entityVertex) { public static List<String> getTraitNames(Vertex entityVertex) {
......
...@@ -203,7 +203,7 @@ object GraphPersistenceStrategy1 extends GraphPersistenceStrategies { ...@@ -203,7 +203,7 @@ object GraphPersistenceStrategy1 extends GraphPersistenceStrategies {
val fieldPrefixInSelect = "it" val fieldPrefixInSelect = "it"
def traitLabel(cls: IDataType[_], traitName: String) = s"${cls.getName}.$traitName" def traitLabel(cls: IDataType[_], traitName: String) = s"$traitName"
def fieldNameInVertex(dataType: IDataType[_], aInfo: AttributeInfo) = GraphHelper.getQualifiedFieldName(dataType, aInfo.name) def fieldNameInVertex(dataType: IDataType[_], aInfo: AttributeInfo) = GraphHelper.getQualifiedFieldName(dataType, aInfo.name)
......
...@@ -43,6 +43,7 @@ import org.apache.atlas.typesystem.Struct; ...@@ -43,6 +43,7 @@ import org.apache.atlas.typesystem.Struct;
import org.apache.atlas.typesystem.exception.EntityNotFoundException; import org.apache.atlas.typesystem.exception.EntityNotFoundException;
import org.apache.atlas.typesystem.exception.TraitNotFoundException; import org.apache.atlas.typesystem.exception.TraitNotFoundException;
import org.apache.atlas.typesystem.persistence.Id; import org.apache.atlas.typesystem.persistence.Id;
import org.apache.atlas.typesystem.types.AttributeDefinition;
import org.apache.atlas.typesystem.types.ClassType; import org.apache.atlas.typesystem.types.ClassType;
import org.apache.atlas.typesystem.types.DataTypes; import org.apache.atlas.typesystem.types.DataTypes;
import org.apache.atlas.typesystem.types.HierarchicalTypeDefinition; import org.apache.atlas.typesystem.types.HierarchicalTypeDefinition;
...@@ -77,6 +78,7 @@ import static org.apache.atlas.typesystem.types.utils.TypesUtil.createClassTypeD ...@@ -77,6 +78,7 @@ import static org.apache.atlas.typesystem.types.utils.TypesUtil.createClassTypeD
import static org.apache.atlas.typesystem.types.utils.TypesUtil.createUniqueRequiredAttrDef; import static org.apache.atlas.typesystem.types.utils.TypesUtil.createUniqueRequiredAttrDef;
import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNotEquals; import static org.testng.Assert.assertNotEquals;
import static org.testng.Assert.assertNotNull;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;
/** /**
...@@ -136,31 +138,35 @@ public class GraphBackedMetadataRepositoryTest { ...@@ -136,31 +138,35 @@ public class GraphBackedMetadataRepositoryTest {
@Test @Test
//In some cases of parallel APIs, the edge is added, but get edge by label doesn't return the edge. ATLAS-1104 //In some cases of parallel APIs, the edge is added, but get edge by label doesn't return the edge. ATLAS-1104
public void testConcurrentCalls() throws Exception { public void testConcurrentCalls() throws Exception {
Referenceable dbInstance = new Referenceable(TestUtils.DATABASE_TYPE); final HierarchicalTypeDefinition<ClassType> refType =
dbInstance.set("name", randomString()); createClassTypeDef(randomString(), ImmutableSet.<String>of());
dbInstance.set("description", "foo database"); HierarchicalTypeDefinition<ClassType> type =
final String id1 = createEntity(dbInstance).get(0); createClassTypeDef(randomString(), ImmutableSet.<String>of(),
new AttributeDefinition("ref", refType.typeName, Multiplicity.OPTIONAL, true, null));
typeSystem.defineClassType(refType);
typeSystem.defineClassType(type);
String refId1 = createEntity(new Referenceable(refType.typeName)).get(0);
String refId2 = createEntity(new Referenceable(refType.typeName)).get(0);
dbInstance.set("name", randomString()); final Referenceable instance1 = new Referenceable(type.typeName);
final String id2 = createEntity(dbInstance).get(0); instance1.set("ref", new Referenceable(refId1, refType.typeName, null));
TraitType piiType = typeSystem.getDataType(TraitType.class, TestUtils.PII); final Referenceable instance2 = new Referenceable(type.typeName);
final ITypedStruct trait = piiType.convert(new Struct(TestUtils.PII), Multiplicity.REQUIRED); instance2.set("ref", new Referenceable(refId2, refType.typeName, null));
ExecutorService executor = Executors.newFixedThreadPool(3); ExecutorService executor = Executors.newFixedThreadPool(3);
List<Future<Object>> futures = new ArrayList<>(); List<Future<Object>> futures = new ArrayList<>();
futures.add(executor.submit(new Callable<Object>() { futures.add(executor.submit(new Callable<Object>() {
@Override @Override
public Object call() throws Exception { public Object call() throws Exception {
repositoryService.addTrait(id1, trait); return createEntity(instance1).get(0);
return null;
} }
})); }));
futures.add(executor.submit(new Callable<Object>() { futures.add(executor.submit(new Callable<Object>() {
@Override @Override
public Object call() throws Exception { public Object call() throws Exception {
repositoryService.addTrait(id2, trait); return createEntity(instance2).get(0);
return null;
} }
})); }));
futures.add(executor.submit(new Callable<Object>() { futures.add(executor.submit(new Callable<Object>() {
...@@ -170,25 +176,23 @@ public class GraphBackedMetadataRepositoryTest { ...@@ -170,25 +176,23 @@ public class GraphBackedMetadataRepositoryTest {
} }
})); }));
for (Future future : futures) { String id1 = (String) futures.get(0).get();
future.get(); String id2 = (String) futures.get(1).get();
} futures.get(2).get();
executor.shutdown(); executor.shutdown();
boolean validated1 = assertEdge(id1); boolean validated1 = assertEdge(id1, type.typeName);
boolean validated2 = assertEdge(id2); boolean validated2 = assertEdge(id2, type.typeName);
assertNotEquals(validated1, validated2); assertTrue(validated1 | validated2);
} }
private boolean assertEdge(String id) throws Exception { private boolean assertEdge(String id, String typeName) throws Exception {
TitanGraph graph = graphProvider.get(); TitanGraph graph = graphProvider.get();
Vertex vertex = graph.query().has(Constants.GUID_PROPERTY_KEY, id).vertices().iterator().next(); Vertex vertex = graph.query().has(Constants.GUID_PROPERTY_KEY, id).vertices().iterator().next();
Iterable<Edge> edges = Iterable<Edge> edges = vertex.getEdges(Direction.OUT, Constants.INTERNAL_PROPERTY_KEY_PREFIX + typeName + ".ref");
vertex.getEdges(Direction.OUT, TestUtils.DATABASE_TYPE + "." + TestUtils.PII); if (!edges.iterator().hasNext()) {
if(!edges.iterator().hasNext()) { ITypedReferenceableInstance entity = repositoryService.getEntityDefinition(id);
repositoryService.deleteTrait(id, TestUtils.PII); assertNotNull(entity.get("ref"));
List<String> traits = repositoryService.getTraitNames(id);
assertTrue(traits.isEmpty());
return true; return true;
} }
return false; return false;
...@@ -237,7 +241,7 @@ public class GraphBackedMetadataRepositoryTest { ...@@ -237,7 +241,7 @@ public class GraphBackedMetadataRepositoryTest {
public void testGetTraitLabel() throws Exception { public void testGetTraitLabel() throws Exception {
Assert.assertEquals( Assert.assertEquals(
repositoryService.getTraitLabel(typeSystem.getDataType(ClassType.class, TestUtils.TABLE_TYPE), repositoryService.getTraitLabel(typeSystem.getDataType(ClassType.class, TestUtils.TABLE_TYPE),
TestUtils.CLASSIFICATION), TestUtils.TABLE_TYPE + "." + TestUtils.CLASSIFICATION); TestUtils.CLASSIFICATION), TestUtils.CLASSIFICATION);
} }
@Test @Test
......
...@@ -125,7 +125,7 @@ object HiveTitanSample { ...@@ -125,7 +125,7 @@ object HiveTitanSample {
if (traits.isDefined) { if (traits.isDefined) {
traits.get foreach { t => traits.get foreach { t =>
t.toGSon(vertices, edges) t.toGSon(vertices, edges)
addEdge(t, s"${this.getClass.getSimpleName}.${t.getClass.getSimpleName}", edges) addEdge(t, s"${t.getClass.getSimpleName}", edges)
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment