Cassandra drop keyspace 在给定 executeAsync 的指定超时之前抛出 timeoutexception

Cassandra drop keyspace throws timeoutexception before specified timeout given to executeAsync

我正在删除键空间时获取 cassandra OperationTimedOutException。虽然我已经给了 60000 毫秒(1 分钟) timeOut 来阻塞,直到我从 cassandra executeAsync 得到 Future 对象。但它立即抛出 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);

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

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

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

中有相应的方法