Apache Atlas源码跟踪-entity的relationship属性逻辑删除问题

一、问题描述

atlasEntity实体的relationship属性更新(删除)操作,Apache Atlas默认是逻辑删除,查询会携带relationship的状态:
在这里插入图片描述
业务要求达到物理删除。

二、解决思路

2.1 服务端修改(采纳)

先debug看下删除逻辑,如果有预留的物理删除操作,则直接替换;如果没有,则考虑修改源码添加删除操作;

2.2 应用端修改

在业务系统的应用端把所有DELETED状态的数据过滤掉返回;虽然这个办法最省力,但是效率是最差的,属于没办法的办法,优先级最低。

三、解决方案

3.1 前置代码逻辑

由于上篇文章侧重点是新建entity的relationship问题,本篇是修改,前置逻辑一样,就不在使用冗余信息了,参考上篇文章:Apache Atlas 源码跟踪和修改- entity的relationship查询无序问题

3.2 relationship核心更新代码

3.2.1 删除旧元素入口:

package:org.apache.atlas.repository.store.graph.v2
class:EntityGraphMapper
method:mapArrayValue
在这里插入图片描述

3.2.1 遍历删除无用元素:

package:org.apache.atlas.repository.store.graph.v2
class:EntityGraphMapper
method:removeUnusedArrayEntries
蓝框:从当前元素集合中取出新元素集合中不存在的元素,即需要删除的元素。
红框:进行删除的地方
在这里插入图片描述

3.2.2 删除"边"数据:

package:org.apache.atlas.repository.store.graph.v1
class:DeleteHandlerV1
method:deleteEdgeReference
问题的重点来了,有两个删除Handler,即两个删除模式,一个是逻辑删除sort,一个是物理删除hard。接下来的问题就好办了,找到获取DeleteHandler实现类的地方,进行修改即可。
在这里插入图片描述

3.2.3 获取DeleteHandler:

回到3.2.1:deleteDelegate.getHandler().deleteEdgeReference
package:org.apache.atlas.repository.store.graph.v1
class:DeleteHandlerDelegate
method:getHandler
1、简单介绍RequestContext:atlas请求的上下文,内部维护了一个ThreadLocal<RequestContext>;经过测试,在业务应用端,调用RequestContext.get().setDeleteType(DeleteType.HARD)无效
2、由于请求时没有设置RequestContext的deleteType,所以会获取到默认DeleteHandler
在这里插入图片描述

3.2.4 获取DefalutDeleteHandler:

1、在构造函数里初始化DefalutDeleteHandler;
package:org.apache.atlas.repository.store.graph.v1
class:DeleteHandlerDelegate
method:DeleteHandlerDelegate
在这里插入图片描述
2、获取DefalutDeleteHandler:
package:org.apache.atlas.repository.store.graph.v1
class:DeleteHandlerDelegate
method:getDefaultConfiguredHandler
默认返回逻辑删除SoftDeleteHandlerV1
在这里插入图片描述
3、实际获取DefalutDeleteHandler:
package:org.apache.atlas.util
class:AtlasRepositoryConfiguration
method:getDeleteHandlerV1Impl
红框代表从atlas-application.properties配置文件获取DeleteHandler;
蓝框代表默认值,即逻辑删除;
在这里插入图片描述

3.3 最终方案

修改atlas-application.properties配置文件atlas.DeleteHandlerV1.impl变量,重启atlas-server:
在这里插入图片描述
注意两点:atlas.DeleteHandlerV1.impl默认是被注释的;变量值默认是逻辑删除SoftDeleteHandlerV1

四、小结

1、relationship是物理删除or逻辑删除的重点是获取对应的DeleteHandler;
2、通过修改atlas-application.properties配置文件的atlas.DeleteHandlerV1.impl变量,设置DefaultDeleteHandler;
3、atlas的entity有如下状态:ACTIVE, DELETED, PURGED。
官方注释:Status of the entity - can be active or deleted. Deleted entities are not removed from Atlas store.
所以relationship属性中,还返回DELETED状态的数据,其实是atlas的设计。

萌新发言,不喜勿喷,欢迎大佬指出不当之处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值