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

posted on 2024-03-14 08:00  荣锋亮  阅读(6)  评论(0编辑  收藏  举报

导航