use clap::{Parser, Subcommand};
use futures::{channel::mpsc::channel, future::pending, select, FutureExt, StreamExt};
-use redis::{Client, RedisError};
+use redis::{aio::MultiplexedConnection, cmd, Client, RedisError, RedisResult};
use signal_hook::consts::signal::*;
use signal_hook_async_std::Signals;
use tide::{
Ok(response)
}
+async fn verify_keyspace_events_enabled(conn: &mut MultiplexedConnection) -> RedisResult<()> {
+ let keyspace_events: Vec<String> = cmd("CONFIG").arg("GET").arg("notify-keyspace-events").query_async(conn).await?;
+ if keyspace_events.len() != 2 || !keyspace_events[1].contains("K") {
+ warn!("Redis \"CONFIG GET notify-keyspace-events\" returned {:?}. Keyspace events must be enabled for proper functioning.", keyspace_events);
+ }
+ Ok(())
+}
+
#[derive(Parser)]
#[clap(version, author, about)]
struct Args {
info!("Connecting to redis server...");
let client = Client::open(&*config.redis.addr)?;
- let connection = match client.get_multiplexed_async_std_connection().await {
+ let mut connection = match client.get_multiplexed_async_std_connection().await {
Ok(connection) => connection,
Err(err) => {
error!("Redis connection error: {}", err);
}
};
+ if let Err(err) = verify_keyspace_events_enabled(&mut connection).await {
+ error!("Redis connection error: {}", err);
+ continue;
+ }
+
let server = Server::new(connection, register_update_stream_tx);
let handle_client_interest = handle_client_interest_subscriptions(pubsub, register_update_stream_rx);