sarankk commented on code in PR #189: URL: https://github.com/apache/cassandra-sidecar/pull/189#discussion_r1970559279
########## conf/sidecar.yaml: ########## @@ -236,6 +236,57 @@ healthcheck: initial_delay: 0ms execute_interval: 30s +# Sidecar Peer Health Monitor settings +# Enables a periodic task checking for the health of adjacent Sidecar peers in the token ring +sidecar_peer_health: + # Determines if the peer health monitor periodic task is enabled or not + enabled: false + # Time between peer health checks + execute_interval: 30s + # The amount of retries the client will attempt a request + sidecar_client_health_check_retries: 5 + # The initial delay between the retries the client will attempt a request + sidecar_client_health_check_retry_delay: 10s + +# Sidecar client settings used to interact with other sidecars +sidecar_client: + # Determines if the sidecar client should use and SSL connection + use_ssl: true Review Comment: We should disable `ssl` by default for client, since sidecar's ssl config is disabled by default. Instead of `use_ssl` can be add enable flag under `ssl:` ? ########## server/src/main/java/org/apache/cassandra/sidecar/config/SidecarClientConfiguration.java: ########## @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config; + +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; + +/** + * Configuration for sidecar client + */ +public interface SidecarClientConfiguration +{ + /** + * @return {@code true} if SSL should be used for Sidecar client connections + */ + boolean useSsl(); Review Comment: `useSsl` should go under `SslConfiguration` ########## conf/sidecar.yaml: ########## @@ -236,6 +236,57 @@ healthcheck: initial_delay: 0ms execute_interval: 30s +# Sidecar Peer Health Monitor settings +# Enables a periodic task checking for the health of adjacent Sidecar peers in the token ring +sidecar_peer_health: + # Determines if the peer health monitor periodic task is enabled or not + enabled: false + # Time between peer health checks + execute_interval: 30s + # The amount of retries the client will attempt a request + sidecar_client_health_check_retries: 5 + # The initial delay between the retries the client will attempt a request + sidecar_client_health_check_retry_delay: 10s + +# Sidecar client settings used to interact with other sidecars +sidecar_client: + # Determines if the sidecar client should use and SSL connection + use_ssl: true + # Time in which a request made by the sidecar client will time out + request_timeout: 1s + # How long the request can be idle Review Comment: Nit: to avoid extra lines, can we add comments on same line as setting ?, for e.g. here ``` schema_reporting: # Schema Reporting configuration enabled: false # Disabled by default initial_delay: 6h # Maximum delay before the first schema report (actual delay is randomized) ``` ########## server/src/main/java/org/apache/cassandra/sidecar/config/yaml/PeerHealthConfigurationImpl.java: ########## @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config.yaml; + +import java.util.concurrent.TimeUnit; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; +import org.apache.cassandra.sidecar.config.PeerHealthConfiguration; + + +/** + * Configuration for Peer Health checks + */ +public class PeerHealthConfigurationImpl extends PeriodicTaskConfigurationImpl implements PeerHealthConfiguration +{ + public static final boolean DEFAULT_ENABLED = true; Review Comment: In `sidecar.conf` enabled is set to `false` by default. Here it is still true. ########## conf/sidecar.yaml: ########## @@ -236,6 +236,57 @@ healthcheck: initial_delay: 0ms execute_interval: 30s +# Sidecar Peer Health Monitor settings +# Enables a periodic task checking for the health of adjacent Sidecar peers in the token ring +sidecar_peer_health: Review Comment: Nit: since `sidecar_peer_health` has only 4 settings, shall we move it under `sidecar:` section and remove `sidecar` prefix?. We also seem to have `PeerHealthConfiguration` class ########## server/src/main/java/org/apache/cassandra/sidecar/config/yaml/PeerHealthConfigurationImpl.java: ########## @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config.yaml; + +import java.util.concurrent.TimeUnit; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; +import org.apache.cassandra.sidecar.config.PeerHealthConfiguration; + + +/** + * Configuration for Peer Health checks + */ +public class PeerHealthConfigurationImpl extends PeriodicTaskConfigurationImpl implements PeerHealthConfiguration +{ + public static final boolean DEFAULT_ENABLED = true; + public static final MillisecondBoundConfiguration DEFAULT_FREQUENCY = new MillisecondBoundConfiguration(30, TimeUnit.SECONDS); + public static final int DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRIES = 5; + public static final MillisecondBoundConfiguration DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRY_DELAY + = new MillisecondBoundConfiguration(10, TimeUnit.SECONDS); + + @JsonProperty(value = "sidecar_client_health_check_retries") + private final int sidecarClientHealthCheckRetries; + @JsonProperty(value = "sidecar_client_health_check_retry_delay") + private final MillisecondBoundConfiguration sidecarClientHealthCheckRetryDelay; + + /** + * Constructs a new {@link PeerHealthConfigurationImpl} instance with the default configuration + * values. + */ + public PeerHealthConfigurationImpl() + { + super(DEFAULT_ENABLED, DEFAULT_FREQUENCY, DEFAULT_FREQUENCY); + this.sidecarClientHealthCheckRetries = DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRIES; + this.sidecarClientHealthCheckRetryDelay = DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRY_DELAY; + } + + public PeerHealthConfigurationImpl(boolean enabled, + MillisecondBoundConfiguration frequency, + int sidecarClientHealthCheckRetries, + MillisecondBoundConfiguration sidecarClientHealthCheckRetryDelay) + { + super(enabled, frequency, frequency); + this.sidecarClientHealthCheckRetries = sidecarClientHealthCheckRetries; + this.sidecarClientHealthCheckRetryDelay = sidecarClientHealthCheckRetryDelay; + } + + /** + * @return the number of maximum retries to be performed during a Sidecar peer health check + */ + @Override + @JsonProperty(value = "sidecar_client_health_check_retries") Review Comment: Nit: are we creating Json from `PeerHealthConfiguration` object? if not we dont need these `@JsonProperty` tags ########## server/src/main/java/org/apache/cassandra/sidecar/config/yaml/PeerHealthConfigurationImpl.java: ########## @@ -0,0 +1,84 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config.yaml; + +import java.util.concurrent.TimeUnit; + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; +import org.apache.cassandra.sidecar.config.PeerHealthConfiguration; + + +/** + * Configuration for Peer Health checks + */ +public class PeerHealthConfigurationImpl extends PeriodicTaskConfigurationImpl implements PeerHealthConfiguration +{ + public static final boolean DEFAULT_ENABLED = true; + public static final MillisecondBoundConfiguration DEFAULT_FREQUENCY = new MillisecondBoundConfiguration(30, TimeUnit.SECONDS); + public static final int DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRIES = 5; + public static final MillisecondBoundConfiguration DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRY_DELAY + = new MillisecondBoundConfiguration(10, TimeUnit.SECONDS); + + @JsonProperty(value = "sidecar_client_health_check_retries") + private final int sidecarClientHealthCheckRetries; + @JsonProperty(value = "sidecar_client_health_check_retry_delay") + private final MillisecondBoundConfiguration sidecarClientHealthCheckRetryDelay; + + /** + * Constructs a new {@link PeerHealthConfigurationImpl} instance with the default configuration + * values. + */ + public PeerHealthConfigurationImpl() + { + super(DEFAULT_ENABLED, DEFAULT_FREQUENCY, DEFAULT_FREQUENCY); + this.sidecarClientHealthCheckRetries = DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRIES; + this.sidecarClientHealthCheckRetryDelay = DEFAULT_SIDECAR_CLIENT_HEALTH_CHECK_RETRY_DELAY; + } + + public PeerHealthConfigurationImpl(boolean enabled, + MillisecondBoundConfiguration frequency, + int sidecarClientHealthCheckRetries, + MillisecondBoundConfiguration sidecarClientHealthCheckRetryDelay) + { + super(enabled, frequency, frequency); + this.sidecarClientHealthCheckRetries = sidecarClientHealthCheckRetries; + this.sidecarClientHealthCheckRetryDelay = sidecarClientHealthCheckRetryDelay; + } + + /** + * @return the number of maximum retries to be performed during a Sidecar peer health check Review Comment: can we use ` {@inheritDoc}` to use same doc as the interface? ########## client/src/main/java/org/apache/cassandra/sidecar/client/SidecarClient.java: ########## @@ -113,6 +115,22 @@ public CompletableFuture<HealthResponse> sidecarHealth() .build()); } + /** + * Executes the Sidecar health request using the configured selection policy and with no retries + * + * @return a completable future of the Sidecar health response + */ + public CompletableFuture<HealthResponse> peerHealth(SidecarInstance instance) + { + return executor.executeRequestAsync(requestBuilder() + .singleInstanceSelectionPolicy( + new SidecarInstanceImpl(instance.hostname(), Review Comment: Why not share `instance` here instead of creating a new one? ########## conf/sidecar.yaml: ########## @@ -236,6 +236,57 @@ healthcheck: initial_delay: 0ms execute_interval: 30s +# Sidecar Peer Health Monitor settings +# Enables a periodic task checking for the health of adjacent Sidecar peers in the token ring +sidecar_peer_health: + # Determines if the peer health monitor periodic task is enabled or not + enabled: false + # Time between peer health checks + execute_interval: 30s + # The amount of retries the client will attempt a request + sidecar_client_health_check_retries: 5 + # The initial delay between the retries the client will attempt a request Review Comment: Nit: shall we add comments on same line as setting? ########## server/src/main/java/org/apache/cassandra/sidecar/config/yaml/SidecarConfigurationImpl.java: ########## @@ -437,6 +465,17 @@ public Builder sslConfiguration(SslConfiguration sslConfiguration) return update(b -> b.sslConfiguration = sslConfiguration); } + /** + * Sets the {@code downDetectorConfiguration} and returns a reference to this Builder enabling method chaining. + * + * @param peerHealthConfiguration the {@code downDetectorConfiguration} to set + * @return a reference to this Builder + */ + public Builder downDetectorConfiguration(PeerHealthConfiguration peerHealthConfiguration) Review Comment: This method seems to have been added by mistake. ########## server/src/main/java/org/apache/cassandra/sidecar/config/SidecarClientConfiguration.java: ########## @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config; + +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; + +/** + * Configuration for sidecar client + */ +public interface SidecarClientConfiguration +{ + /** + * @return {@code true} if SSL should be used for Sidecar client connections + */ + boolean useSsl(); + + /** + * @return The configuration for SSL connections on the client. + */ + SslConfiguration sslConfiguration(); + + /** + * @return the client request timeout value for the connection to be established + */ + MillisecondBoundConfiguration requestTimeout(); + + /** + * @return the client idle timeout before the connection is considered as stale + */ + MillisecondBoundConfiguration requestIdleTimeout(); + + // Pooling options + + /** + * @return the maximum size of the pool for client connections + */ + int connectionPoolMaxSize(); + + /** + * @return the connection pool cleaner period, a non-positive value disables expiration checks and connections + * will remain in the pool until they are closed. + */ + MillisecondBoundConfiguration connectionPoolCleanerPeriod(); + + /** + * Return the configured number of event-loop the pool use. + * + * <ul> + * <li>when the size is {@code 0}, the client pool will use the current event-loop</li> + * <li>otherwise the client will create and use its own event loop</li> + * </ul> + * + * @return the configured number of event-loop the pool use + */ + int connectionPoolEventLoopSize(); Review Comment: I think this setting allows the client to create its own event loop, should we avoid this, client can use server's current event loop to allow for sharing of resources between server and client? ########## server/src/main/java/org/apache/cassandra/sidecar/config/yaml/SidecarClientConfigurationImpl.java: ########## @@ -0,0 +1,216 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.sidecar.config.yaml; + + +import com.fasterxml.jackson.annotation.JsonProperty; +import org.apache.cassandra.sidecar.common.server.utils.MillisecondBoundConfiguration; +import org.apache.cassandra.sidecar.config.SidecarClientConfiguration; +import org.apache.cassandra.sidecar.config.SslConfiguration; + + +/** + * Configuration for Sidecar client + */ +public class SidecarClientConfigurationImpl implements SidecarClientConfiguration +{ + public static final String USE_SSL = "use_ssl"; + public static final String SSL_CONFIGURATION = "ssl"; + public static final String REQUEST_TIMEOUT = "request_timeout"; + public static final String REQUEST_IDLE_TIMEOUT = "request_idle_timeout"; + public static final String CONNECTION_POOL_MAX_SIZE = "connection_pool_max_size"; + public static final String CONNECTION_POOL_CLEANER_PERIOD = "connection_pool_clearing_period"; + public static final String CONNECTION_POOL_EVENT_LOOP_SIZE = "connection_pool_event_loop_size"; + public static final String CONNECTION_POOL_MAX_WAIT_QUEUE_SIZE = "connection_pool_max_wait_queue_size"; + public static final String MAX_RETRIES = "max_retries"; + public static final String RETRY_DELAY = "retry_delay"; + public static final String MAX_RETRY_DELAY = "max_retry_delay"; + + public static final boolean DEFAULT_USE_SSL = false; + public static final SslConfiguration DEFAULT_SSL_CONFIGURATION = null; + public static final MillisecondBoundConfiguration DEFAULT_REQUEST_TIMEOUT = MillisecondBoundConfiguration.parse("60s"); + public static final MillisecondBoundConfiguration DEFAULT_REQUEST_IDLE_TIMEOUT = MillisecondBoundConfiguration.parse("60s"); + public static final int DEFAULT_CONNECTION_POOL_MAX_SIZE = 10; + public static final MillisecondBoundConfiguration DEFAULT_CONNECTION_POOL_CLEANER_PERIOD = MillisecondBoundConfiguration.parse("60s"); + public static final int DEFAULT_CONNECTION_POOL_EVENT_LOOP_SIZE = 10; + public static final int DEFAULT_CONNECTION_POOL_MAX_WAIT_QUEUE_SIZE = 10; + public static final int DEFAULT_MAX_RETRIES = 3; + public static final MillisecondBoundConfiguration DEFAULT_RETRY_DELAY = MillisecondBoundConfiguration.parse("1s"); + public static final MillisecondBoundConfiguration DEFAULT_MAX_RETRY_DELAY = MillisecondBoundConfiguration.parse("10s"); + + + @JsonProperty(value = USE_SSL) + protected final boolean useSsl; + + @JsonProperty(value = SSL_CONFIGURATION) + protected final SslConfiguration sslConfiguration; + + @JsonProperty(value = REQUEST_TIMEOUT) + protected final MillisecondBoundConfiguration requestTimeout; + + @JsonProperty(value = REQUEST_IDLE_TIMEOUT) + protected final MillisecondBoundConfiguration requestIdleTimeout; + + @JsonProperty(value = CONNECTION_POOL_MAX_SIZE) + protected final int connectionPoolMaxSize; + + @JsonProperty(value = CONNECTION_POOL_CLEANER_PERIOD) + protected final MillisecondBoundConfiguration connectionPoolCleanerPeriod; + + @JsonProperty(value = CONNECTION_POOL_EVENT_LOOP_SIZE) + protected final int connectionPoolEventLoopSize; + + @JsonProperty(value = CONNECTION_POOL_MAX_WAIT_QUEUE_SIZE) + protected final int connectionPoolEventMaxWaitQueueSize; + + @JsonProperty(value = MAX_RETRIES) + protected final int maxRetries; + + @JsonProperty(value = RETRY_DELAY) + protected final MillisecondBoundConfiguration retryDelay; + + @JsonProperty(value = MAX_RETRY_DELAY) + protected final MillisecondBoundConfiguration maxRetryDelay; + + public SidecarClientConfigurationImpl() + { + + this(DEFAULT_USE_SSL, + DEFAULT_SSL_CONFIGURATION, + DEFAULT_REQUEST_TIMEOUT, + DEFAULT_REQUEST_IDLE_TIMEOUT, + DEFAULT_CONNECTION_POOL_MAX_SIZE, + DEFAULT_CONNECTION_POOL_CLEANER_PERIOD, + DEFAULT_CONNECTION_POOL_EVENT_LOOP_SIZE, + DEFAULT_CONNECTION_POOL_MAX_WAIT_QUEUE_SIZE, + DEFAULT_MAX_RETRIES, + DEFAULT_RETRY_DELAY, + DEFAULT_MAX_RETRY_DELAY + ); + } + + public SidecarClientConfigurationImpl(SslConfiguration sslConfiguration) + { + + this(DEFAULT_USE_SSL, + sslConfiguration, + DEFAULT_REQUEST_TIMEOUT, + DEFAULT_REQUEST_IDLE_TIMEOUT, + DEFAULT_CONNECTION_POOL_MAX_SIZE, + DEFAULT_CONNECTION_POOL_CLEANER_PERIOD, + DEFAULT_CONNECTION_POOL_EVENT_LOOP_SIZE, + DEFAULT_CONNECTION_POOL_MAX_WAIT_QUEUE_SIZE, + DEFAULT_MAX_RETRIES, + DEFAULT_RETRY_DELAY, + DEFAULT_MAX_RETRY_DELAY + ); + } + + public SidecarClientConfigurationImpl(boolean useSsl, + SslConfiguration sslConfiguration, + MillisecondBoundConfiguration requestTimeout, + MillisecondBoundConfiguration requestIdleTimeout, + int connectionPoolMaxSize, + MillisecondBoundConfiguration connectionPoolCleanerPeriod, + int connectionPoolEventLoopSize, + int connectionPoolEventMaxWaitQueueSize, + int maxRetries, + MillisecondBoundConfiguration retryDelay, + MillisecondBoundConfiguration maxRetryDelay) + { + this.useSsl = useSsl; + this.sslConfiguration = sslConfiguration; + this.requestTimeout = requestTimeout; + this.requestIdleTimeout = requestIdleTimeout; + this.connectionPoolMaxSize = connectionPoolMaxSize; + this.connectionPoolCleanerPeriod = connectionPoolCleanerPeriod; + this.connectionPoolEventLoopSize = connectionPoolEventLoopSize; + this.connectionPoolEventMaxWaitQueueSize = connectionPoolEventMaxWaitQueueSize; + this.maxRetries = maxRetries; + this.retryDelay = retryDelay; + this.maxRetryDelay = maxRetryDelay; + } + + @Override + public boolean useSsl() + { + return useSsl; + } + + @Override + public SslConfiguration sslConfiguration() + { + return sslConfiguration; + } + + @Override + public MillisecondBoundConfiguration requestTimeout() + { + return requestTimeout; + } + + @Override + public MillisecondBoundConfiguration requestIdleTimeout() + { + return requestIdleTimeout; + } + + @Override + public int connectionPoolMaxSize() + { + return connectionPoolMaxSize; + } + + @Override + public MillisecondBoundConfiguration connectionPoolCleanerPeriod() + { + return connectionPoolCleanerPeriod; + } + + @Override + public int connectionPoolEventLoopSize() + { + return connectionPoolEventLoopSize; + } + + @Override + public int connectionPoolMaxWaitQueueSize() + { + return connectionPoolEventMaxWaitQueueSize; + } + + @Override + public int maxRetries() + { + return maxRetries; + } + + @Override + public MillisecondBoundConfiguration retryDelay() + { + return retryDelay; + } + + @Override + public MillisecondBoundConfiguration maxRetryDelay() + { + return maxRetryDelay; + } + Review Comment: Nit: extra line -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: pr-unsubscr...@cassandra.apache.org For additional commands, e-mail: pr-h...@cassandra.apache.org