Spring data cassandra - error while opening new channel

Viewed 4610

I have a problem with Cassandra's connection with spring-data. When Cassandra is running locally I have no problem with connecting, however when I ran my spring-boot app in k8s with external Cassandra I am stuck on WARN:

2020-07-24 10:26:32.398  WARN 6 --- [     s0-admin-0] c.d.o.d.internal.core.pool.ChannelPool   : [s0|/127.0.0.1:9042]  Error while opening new channel (ConnectionInitException: [s0|connecting...] Protocol initialization request, step 1 (STARTUP {CQL_VERSION=3.0.0, DRIVER_NAME=DataStax Java driver for Apache Cassandra(R), DRIVER_VERSION=4.7.2, CLIENT_ID=9679ee85-ff39-45b6-8573-62a8d827ec9e}): failed to send request (java.nio.channels.ClosedChannelException))

I don't understand why in the log I have [s0|/127.0.0.1:9042] instead of the IP of my contact points.

Spring configuration:

spring:
  data:
    cassandra:
      keyspace-name: event_store
      local-datacenter: datacenter1
      contact-points: host1:9042,host2:9042

Also this WARN is not causing that spring-boot won't start however if I do query in service I have error:

{ error: "Query; CQL [com.datastax.oss.driver.internal.core.cql.DefaultSimpleStatement@9463dccc]; No node was available to execute the query; nested exception is com.datastax.oss.driver.api.core.NoNodeAvailableException: No node was available to execute the query" }
1 Answers

Option 1: test your yml file like this. (Have you tried with ip address?)

  data:
    cassandra:
      keyspace-name: event_store
      local-datacenter: datacenter1
      port:9042
      contact-points: host1,host2
      username: cassandra
      password: cassandra

Option 2: Create new properties on your yml and than a configuration class

cassandra:
    database:
        keyspace-name: event_store
        contact-points: host1, host2
        port: 9042
        username: cassandra
        password: cassandra

@Configuration
public class CassandraConfig extends AbstractCassandraConfiguration {

    @Value("${cassandra.database.keyspace-name}")
    private String keySpace;

    @Value("${cassandra.database.contact-points}")
    private String contactPoints;

    @Value("${cassandra.database.port}")
    private int port;

    @Value("${cassandra.database.username}")
    private String userName;

    @Value("${cassandra.database.password}")
    private String password;


    @Override
    protected String getKeyspaceName() {
        return keySpace;
    }
    
    @Bean
    public CassandraMappingContext cassandraMapping() throws ClassNotFoundException {
        CassandraMappingContext context = new CassandraMappingContext();
        context.setUserTypeResolver(new SimpleUserTypeResolver(cluster().getObject(), keySpace));
        return context;
    }

    @Bean
    public CassandraClusterFactoryBean cluster() {
        CassandraClusterFactoryBean cluster = super.cluster();
        cluster.setUsername(userName);
        cluster.setPassword(password);
        cluster.setContactPoints(contactPoints);
        cluster.setPort(port);
        return cluster;
    }
    
    @Override
    protected boolean getMetricsEnabled() {
        return false;
    } 
    
}
Related