dremio ControlsInjector 简单说明
ControlsInjector 在dremio 中的使用特别多,各种执行任务中都能看到它的影子
参考使用到的类
从下图可以看到使用到ControlsInjector的地方特别多,比如命令创建,fragment启动,dremio 的sql 优化器
参考实现
如下图是目前的实现类,包含了一个无操作的,已经需要执行一些操作的(具体执行的需要jvm 启动的时候配置-ea 开启assert 功能)
参考使用
比如CommandCreator 中就用到了,尽管默认是空操作
- 参考使用
public CommandRunner<?> toCommand() throws ForemanException {
// 进行check command 是否重复执行,
injector.injectChecked(context.getExecutionControls(), "run-try-beginning", ForemanException.class);
如果是包含了断言的重复执行会有异常的,同时服务会有异常抛出
说明
dremio 的ControlsInjector 比较方便进行系统的debug,我们只需要开启jvm assert 就可以方便的进行系统运行状态的check,默认无操作
对于是否开启assert 的check 处理
// 如果开启了 isAssertEnabled0 返回为true,否则jvm 忽略assert 那行代码的执行
private static boolean isAssertEnabled0() {
// Using side-effect to set isAssertEnabled if assertions are enabled
boolean isAssertEnabled = false;
assert isAssertEnabled = true;
return isAssertEnabled;
}
基于assert开关特性是一种不错的调试手段,我们通过简单的配置就可以方便了解系统的运行状态时候符合预期
参考资料
sabot/kernel/src/main/java/com/dremio/exec/testing/ControlsInjectorFactory.java
common/legacy/src/main/java/com/dremio/common/VM.java
sabot/kernel/src/main/java/com/dremio/exec/testing/ControlsInjector.java
sabot/kernel/src/main/java/com/dremio/exec/testing/ExecutionControls.java
sabot/kernel/src/main/java/com/dremio/exec/testing/ExecutionControlsInjector.java
sabot/kernel/src/main/java/com/dremio/exec/testing/Injection.java
sabot/kernel/src/main/java/com/dremio/exec/planner/sql/handlers/commands/CommandCreator.java