首页 > 解决方案 > Cassandra drop keyspace 在为 executeAsync 指定的超时之前抛出 timeoutexception

问题描述

OperationTimedOutException在删除键空间时得到了 cassandra。尽管我已经给了60000 毫秒(1 分钟) timeOut的时间来阻止,直到我Future从 cassandra 获得对象executeAsync。但它立即抛出timeoutexception 而没有等待完成 1 分钟。

这就是我使用java删除键空间的方式 -

List<KeyspaceMetadata> keyspaceMetadataList = cluster.getMetadata().getKeyspaces();
    for(KeyspaceMetadata ks: keyspaceMetadataList)
    {
         if (ks.getName().startsWith("system"))
         {
             continue;
         }
         try
        {
            session.executeAsync("drop keyspace " + ks.getName()).get(1000 * 60, TimeUnit.MILLISECONDS);
            log.info("Dropped Keyspace: " + ks.getName());
        }
        catch( InterruptedException | ExecutionException | TimeoutException e )
        {
            log.error("Something went wrong: " + e);
        }

    }

您可以看到下面给出的行,我在其中强行告诉呼叫等待至少 60 秒,但即使在此之前,我得到了TimeOutException.

session.executeAsync("drop keyspace " + ks.getName()).get(1000 * 60, TimeUnit.MILLISECONDS);

我不确定这是否是以编程方式增加超时的正确方法。如果有其他好的方法,请告诉我。

标签: javacassandradatastax-java-drivercassandra-driver

解决方案


最好不要同时进行多项修改(就像你正在做的那样 via executeAsync)。当您在分布式系统中修改模式时,模式更改应该解决,并且所有节点之间应该达成一致。

我建议修改您的代码以通过session.execute而不是异步版本执行命令。并在所有操作完成后检查模式协议 -Metadata类中有相应的方法。


推荐阅读