DriverTimeoutException: Query timed out after PT2S. Unable to set spring.data.cassandra.request.timeout property?

Viewed 5482

When starting my application the keyspace is always created and possibly one or two tables before the PT2S error message . Somehow the spring.data.cassandra.request.timeout property is not honored, or maybe there is something wrong with my configuration? The "DriverConfigLoaderBuilderCustomizer" bean does not make any difference.

pom.xml

<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.5.RELEASE</version>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-cassandra</artifactId>
<spring.framework.version>5.3.1</spring.framework.version>

application.yml

spring:
  data:
    cassandra:
      port: 9042
      keyspace-name: abc
      contact-points: localhost
      local-datacenter: datacenter1
      replication-factor: 1
      request:
        timeout: 15s
      connection:
        init-query-timeout: 15s

CassandraConfig.java

@Configuration
@EnableReactiveCassandraRepositories(basePackages = "a.b.c.repository")
public class CassandraConfig extends AbstractReactiveCassandraConfiguration {
    @Value("${spring.data.cassandra.contactpoints}")
    .
    .
    @Override
    protected String getKeyspaceName() {
        return keyspace;
    }
    @Override protected String getContactPoints() {
        return contactPoints;
    }
    @Override protected int getPort() {
        return port;
    }
    @Override
    protected String getLocalDataCenter() {
        return datacenter;
    }
   @Override
    public SchemaAction getSchemaAction() {
        return SchemaAction.NONE;
    }
    @Override
    protected List<CreateKeyspaceSpecification> getKeyspaceCreations() {
        return Collections.singletonList(CreateKeyspaceSpecification.createKeyspace(getKeyspaceName())
                .ifNotExists()
                .with(KeyspaceOption.DURABLE_WRITES, true)
                .withNetworkReplication(DataCenterReplication.of(getLocalDataCenter(), getReplicationFactor())));
    }
    @Override
    protected KeyspacePopulator keyspacePopulator() {
        ResourceKeyspacePopulator keyspacePopulate = new ResourceKeyspacePopulator();
        keyspacePopulate.addScript(new ClassPathResource("table-schema.cql"));
        return keyspacePopulate;
    }
    private long getReplicationFactor() {
        return replicationFactor;
    }
    //@Bean
    //public DriverConfigLoaderBuilderCustomizer driverConfigLoaderBuilderCustomizer() {
        //return loaderBuilder -> loaderBuilder
                //.withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofSeconds(15))
                //.withDuration(DefaultDriverOption.CONNECTION_INIT_QUERY_TIMEOUT, Duration.ofSeconds(15));
    //}

}

Trimmed error log

BeanCreationException: Error creating bean with name 'cassandraSessionFactory' 
Invocation of init method failed; nested exception is ScriptStatementFailedException: Failed to execute CQL script statement #2 of class path resource [table-schema.cql]: CREATE TABLE IF NOT EXISTS mytable...

Caused by: org.springframework.data.cassandra.core.cql.session.init.ScriptStatementFailedException: Failed to execute CQL script statement #2 of class path resource [table-schema.cql]: CREATE TABLE IF NOT EXISTS mytanble... nested exception is com.datastax.oss.driver.api.core.DriverTimeoutException: Query timed out after PT2S
    at org.springframework.data.cassandra.core.cql.session.init.ScriptUtils.executeCqlScript(ScriptUtils.java:555) ~[spring-data-cassandra-3.0.5.RELEASE.jar:3.0.5.RELEASE]
    at org.springframework.data.cassandra.core.cql.session.init.ResourceKeyspacePopulator.populate
    
Caused by: com.datastax.oss.driver.api.core.DriverTimeoutException: Query timed out after PT2S
at com.datastax.oss.driver.api.core.DriverTimeoutException.copy(DriverTimeoutException.java:34)
1 Answers

We had a similar problem and tried your exact steps first. The driver examples code than stirred us in the right direction. We have a custom cassandra config with excluded auto config:

@SpringBootApplication(exclude = {CassandraAutoConfiguration.class,CassandraDataAutoConfiguration.class})

Running spring-boot-starter-parent version 2.3.0.RELEASE.

CassandraConfig:

@Configuration
@EnableCassandraRepositories(basePackages = {"com.example.model.cassandra"})
public class CassandraConfig extends AbstractCassandraConfiguration {

@Override
protected SessionBuilderConfigurer getSessionBuilderConfigurer() {
    return new SessionBuilderConfigurer() {
        @Override
        public CqlSessionBuilder configure(CqlSessionBuilder cqlSessionBuilder) {
            return cqlSessionBuilder
                    .withConfigLoader(DriverConfigLoader.programmaticBuilder().withDuration(DefaultDriverOption.REQUEST_TIMEOUT, Duration.ofMillis(15000)).build());
        }
    };
}
}
Related