如何配置 Kudu 测试工具以避免 "Block cache capacity exceeds the memory pressure threshold"

How can I configure the Kudu test harness to avoid "Block cache capacity exceeds the memory pressure threshold"

我正在尝试按照 Getting Started guide 中的 KuduTestHarness 使用指南进行操作。我创建了以下简单的测试用例。

import org.apache.kudu.test.KuduTestHarness;

import static org.junit.Assert.assertTrue;
import org.junit.Rule;
import org.junit.Test;

public class DemoTest{
    @Rule
    public KuduTestHarness harness=new KuduTestHarness();

    @Test
    public void testDemo(){
    assertTrue(true);
    }
}

但我在控制台日志中收到以下错误。

2020-10-07 11:50:01,060 [cluster stderr printer] INFO  org.apache.kudu.test.cluster.MiniKuduCluster - E1007 11:50:01.059237 17257 block_cache.cc:99] Block cache capacity exceeds the memory pressure threshold (536870912 bytes vs. 498776800 bytes). This will cause instability and harmful flushing behavior. Lower --block_cache_capacity_mb or raise --memory_limit_hard_bytes.

2020-10-07 11:50:01,060 [cluster stderr printer] INFO  org.apache.kudu.test.cluster.MiniKuduCluster - E1007 11:50:01.059262 17257 flags.cc:441] Detected inconsistency in command-line flags; exiting

2020-10-07 11:50:01,100 [main] DEBUG org.apache.kudu.test.cluster.MiniKuduCluster - Response: error {
  code: RUNTIME_ERROR
  message: "failed to start masters: Unable to start Master at index 0: /tmp/kudu-binary-jar1893943400146501302/kudu-binary-1.13.0-linux-x86_64/bin/kudu-master: process exited with non-zero status 1"
}

我尝试向基础构建器添加一个标志,但它没有任何影响。新标志未显示在日志中的标志列表中。

import org.apache.kudu.test.cluster.MiniKuduCluster.MiniKuduClusterBuilder;
...
    static{
    MiniKuduClusterBuilder builder=KuduTestHarness.getBaseClusterBuilder();
    builder.addMasterServerFlag("--block_cache_capacity_mb=498776800");
    }
...

有人可以指出正确的方向以正确配置测试工具。

好的,我通过阅读源代码自己解决了这个问题。很纳闷为什么MiniKuduCluster的相关javdocs不在线

答案是 getBaseClusterBuilder() 是一个工厂方法,而不是我假设的访问器方法。您每次都会得到一个新的,测试工具 class 将在您创建新规则实例时使用新的构建器,因此您需要在此时注入自定义构建器。有一个采用构建器对象的构造函数。

这段代码展示了它是如何完成的。

    public static MiniKuduClusterBuilder builder;

    @BeforeClass
    public static void classInit(){
    builder=KuduTestHarness.getBaseClusterBuilder()
        .addMasterServerFlag("--block_cache_capacity_mb=475")
        .addTabletServerFlag("--block_cache_capacity_mb=475");
    }

    @Rule
    public KuduTestHarness harness=new KuduTestHarness(builder);

根本问题是由于在内存有限的笔记本电脑上使用 VM。我无能为力,因此此时自定义构建器的能力非常有用。