From 74844df51ae9e45d9d8446ca16e33d49e2915b8e Mon Sep 17 00:00:00 2001 From: Harrison Burt <57491488+ChillFish8@users.noreply.github.com> Date: Sat, 26 Mar 2022 20:27:32 +0000 Subject: [PATCH] Clear and update base handlers --- Cargo.toml | 30 +- Dockerfile | 6 +- rustfmt.toml | 3 +- src/backends/cql.rs | 379 ---- src/backends/mod.rs | 3 - src/backends/redis.rs | 148 -- src/backends/sql.rs | 676 ------- src/cache.rs | 58 - src/configure.rs | 147 -- src/context.rs | 58 - src/image.rs | 241 --- src/main.rs | 250 --- src/response.rs | 54 - src/routes.rs | 290 --- src/storage.rs | 137 -- src/traits.rs | 34 - .../backend_runners/keydb/docker-compose.yml | 11 - tests/backend_runners/keydb/keydb.conf | 1574 ----------------- .../backend_runners/maria/docker-compose.yml | 13 - .../backend_runners/scylla/docker-compose.yml | 24 - tests/nginx/Dockerfile | 13 - tests/nginx/nginx.conf | 61 - tests/nginx/sample/news.png | Bin 91573 -> 0 bytes tests/noqa/expand.py | 40 - tests/samples/news.png | Bin 91573 -> 0 bytes tests/samples/release.png | Bin 152897 -> 0 bytes tests/unit.py | 109 -- 27 files changed, 11 insertions(+), 4348 deletions(-) delete mode 100644 src/backends/cql.rs delete mode 100644 src/backends/mod.rs delete mode 100644 src/backends/redis.rs delete mode 100644 src/backends/sql.rs delete mode 100644 src/cache.rs delete mode 100644 src/configure.rs delete mode 100644 src/context.rs delete mode 100644 src/image.rs delete mode 100644 src/response.rs delete mode 100644 src/routes.rs delete mode 100644 src/storage.rs delete mode 100644 src/traits.rs delete mode 100644 tests/backend_runners/keydb/docker-compose.yml delete mode 100644 tests/backend_runners/keydb/keydb.conf delete mode 100644 tests/backend_runners/maria/docker-compose.yml delete mode 100644 tests/backend_runners/scylla/docker-compose.yml delete mode 100644 tests/nginx/Dockerfile delete mode 100644 tests/nginx/nginx.conf delete mode 100644 tests/nginx/sample/news.png delete mode 100644 tests/noqa/expand.py delete mode 100644 tests/samples/news.png delete mode 100644 tests/samples/release.png delete mode 100644 tests/unit.py diff --git a/Cargo.toml b/Cargo.toml index 7dc985c..c475b75 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "lust" -version = "1.3.5" +version = "2.0.0" authors = ["Harrison Burt <57491488+ChillFish8@users.noreply.github.com>"] -edition = "2018" +edition = "2021" documentation = "getting-started.md" readme = "README.md" license = "MIT" @@ -14,36 +14,18 @@ description = "A fast, auto-optimising image server designed for multiple backen [dependencies] webp = { version = "*", path = "./webp" } -image = "0.23" +image = "0.24.1" base64 = "0.13.0" bytes = "1" anyhow = "1" -clap = "2" +clap = "3" serde_json = "1" -serde_variant = "0.1.0" -async-trait = "0.1.50" -once_cell = "1.7.2" -concread = "0.2.14" +async-trait = "0.1" +once_cell = "1.10.0" futures = "0.3" -log = "0.4.14" -pretty_env_logger = "0.4.0" - -gotham = "0.6.0" -gotham_derive = "0.6.0" -headers = "0.3" - -tokio = { version = "1", features = ["full"] } -serde = { version = "1", features = ["derive"] } -chrono = { version = "0.4", features = ["serde"] } -uuid = { version = "0.8.2", features = ["serde", "v4"] } -hashbrown = { version = "0.11.2", features = ["serde"] } -sqlx = { version = "0.5", features = [ "runtime-tokio-rustls", "mysql", "sqlite", "postgres", "chrono", "uuid" ] } -redis = { version = "0.20", features = ["tokio-comp", "connection-manager"] } -scylla = "0.2.1" - [profile.release] lto = "fat" codegen-units = 1 diff --git a/Dockerfile b/Dockerfile index fe9965d..ddefc03 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,8 +1,8 @@ FROM rust:slim-buster as build -WORKDIR /code +WORKDIR /app -COPY . /code +COPY . /app RUN cargo build --release @@ -10,7 +10,7 @@ RUN cargo build --release FROM debian:buster-slim WORKDIR /etc/lust -COPY --from=build /code/target/release/lust / +COPY --from=build /app/target/release/lust / USER root ENTRYPOINT ["./lust", "run"] diff --git a/rustfmt.toml b/rustfmt.toml index 2b8802b..2cf8f73 100644 --- a/rustfmt.toml +++ b/rustfmt.toml @@ -3,4 +3,5 @@ combine_control_expr = false imports_layout = "HorizontalVertical" match_block_trailing_comma = true imports_granularity = "Module" -group_imports = "StdExternalCrate" \ No newline at end of file +group_imports = "StdExternalCrate" +max_width = 89 \ No newline at end of file diff --git a/src/backends/cql.rs b/src/backends/cql.rs deleted file mode 100644 index 4700667..0000000 --- a/src/backends/cql.rs +++ /dev/null @@ -1,379 +0,0 @@ -use anyhow::Result; -use async_trait::async_trait; -use bytes::{Bytes, BytesMut}; -use chrono::{DateTime, NaiveDateTime, Utc}; -use hashbrown::HashMap; -use log::{debug, info, warn}; -use scylla::query::Query; -use scylla::statement::prepared_statement::PreparedStatement; -use scylla::transport::session::Session; -use scylla::{QueryResult, SessionBuilder}; -use serde::{Deserialize, Serialize}; -use serde_variant::to_variant_name; -use uuid::Uuid; - -use crate::configure::PAGE_SIZE; -use crate::context::{FilterType, IndexResult, OrderBy}; -use crate::image::{ImageFormat, ImagePresetsData}; -use crate::traits::{DatabaseLinker, ImageStore}; - -/// Represents a connection pool session with a round robbin load balancer. -type CurrentSession = Session; - -type PagedRow = (Uuid, String, i64, i32); - -#[derive(Clone, Serialize, Deserialize)] -#[serde(tag = "strategy", content = "spec")] -enum ReplicationClass { - SimpleStrategy(SimpleNode), - NetworkTopologyStrategy(Vec), -} - -#[derive(Clone, Serialize, Deserialize)] -struct SimpleNode { - replication_factor: usize, -} - -#[derive(Clone, Serialize, Deserialize)] -struct DataCenterNode { - node_name: String, - replication: usize, -} - -/// The configuration for a cassandra database. -/// -/// Each cluster should be given in the `host:port` format and -/// should only be the main node (not replication nodes). -/// -/// The replication_factor is used when the keyspace is first created, -/// if the keyspace already exists this number may be ignored despite -/// being changed due to current implementation limitations. -/// -/// The replication_class is used when the keyspace is first created, -/// this has the same caveats as the replication_factor. -#[derive(Clone, Deserialize)] -pub struct DatabaseConfig { - clusters: Vec, - keyspace: ReplicationClass, - user: String, - password: String, -} - -macro_rules! log_and_convert_error { - ( $e:expr ) => {{ - match $e { - Ok(frame) => Some(frame), - Err(e) => { - warn!("failed to execute query {:?}", e); - None - }, - } - }}; -} - -async fn get_page( - filter: &FilterType, - session: &CurrentSession, - stmt: &PreparedStatement, - page_state: Option, -) -> Result { - Ok(match &filter { - FilterType::All => session.execute_paged(stmt, &[], page_state).await?, - FilterType::CreationDate(v) => { - session - .execute_paged(stmt, (v.to_string(),), page_state) - .await? - }, - FilterType::Category(v) => session.execute_paged(stmt, (v,), page_state).await?, - }) -} - -/// A cassandra database backend. -pub struct Backend { - session: CurrentSession, - check_cat: Option, - get_file: HashMap>, -} - -impl Backend { - pub async fn connect(cfg: DatabaseConfig) -> Result { - info!("connecting to database"); - let session = SessionBuilder::new() - .user(cfg.user, cfg.password) - .known_nodes(cfg.clusters.as_ref()) - .build() - .await?; - info!("connect successful"); - - let replication = match cfg.keyspace { - ReplicationClass::SimpleStrategy(node) => { - format!( - "'class': 'SimpleStrategy', 'replication_factor': {}", - node.replication_factor, - ) - }, - ReplicationClass::NetworkTopologyStrategy(mut nodes) => { - let mut spec = nodes - .drain(..) - .map(|v| format!("'{}': {}", v.node_name, v.replication)) - .collect::>(); - - spec.insert(0, "'class' : 'NetworkTopologyStrategy'".to_string()); - - spec.join(", ") - }, - }; - - let create_ks = format!( - "CREATE KEYSPACE IF NOT EXISTS lust_ks WITH REPLICATION = {{{}}};", - replication - ); - debug!("creating keyspace {}", &create_ks); - - let _ = session.query(create_ks, &[]).await?; - info!("keyspace ensured"); - - Ok(Self { - session, - check_cat: None, - get_file: HashMap::new(), - }) - } -} - -#[async_trait] -impl DatabaseLinker for Backend { - async fn ensure_tables(&mut self, presets: Vec<&str>, formats: Vec) -> Result<()> { - info!("building tables"); - - let query = r#" - CREATE TABLE IF NOT EXISTS lust_ks.image_metadata ( - file_id UUID, - category TEXT, - insert_date TIMESTAMP, - total_size BIGINT, - PRIMARY KEY ((file_id), category) - ) WITH CLUSTERING ORDER BY (category DESC); - "#; - - self.session.query(query, &[]).await?; - info!("metadata table created successfully"); - - let query = r#" - CREATE INDEX IF NOT EXISTS ON lust_ks.image_metadata (category); - "#; - - self.session.query(query, &[]).await?; - info!("metadata table index created successfully"); - - let mut columns = vec![format!("file_id UUID PRIMARY KEY")]; - - for format in formats.iter() { - let column = to_variant_name(format).expect("unreachable"); - columns.push(format!("{} BLOB", column)) - } - - for preset in presets { - let query = format!( - "CREATE TABLE IF NOT EXISTS lust_ks.{table} ({columns})", - table = preset, - columns = columns.join(", ") - ); - - self.session.query(query, &[]).await?; - debug!("created preset table {}", preset); - - for format in formats.iter() { - let column = to_variant_name(format).expect("unreachable"); - - let qry = format!( - "SELECT {column} FROM lust_ks.{table} WHERE file_id = ? LIMIT 1;", - column = column, - table = preset, - ); - - let prepared = self.session.prepare(qry).await?; - debug!("prepared check query {:?}", format); - - if let Some(tbl) = self.get_file.get_mut(preset) { - tbl.insert(column.to_string(), prepared); - } else { - let mut new_map = HashMap::new(); - new_map.insert(column.to_string(), prepared); - self.get_file.insert(preset.to_string(), new_map); - } - } - } - info!("tables created"); - - let qry = r#" - SELECT file_id FROM lust_ks.image_metadata - WHERE file_id = ? AND category = ?; - "#; - let prepared = self.session.prepare(qry).await?; - self.check_cat = Some(prepared); - - info!("prepared all queries and tables"); - - Ok(()) - } -} - -#[async_trait] -impl ImageStore for Backend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - let prepared = self.check_cat.as_ref().unwrap(); - let query_result = - log_and_convert_error!(self.session.execute(prepared, (file_id, category)).await)?; - - let _ = query_result.rows?; - - let column = to_variant_name(&format).expect("unreachable"); - let prepared = self.get_file.get(&preset)?.get(column)?; - - let query_result = - log_and_convert_error!(self.session.execute(prepared, (file_id,)).await)?; - - let mut rows = query_result.rows?; - let row = rows.pop()?; - let (data,) = log_and_convert_error!(row.into_typed::<(Vec,)>())?; - let ref_: &[u8] = data.as_ref(); - Some(BytesMut::from(ref_)) - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let mut total: i64 = 0; - for (preset, preset_data) in data { - let sum: i64 = preset_data.values().map(|v| v.len() as i64).sum(); - total += sum; - - let columns: String = preset_data - .keys() - .map(|v| to_variant_name(v).expect("unreachable")) - .collect::>() - .join(", "); - - let placeholders: String = (0..preset_data.len()) - .map(|_| "?") - .collect::>() - .join(", "); - - let mut values: Vec> = preset_data.values().map(|v| v.to_vec()).collect(); - - values.insert(0, file_id.as_bytes().to_vec()); - - let qry = format!( - "INSERT INTO lust_ks.{table} (file_id, {columns}) VALUES (?, {placeholders});", - table = preset, - columns = columns, - placeholders = placeholders, - ); - - let prepared = self.session.prepare(qry).await?; - self.session.execute(&prepared, values).await?; - } - - let qry = r#" - INSERT INTO lust_ks.image_metadata ( - file_id, - category, - insert_date, - total_size - ) VALUES (?, ?, ?, ?);"#; - - let now = Utc::now(); - - self.session - .query(qry, (file_id, category, now.timestamp(), total)) - .await?; - Ok(()) - } - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()> { - for preset in presets { - let qry = format!( - "DELETE FROM lust_ks.{table} WHERE file_id = ?;", - table = preset, - ); - - self.session - .query(qry, (file_id.as_bytes().to_vec(),)) - .await?; - } - - let qry = "DELETE FROM lust_ks.image_metadata WHERE file_id = ?;"; - - self.session.query(qry, (file_id,)).await?; - Ok(()) - } - - async fn list_entities( - &self, - filter: FilterType, - _order: OrderBy, - page: usize, - ) -> Result> { - let qry = format!( - r#" - SELECT file_id, category, insert_date, total_size - FROM lust_ks.image_metadata - "#, - ); - - let mut query = match &filter { - FilterType::All => { - let qry = format!("{};", qry); - Query::new(qry) - }, - FilterType::CreationDate(_) => { - let qry = format!("{} WHERE insert_date = ?;", qry); - Query::new(qry) - }, - FilterType::Category(_) => { - let qry = format!("{} WHERE category = ?;", qry); - Query::new(qry) - }, - }; - - query.set_page_size(PAGE_SIZE as i32); - let prepared = self.session.prepare(query).await?; - let mut page_state = None; - - for _ in 0..page - 1 { - let rows = get_page(&filter, &self.session, &prepared, page_state.clone()).await?; - - page_state = rows.paging_state; - } - - let target_rows = get_page(&filter, &self.session, &prepared, page_state.clone()).await?; - - let results = if let Some(mut rows) = target_rows.rows { - rows.drain(..) - .map(|r| { - let r = r - .into_typed::() - .expect("database format invalidated"); - - let res = IndexResult { - file_id: r.0, - category: r.1, - created_on: DateTime::from_utc(NaiveDateTime::from_timestamp(r.2, 0), Utc), - total_size: r.3, - }; - - res - }) - .collect() - } else { - vec![] - }; - - Ok(results) - } -} diff --git a/src/backends/mod.rs b/src/backends/mod.rs deleted file mode 100644 index 836c1bd..0000000 --- a/src/backends/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod cql; -pub mod redis; -pub mod sql; diff --git a/src/backends/redis.rs b/src/backends/redis.rs deleted file mode 100644 index 81e313b..0000000 --- a/src/backends/redis.rs +++ /dev/null @@ -1,148 +0,0 @@ -use std::sync::atomic::{AtomicUsize, Ordering}; - -use anyhow::Result; -use async_trait::async_trait; -use bytes::BytesMut; -use log::error; -use redis::aio::ConnectionManager; -use redis::{AsyncCommands, AsyncIter}; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -use crate::context::{FilterType, IndexResult, OrderBy}; -use crate::image::{ImageFormat, ImagePresetsData}; -use crate::traits::{DatabaseLinker, ImageStore}; - -#[derive(Clone, Serialize, Deserialize)] -pub struct RedisConfig { - connection_uri: String, - pool_size: usize, -} - -struct RedisPool { - connections: Vec, - index: AtomicUsize, -} - -impl RedisPool { - pub async fn connect(cfg: RedisConfig) -> Result { - let client = redis::Client::open(cfg.connection_uri)?; - let mut conns = Vec::new(); - for _ in 0..cfg.pool_size { - let conn = client.get_tokio_connection_manager().await?; - conns.push(conn); - } - - Ok(Self { - connections: conns, - index: AtomicUsize::new(0), - }) - } - - pub fn get(&self) -> ConnectionManager { - let index = self.index.load(Ordering::Relaxed); - let conn = self.connections[index].clone(); - - if index == (self.connections.len() - 1) { - self.index.store(0, Ordering::Relaxed); - } else { - self.index.store(index + 1, Ordering::Relaxed); - } - - conn - } -} - -pub struct Backend { - pool: RedisPool, -} - -impl Backend { - pub async fn connect(cfg: RedisConfig) -> Result { - let pool = RedisPool::connect(cfg).await?; - - Ok(Self { pool }) - } -} - -#[async_trait] -impl DatabaseLinker for Backend { - /// Due to the nature of the key-value setup for redis clients this has completely - /// different handling so does not do anything when this funciton is called. - async fn ensure_tables( - &mut self, - _presets: Vec<&str>, - _columns: Vec, - ) -> Result<()> { - Ok(()) - } -} - -#[async_trait] -impl ImageStore for Backend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - let key = format!("{:?} {} {} {:?}", file_id, preset, category, format); - let mut conn = self.pool.get(); - let result = conn.get(&key).await; - - let val: Vec = match result { - Ok(v) => v, - Err(e) => { - error!("failed to fetch key {} from redis: {:?}", &key, e); - return None; - }, - }; - - if val.len() == 0 { - None - } else { - let ref_: &[u8] = val.as_ref(); - Some(BytesMut::from(ref_)) - } - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let mut pairs = Vec::new(); - - for (preset, formats) in data { - for (format, buff) in formats { - let key = format!("{:?} {} {} {:?}", &file_id, &preset, category, format); - pairs.push((key, buff.to_vec())); - } - } - - let mut conn = self.pool.get(); - conn.set_multiple(&pairs).await?; - - Ok(()) - } - - async fn remove_image(&self, file_id: Uuid, _presets: Vec<&String>) -> Result<()> { - let mut conn = self.pool.get(); - let mut conn2 = self.pool.get(); - let mut keys: AsyncIter = conn.scan_match(format!("{:?}*", file_id)).await?; - while let Some(v) = keys.next_item().await { - conn2.del(v).await?; - } - - Ok(()) - } - - /// This is non-functional due to limitations with the key-value setup of redis. - async fn list_entities( - &self, - _filter: FilterType, - _order: OrderBy, - _page: usize, - ) -> Result> { - Err(anyhow::Error::msg( - "redis backend does not support listing entities", - )) - } -} diff --git a/src/backends/sql.rs b/src/backends/sql.rs deleted file mode 100644 index 5af7f26..0000000 --- a/src/backends/sql.rs +++ /dev/null @@ -1,676 +0,0 @@ -use std::str::FromStr; - -use anyhow::Result; -use async_trait::async_trait; -use bytes::BytesMut; -use chrono::Utc; -use log::{debug, error, info}; -use serde::Deserialize; -use serde_variant::to_variant_name; -use sqlx::mysql::{MySqlPool, MySqlPoolOptions}; -use sqlx::postgres::{PgPool, PgPoolOptions}; -use sqlx::sqlite::{SqlitePool, SqlitePoolOptions}; -use sqlx::Row; -use uuid::Uuid; - -use crate::configure::PAGE_SIZE; -use crate::context::{FilterType, IndexResult, OrderBy}; -use crate::image::{ImageFormat, ImagePresetsData}; -use crate::traits::{DatabaseLinker, ImageStore}; - -/// The configuration for the SQL based database backends. -/// -/// The `connection_uri` should be formatted as a direct connect -/// uri. e.g. -/// `postgresql://john:boo@localhost/postgres` -/// -/// The `pool_size` determined the *maximum* amount of pool connections. -#[derive(Clone, Deserialize)] -pub struct DatabaseConfig { - connection_uri: String, - pool_size: u32, -} - -fn build_select_qry(column: &str, preset: &str, placeholder: &str) -> String { - format!( - "SELECT {column} FROM {table} WHERE file_id = {placeholder} LIMIT 1;", - column = column, - table = preset, - placeholder = placeholder, - ) -} - -fn build_insert_qry(preset: &str, columns: &Vec<&str>, placeholders: &Vec) -> String { - let columns = columns.join(", "); - let placeholders = placeholders.join(", "); - format!( - "INSERT INTO {table} ({columns}) VALUES ({placeholders});", - table = preset, - columns = columns, - placeholders = placeholders, - ) -} - -fn build_delete_queries(presets: &Vec<&String>, placeholder: &str) -> Vec { - let mut queries = vec![]; - for preset in presets { - queries.push(format!( - "DELETE FROM {table} WHERE file_id = {placeholder};", - table = preset, - placeholder = placeholder, - )) - } - - queries -} - -/// Either extracts the value as a `&[u8]` from the row as `Some(BytesMut)` -/// or becomes `None`. -macro_rules! extract_or_none { - ( $e:expr, $c:expr ) => {{ - match $e { - Ok(row) => { - let row = row?; - let data: &[u8] = row.get($c); - Some(BytesMut::from(data)) - }, - Err(e) => { - error!("failed to fetch row due to error: {:?}", e); - None - }, - } - }}; -} - -/// Builds a SQL query for the given preset (table) from -/// the given data adding place holders for each value for -/// prepared statements. -macro_rules! build_insert { - ( $preset:expr, $data:expr, $placeholder:expr ) => {{ - let mut columns: Vec<&str> = $data - .keys() - .map(|v| to_variant_name(v).expect("unreachable")) - .collect(); - columns.insert(0, "file_id"); - - let values: Vec = $data.values().map(|v| v.clone()).collect(); - - let placeholders: Vec = (1..columns.len() + 1).map($placeholder).collect(); - - (build_insert_qry($preset, &columns, &placeholders), values) - }}; -} - -/// Builds a sqlx query based on the given query string and values -/// -/// This also accounts for the file_id being a uuid vs everything else -/// being bytes. -macro_rules! query_with_parameters { - ( $id:expr, $qry:expr, $values:expr ) => {{ - let mut qry = sqlx::query($qry).bind($id); - - for value in $values { - qry = qry.bind(value) - } - - qry - }}; -} - -/// Deletes a file with a given id from all presets. -/// -/// Due to the nature of the Pool types but the similarity between -/// each database code to delete files it makes more sense to put this -/// in a macro over a function. -macro_rules! delete_file { - ( $id:expr, $presets:expr, $placeholder:expr, $pool:expr ) => {{ - let file_id = $id.to_string(); - let queries = build_delete_queries($presets, $placeholder); - - for qry in queries { - let query = sqlx::query(&qry).bind(&file_id); - query.execute($pool).await?; - } - - let qry = format!( - "DELETE FROM image_metadata WHERE file_id = {}", - $placeholder, - ); - - let query = sqlx::query(&qry).bind($id.to_string()); - query.execute($pool).await?; - }}; -} - -/// Inserts a given file_id into the index table. -/// -/// This table mostly acts as the metadata table for listing files of -/// given categories. -macro_rules! insert_metadata { - ( $file_id:expr, $category:expr, $total:expr, $placeholder:expr, $pool:expr, ) => {{ - let placeholders: String = (1..5).map($placeholder).collect::>().join(", "); - - let qry = format!( - r#" - INSERT INTO image_metadata ( - file_id, - category, - insert_date, - total_size - ) VALUES ({placeholders})"#, - placeholders = placeholders, - ); - - let now = Utc::now(); - - let query = sqlx::query(&qry) - .bind($file_id) - .bind($category) - .bind(now) - .bind($total); - query.execute($pool).await?; - }}; -} - -macro_rules! sum_total { - ( $total:expr, $values:expr ) => {{ - let sum: i64 = $values.values().map(|v| v.len() as i64).sum(); - $total += sum; - }}; -} - -macro_rules! check_category { - ( $file_id:expr, $category:expr, $ph1:expr, $ph2:expr, $pool:expr ) => {{ - let qry = format!( - "SELECT 1 FROM image_metadata WHERE file_id = {} AND category = {};", - $ph1, $ph2, - ); - - sqlx::query(&qry) - .bind($file_id.to_string()) - .bind($category) - .fetch_optional($pool) - .await - .unwrap_or(None) - }}; -} - -macro_rules! apply_filter { - ( $qry:expr, $placeholder:expr, $filter:expr ) => {{ - match $filter { - FilterType::All => (), - FilterType::Category(_) => $qry = format!("{} WHERE category = {}", $qry, $placeholder), - FilterType::CreationDate(_) => { - $qry = format!("{} WHERE insert_date = {}", $qry, $placeholder) - }, - }; - }}; -} - -macro_rules! bind_filter { - ( $query:expr, $filter:expr ) => {{ - match $filter { - FilterType::All => (), - FilterType::Category(v) => $query = $query.bind(v), - FilterType::CreationDate(v) => $query = $query.bind(v), - }; - }}; -} - -macro_rules! from_rows { - ( $rows:expr ) => {{ - $rows - .drain(..) - .map(|v| IndexResult { - file_id: Uuid::from_str(v.get("file_id")).expect("uuid was invalid in database"), - category: v.get("category"), - total_size: v.get("total_size"), - created_on: v.get("insert_date"), - }) - .collect() - }}; -} - -/// A database backend set to handle the PostgreSQL database. -pub struct PostgresBackend { - pool: PgPool, -} - -impl PostgresBackend { - /// Connect to the given PostgreSQL server. - /// - /// This will build a connection pool and connect with a maximum - /// of n connections determined by the `pool_size` of the given - /// config. - pub async fn connect(cfg: DatabaseConfig) -> Result { - let pool = PgPoolOptions::new() - .max_connections(cfg.pool_size) - .connect(&cfg.connection_uri) - .await?; - - Ok(Self { pool }) - } -} - -#[async_trait] -impl DatabaseLinker for PostgresBackend { - async fn ensure_tables(&mut self, presets: Vec<&str>, formats: Vec) -> Result<()> { - info!("building tables"); - - let query = sqlx::query( - r#" - CREATE TABLE IF NOT EXISTS image_metadata ( - file_id CHAR(36) PRIMARY KEY, - category TEXT, - insert_date TIMESTAMP WITH TIME ZONE, - total_size INTEGER - )"#, - ); - - query.execute(&self.pool).await?; - - let mut columns = vec![format!("file_id CHAR(36) PRIMARY KEY")]; - - for format in formats { - let column = to_variant_name(&format).expect("unreachable"); - columns.push(format!("{} BYTEA", column)) - } - - for preset in presets { - let qry = format!( - "CREATE TABLE IF NOT EXISTS {table} ({columns})", - table = preset, - columns = columns.join(", ") - ); - - let query = sqlx::query(&qry); - - query.execute(&self.pool).await?; - } - - Ok(()) - } -} - -#[async_trait] -impl ImageStore for PostgresBackend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - check_category!(file_id, category, "$1", "$2", &self.pool)?; - - let column = to_variant_name(&format).expect("unreachable"); - - let qry = build_select_qry(column, &preset, "$1"); - let qry = sqlx::query(&qry).bind(file_id.to_string()); - - extract_or_none!(qry.fetch_optional(&self.pool).await, column) - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let mut total: i64 = 0; - for (preset, preset_data) in data { - sum_total!(total, preset_data); - let (qry, values) = build_insert!(&preset, preset_data, |i| format!("${}", i)); - - let values_ = values.iter().map(|v| v.as_ref()); - let query = query_with_parameters!(file_id.to_string(), &qry, values_); - query.execute(&self.pool).await?; - } - - insert_metadata!( - file_id.to_string(), - category, - total, - |i| format!("${}", i), - &self.pool, - ); - - Ok(()) - } - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()> { - delete_file!(file_id, &presets, "$1", &self.pool); - - Ok(()) - } - - async fn list_entities( - &self, - filter: FilterType, - order: OrderBy, - page: usize, - ) -> Result> { - // we start at 1 but the offset should be calculated from 0 - let skip = PAGE_SIZE * (page as i64 - 1); - let order = order.as_str(); - - let mut qry = format!( - r#" - SELECT file_id, category, insert_date, total_size - FROM image_metadata - ORDER BY {} DESC - OFFSET $1 - LIMIT $2 - "#, - order - ); - - apply_filter!(qry, "$3", &filter); - - let mut query = sqlx::query(&qry).bind(skip).bind(PAGE_SIZE); - - bind_filter!(query, filter); - - let mut rows = query.fetch_all(&self.pool).await?; - let results = from_rows!(rows); - - Ok(results) - } -} - -/// A database backend set to handle the MySQL / MariaDB database. -pub struct MySQLBackend { - pool: MySqlPool, -} - -impl MySQLBackend { - /// Connect to the given MySQL / MariaDB server. - /// - /// This will build a connection pool and connect with a maximum - /// of n connections determined by the `pool_size` of the given - /// config. - pub async fn connect(cfg: DatabaseConfig) -> Result { - let pool = MySqlPoolOptions::new() - .max_connections(cfg.pool_size) - .connect(&cfg.connection_uri) - .await?; - - Ok(Self { pool }) - } -} - -#[async_trait] -impl DatabaseLinker for MySQLBackend { - async fn ensure_tables(&mut self, presets: Vec<&str>, formats: Vec) -> Result<()> { - info!("building tables"); - - let query = sqlx::query( - r#" - CREATE TABLE IF NOT EXISTS image_metadata ( - file_id CHAR(36) PRIMARY KEY, - category TEXT, - insert_date TIMESTAMP, - total_size INTEGER - )"#, - ); - - query.execute(&self.pool).await?; - - let mut columns = vec![format!("file_id CHAR(36) PRIMARY KEY")]; - - for format in formats { - let column = to_variant_name(&format).expect("unreachable"); - columns.push(format!("{} LONGBLOB", column)) - } - - for preset in presets { - let qry = format!( - "CREATE TABLE IF NOT EXISTS {table} ({columns})", - table = preset, - columns = columns.join(", ") - ); - - let query = sqlx::query(&qry); - - query.execute(&self.pool).await?; - } - - Ok(()) - } -} - -#[async_trait] -impl ImageStore for MySQLBackend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - check_category!(file_id, category, "?", "?", &self.pool)?; - - let column = to_variant_name(&format).expect("unreachable"); - - let qry = build_select_qry(column, &preset, "?"); - let query = sqlx::query(&qry).bind(file_id.to_string()); - - extract_or_none!(query.fetch_optional(&self.pool).await, column) - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let mut total: i64 = 0; - for (preset, preset_data) in data { - sum_total!(total, preset_data); - let (qry, values) = build_insert!(&preset, preset_data, |_| "?".to_string()); - - let values_ = values.iter().map(|v| v.as_ref()); - let query = query_with_parameters!(file_id.to_string(), &qry, values_); - query.execute(&self.pool).await?; - } - - insert_metadata!( - file_id.to_string(), - category, - total, - |_| "?".to_string(), - &self.pool, - ); - - Ok(()) - } - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()> { - delete_file!(file_id, &presets, "?", &self.pool); - Ok(()) - } - - async fn list_entities( - &self, - filter: FilterType, - order: OrderBy, - page: usize, - ) -> Result> { - // we start at 1 but the offset should be calculated from 0 - let skip = PAGE_SIZE * (page as i64 - 1); - let order = order.as_str(); - - let mut qry = format!( - r#" - SELECT file_id, category, insert_date, total_size - FROM image_metadata - ORDER BY {} DESC - LIMIT ?, ? - "#, - order - ); - - apply_filter!(qry, "?", &filter); - - let mut query = sqlx::query(&qry).bind(skip).bind(PAGE_SIZE); - - bind_filter!(query, filter); - - let mut rows = query.fetch_all(&self.pool).await?; - let results = from_rows!(rows); - - Ok(results) - } -} - -/// A database backend set to handle the Sqlite database. -/// -/// Due to the nature of SQLite this is *not* recommended for use -/// in production being a single file. Consider using something like -/// PostgreSQL or Cassandra in production. -/// -/// This backend requires that the system uses a standard File approach e.g. -/// not im memory / shared memory due to the sqlx::Pool handling. -/// If in-memory is used this can produce undefined behaviour in terms -/// of what data is perceived to be stored. -pub struct SqliteBackend { - pool: SqlitePool, -} - -impl SqliteBackend { - /// Connect to the given Sqlite file. - /// - /// This will build a connection pool and connect with a maximum - /// of n connections determined by the `pool_size` of the given - /// config. - /// - /// Due to the nature of this being a pool setup, in-memory setups are - /// not supported. - pub async fn connect(cfg: DatabaseConfig) -> Result { - let pool = SqlitePoolOptions::new() - .max_connections(cfg.pool_size) - .connect(&cfg.connection_uri) - .await?; - - info!("successfully connected to sqlite"); - - Ok(Self { pool }) - } -} - -#[async_trait] -impl DatabaseLinker for SqliteBackend { - async fn ensure_tables(&mut self, presets: Vec<&str>, formats: Vec) -> Result<()> { - info!("building tables"); - - let query = sqlx::query( - " - CREATE TABLE IF NOT EXISTS image_metadata ( - file_id CHAR(36) PRIMARY KEY, - category TEXT, - insert_date TEXT, - total_size INTEGER - )", - ); - - query.execute(&self.pool).await?; - info!("metadata table created successfully"); - - let mut columns = vec![format!("file_id CHAR(36) PRIMARY KEY")]; - - for format in formats { - let column = to_variant_name(&format).expect("unreachable"); - columns.push(format!("{} BLOB", column)) - } - - for preset in presets { - let qry = format!( - "CREATE TABLE IF NOT EXISTS {table} ({columns})", - table = preset, - columns = columns.join(", ") - ); - - let query = sqlx::query(&qry); - - query.execute(&self.pool).await?; - - debug!("created preset table {}", preset); - } - info!("all preset tables created successfully"); - - Ok(()) - } -} - -#[async_trait] -impl ImageStore for SqliteBackend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - check_category!(file_id, category, "?", "?", &self.pool)?; - - let column = to_variant_name(&format).expect("unreachable"); - - let qry = build_select_qry(column, &preset, "?"); - let query = sqlx::query(&qry).bind(file_id.to_string()); - - extract_or_none!(query.fetch_optional(&self.pool).await, column) - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let mut total: i64 = 0; - for (preset, preset_data) in data { - sum_total!(total, preset_data); - - let (qry, values) = build_insert!(&preset, preset_data, |_| "?".to_string()); - - let values_ = values.iter().map(|v| v.as_ref()); - let query = query_with_parameters!(file_id.to_string(), &qry, values_); - query.execute(&self.pool).await?; - } - - insert_metadata!( - file_id.to_string(), - category, - total, - |_| "?".to_string(), - &self.pool, - ); - - Ok(()) - } - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()> { - delete_file!(file_id, &presets, "?", &self.pool); - Ok(()) - } - - async fn list_entities( - &self, - filter: FilterType, - order: OrderBy, - page: usize, - ) -> Result> { - // we start at 1 but the offset should be calculated from 0 - let skip = PAGE_SIZE * (page as i64 - 1); - let order = match order { - OrderBy::CreationDate => "datetime(insert_date)", - OrderBy::TotalSize => "total_size", - }; - - let mut qry = format!( - r#" - SELECT file_id, category, insert_date, total_size - FROM image_metadata - ORDER BY {} DESC - LIMIT ?, ?; - "#, - order - ); - - apply_filter!(qry, "?", &filter); - - let mut query = sqlx::query(&qry).bind(skip).bind(PAGE_SIZE); - - bind_filter!(query, filter); - - let mut rows = query.fetch_all(&self.pool).await?; - let results = from_rows!(rows); - - Ok(results) - } -} diff --git a/src/cache.rs b/src/cache.rs deleted file mode 100644 index 82547df..0000000 --- a/src/cache.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::sync::Arc; - -use bytes::BytesMut; -use concread::arcache::{ARCache, ARCacheBuilder}; -use once_cell::sync::OnceCell; -use uuid::Uuid; - -use crate::image::ImageFormat; - -/// The key that acts as the hashed key. -pub type CacheKey = (Uuid, String, ImageFormat); - -/// Cheaply cloneable lock around a LRU cache. -pub type CacheStore = Arc>; - -pub static CACHE_STATE: OnceCell = OnceCell::new(); - -/// A wrapper around the `CacheStore` type letting it be put into Gotham's -/// shared state. -#[derive(Clone)] -pub struct CacheState(pub Option); - -impl CacheState { - /// Creates a new cache state instance with a given size. - pub fn init(cache_size: usize) { - let inst = if cache_size == 0 { - Self { 0: None } - } else { - let store = Arc::new(ARCacheBuilder::new() - .set_size(cache_size, 12) - .build() - .unwrap() - ); - Self { 0: Some(store) } - }; - - let _ = CACHE_STATE.set(inst); - } - - /// Get a item from the cache if it exists otherwise returns None. - pub fn get(&self, file_id: Uuid, preset: String, format: ImageFormat) -> Option { - let state = self.0.as_ref()?; - let ref_val = (file_id, preset, format); - let mut target = state.read(); - target.get(&ref_val).map(|v| v.clone()) - } - - /// Adds an item to the cache, if the cache size is already at it's limit - /// the least recently used (LRU) item is removed. - pub fn set(&self, file_id: Uuid, preset: String, format: ImageFormat, data: BytesMut) { - if let Some(state) = self.0.as_ref() { - let ref_val = (file_id, preset, format); - let mut target = state.write(); - target.insert(ref_val, data); - target.commit(); - } - } -} diff --git a/src/configure.rs b/src/configure.rs deleted file mode 100644 index 6afce37..0000000 --- a/src/configure.rs +++ /dev/null @@ -1,147 +0,0 @@ -use std::fs::read_to_string; -use std::sync::Arc; - -use gotham_derive::StateData; -use hashbrown::HashMap; -use serde::{Deserialize, Serialize}; - -use crate::image::ImageFormat; -use crate::storage::DatabaseBackend; - -/// The size of the pages when listing indexes via the admin panel. -pub const PAGE_SIZE: i64 = 50; - -/// A cheaply cloneable version of the given configuration -/// for shared state middleware. -#[derive(Clone, StateData)] -pub struct StateConfig(pub Arc); - -#[derive(Copy, Clone, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum LogLevel { - Off, - Info, - Debug, - Error, -} - -/// A given size of a preset. -/// Any uploaded images will be automatically duplicated and resized in this -/// preset. -#[derive(Deserialize)] -pub struct SizingPreset { - pub width: u32, - pub height: u32, -} - -#[derive(Deserialize)] -pub struct Config { - pub log_level: LogLevel, - pub host: String, - pub port: u16, - pub base_data_path: String, - pub formats: HashMap, - pub database_backend: DatabaseBackend, - pub size_presets: HashMap, - pub default_serving_preset: String, - pub default_serving_format: ImageFormat, - pub webp_quality: Option, - pub webp_compression: Option, - pub webp_method: Option, - pub webp_threading: Option, - pub cache_size: usize, -} - -impl Config { - pub fn from_file(file: &str) -> anyhow::Result { - let data = read_to_string(file)?; - Ok(serde_json::from_str::(&data)?) - } - - pub fn template(backend: &str) -> anyhow::Result { - let config = match backend.to_lowercase().as_str() { - "redis" => json!({ - "type": "redis", - "config": { - "connection_uri": "redis://user:pass@localhost/0", - "pool_size": 12, - } - }), - "cassandra" => json!({ - "type": "cassandra", - "config": { - "clusters": [ - "ip:port", - "ip:port", - "ip:port", - ], - "keyspace": { - "strategy": "SimpleStrategy", - "spec": { - "replication_factor": 3 - } - }, - "user": "", - "password": "", - } - }), - "postgres" => json!({ - "type": "postgres", - "config": { - "connection_uri": "postgres://user:pass@localhost/foo", - "pool_size": 10, - } - }), - "mysql" => json!({ - "type": "mysql", - "config": { - "connection_uri": "mysql://user:pass@localhost/foo", - "pool_size": 10, - } - }), - "sqlite" => json!({ - "type": "sqlite", - "config": { - "connection_uri": "sqlite://database.db", - "pool_size": 10, - } - }), - _ => return Err(anyhow::Error::msg("invalid database backend given")), - }; - - Ok(json!({ - "log_level": LogLevel::Info, - "host": "127.0.0.1", - "port": 7070, - "base_data_path": "/images", - "formats": { - "png": true, - "jpeg": true, - "gif": false, - "webp": true, - }, - "database_backend": config, - "size_presets": { - "small": { - "width": 32, - "height": 32, - }, - "medium": { - "width": 64, - "height": 64, - }, - "large": { - "width": 128, - "height": 128, - }, - }, - "default_serving_preset": "original", - "default_serving_format": "webp", - "webp_quality": None::, - "webp_compression": Some(50), - "webp_method": Some(4), - "webp_threading": Some(true), - "cache_size": 500, - })) - } -} diff --git a/src/context.rs b/src/context.rs deleted file mode 100644 index 71e1709..0000000 --- a/src/context.rs +++ /dev/null @@ -1,58 +0,0 @@ -use chrono::{DateTime, Utc}; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; - -/// A set of filters that can be used to view -/// entities via the REST API on the admin panel. -/// -/// Example: -/// -/// ```json -/// { -/// "filter": { -/// "filter_type": "category", -/// "with_value": "cats", -/// } -/// } -/// ``` -#[derive(Clone, Serialize, Deserialize)] -#[serde(rename_all = "lowercase", tag = "filter_type", content = "with_value")] -pub enum FilterType { - All, - Category(String), - CreationDate(DateTime), -} - -/// How the data should be ordered when requesting the -/// index list. -#[derive(Copy, Clone, Serialize, Deserialize)] -#[serde(rename_all = "lowercase")] -pub enum OrderBy { - CreationDate, - TotalSize, -} - -impl OrderBy { - pub fn as_str(&self) -> &str { - match self { - OrderBy::CreationDate => "insert_date", - OrderBy::TotalSize => "total_size", - } - } -} - -/// A result when listing all items in the server. -#[derive(Serialize)] -pub struct IndexResult { - pub file_id: Uuid, - pub category: String, - pub total_size: i32, - pub created_on: DateTime, -} - -#[derive(Deserialize)] -pub struct FilesListPayload { - pub filter: Option, - pub order: Option, - pub page: Option, -} diff --git a/src/image.rs b/src/image.rs deleted file mode 100644 index 8e9ae0d..0000000 --- a/src/image.rs +++ /dev/null @@ -1,241 +0,0 @@ -use std::sync::Arc; -use std::time::Instant; - -use anyhow::Result; -use bytes::{BufMut, BytesMut}; -use gotham::state::{FromState, State}; -use gotham_derive::{StateData, StaticResponseExtender}; -use hashbrown::HashMap; -use image::{imageops, load_from_memory_with_format, DynamicImage}; -use log::{debug, error}; -use serde::{Deserialize, Serialize}; -use uuid::Uuid; -use webp::Encoder; - -use crate::configure::StateConfig; -use crate::storage::StorageBackend; -use crate::traits::ImageStore; - -pub type ImageData = HashMap; -pub type ImagePresetsData = HashMap; - -pub type ImageDataSizes = HashMap; -pub type ImagePresetDataSizes = HashMap; - -#[derive(Debug, Clone, Ord, PartialOrd, Hash, Eq, PartialEq, Serialize, Deserialize, Copy)] -#[serde(rename_all = "lowercase")] -pub enum ImageFormat { - Png, - Jpeg, - Gif, - WebP, -} - -#[derive(Deserialize, StateData, StaticResponseExtender)] -pub struct ImageGet { - pub format: Option, - pub encode: Option, - pub preset: Option, -} - -#[derive(Deserialize)] -pub struct ImageUpload { - pub format: ImageFormat, - pub data: String, - pub category: Option, -} - -#[derive(Serialize)] -pub struct ImageUploaded { - pub file_id: Uuid, - pub formats: ImagePresetDataSizes, - pub category: String, -} - -#[derive(Deserialize, StateData, StaticResponseExtender)] -pub struct ImageRemove { - pub file_id: Uuid, -} - -macro_rules! convert { - ( $e:expr, $d:expr ) => {{ - || -> anyhow::Result { - let buff = BytesMut::new(); - let mut writer = buff.writer(); - let start = Instant::now(); - $e.write_to(&mut writer, $d)?; - debug!("format {:?} conversion took {:?}", $d, start.elapsed()); - Ok(writer.into_inner()) - }() - }}; -} - -macro_rules! generate { - ( $n:expr, $e:expr, $hm1:expr, $hm2:expr, $cfg:expr ) => ({ - let (data, sizes) = convert_image($e, $cfg).await?; - $hm1.insert($n.to_string(), sizes); - $hm2.insert($n.to_string(), data); - }) -} - -macro_rules! is_enabled { - ( $format:expr, $options:expr ) => {{ - $options.get(&$format).map(|v| *v).unwrap_or(true) - }}; -} - -macro_rules! log_err { - ( $result:expr, $msg:expr ) => {{ - match &$result { - Ok(_) => (), - Err(e) => error!("{} {:?}", $msg, e), - }; - - $result - }}; -} - -fn spawn_conversion( - img: Arc, - format: ImageFormat, - convert_to_format: image::ImageFormat, -) -> Result<(ImageFormat, BytesMut)> { - let img: BytesMut = log_err!( - convert!(img, convert_to_format), - format!("failed to convert {:?}: ", convert_to_format) - )?; - - return Ok((format, img)); -} - -async fn convert_image( - img: Arc, - cfg: StateConfig, -) -> Result<(ImageData, ImageDataSizes)> { - let mut resulting_sizes = HashMap::with_capacity(4); - let mut resulting_data = HashMap::with_capacity(4); - - let mut handles = vec![]; - - if is_enabled!(ImageFormat::Png, cfg.0.formats) { - let cloned = img.clone(); - let handle = tokio::task::spawn_blocking(move || { - spawn_conversion(cloned, ImageFormat::Png, image::ImageFormat::Png) - }); - handles.push(handle); - } - - if is_enabled!(ImageFormat::Jpeg, cfg.0.formats) { - let cloned = img.clone(); - let handle = tokio::task::spawn_blocking(move || { - spawn_conversion(cloned, ImageFormat::Jpeg, image::ImageFormat::Jpeg) - }); - handles.push(handle); - } - - if is_enabled!(ImageFormat::Gif, cfg.0.formats) { - let cloned = img.clone(); - let handle = tokio::task::spawn_blocking(move || { - spawn_conversion(cloned, ImageFormat::Gif, image::ImageFormat::Gif) - }); - handles.push(handle); - } - - // This is the slowest conversion, maybe change?? - // Updated: New encoder allows for multi threading encoding. - if is_enabled!(ImageFormat::WebP, cfg.0.formats) { - let cloned = img.clone(); - let handle = tokio::task::spawn_blocking(move || -> Result<(ImageFormat, BytesMut)> { - let start = Instant::now(); - let raw = Encoder::from_image(cloned.as_ref()).encode(); - debug!( - "format {:?} conversion took {:?}", - image::ImageFormat::WebP, - start.elapsed() - ); - let webp = BytesMut::from(raw.as_ref()); - - Ok((ImageFormat::WebP, webp)) - }); - handles.push(handle); - } - - for handle in handles { - let (format, data) = handle.await??; - resulting_sizes.insert(format, data.len()); - resulting_data.insert(format, data); - } - - Ok((resulting_data, resulting_sizes)) -} - -pub async fn process_new_image( - state: &mut State, - category: &str, - format: ImageFormat, - data: Vec, -) -> Result<(Uuid, ImagePresetDataSizes)> { - let cfg = StateConfig::take_from(state); - let storage = StorageBackend::take_from(state); - - let fmt = match format { - ImageFormat::Png => image::ImageFormat::Png, - ImageFormat::Jpeg => image::ImageFormat::Jpeg, - ImageFormat::Gif => image::ImageFormat::Gif, - ImageFormat::WebP => image::ImageFormat::WebP, - }; - - let presets = &cfg.0.size_presets; - let mut converted_sizes = HashMap::with_capacity(presets.len()); - let mut converted_data = HashMap::with_capacity(presets.len()); - let original = Arc::from(log_err!( - load_from_memory_with_format(&data, fmt), - "failed to load format due to exception: " - )?); - generate!( - "original", - original.clone(), - converted_sizes, - converted_data, - cfg.clone() - ); - - for (preset_name, size) in presets { - let cloned = original.clone(); - let im = Arc::new(cloned.resize(size.width, size.height, imageops::FilterType::Nearest)); - - generate!( - preset_name, - im, - converted_sizes, - converted_data, - cfg.clone() - ); - } - - let file_id = Uuid::new_v4(); - storage.add_image(file_id, category, converted_data).await?; - - Ok((file_id, converted_sizes)) -} - -pub async fn get_image( - state: &mut State, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, -) -> Option { - let storage = StorageBackend::take_from(state); - storage.get_image(file_id, preset, category, format).await -} - -pub async fn delete_image(state: &mut State, file_id: Uuid) -> Result<()> { - let storage = StorageBackend::take_from(state); - let cfg = StateConfig::take_from(state); - - let presets = cfg.0.size_presets.keys().collect(); - storage.remove_image(file_id, presets).await?; - - Ok(()) -} diff --git a/src/main.rs b/src/main.rs index 9ffdae7..e69de29 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,250 +0,0 @@ -mod backends; -mod cache; -mod configure; -mod context; -mod image; -mod response; -mod routes; -mod storage; -mod traits; - -#[macro_use] -extern crate serde_json; - -use std::net::SocketAddr; -use std::sync::Arc; - -use anyhow::Result; -use clap::{App, Arg, ArgMatches, SubCommand}; -use gotham::middleware::logger::SimpleLogger as GothSimpleLogger; -use gotham::middleware::state::StateMiddleware; -use gotham::pipeline::new_pipeline; -use gotham::pipeline::single::single_pipeline; -use gotham::router::builder::{build_router, DefineSingleRoute, DrawRoutes}; -use gotham::router::Router; -use gotham_derive::{StateData, StaticResponseExtender}; -use log::{info, LevelFilter}; -use serde::Deserialize; -use tokio::fs; -use uuid::Uuid; - -use crate::configure::{LogLevel, StateConfig}; -use crate::image::{ImageFormat, ImageGet, ImageRemove}; -use crate::storage::{DatabaseBackend, StorageBackend}; -use crate::traits::DatabaseLinker; - -/// A regex string for validating uuids in the request path. -static UUID_REGEX: &str = - "[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$"; - -/// A regex for separating out the category sections -static CATEGORY_REGEX: &str = "[a-zA-Z0-9]+"; - -/// A simple extractor for taking the file_id out of the path -/// of the request as a UUID. -#[derive(Deserialize, StateData, StaticResponseExtender)] -struct PathExtractor { - category: Option, - file_id: Uuid, -} - -/// Constructs all the routes for the server. -fn router(backend: storage::StorageBackend, config: StateConfig) -> Result { - let base = config.0.base_data_path.clone(); - - let cache_size = config.0.cache_size; - cache::CacheState::init(cache_size); - - let pipeline = new_pipeline() - .add(GothSimpleLogger::new(log::Level::Info)) - .add(StateMiddleware::new(backend)) - .add(StateMiddleware::new(config)) - .build(); - let (chain, pipelines) = single_pipeline(pipeline); - - Ok(build_router(chain, pipelines, |route| { - route - .get(&format!("{}/:file_id:{}", base, UUID_REGEX)) - .with_path_extractor::() - .with_query_string_extractor::() - .to_async(routes::get_file); - - route - .get(&format!( - "{}/:category:{}/:file_id:{}", - base, CATEGORY_REGEX, UUID_REGEX - )) - .with_path_extractor::() - .with_query_string_extractor::() - .to_async(routes::get_file); - - route.post("admin/create/image").to_async(routes::add_file); - route - .delete(&format!("admin/delete/image/:file_id:{}", UUID_REGEX)) - .with_path_extractor::() - .to_async(routes::remove_file); - - route.post("admin/list").to_async(routes::list_files); - })) -} - -/// This will initialise the logger as well as -/// start server and parse args (although not in that order). -#[tokio::main] -async fn main() -> Result<()> { - let cli_args = parse_args(); - let (name, args) = cli_args.subcommand(); - match name { - "init" => run_init(args.unwrap()).await, - "run" => run_server(args.unwrap()).await, - other => { - return Err(anyhow::Error::msg(format!( - "command {} is not supported, only commands (init, run) are supported", - other, - ))) - }, - }?; - - Ok(()) -} - -async fn run_init(args: &ArgMatches<'_>) -> Result<()> { - let target_backend = args.value_of("backend").expect("backend value not given"); - - let example = configure::Config::template(target_backend)?; - let out = serde_json::to_string_pretty(&example)?; - fs::write("./config.json", out).await?; - - Ok(()) -} - -async fn run_server(args: &ArgMatches<'_>) -> Result<()> { - let cfg = if let Some(cfg) = args.value_of("config") { - configure::Config::from_file(cfg) - } else { - return Err(anyhow::Error::msg( - "missing required config file, exiting...", - )); - }?; - - let (goth_lvl, lust_lvl) = match cfg.log_level { - LogLevel::Off => (LevelFilter::Off, LevelFilter::Off), - LogLevel::Info => (LevelFilter::Info, LevelFilter::Info), - LogLevel::Debug => (LevelFilter::Info, LevelFilter::Debug), - LogLevel::Error => (LevelFilter::Error, LevelFilter::Error), - }; - - if std::env::var_os("RUST_LOG").is_none() { - std::env::set_var("RUST_LOG", format!("warn,lust={},gotham={}", lust_lvl, goth_lvl)); - } - - pretty_env_logger::init(); - - let lossless = cfg.webp_quality.is_none(); - let quality = if lossless { - cfg.webp_compression.unwrap_or(50f32) - } else { - cfg.webp_quality.unwrap() - }; - let threading = cfg.webp_threading.unwrap_or(true); - let method = cfg.webp_method.unwrap_or(4) as i32; - info!( - "setting up webp state. \ - Lossless: {}, \ - Quality: {}, \ - Method: {}, \ - Threading: {}", - lossless, quality, method, threading - ); - webp::init_global(lossless, quality, method, threading); - - let fields: Vec = cfg - .formats - .iter() - .filter_map( - |(format, enabled)| { - if *enabled { - Some(*format) - } else { - None - } - }, - ) - .collect(); - - let mut presets: Vec<&str> = cfg.size_presets.keys().map(|v| v.as_str()).collect(); - presets.push("original"); - - let backend: StorageBackend = match cfg.database_backend.clone() { - DatabaseBackend::Redis(db_cfg) => { - let mut db = backends::redis::Backend::connect(db_cfg).await?; - db.ensure_tables(presets, fields).await?; - let _ = storage::REDIS.set(db); - StorageBackend::Redis - }, - DatabaseBackend::Cassandra(db_cfg) => { - let mut db = backends::cql::Backend::connect(db_cfg).await?; - db.ensure_tables(presets, fields).await?; - let _ = storage::CASSANDRA.set(db); - StorageBackend::Cassandra - }, - DatabaseBackend::Postgres(db_cfg) => { - let mut db = backends::sql::PostgresBackend::connect(db_cfg).await?; - db.ensure_tables(presets, fields).await?; - let _ = storage::POSTGRES.set(db); - StorageBackend::Postgres - }, - DatabaseBackend::MySQL(db_cfg) => { - let mut db = backends::sql::MySQLBackend::connect(db_cfg).await?; - db.ensure_tables(presets, fields).await?; - let _ = storage::MYSQL.set(db); - StorageBackend::MySQL - }, - DatabaseBackend::Sqlite(db_cfg) => { - let mut db = backends::sql::SqliteBackend::connect(db_cfg).await?; - db.ensure_tables(presets, fields).await?; - let _ = storage::SQLITE.set(db); - StorageBackend::Sqlite - }, - }; - - let addr: SocketAddr = format!("{}:{}", &cfg.host, cfg.port).parse()?; - let state_cfg = StateConfig(Arc::new(cfg)); - let _ = gotham::init_server(addr, router(backend, state_cfg)?).await; - - Ok(()) -} - -fn parse_args() -> ArgMatches<'static> { - App::new("Lust") - .version("0.1.0") - .author("Harrison Burt ") - .about("A powerful automatic image server.") - .subcommand( - SubCommand::with_name("init") - .about("Initialises the workspace with a configuration file") - .version("0.1.0") - .arg( - Arg::with_name("backend") - .short("b") - .long("backend") - .help("The target database backend") - .takes_value(true) - .required(true), - ), - ) - .subcommand( - SubCommand::with_name("run") - .about("Runs the server with the given configuration") - .version("0.1.0") - .arg( - Arg::with_name("config") - .short("c") - .long("config") - .help("The path to a given config file in JSON format.") - .takes_value(true) - .default_value("config.json"), - ), - ) - .get_matches() -} diff --git a/src/response.rs b/src/response.rs deleted file mode 100644 index 76ce55a..0000000 --- a/src/response.rs +++ /dev/null @@ -1,54 +0,0 @@ -use bytes::BytesMut; -use gotham::hyper::http::{header, Response, StatusCode}; -use gotham::hyper::Body; -use headers::{ContentType, HeaderMapExt}; -use serde_json::Value; - -use crate::image::ImageFormat; - -/// A standard JSON response with the content type set to application/json -pub fn json_response(status: StatusCode, data: Option) -> Response { - let payload = json!({ - "status": status.as_u16(), - "data": data, - }); - - let mut resp = Response::builder() - .status(status) - .body(Body::from(serde_json::to_vec(&payload).unwrap())) - .unwrap(); - - resp.headers_mut().typed_insert(ContentType::json()); - - resp -} - -pub fn image_response(format: ImageFormat, data: BytesMut) -> Response { - let mut resp = Response::builder() - .status(StatusCode::OK) - .body(Body::from(data.to_vec())) - .unwrap(); - - let content_type = match format { - ImageFormat::Png => "image/png", - ImageFormat::Jpeg => "image/jpeg", - ImageFormat::Gif => "image/gif", - ImageFormat::WebP => "image/webp", - }; - - resp.headers_mut() - .insert(header::CONTENT_TYPE, content_type.parse().unwrap()); - - resp -} - -pub fn empty_response(status: StatusCode) -> Response { - let mut resp = Response::builder() - .status(status) - .body(Body::from(Vec::new())) - .unwrap(); - - resp.headers_mut().typed_insert(ContentType::text_utf8()); - - resp -} diff --git a/src/routes.rs b/src/routes.rs deleted file mode 100644 index 729f0e0..0000000 --- a/src/routes.rs +++ /dev/null @@ -1,290 +0,0 @@ -use base64::{decode, encode}; -use gotham::handler::HandlerResult; -use gotham::hyper::http::StatusCode; -use gotham::hyper::{body, Body}; -use gotham::state::{FromState, State}; -use log::{debug, error}; - -use crate::cache::CACHE_STATE; -use crate::configure::StateConfig; -use crate::context::{FilesListPayload, FilterType, OrderBy}; -use crate::image::{ - delete_image, - get_image, - process_new_image, - ImageGet, - ImageRemove, - ImageUpload, - ImageUploaded, -}; -use crate::response::{empty_response, image_response, json_response}; -use crate::storage::StorageBackend; -use crate::traits::ImageStore; -use crate::PathExtractor; - -macro_rules! from_body { - ( $e:expr ) => {{ - let res = body::to_bytes(Body::take_from(&mut $e)).await; - let bod = match res { - Ok(bod) => bod, - Err(e) => { - error!("failed to read data from body {:?}", &e); - return Ok(( - $e, - json_response( - StatusCode::INTERNAL_SERVER_ERROR, - Some(json!({ - "message": format!("encountered exception: {:?}", e) - })), - ), - )); - } - }; - - match serde_json::from_slice(bod.as_ref()) { - Ok(v) => v, - Err(e) => { - return Ok(( - $e, - json_response( - StatusCode::UNPROCESSABLE_ENTITY, - Some(json!({ - "message": - format!( - "failed to deserialize POST body due to the following error: {:?}", - e - ) - })), - ), - )) - } - } - }}; -} - -/// Gets a given image from the storage backend with the given -/// preset and format if it does not already exist in cache. -/// -/// This endpoint can return any of the following status codes: -/// -/// 404: -/// The image does not exist, NOTE: This endpoint will **always** -/// return a 404 if an unexpected error was encountered rather than -/// raising an error to the requester, instead it will be logged in -/// the console. -/// -/// 200: -/// The image was successfully fetched and sent as the response. -/// -/// TODO: -/// Likely performance issues could become apparent at higher -/// concurrency due to the Mutex on the LRU cache, although this -/// is probably insignificant compared to the time spent on IO. -pub async fn get_file(mut state: State) -> HandlerResult { - let path_vars = PathExtractor::take_from(&mut state); - let params = ImageGet::take_from(&mut state); - let config = StateConfig::take_from(&mut state); - - let file_id = path_vars.file_id; - let category = path_vars.category.unwrap_or_else(|| "default".to_string()); - - let format = params - .format - .unwrap_or_else(|| config.0.default_serving_format.clone()); - - let mut preset = params - .preset - .unwrap_or_else(|| config.0.default_serving_preset.clone()); - - if preset != "original" { - // We dont want to necessarily error if you give an invalid - // preset, but we dont want to attempt something that doesnt - // exist. - if !config.0.size_presets.contains_key(&preset) { - preset = "original".into(); - } - } - - let cache = CACHE_STATE.get().expect("not initialised"); - let img = if let Some(cached) = cache.get(file_id, preset.clone(), format) { - debug!( - "using cached version of image for file_id: {}, preset: {}, format: {:?}", - file_id, &preset, format, - ); - Some(cached) - } else { - debug!( - "using backend version of image for file_id: {}, preset: {}, format: {:?}", - file_id, &preset, format, - ); - if let Some(data) = get_image(&mut state, file_id, preset.clone(), &category, format).await - { - cache.set(file_id, preset, format, data.clone()); - Some(data) - } else { - None - } - }; - - match img { - None => Ok((state, empty_response(StatusCode::NOT_FOUND))), - Some(data) => { - if params.encode.unwrap_or(false) { - let encoded = encode(data.as_ref()); - return Ok(( - state, - json_response( - StatusCode::OK, - Some(json!({ - "image": encoded, - })), - ), - )); - } - Ok((state, image_response(format, data))) - }, - } -} - -/// Handles a POST request for adding a image to the store. -/// -/// The image payload must be in JSON format and be base64 encoded in -/// the standard specification. -/// -/// E.g. -/// ```json -/// { -/// "format": "png", -/// "data": "...data ensues..." -/// } -/// ``` -pub async fn add_file(mut state: State) -> HandlerResult { - let upload: ImageUpload = from_body!(state); - - let format = upload.format; - let data = match decode(upload.data) { - Ok(d) => d, - Err(_) => { - return Ok(( - state, - json_response( - StatusCode::UNPROCESSABLE_ENTITY, - Some(json!({ - "message": "data is not encoded in base64 format correctly", - })), - ), - )) - }, - }; - - let category = upload.category.unwrap_or_else(|| "default".to_string()); - - let (file_id, formats) = match process_new_image(&mut state, &category, format, data).await { - Ok(v) => v, - Err(e) => { - return Ok(( - state, - json_response( - StatusCode::INTERNAL_SERVER_ERROR, - Some(json!({ - "message": format!("failed to process image: {:?}", e), - })), - ), - )); - }, - }; - - let resp = ImageUploaded { - file_id, - formats, - category, - }; - - let resp = serde_json::to_value(resp).expect("failed to serialize uploaded stats"); - - Ok((state, json_response(StatusCode::OK, Some(resp)))) -} - -/// Handles removing a image from the store. -/// -/// This removes the image from both the database backend and -/// the cache if it exists in there. -/// -/// This only requires the UUID of the image no other information -/// is needed. -/// -/// Note on semantics: -/// This endpoint does not check if the image exists or not, -/// it simply tries to remove it if it exists otherwise ignores it. -/// -/// For that reason this will always return 200 if no exceptions -/// happened at the time. -/// -/// This endpoint can return any of the following responses: -/// -/// 500: -/// The server could not complete the request due to a unexpected -/// exception, this is typically only possible via the transaction -/// on the database backend failing. -/// -/// 200: -/// The image has been removed successfully. -pub async fn remove_file(mut state: State) -> HandlerResult { - let params = ImageRemove::take_from(&mut state); - - if let Err(e) = delete_image(&mut state, params.file_id).await { - return Ok(( - state, - json_response( - StatusCode::INTERNAL_SERVER_ERROR, - Some(json!({ - "message": format!( - "failed to delete image with id: {} due to the following exception: {:?}", - params.file_id, - e - ) - })), - ), - )); - }; - - Ok(( - state, - json_response( - StatusCode::OK, - Some(json!({ - "message": "file deleted if exists", - "file_id": params.file_id.to_string() - })), - ), - )) -} - -pub async fn list_files(mut state: State) -> HandlerResult { - let payload: FilesListPayload = from_body!(state); - let storage = StorageBackend::take_from(&mut state); - - let filter = payload.filter.unwrap_or_else(|| FilterType::All); - let sort = payload.order.unwrap_or_else(|| OrderBy::CreationDate); - let page = payload.page.unwrap_or_else(|| 1usize); - - let (status, payload) = match storage.list_entities(filter.clone(), sort, page).await { - Ok(results) => ( - StatusCode::OK, - Some(json!({ - "page": page, - "filtered_by": filter, - "ordered_by": sort, - "results": results, - })), - ), - Err(e) => ( - StatusCode::INTERNAL_SERVER_ERROR, - Some(json!({ - "message": format!("failed to fetch results for page due to error: {:?}", e) - })), - ), - }; - - Ok((state, json_response(status, payload))) -} diff --git a/src/storage.rs b/src/storage.rs deleted file mode 100644 index f6b29fa..0000000 --- a/src/storage.rs +++ /dev/null @@ -1,137 +0,0 @@ -use anyhow::Result; -use async_trait::async_trait; -use bytes::BytesMut; -use gotham_derive::StateData; -use log::error; -use once_cell::sync::OnceCell; -use serde::Deserialize; -use uuid::Uuid; - -use crate::backends; -use crate::context::{FilterType, IndexResult, OrderBy}; -use crate::image::{ImageFormat, ImagePresetsData}; -use crate::traits::ImageStore; - -// The bellow definitions are a hack, this is due to -pub(crate) static REDIS: OnceCell = OnceCell::new(); -pub(crate) static CASSANDRA: OnceCell = OnceCell::new(); -pub(crate) static POSTGRES: OnceCell = OnceCell::new(); -pub(crate) static MYSQL: OnceCell = OnceCell::new(); -pub(crate) static SQLITE: OnceCell = OnceCell::new(); - -#[derive(Clone, Deserialize)] -#[serde(rename_all = "lowercase", tag = "type", content = "config")] -pub enum DatabaseBackend { - Redis(backends::redis::RedisConfig), - Cassandra(backends::cql::DatabaseConfig), - Postgres(backends::sql::DatabaseConfig), - MySQL(backends::sql::DatabaseConfig), - Sqlite(backends::sql::DatabaseConfig), -} - -macro_rules! acquire { - ( $e:expr ) => {{ - $e.get().expect("backend not initialised") - }}; -} - -#[derive(Copy, Clone, StateData)] -pub enum StorageBackend { - Redis, - Cassandra, - Postgres, - MySQL, - Sqlite, -} - -#[async_trait] -impl ImageStore for StorageBackend { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option { - match self { - Self::Redis => { - acquire!(REDIS) - .get_image(file_id, preset, category, format) - .await - }, - Self::Cassandra => { - acquire!(CASSANDRA) - .get_image(file_id, preset, category, format) - .await - }, - Self::Postgres => { - acquire!(POSTGRES) - .get_image(file_id, preset, category, format) - .await - }, - Self::MySQL => { - acquire!(MYSQL) - .get_image(file_id, preset, category, format) - .await - }, - Self::Sqlite => { - acquire!(SQLITE) - .get_image(file_id, preset, category, format) - .await - }, - } - } - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()> { - let res = match self { - Self::Redis => acquire!(REDIS).add_image(file_id, category, data).await, - Self::Cassandra => acquire!(CASSANDRA).add_image(file_id, category, data).await, - Self::Postgres => acquire!(POSTGRES).add_image(file_id, category, data).await, - Self::MySQL => acquire!(MYSQL).add_image(file_id, category, data).await, - Self::Sqlite => acquire!(SQLITE).add_image(file_id, category, data).await, - }; - - if let Err(e) = &res { - error!("failed to add image {:?}", e); - } - - res - } - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()> { - let res = match self { - Self::Redis => acquire!(REDIS).remove_image(file_id, presets).await, - Self::Cassandra => acquire!(CASSANDRA).remove_image(file_id, presets).await, - Self::Postgres => acquire!(POSTGRES).remove_image(file_id, presets).await, - Self::MySQL => acquire!(MYSQL).remove_image(file_id, presets).await, - Self::Sqlite => acquire!(SQLITE).remove_image(file_id, presets).await, - }; - - if let Err(e) = &res { - error!("failed to remove image {:?}", e); - } - - res - } - - async fn list_entities( - &self, - filter: FilterType, - order: OrderBy, - page: usize, - ) -> Result> { - let res = match self { - Self::Redis => acquire!(REDIS).list_entities(filter, order, page).await, - Self::Cassandra => acquire!(CASSANDRA).list_entities(filter, order, page).await, - Self::Postgres => acquire!(POSTGRES).list_entities(filter, order, page).await, - Self::MySQL => acquire!(MYSQL).list_entities(filter, order, page).await, - Self::Sqlite => acquire!(SQLITE).list_entities(filter, order, page).await, - }; - - if let Err(e) = &res { - error!("failed to list images {:?}", e); - } - - res - } -} diff --git a/src/traits.rs b/src/traits.rs deleted file mode 100644 index b4d2f76..0000000 --- a/src/traits.rs +++ /dev/null @@ -1,34 +0,0 @@ -use anyhow::Result; -use async_trait::async_trait; -use bytes::BytesMut; -use uuid::Uuid; - -use crate::context::{FilterType, IndexResult, OrderBy}; -use crate::image::{ImageFormat, ImagePresetsData}; - -#[async_trait] -pub trait DatabaseLinker { - async fn ensure_tables(&mut self, presets: Vec<&str>, columns: Vec) -> Result<()>; -} - -#[async_trait] -pub trait ImageStore { - async fn get_image( - &self, - file_id: Uuid, - preset: String, - category: &str, - format: ImageFormat, - ) -> Option; - - async fn add_image(&self, file_id: Uuid, category: &str, data: ImagePresetsData) -> Result<()>; - - async fn remove_image(&self, file_id: Uuid, presets: Vec<&String>) -> Result<()>; - - async fn list_entities( - &self, - filter: FilterType, - order: OrderBy, - page: usize, - ) -> Result>; -} diff --git a/tests/backend_runners/keydb/docker-compose.yml b/tests/backend_runners/keydb/docker-compose.yml deleted file mode 100644 index 6992869..0000000 --- a/tests/backend_runners/keydb/docker-compose.yml +++ /dev/null @@ -1,11 +0,0 @@ -version: '3' - -services: - keydb: - image: eqalpha/keydb:latest - container_name: some-keydb - ports: - - "6379:6379" - volumes: - - ./storage:/data - - ./keydb.conf:/etc/keydb/keydb.conf \ No newline at end of file diff --git a/tests/backend_runners/keydb/keydb.conf b/tests/backend_runners/keydb/keydb.conf deleted file mode 100644 index fbe2ff6..0000000 --- a/tests/backend_runners/keydb/keydb.conf +++ /dev/null @@ -1,1574 +0,0 @@ -# KeyDB configuration file example. -# -# Note that in order to read the configuration file, KeyDB must be -# started with the file path as first argument: -# -# ./keydb-server /path/to/keydb.conf - -# Note on units: when memory size is needed, it is possible to specify -# it in the usual form of 1k 5GB 4M and so forth: -# -# 1k => 1000 bytes -# 1kb => 1024 bytes -# 1m => 1000000 bytes -# 1mb => 1024*1024 bytes -# 1g => 1000000000 bytes -# 1gb => 1024*1024*1024 bytes -# -# units are case insensitive so 1GB 1Gb 1gB are all the same. - -################################## INCLUDES ################################### - -# Include one or more other config files here. This is useful if you -# have a standard template that goes to all KeyDB servers but also need -# to customize a few per-server settings. Include files can include -# other files, so use this wisely. -# -# Notice option "include" won't be rewritten by command "CONFIG REWRITE" -# from admin or KeyDB Sentinel. Since KeyDB always uses the last processed -# line as value of a configuration directive, you'd better put includes -# at the beginning of this file to avoid overwriting config change at runtime. -# -# If instead you are interested in using includes to override configuration -# options, it is better to use include as the last line. -# -# include /path/to/local.conf -# include /path/to/other.conf - -################################## MODULES ##################################### - -# Load modules at startup. If the server is not able to load modules -# it will abort. It is possible to use multiple loadmodule directives. -# -# loadmodule /path/to/my_module.so -# loadmodule /path/to/other_module.so - -################################## NETWORK ##################################### - -# By default, if no "bind" configuration directive is specified, KeyDB listens -# for connections from all the network interfaces available on the server. -# It is possible to listen to just one or multiple selected interfaces using -# the "bind" configuration directive, followed by one or more IP addresses. -# -# Examples: -# -# bind 192.168.1.100 10.0.0.1 -# bind 127.0.0.1 ::1 -# -# ~~~ WARNING ~~~ If the computer running KeyDB is directly exposed to the -# internet, binding to all the interfaces is dangerous and will expose the -# instance to everybody on the internet. So by default we uncomment the -# following bind directive, that will force KeyDB to listen only into -# the IPv4 loopback interface address (this means KeyDB will be able to -# accept connections only from clients running into the same computer it -# is running). -# -# IF YOU ARE SURE YOU WANT YOUR INSTANCE TO LISTEN TO ALL THE INTERFACES -# JUST COMMENT THE FOLLOWING LINE. -# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -bind 0.0.0.0 - -# Protected mode is a layer of security protection, in order to avoid that -# KeyDB instances left open on the internet are accessed and exploited. -# -# When protected mode is on and if: -# -# 1) The server is not binding explicitly to a set of addresses using the -# "bind" directive. -# 2) No password is configured. -# -# The server only accepts connections from clients connecting from the -# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain -# sockets. -# -# By default protected mode is enabled. You should disable it only if -# you are sure you want clients from other hosts to connect to KeyDB -# even if no authentication is configured, nor a specific set of interfaces -# are explicitly listed using the "bind" directive. -protected-mode yes - -# Accept connections on the specified port, default is 6379 (IANA #815344). -# If port 0 is specified KeyDB will not listen on a TCP socket. -port 6379 - -# TCP listen() backlog. -# -# In high requests-per-second environments you need an high backlog in order -# to avoid slow clients connections issues. Note that the Linux kernel -# will silently truncate it to the value of /proc/sys/net/core/somaxconn so -# make sure to raise both the value of somaxconn and tcp_max_syn_backlog -# in order to get the desired effect. -tcp-backlog 511 - -# Unix socket. -# -# Specify the path for the Unix socket that will be used to listen for -# incoming connections. There is no default, so KeyDB will not listen -# on a unix socket when not specified. -# -# unixsocket /tmp/keydb.sock -# unixsocketperm 700 - -# Close the connection after a client is idle for N seconds (0 to disable) -timeout 0 - -# TCP keepalive. -# -# If non-zero, use SO_KEEPALIVE to send TCP ACKs to clients in absence -# of communication. This is useful for two reasons: -# -# 1) Detect dead peers. -# 2) Take the connection alive from the point of view of network -# equipment in the middle. -# -# On Linux, the specified value (in seconds) is the period used to send ACKs. -# Note that to close the connection the double of the time is needed. -# On other kernels the period depends on the kernel configuration. -# -# A reasonable value for this option is 300 seconds, which is the new -# KeyDB default starting with Redis 3.2.1. -tcp-keepalive 300 - -################################# GENERAL ##################################### - -# By default KeyDB does not run as a daemon. Use 'yes' if you need it. -# Note that KeyDB will write a pid file in /var/run/keydb.pid when daemonized. -daemonize no - -# If you run KeyDB from upstart or systemd, KeyDB can interact with your -# supervision tree. Options: -# supervised no - no supervision interaction -# supervised upstart - signal upstart by putting KeyDB into SIGSTOP mode -# supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET -# supervised auto - detect upstart or systemd method based on -# UPSTART_JOB or NOTIFY_SOCKET environment variables -# Note: these supervision methods only signal "process is ready." -# They do not enable continuous liveness pings back to your supervisor. -supervised no - -# If a pid file is specified, KeyDB writes it where specified at startup -# and removes it at exit. -# -# When the server runs non daemonized, no pid file is created if none is -# specified in the configuration. When the server is daemonized, the pid file -# is used even if not specified, defaulting to "/var/run/keydb.pid". -# -# Creating a pid file is best effort: if KeyDB is not able to create it -# nothing bad happens, the server will start and run normally. -pidfile /var/run/keydb_6379.pid - -# Specify the server verbosity level. -# This can be one of: -# debug (a lot of information, useful for development/testing) -# verbose (many rarely useful info, but not a mess like the debug level) -# notice (moderately verbose, what you want in production probably) -# warning (only very important / critical messages are logged) -loglevel notice - -# Specify the log file name. Also the empty string can be used to force -# KeyDB to log on the standard output. Note that if you use standard -# output for logging but daemonize, logs will be sent to /dev/null -logfile "" - -# To enable logging to the system logger, just set 'syslog-enabled' to yes, -# and optionally update the other syslog parameters to suit your needs. -# syslog-enabled no - -# Specify the syslog identity. -# syslog-ident keydb - -# Specify the syslog facility. Must be USER or between LOCAL0-LOCAL7. -# syslog-facility local0 - -# Set the number of databases. The default database is DB 0, you can select -# a different one on a per-connection basis using SELECT where -# dbid is a number between 0 and 'databases'-1 -databases 16 - -# By default KeyDB shows an ASCII art logo only when started to log to the -# standard output and if the standard output is a TTY. Basically this means -# that normally a logo is displayed only in interactive sessions. -# -# However it is possible to force the pre-4.0 behavior and always show a -# ASCII art logo in startup logs by setting the following option to yes. -always-show-logo yes - -################################ SNAPSHOTTING ################################ -# -# Save the DB on disk: -# -# save -# -# Will save the DB if both the given number of seconds and the given -# number of write operations against the DB occurred. -# -# In the example below the behaviour will be to save: -# after 900 sec (15 min) if at least 1 key changed -# after 300 sec (5 min) if at least 10 keys changed -# after 60 sec if at least 10000 keys changed -# -# Note: you can disable saving completely by commenting out all "save" lines. -# -# It is also possible to remove all the previously configured save -# points by adding a save directive with a single empty string argument -# like in the following example: -# -# save "" - -save 900 1 -save 300 10 -save 60 10000 - -# By default KeyDB will stop accepting writes if RDB snapshots are enabled -# (at least one save point) and the latest background save failed. -# This will make the user aware (in a hard way) that data is not persisting -# on disk properly, otherwise chances are that no one will notice and some -# disaster will happen. -# -# If the background saving process will start working again KeyDB will -# automatically allow writes again. -# -# However if you have setup your proper monitoring of the KeyDB server -# and persistence, you may want to disable this feature so that KeyDB will -# continue to work as usual even if there are problems with disk, -# permissions, and so forth. -stop-writes-on-bgsave-error yes - -# Compress string objects using LZF when dump .rdb databases? -# For default that's set to 'yes' as it's almost always a win. -# If you want to save some CPU in the saving child set it to 'no' but -# the dataset will likely be bigger if you have compressible values or keys. -rdbcompression yes - -# Since version 5 of RDB a CRC64 checksum is placed at the end of the file. -# This makes the format more resistant to corruption but there is a performance -# hit to pay (around 10%) when saving and loading RDB files, so you can disable it -# for maximum performances. -# -# RDB files created with checksum disabled have a checksum of zero that will -# tell the loading code to skip the check. -rdbchecksum yes - -# The filename where to dump the DB -dbfilename dump.rdb - -# The working directory. -# -# The DB will be written inside this directory, with the filename specified -# above using the 'dbfilename' configuration directive. -# -# The Append Only File will also be created inside this directory. -# -# Note that you must specify a directory here, not a file name. -dir ./ - -################################# REPLICATION ################################# - -# Master-Replica replication. Use replicaof to make a KeyDB instance a copy of -# another KeyDB server. A few things to understand ASAP about KeyDB replication. -# -# +------------------+ +---------------+ -# | Master | ---> | Replica | -# | (receive writes) | | (exact copy) | -# +------------------+ +---------------+ -# -# 1) KeyDB replication is asynchronous, but you can configure a master to -# stop accepting writes if it appears to be not connected with at least -# a given number of replicas. -# 2) KeyDB replicas are able to perform a partial resynchronization with the -# master if the replication link is lost for a relatively small amount of -# time. You may want to configure the replication backlog size (see the next -# sections of this file) with a sensible value depending on your needs. -# 3) Replication is automatic and does not need user intervention. After a -# network partition replicas automatically try to reconnect to masters -# and resynchronize with them. -# -# replicaof - -# If the master is password protected (using the "requirepass" configuration -# directive below) it is possible to tell the replica to authenticate before -# starting the replication synchronization process, otherwise the master will -# refuse the replica request. -# -# masterauth -# -# However this is not enough if you are using KeyDB ACLs (for Redis version -# 6 or greater), and the default user is not capable of running the PSYNC -# command and/or other commands needed for replication. In this case it's -# better to configure a special user to use with replication, and specify the -# masteruser configuration as such: -# -# masteruser -# -# When masteruser is specified, the replica will authenticate against its -# master using the new AUTH form: AUTH . - -# When a replica loses its connection with the master, or when the replication -# is still in progress, the replica can act in two different ways: -# -# 1) if replica-serve-stale-data is set to 'yes' (the default) the replica will -# still reply to client requests, possibly with out of date data, or the -# data set may just be empty if this is the first synchronization. -# -# 2) if replica-serve-stale-data is set to 'no' the replica will reply with -# an error "SYNC with master in progress" to all the kind of commands -# but to INFO, replicaOF, AUTH, PING, SHUTDOWN, REPLCONF, ROLE, CONFIG, -# SUBSCRIBE, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, PUBLISH, PUBSUB, -# COMMAND, POST, HOST: and LATENCY. -# -replica-serve-stale-data yes - -# You can configure a replica instance to accept writes or not. Writing against -# a replica instance may be useful to store some ephemeral data (because data -# written on a replica will be easily deleted after resync with the master) but -# may also cause problems if clients are writing to it because of a -# misconfiguration. -# -# Since Redis 2.6 by default replicas are read-only. -# -# Note: read only replicas are not designed to be exposed to untrusted clients -# on the internet. It's just a protection layer against misuse of the instance. -# Still a read only replica exports by default all the administrative commands -# such as CONFIG, DEBUG, and so forth. To a limited extent you can improve -# security of read only replicas using 'rename-command' to shadow all the -# administrative / dangerous commands. -replica-read-only yes - -# Replication SYNC strategy: disk or socket. -# -# ------------------------------------------------------- -# WARNING: DISKLESS REPLICATION IS EXPERIMENTAL CURRENTLY -# ------------------------------------------------------- -# -# New replicas and reconnecting replicas that are not able to continue the replication -# process just receiving differences, need to do what is called a "full -# synchronization". An RDB file is transmitted from the master to the replicas. -# The transmission can happen in two different ways: -# -# 1) Disk-backed: The KeyDB master creates a new process that writes the RDB -# file on disk. Later the file is transferred by the parent -# process to the replicas incrementally. -# 2) Diskless: The KeyDB master creates a new process that directly writes the -# RDB file to replica sockets, without touching the disk at all. -# -# With disk-backed replication, while the RDB file is generated, more replicas -# can be queued and served with the RDB file as soon as the current child producing -# the RDB file finishes its work. With diskless replication instead once -# the transfer starts, new replicas arriving will be queued and a new transfer -# will start when the current one terminates. -# -# When diskless replication is used, the master waits a configurable amount of -# time (in seconds) before starting the transfer in the hope that multiple replicas -# will arrive and the transfer can be parallelized. -# -# With slow disks and fast (large bandwidth) networks, diskless replication -# works better. -repl-diskless-sync no - -# When diskless replication is enabled, it is possible to configure the delay -# the server waits in order to spawn the child that transfers the RDB via socket -# to the replicas. -# -# This is important since once the transfer starts, it is not possible to serve -# new replicas arriving, that will be queued for the next RDB transfer, so the server -# waits a delay in order to let more replicas arrive. -# -# The delay is specified in seconds, and by default is 5 seconds. To disable -# it entirely just set it to 0 seconds and the transfer will start ASAP. -repl-diskless-sync-delay 5 - -# Replicas send PINGs to server in a predefined interval. It's possible to change -# this interval with the repl_ping_replica_period option. The default value is 10 -# seconds. -# -# repl-ping-replica-period 10 - -# The following option sets the replication timeout for: -# -# 1) Bulk transfer I/O during SYNC, from the point of view of replica. -# 2) Master timeout from the point of view of replicas (data, pings). -# 3) Replica timeout from the point of view of masters (REPLCONF ACK pings). -# -# It is important to make sure that this value is greater than the value -# specified for repl-ping-replica-period otherwise a timeout will be detected -# every time there is low traffic between the master and the replica. -# -# repl-timeout 60 - -# Disable TCP_NODELAY on the replica socket after SYNC? -# -# If you select "yes" KeyDB will use a smaller number of TCP packets and -# less bandwidth to send data to replicas. But this can add a delay for -# the data to appear on the replica side, up to 40 milliseconds with -# Linux kernels using a default configuration. -# -# If you select "no" the delay for data to appear on the replica side will -# be reduced but more bandwidth will be used for replication. -# -# By default we optimize for low latency, but in very high traffic conditions -# or when the master and replicas are many hops away, turning this to "yes" may -# be a good idea. -repl-disable-tcp-nodelay no - -# Set the replication backlog size. The backlog is a buffer that accumulates -# replica data when replicas are disconnected for some time, so that when a replica -# wants to reconnect again, often a full resync is not needed, but a partial -# resync is enough, just passing the portion of data the replica missed while -# disconnected. -# -# The bigger the replication backlog, the longer the time the replica can be -# disconnected and later be able to perform a partial resynchronization. -# -# The backlog is only allocated once there is at least a replica connected. -# -# repl-backlog-size 1mb - -# After a master has no longer connected replicas for some time, the backlog -# will be freed. The following option configures the amount of seconds that -# need to elapse, starting from the time the last replica disconnected, for -# the backlog buffer to be freed. -# -# Note that replicas never free the backlog for timeout, since they may be -# promoted to masters later, and should be able to correctly "partially -# resynchronize" with the replicas: hence they should always accumulate backlog. -# -# A value of 0 means to never release the backlog. -# -# repl-backlog-ttl 3600 - -# The replica priority is an integer number published by KeyDB in the INFO output. -# It is used by KeyDB Sentinel in order to select a replica to promote into a -# master if the master is no longer working correctly. -# -# A replica with a low priority number is considered better for promotion, so -# for instance if there are three replicas with priority 10, 100, 25 Sentinel will -# pick the one with priority 10, that is the lowest. -# -# However a special priority of 0 marks the replica as not able to perform the -# role of master, so a replica with priority of 0 will never be selected by -# KeyDB Sentinel for promotion. -# -# By default the priority is 100. -replica-priority 100 - -# It is possible for a master to stop accepting writes if there are less than -# N replicas connected, having a lag less or equal than M seconds. -# -# The N replicas need to be in "online" state. -# -# The lag in seconds, that must be <= the specified value, is calculated from -# the last ping received from the replica, that is usually sent every second. -# -# This option does not GUARANTEE that N replicas will accept the write, but -# will limit the window of exposure for lost writes in case not enough replicas -# are available, to the specified number of seconds. -# -# For example to require at least 3 replicas with a lag <= 10 seconds use: -# -# min-replicas-to-write 3 -# min-replicas-max-lag 10 -# -# Setting one or the other to 0 disables the feature. -# -# By default min-replicas-to-write is set to 0 (feature disabled) and -# min-replicas-max-lag is set to 10. - -# A KeyDB master is able to list the address and port of the attached -# replicas in different ways. For example the "INFO replication" section -# offers this information, which is used, among other tools, by -# KeyDB Sentinel in order to discover replica instances. -# Another place where this info is available is in the output of the -# "ROLE" command of a master. -# -# The listed IP and address normally reported by a replica is obtained -# in the following way: -# -# IP: The address is auto detected by checking the peer address -# of the socket used by the replica to connect with the master. -# -# Port: The port is communicated by the replica during the replication -# handshake, and is normally the port that the replica is using to -# listen for connections. -# -# However when port forwarding or Network Address Translation (NAT) is -# used, the replica may be actually reachable via different IP and port -# pairs. The following two options can be used by a replica in order to -# report to its master a specific set of IP and port, so that both INFO -# and ROLE will report those values. -# -# There is no need to use both the options if you need to override just -# the port or the IP address. -# -# replica-announce-ip 5.5.5.5 -# replica-announce-port 1234 - -################################## SECURITY ################################### - -# Warning: since KeyDB is pretty fast an outside user can try up to -# 1 million passwords per second against a modern box. This means that you -# should use very strong passwords, otherwise they will be very easy to break. -# Note that because the password is really a shared secret between the client -# and the server, and should not be memorized by any human, the password -# can be easily a long string from /dev/urandom or whatever, so by using a -# long and unguessable password no brute force attack will be possible. - -# KeyDB ACL users are defined in the following format: -# -# user ... acl rules ... -# -# For example: -# -# user worker +@list +@connection ~jobs:* on >ffa9203c493aa99 -# -# The special username "default" is used for new connections. If this user -# has the "nopass" rule, then new connections will be immediately authenticated -# as the "default" user without the need of any password provided via the -# AUTH command. Otherwise if the "default" user is not flagged with "nopass" -# the connections will start in not authenticated state, and will require -# AUTH (or the HELLO command AUTH option) in order to be authenticated and -# start to work. -# -# The ACL rules that describe what an user can do are the following: -# -# on Enable the user: it is possible to authenticate as this user. -# off Disable the user: it's no longer possible to authenticate -# with this user, however the already authenticated connections -# will still work. -# + Allow the execution of that command -# - Disallow the execution of that command -# +@ Allow the execution of all the commands in such category -# with valid categories are like @admin, @set, @sortedset, ... -# and so forth, see the full list in the server.c file where -# the KeyDB command table is described and defined. -# The special category @all means all the commands, but currently -# present in the server, and that will be loaded in the future -# via modules. -# +|subcommand Allow a specific subcommand of an otherwise -# disabled command. Note that this form is not -# allowed as negative like -DEBUG|SEGFAULT, but -# only additive starting with "+". -# allcommands Alias for +@all. Note that it implies the ability to execute -# all the future commands loaded via the modules system. -# nocommands Alias for -@all. -# ~ Add a pattern of keys that can be mentioned as part of -# commands. For instance ~* allows all the keys. The pattern -# is a glob-style pattern like the one of KEYS. -# It is possible to specify multiple patterns. -# allkeys Alias for ~* -# resetkeys Flush the list of allowed keys patterns. -# > Add this passowrd to the list of valid password for the user. -# For example >mypass will add "mypass" to the list. -# This directive clears the "nopass" flag (see later). -# < Remove this password from the list of valid passwords. -# nopass All the set passwords of the user are removed, and the user -# is flagged as requiring no password: it means that every -# password will work against this user. If this directive is -# used for the default user, every new connection will be -# immediately authenticated with the default user without -# any explicit AUTH command required. Note that the "resetpass" -# directive will clear this condition. -# resetpass Flush the list of allowed passwords. Moreover removes the -# "nopass" status. After "resetpass" the user has no associated -# passwords and there is no way to authenticate without adding -# some password (or setting it as "nopass" later). -# reset Performs the following actions: resetpass, resetkeys, off, -# -@all. The user returns to the same state it has immediately -# after its creation. -# -# ACL rules can be specified in any order: for instance you can start with -# passwords, then flags, or key patterns. However note that the additive -# and subtractive rules will CHANGE MEANING depending on the ordering. -# For instance see the following example: -# -# user alice on +@all -DEBUG ~* >somepassword -# -# This will allow "alice" to use all the commands with the exception of the -# DEBUG command, since +@all added all the commands to the set of the commands -# alice can use, and later DEBUG was removed. However if we invert the order -# of two ACL rules the result will be different: -# -# user alice on -DEBUG +@all ~* >somepassword -# -# Now DEBUG was removed when alice had yet no commands in the set of allowed -# commands, later all the commands are added, so the user will be able to -# execute everything. -# -# Basically ACL rules are processed left-to-right. -# -# For more information about ACL configuration please refer to -# the Redis web site at https://redis.io/topics/acl - -# Using an external ACL file -# -# Instead of configuring users here in this file, it is possible to use -# a stand-alone file just listing users. The two methods cannot be mixed: -# if you configure users here and at the same time you activate the exteranl -# ACL file, the server will refuse to start. -# -# The format of the external ACL user file is exactly the same as the -# format that is used inside keydb.conf to describe users. -# -# aclfile /etc/keydb/users.acl - -# IMPORTANT NOTE: starting with Redis 6 "requirepass" is just a compatiblity -# layer on top of the new ACL system. The option effect will be just setting -# the password for the default user. Clients will still authenticate using -# AUTH as usually, or more explicitly with AUTH default -# if they follow the new protocol: both will work. -# -# requirepass foobared - -# Command renaming (DEPRECATED). -# -# ------------------------------------------------------------------------ -# WARNING: avoid using this option if possible. Instead use ACLs to remove -# commands from the default user, and put them only in some admin user you -# create for administrative purposes. -# ------------------------------------------------------------------------ -# -# It is possible to change the name of dangerous commands in a shared -# environment. For instance the CONFIG command may be renamed into something -# hard to guess so that it will still be available for internal-use tools -# but not available for general clients. -# -# Example: -# -# rename-command CONFIG b840fc02d524045429941cc15f59e41cb7be6c52 -# -# It is also possible to completely kill a command by renaming it into -# an empty string: -# -# rename-command CONFIG "" -# -# Please note that changing the name of commands that are logged into the -# AOF file or transmitted to replicas may cause problems. - -################################### CLIENTS #################################### - -# Set the max number of connected clients at the same time. By default -# this limit is set to 10000 clients, however if the KeyDB server is not -# able to configure the process file limit to allow for the specified limit -# the max number of allowed clients is set to the current file limit -# minus 32 (as KeyDB reserves a few file descriptors for internal uses). -# -# Once the limit is reached KeyDB will close all the new connections sending -# an error 'max number of clients reached'. -# -# maxclients 10000 - -############################## MEMORY MANAGEMENT ################################ - -# Set a memory usage limit to the specified amount of bytes. -# When the memory limit is reached KeyDB will try to remove keys -# according to the eviction policy selected (see maxmemory-policy). -# -# If KeyDB can't remove keys according to the policy, or if the policy is -# set to 'noeviction', KeyDB will start to reply with errors to commands -# that would use more memory, like SET, LPUSH, and so on, and will continue -# to reply to read-only commands like GET. -# -# This option is usually useful when using KeyDB as an LRU or LFU cache, or to -# set a hard memory limit for an instance (using the 'noeviction' policy). -# -# WARNING: If you have replicas attached to an instance with maxmemory on, -# the size of the output buffers needed to feed the replicas are subtracted -# from the used memory count, so that network problems / resyncs will -# not trigger a loop where keys are evicted, and in turn the output -# buffer of replicas is full with DELs of keys evicted triggering the deletion -# of more keys, and so forth until the database is completely emptied. -# -# In short... if you have replicas attached it is suggested that you set a lower -# limit for maxmemory so that there is some free RAM on the system for replica -# output buffers (but this is not needed if the policy is 'noeviction'). -# -maxmemory 1gb - -# MAXMEMORY POLICY: how KeyDB will select what to remove when maxmemory -# is reached. You can select among five behaviors: -# -# volatile-lru -> Evict using approximated LRU among the keys with an expire set. -# allkeys-lru -> Evict any key using approximated LRU. -# volatile-lfu -> Evict using approximated LFU among the keys with an expire set. -# allkeys-lfu -> Evict any key using approximated LFU. -# volatile-random -> Remove a random key among the ones with an expire set. -# allkeys-random -> Remove a random key, any key. -# volatile-ttl -> Remove the key with the nearest expire time (minor TTL) -# noeviction -> Don't evict anything, just return an error on write operations. -# -# LRU means Least Recently Used -# LFU means Least Frequently Used -# -# Both LRU, LFU and volatile-ttl are implemented using approximated -# randomized algorithms. -# -# Note: with any of the above policies, KeyDB will return an error on write -# operations, when there are no suitable keys for eviction. -# -# At the date of writing these commands are: set setnx setex append -# incr decr rpush lpush rpushx lpushx linsert lset rpoplpush sadd -# sinter sinterstore sunion sunionstore sdiff sdiffstore zadd zincrby -# zunionstore zinterstore hset hsetnx hmset hincrby incrby decrby -# getset mset msetnx exec sort -# -# The default is: -# -maxmemory-policy volatile-lru - -# LRU, LFU and minimal TTL algorithms are not precise algorithms but approximated -# algorithms (in order to save memory), so you can tune it for speed or -# accuracy. For default KeyDB will check five keys and pick the one that was -# used less recently, you can change the sample size using the following -# configuration directive. -# -# The default of 5 produces good enough results. 10 Approximates very closely -# true LRU but costs more CPU. 3 is faster but not very accurate. -# -maxmemory-samples 5 - -# Starting from Redis 5, by default a replica will ignore its maxmemory setting -# (unless it is promoted to master after a failover or manually). It means -# that the eviction of keys will be just handled by the master, sending the -# DEL commands to the replica as keys evict in the master side. -# -# This behavior ensures that masters and replicas stay consistent, and is usually -# what you want, however if your replica is writable, or you want the replica to have -# a different memory setting, and you are sure all the writes performed to the -# replica are idempotent, then you may change this default (but be sure to understand -# what you are doing). -# -# Note that since the replica by default does not evict, it may end using more -# memory than the one set via maxmemory (there are certain buffers that may -# be larger on the replica, or data structures may sometimes take more memory and so -# forth). So make sure you monitor your replicas and make sure they have enough -# memory to never hit a real out-of-memory condition before the master hits -# the configured maxmemory setting. -# -# replica-ignore-maxmemory yes - -############################# LAZY FREEING #################################### - -# KeyDB has two primitives to delete keys. One is called DEL and is a blocking -# deletion of the object. It means that the server stops processing new commands -# in order to reclaim all the memory associated with an object in a synchronous -# way. If the key deleted is associated with a small object, the time needed -# in order to execute the DEL command is very small and comparable to most other -# O(1) or O(log_N) commands in KeyDB. However if the key is associated with an -# aggregated value containing millions of elements, the server can block for -# a long time (even seconds) in order to complete the operation. -# -# For the above reasons KeyDB also offers non blocking deletion primitives -# such as UNLINK (non blocking DEL) and the ASYNC option of FLUSHALL and -# FLUSHDB commands, in order to reclaim memory in background. Those commands -# are executed in constant time. Another thread will incrementally free the -# object in the background as fast as possible. -# -# DEL, UNLINK and ASYNC option of FLUSHALL and FLUSHDB are user-controlled. -# It's up to the design of the application to understand when it is a good -# idea to use one or the other. However the KeyDB server sometimes has to -# delete keys or flush the whole database as a side effect of other operations. -# Specifically KeyDB deletes objects independently of a user call in the -# following scenarios: -# -# 1) On eviction, because of the maxmemory and maxmemory policy configurations, -# in order to make room for new data, without going over the specified -# memory limit. -# 2) Because of expire: when a key with an associated time to live (see the -# EXPIRE command) must be deleted from memory. -# 3) Because of a side effect of a command that stores data on a key that may -# already exist. For example the RENAME command may delete the old key -# content when it is replaced with another one. Similarly SUNIONSTORE -# or SORT with STORE option may delete existing keys. The SET command -# itself removes any old content of the specified key in order to replace -# it with the specified string. -# 4) During replication, when a replica performs a full resynchronization with -# its master, the content of the whole database is removed in order to -# load the RDB file just transferred. -# -# In all the above cases the default is to delete objects in a blocking way, -# like if DEL was called. However you can configure each case specifically -# in order to instead release memory in a non-blocking way like if UNLINK -# was called, using the following configuration directives: - -lazyfree-lazy-eviction no -lazyfree-lazy-expire no -lazyfree-lazy-server-del no -replica-lazy-flush no - -############################## APPEND ONLY MODE ############################### - -# By default KeyDB asynchronously dumps the dataset on disk. This mode is -# good enough in many applications, but an issue with the KeyDB process or -# a power outage may result into a few minutes of writes lost (depending on -# the configured save points). -# -# The Append Only File is an alternative persistence mode that provides -# much better durability. For instance using the default data fsync policy -# (see later in the config file) KeyDB can lose just one second of writes in a -# dramatic event like a server power outage, or a single write if something -# wrong with the KeyDB process itself happens, but the operating system is -# still running correctly. -# -# AOF and RDB persistence can be enabled at the same time without problems. -# If the AOF is enabled on startup KeyDB will load the AOF, that is the file -# with the better durability guarantees. -# -# Please check http://redis.io/topics/persistence for more information. - -appendonly no - -# The name of the append only file (default: "appendonly.aof") - -appendfilename "appendonly.aof" - -# The fsync() call tells the Operating System to actually write data on disk -# instead of waiting for more data in the output buffer. Some OS will really flush -# data on disk, some other OS will just try to do it ASAP. -# -# KeyDB supports three different modes: -# -# no: don't fsync, just let the OS flush the data when it wants. Faster. -# always: fsync after every write to the append only log. Slow, Safest. -# everysec: fsync only one time every second. Compromise. -# -# The default is "everysec", as that's usually the right compromise between -# speed and data safety. It's up to you to understand if you can relax this to -# "no" that will let the operating system flush the output buffer when -# it wants, for better performances (but if you can live with the idea of -# some data loss consider the default persistence mode that's snapshotting), -# or on the contrary, use "always" that's very slow but a bit safer than -# everysec. -# -# More details please check the following article: -# http://antirez.com/post/redis-persistence-demystified.html -# -# If unsure, use "everysec". - -# appendfsync always -appendfsync everysec -# appendfsync no - -# When the AOF fsync policy is set to always or everysec, and a background -# saving process (a background save or AOF log background rewriting) is -# performing a lot of I/O against the disk, in some Linux configurations -# KeyDB may block too long on the fsync() call. Note that there is no fix for -# this currently, as even performing fsync in a different thread will block -# our synchronous write(2) call. -# -# In order to mitigate this problem it's possible to use the following option -# that will prevent fsync() from being called in the main process while a -# BGSAVE or BGREWRITEAOF is in progress. -# -# This means that while another child is saving, the durability of KeyDB is -# the same as "appendfsync none". In practical terms, this means that it is -# possible to lose up to 30 seconds of log in the worst scenario (with the -# default Linux settings). -# -# If you have latency problems turn this to "yes". Otherwise leave it as -# "no" that is the safest pick from the point of view of durability. - -no-appendfsync-on-rewrite no - -# Automatic rewrite of the append only file. -# KeyDB is able to automatically rewrite the log file implicitly calling -# BGREWRITEAOF when the AOF log size grows by the specified percentage. -# -# This is how it works: KeyDB remembers the size of the AOF file after the -# latest rewrite (if no rewrite has happened since the restart, the size of -# the AOF at startup is used). -# -# This base size is compared to the current size. If the current size is -# bigger than the specified percentage, the rewrite is triggered. Also -# you need to specify a minimal size for the AOF file to be rewritten, this -# is useful to avoid rewriting the AOF file even if the percentage increase -# is reached but it is still pretty small. -# -# Specify a percentage of zero in order to disable the automatic AOF -# rewrite feature. - -auto-aof-rewrite-percentage 100 -auto-aof-rewrite-min-size 64mb - -# An AOF file may be found to be truncated at the end during the KeyDB -# startup process, when the AOF data gets loaded back into memory. -# This may happen when the system where KeyDB is running -# crashes, especially when an ext4 filesystem is mounted without the -# data=ordered option (however this can't happen when KeyDB itself -# crashes or aborts but the operating system still works correctly). -# -# KeyDB can either exit with an error when this happens, or load as much -# data as possible (the default now) and start if the AOF file is found -# to be truncated at the end. The following option controls this behavior. -# -# If aof-load-truncated is set to yes, a truncated AOF file is loaded and -# the KeyDB server starts emitting a log to inform the user of the event. -# Otherwise if the option is set to no, the server aborts with an error -# and refuses to start. When the option is set to no, the user requires -# to fix the AOF file using the "keydb-check-aof" utility before to restart -# the server. -# -# Note that if the AOF file will be found to be corrupted in the middle -# the server will still exit with an error. This option only applies when -# KeyDB will try to read more data from the AOF file but not enough bytes -# will be found. -aof-load-truncated yes - -# When rewriting the AOF file, KeyDB is able to use an RDB preamble in the -# AOF file for faster rewrites and recoveries. When this option is turned -# on the rewritten AOF file is composed of two different stanzas: -# -# [RDB file][AOF tail] -# -# When loading KeyDB recognizes that the AOF file starts with the "REDIS" -# string and loads the prefixed RDB file, and continues loading the AOF -# tail. -aof-use-rdb-preamble yes - -################################ LUA SCRIPTING ############################### - -# Max execution time of a Lua script in milliseconds. -# -# If the maximum execution time is reached KeyDB will log that a script is -# still in execution after the maximum allowed time and will start to -# reply to queries with an error. -# -# When a long running script exceeds the maximum execution time only the -# SCRIPT KILL and SHUTDOWN NOSAVE commands are available. The first can be -# used to stop a script that did not yet called write commands. The second -# is the only way to shut down the server in the case a write command was -# already issued by the script but the user doesn't want to wait for the natural -# termination of the script. -# -# Set it to 0 or a negative value for unlimited execution without warnings. -lua-time-limit 5000 - -################################ KEYDB CLUSTER ############################### - -# Normal KeyDB instances can't be part of a KeyDB Cluster; only nodes that are -# started as cluster nodes can. In order to start a KeyDB instance as a -# cluster node enable the cluster support uncommenting the following: -# -# cluster-enabled yes - -# Every cluster node has a cluster configuration file. This file is not -# intended to be edited by hand. It is created and updated by KeyDB nodes. -# Every KeyDB Cluster node requires a different cluster configuration file. -# Make sure that instances running in the same system do not have -# overlapping cluster configuration file names. -# -# cluster-config-file nodes-6379.conf - -# Cluster node timeout is the amount of milliseconds a node must be unreachable -# for it to be considered in failure state. -# Most other internal time limits are multiple of the node timeout. -# -# cluster-node-timeout 15000 - -# A replica of a failing master will avoid to start a failover if its data -# looks too old. -# -# There is no simple way for a replica to actually have an exact measure of -# its "data age", so the following two checks are performed: -# -# 1) If there are multiple replicas able to failover, they exchange messages -# in order to try to give an advantage to the replica with the best -# replication offset (more data from the master processed). -# Replicas will try to get their rank by offset, and apply to the start -# of the failover a delay proportional to their rank. -# -# 2) Every single replica computes the time of the last interaction with -# its master. This can be the last ping or command received (if the master -# is still in the "connected" state), or the time that elapsed since the -# disconnection with the master (if the replication link is currently down). -# If the last interaction is too old, the replica will not try to failover -# at all. -# -# The point "2" can be tuned by user. Specifically a replica will not perform -# the failover if, since the last interaction with the master, the time -# elapsed is greater than: -# -# (node-timeout * replica-validity-factor) + repl-ping-replica-period -# -# So for example if node-timeout is 30 seconds, and the replica-validity-factor -# is 10, and assuming a default repl-ping-replica-period of 10 seconds, the -# replica will not try to failover if it was not able to talk with the master -# for longer than 310 seconds. -# -# A large replica-validity-factor may allow replicas with too old data to failover -# a master, while a too small value may prevent the cluster from being able to -# elect a replica at all. -# -# For maximum availability, it is possible to set the replica-validity-factor -# to a value of 0, which means, that replicas will always try to failover the -# master regardless of the last time they interacted with the master. -# (However they'll always try to apply a delay proportional to their -# offset rank). -# -# Zero is the only value able to guarantee that when all the partitions heal -# the cluster will always be able to continue. -# -# cluster-replica-validity-factor 10 - -# Cluster replicas are able to migrate to orphaned masters, that are masters -# that are left without working replicas. This improves the cluster ability -# to resist to failures as otherwise an orphaned master can't be failed over -# in case of failure if it has no working replicas. -# -# Replicas migrate to orphaned masters only if there are still at least a -# given number of other working replicas for their old master. This number -# is the "migration barrier". A migration barrier of 1 means that a replica -# will migrate only if there is at least 1 other working replica for its master -# and so forth. It usually reflects the number of replicas you want for every -# master in your cluster. -# -# Default is 1 (replicas migrate only if their masters remain with at least -# one replica). To disable migration just set it to a very large value. -# A value of 0 can be set but is useful only for debugging and dangerous -# in production. -# -# cluster-migration-barrier 1 - -# By default KeyDB Cluster nodes stop accepting queries if they detect there -# is at least an hash slot uncovered (no available node is serving it). -# This way if the cluster is partially down (for example a range of hash slots -# are no longer covered) all the cluster becomes, eventually, unavailable. -# It automatically returns available as soon as all the slots are covered again. -# -# However sometimes you want the subset of the cluster which is working, -# to continue to accept queries for the part of the key space that is still -# covered. In order to do so, just set the cluster-require-full-coverage -# option to no. -# -# cluster-require-full-coverage yes - -# This option, when set to yes, prevents replicas from trying to failover its -# master during master failures. However the master can still perform a -# manual failover, if forced to do so. -# -# This is useful in different scenarios, especially in the case of multiple -# data center operations, where we want one side to never be promoted if not -# in the case of a total DC failure. -# -# cluster-replica-no-failover no - -# In order to setup your cluster make sure to read the documentation -# available at http://redis.io web site. - -########################## CLUSTER DOCKER/NAT support ######################## - -# In certain deployments, KeyDB Cluster nodes address discovery fails, because -# addresses are NAT-ted or because ports are forwarded (the typical case is -# Docker and other containers). -# -# In order to make KeyDB Cluster working in such environments, a static -# configuration where each node knows its public address is needed. The -# following two options are used for this scope, and are: -# -# * cluster-announce-ip -# * cluster-announce-port -# * cluster-announce-bus-port -# -# Each instruct the node about its address, client port, and cluster message -# bus port. The information is then published in the header of the bus packets -# so that other nodes will be able to correctly map the address of the node -# publishing the information. -# -# If the above options are not used, the normal KeyDB Cluster auto-detection -# will be used instead. -# -# Note that when remapped, the bus port may not be at the fixed offset of -# clients port + 10000, so you can specify any port and bus-port depending -# on how they get remapped. If the bus-port is not set, a fixed offset of -# 10000 will be used as usually. -# -# Example: -# -# cluster-announce-ip 10.1.1.5 -# cluster-announce-port 6379 -# cluster-announce-bus-port 6380 - -################################## SLOW LOG ################################### - -# The KeyDB Slow Log is a system to log queries that exceeded a specified -# execution time. The execution time does not include the I/O operations -# like talking with the client, sending the reply and so forth, -# but just the time needed to actually execute the command (this is the only -# stage of command execution where the thread is blocked and can not serve -# other requests in the meantime). -# -# You can configure the slow log with two parameters: one tells KeyDB -# what is the execution time, in microseconds, to exceed in order for the -# command to get logged, and the other parameter is the length of the -# slow log. When a new command is logged the oldest one is removed from the -# queue of logged commands. - -# The following time is expressed in microseconds, so 1000000 is equivalent -# to one second. Note that a negative number disables the slow log, while -# a value of zero forces the logging of every command. -slowlog-log-slower-than 10000 - -# There is no limit to this length. Just be aware that it will consume memory. -# You can reclaim memory used by the slow log with SLOWLOG RESET. -slowlog-max-len 128 - -################################ LATENCY MONITOR ############################## - -# The KeyDB latency monitoring subsystem samples different operations -# at runtime in order to collect data related to possible sources of -# latency of a KeyDB instance. -# -# Via the LATENCY command this information is available to the user that can -# print graphs and obtain reports. -# -# The system only logs operations that were performed in a time equal or -# greater than the amount of milliseconds specified via the -# latency-monitor-threshold configuration directive. When its value is set -# to zero, the latency monitor is turned off. -# -# By default latency monitoring is disabled since it is mostly not needed -# if you don't have latency issues, and collecting data has a performance -# impact, that while very small, can be measured under big load. Latency -# monitoring can easily be enabled at runtime using the command -# "CONFIG SET latency-monitor-threshold " if needed. -latency-monitor-threshold 0 - -############################# EVENT NOTIFICATION ############################## - -# KeyDB can notify Pub/Sub clients about events happening in the key space. -# This feature is documented at http://redis.io/topics/notifications -# -# For instance if keyspace events notification is enabled, and a client -# performs a DEL operation on key "foo" stored in the Database 0, two -# messages will be published via Pub/Sub: -# -# PUBLISH __keyspace@0__:foo del -# PUBLISH __keyevent@0__:del foo -# -# It is possible to select the events that KeyDB will notify among a set -# of classes. Every class is identified by a single character: -# -# K Keyspace events, published with __keyspace@__ prefix. -# E Keyevent events, published with __keyevent@__ prefix. -# g Generic commands (non-type specific) like DEL, EXPIRE, RENAME, ... -# $ String commands -# l List commands -# s Set commands -# h Hash commands -# z Sorted set commands -# x Expired events (events generated every time a key expires) -# e Evicted events (events generated when a key is evicted for maxmemory) -# A Alias for g$lshzxe, so that the "AKE" string means all the events. -# -# The "notify-keyspace-events" takes as argument a string that is composed -# of zero or multiple characters. The empty string means that notifications -# are disabled. -# -# Example: to enable list and generic events, from the point of view of the -# event name, use: -# -# notify-keyspace-events Elg -# -# Example 2: to get the stream of the expired keys subscribing to channel -# name __keyevent@0__:expired use: -# -# notify-keyspace-events Ex -# -# By default all notifications are disabled because most users don't need -# this feature and the feature has some overhead. Note that if you don't -# specify at least one of K or E, no events will be delivered. -notify-keyspace-events "" - -############################### GOPHER SERVER ################################# - -# KeyDB contains an implementation of the Gopher protocol, as specified in -# the RFC 1436 (https://www.ietf.org/rfc/rfc1436.txt). -# -# The Gopher protocol was very popular in the late '90s. It is an alternative -# to the web, and the implementation both server and client side is so simple -# that the KeyDB server has just 100 lines of code in order to implement this -# support. -# -# What do you do with Gopher nowadays? Well Gopher never *really* died, and -# lately there is a movement in order for the Gopher more hierarchical content -# composed of just plain text documents to be resurrected. Some want a simpler -# internet, others believe that the mainstream internet became too much -# controlled, and it's cool to create an alternative space for people that -# want a bit of fresh air. -# -# Anyway for the 10nth birthday of the KeyDB, we gave it the Gopher protocol -# as a gift. -# -# --- HOW IT WORKS? --- -# -# The KeyDB Gopher support uses the inline protocol of KeyDB, and specifically -# two kind of inline requests that were anyway illegal: an empty request -# or any request that starts with "/" (there are no KeyDB commands starting -# with such a slash). Normal RESP2/RESP3 requests are completely out of the -# path of the Gopher protocol implementation and are served as usually as well. -# -# If you open a connection to KeyDB when Gopher is enabled and send it -# a string like "/foo", if there is a key named "/foo" it is served via the -# Gopher protocol. -# -# In order to create a real Gopher "hole" (the name of a Gopher site in Gopher -# talking), you likely need a script like the following: -# -# https://github.com/antirez/gopher2redis -# -# --- SECURITY WARNING --- -# -# If you plan to put KeyDB on the internet in a publicly accessible address -# to server Gopher pages MAKE SURE TO SET A PASSWORD to the instance. -# Once a password is set: -# -# 1. The Gopher server (when enabled, not by default) will kill serve -# content via Gopher. -# 2. However other commands cannot be called before the client will -# authenticate. -# -# So use the 'requirepass' option to protect your instance. -# -# To enable Gopher support uncomment the following line and set -# the option from no (the default) to yes. -# -# gopher-enabled no - -############################### ADVANCED CONFIG ############################### - -# Hashes are encoded using a memory efficient data structure when they have a -# small number of entries, and the biggest entry does not exceed a given -# threshold. These thresholds can be configured using the following directives. -hash-max-ziplist-entries 512 -hash-max-ziplist-value 64 - -# Lists are also encoded in a special way to save a lot of space. -# The number of entries allowed per internal list node can be specified -# as a fixed maximum size or a maximum number of elements. -# For a fixed maximum size, use -5 through -1, meaning: -# -5: max size: 64 Kb <-- not recommended for normal workloads -# -4: max size: 32 Kb <-- not recommended -# -3: max size: 16 Kb <-- probably not recommended -# -2: max size: 8 Kb <-- good -# -1: max size: 4 Kb <-- good -# Positive numbers mean store up to _exactly_ that number of elements -# per list node. -# The highest performing option is usually -2 (8 Kb size) or -1 (4 Kb size), -# but if your use case is unique, adjust the settings as necessary. -list-max-ziplist-size -2 - -# Lists may also be compressed. -# Compress depth is the number of quicklist ziplist nodes from *each* side of -# the list to *exclude* from compression. The head and tail of the list -# are always uncompressed for fast push/pop operations. Settings are: -# 0: disable all list compression -# 1: depth 1 means "don't start compressing until after 1 node into the list, -# going from either the head or tail" -# So: [head]->node->node->...->node->[tail] -# [head], [tail] will always be uncompressed; inner nodes will compress. -# 2: [head]->[next]->node->node->...->node->[prev]->[tail] -# 2 here means: don't compress head or head->next or tail->prev or tail, -# but compress all nodes between them. -# 3: [head]->[next]->[next]->node->node->...->node->[prev]->[prev]->[tail] -# etc. -list-compress-depth 0 - -# Sets have a special encoding in just one case: when a set is composed -# of just strings that happen to be integers in radix 10 in the range -# of 64 bit signed integers. -# The following configuration setting sets the limit in the size of the -# set in order to use this special memory saving encoding. -set-max-intset-entries 512 - -# Similarly to hashes and lists, sorted sets are also specially encoded in -# order to save a lot of space. This encoding is only used when the length and -# elements of a sorted set are below the following limits: -zset-max-ziplist-entries 128 -zset-max-ziplist-value 64 - -# HyperLogLog sparse representation bytes limit. The limit includes the -# 16 bytes header. When an HyperLogLog using the sparse representation crosses -# this limit, it is converted into the dense representation. -# -# A value greater than 16000 is totally useless, since at that point the -# dense representation is more memory efficient. -# -# The suggested value is ~ 3000 in order to have the benefits of -# the space efficient encoding without slowing down too much PFADD, -# which is O(N) with the sparse encoding. The value can be raised to -# ~ 10000 when CPU is not a concern, but space is, and the data set is -# composed of many HyperLogLogs with cardinality in the 0 - 15000 range. -hll-sparse-max-bytes 3000 - -# Streams macro node max size / items. The stream data structure is a radix -# tree of big nodes that encode multiple items inside. Using this configuration -# it is possible to configure how big a single node can be in bytes, and the -# maximum number of items it may contain before switching to a new node when -# appending new stream entries. If any of the following settings are set to -# zero, the limit is ignored, so for instance it is possible to set just a -# max entires limit by setting max-bytes to 0 and max-entries to the desired -# value. -stream-node-max-bytes 4096 -stream-node-max-entries 100 - -# Active rehashing uses 1 millisecond every 100 milliseconds of CPU time in -# order to help rehashing the main KeyDB hash table (the one mapping top-level -# keys to values). The hash table implementation KeyDB uses (see dict.c) -# performs a lazy rehashing: the more operation you run into a hash table -# that is rehashing, the more rehashing "steps" are performed, so if the -# server is idle the rehashing is never complete and some more memory is used -# by the hash table. -# -# The default is to use this millisecond 10 times every second in order to -# actively rehash the main dictionaries, freeing memory when possible. -# -# If unsure: -# use "activerehashing no" if you have hard latency requirements and it is -# not a good thing in your environment that KeyDB can reply from time to time -# to queries with 2 milliseconds delay. -# -# use "activerehashing yes" if you don't have such hard requirements but -# want to free memory asap when possible. -activerehashing yes - -# The client output buffer limits can be used to force disconnection of clients -# that are not reading data from the server fast enough for some reason (a -# common reason is that a Pub/Sub client can't consume messages as fast as the -# publisher can produce them). -# -# The limit can be set differently for the three different classes of clients: -# -# normal -> normal clients including MONITOR clients -# replica -> replica clients -# pubsub -> clients subscribed to at least one pubsub channel or pattern -# -# The syntax of every client-output-buffer-limit directive is the following: -# -# client-output-buffer-limit -# -# A client is immediately disconnected once the hard limit is reached, or if -# the soft limit is reached and remains reached for the specified number of -# seconds (continuously). -# So for instance if the hard limit is 32 megabytes and the soft limit is -# 16 megabytes / 10 seconds, the client will get disconnected immediately -# if the size of the output buffers reach 32 megabytes, but will also get -# disconnected if the client reaches 16 megabytes and continuously overcomes -# the limit for 10 seconds. -# -# By default normal clients are not limited because they don't receive data -# without asking (in a push way), but just after a request, so only -# asynchronous clients may create a scenario where data is requested faster -# than it can read. -# -# Instead there is a default limit for pubsub and replica clients, since -# subscribers and replicas receive data in a push fashion. -# -# Both the hard or the soft limit can be disabled by setting them to zero. -client-output-buffer-limit normal 0 0 0 -client-output-buffer-limit replica 256mb 64mb 60 -client-output-buffer-limit pubsub 32mb 8mb 60 - -# Client query buffers accumulate new commands. They are limited to a fixed -# amount by default in order to avoid that a protocol desynchronization (for -# instance due to a bug in the client) will lead to unbound memory usage in -# the query buffer. However you can configure it here if you have very special -# needs, such us huge multi/exec requests or alike. -# -# client-query-buffer-limit 1gb - -# In the KeyDB protocol, bulk requests, that are, elements representing single -# strings, are normally limited ot 512 mb. However you can change this limit -# here. -# -# proto-max-bulk-len 512mb - -# KeyDB calls an internal function to perform many background tasks, like -# closing connections of clients in timeout, purging expired keys that are -# never requested, and so forth. -# -# Not all tasks are performed with the same frequency, but KeyDB checks for -# tasks to perform according to the specified "hz" value. -# -# By default "hz" is set to 10. Raising the value will use more CPU when -# KeyDB is idle, but at the same time will make KeyDB more responsive when -# there are many keys expiring at the same time, and timeouts may be -# handled with more precision. -# -# The range is between 1 and 500, however a value over 100 is usually not -# a good idea. Most users should use the default of 10 and raise this up to -# 100 only in environments where very low latency is required. -hz 10 - -# Normally it is useful to have an HZ value which is proportional to the -# number of clients connected. This is useful in order, for instance, to -# avoid too many clients are processed for each background task invocation -# in order to avoid latency spikes. -# -# Since the default HZ value by default is conservatively set to 10, KeyDB -# offers, and enables by default, the ability to use an adaptive HZ value -# which will temporary raise when there are many connected clients. -# -# When dynamic HZ is enabled, the actual configured HZ will be used as -# as a baseline, but multiples of the configured HZ value will be actually -# used as needed once more clients are connected. In this way an idle -# instance will use very little CPU time while a busy instance will be -# more responsive. -dynamic-hz yes - -# When a child rewrites the AOF file, if the following option is enabled -# the file will be fsync-ed every 32 MB of data generated. This is useful -# in order to commit the file to the disk more incrementally and avoid -# big latency spikes. -aof-rewrite-incremental-fsync yes - -# When KeyDB saves RDB file, if the following option is enabled -# the file will be fsync-ed every 32 MB of data generated. This is useful -# in order to commit the file to the disk more incrementally and avoid -# big latency spikes. -rdb-save-incremental-fsync yes - -# KeyDB LFU eviction (see maxmemory setting) can be tuned. However it is a good -# idea to start with the default settings and only change them after investigating -# how to improve the performances and how the keys LFU change over time, which -# is possible to inspect via the OBJECT FREQ command. -# -# There are two tunable parameters in the KeyDB LFU implementation: the -# counter logarithm factor and the counter decay time. It is important to -# understand what the two parameters mean before changing them. -# -# The LFU counter is just 8 bits per key, it's maximum value is 255, so KeyDB -# uses a probabilistic increment with logarithmic behavior. Given the value -# of the old counter, when a key is accessed, the counter is incremented in -# this way: -# -# 1. A random number R between 0 and 1 is extracted. -# 2. A probability P is calculated as 1/(old_value*lfu_log_factor+1). -# 3. The counter is incremented only if R < P. -# -# The default lfu-log-factor is 10. This is a table of how the frequency -# counter changes with a different number of accesses with different -# logarithmic factors: -# -# +--------+------------+------------+------------+------------+------------+ -# | factor | 100 hits | 1000 hits | 100K hits | 1M hits | 10M hits | -# +--------+------------+------------+------------+------------+------------+ -# | 0 | 104 | 255 | 255 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 1 | 18 | 49 | 255 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 10 | 10 | 18 | 142 | 255 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# | 100 | 8 | 11 | 49 | 143 | 255 | -# +--------+------------+------------+------------+------------+------------+ -# -# NOTE: The above table was obtained by running the following commands: -# -# keydb-benchmark -n 1000000 incr foo -# keydb-cli object freq foo -# -# NOTE 2: The counter initial value is 5 in order to give new objects a chance -# to accumulate hits. -# -# The counter decay time is the time, in minutes, that must elapse in order -# for the key counter to be divided by two (or decremented if it has a value -# less <= 10). -# -# The default value for the lfu-decay-time is 1. A Special value of 0 means to -# decay the counter every time it happens to be scanned. -# -# lfu-log-factor 10 -# lfu-decay-time 1 - -########################### ACTIVE DEFRAGMENTATION ####################### -# -# WARNING THIS FEATURE IS EXPERIMENTAL. However it was stress tested -# even in production and manually tested by multiple engineers for some -# time. -# -# What is active defragmentation? -# ------------------------------- -# -# Active (online) defragmentation allows a KeyDB server to compact the -# spaces left between small allocations and deallocations of data in memory, -# thus allowing to reclaim back memory. -# -# Fragmentation is a natural process that happens with every allocator (but -# less so with Jemalloc, fortunately) and certain workloads. Normally a server -# restart is needed in order to lower the fragmentation, or at least to flush -# away all the data and create it again. However thanks to this feature -# implemented by Oran Agra for Redis 4.0 this process can happen at runtime -# in an "hot" way, while the server is running. -# -# Basically when the fragmentation is over a certain level (see the -# configuration options below) KeyDB will start to create new copies of the -# values in contiguous memory regions by exploiting certain specific Jemalloc -# features (in order to understand if an allocation is causing fragmentation -# and to allocate it in a better place), and at the same time, will release the -# old copies of the data. This process, repeated incrementally for all the keys -# will cause the fragmentation to drop back to normal values. -# -# Important things to understand: -# -# 1. This feature is disabled by default, and only works if you compiled KeyDB -# to use the copy of Jemalloc we ship with the source code of KeyDB. -# This is the default with Linux builds. -# -# 2. You never need to enable this feature if you don't have fragmentation -# issues. -# -# 3. Once you experience fragmentation, you can enable this feature when -# needed with the command "CONFIG SET activedefrag yes". -# -# The configuration parameters are able to fine tune the behavior of the -# defragmentation process. If you are not sure about what they mean it is -# a good idea to leave the defaults untouched. - -# Enabled active defragmentation -# activedefrag yes - -# Minimum amount of fragmentation waste to start active defrag -# active-defrag-ignore-bytes 100mb - -# Minimum percentage of fragmentation to start active defrag -# active-defrag-threshold-lower 10 - -# Maximum percentage of fragmentation at which we use maximum effort -# active-defrag-threshold-upper 100 - -# Minimal effort for defrag in CPU percentage -# active-defrag-cycle-min 5 - -# Maximal effort for defrag in CPU percentage -# active-defrag-cycle-max 75 - -# Maximum number of set/hash/zset/list fields that will be processed from -# the main dictionary scan -# active-defrag-max-scan-fields 1000 - -# The minimum number of clients on a thread before KeyDB assigns new connections to a different thread -# Tuning this parameter is a tradeoff between locking overhead and distributing the workload over multiple cores -# min-clients-per-thread 50 - -# Path to directory for file backed scratchpad. The file backed scratchpad -# reduces memory requirements by storing rarely accessed data on disk -# instead of RAM. A temporary file will be created in this directory. -# scratch-file-path /tmp/ - -# Number of worker threads serving requests. This number should be related to the performance -# of your network hardware, not the number of cores on your machine. We don't recommend going -# above 4 at this time. By default this is set 1. -server-threads 2 - -# Should KeyDB pin threads to CPUs? By default this is disabled, and KeyDB will not bind threads. -# When enabled threads are bount to cores sequentially starting at core 0. -# server-thread-affinity true - -# Uncomment the option below to enable Active Active support. Note that -# replicas will still sync in the normal way and incorrect ordering when -# bringing up replicas can result in data loss (the first master will win). -# active-replica yes - -# Enable Enterprise? KeyDB Enterprise provides support for Enterprise only features -# note: you may omit the license key to demo Enterprise features for a limited time -# enable-enterprise [License Key] - -# Enable FLASH support? (Enterprise Only) -# storage-provider flash /path/to/flash/db diff --git a/tests/backend_runners/maria/docker-compose.yml b/tests/backend_runners/maria/docker-compose.yml deleted file mode 100644 index 1a43e84..0000000 --- a/tests/backend_runners/maria/docker-compose.yml +++ /dev/null @@ -1,13 +0,0 @@ -version: '3' - -services: - mariadb: - image: mariadb:latest - container_name: some-maria - ports: - - "3306:3306" - environment: - - MARIADB_ROOT_PASSWORD=admin - - MARIADB_DATABASE=maria - volumes: - - ./storage:/var/lib/mysql diff --git a/tests/backend_runners/scylla/docker-compose.yml b/tests/backend_runners/scylla/docker-compose.yml deleted file mode 100644 index c102e4d..0000000 --- a/tests/backend_runners/scylla/docker-compose.yml +++ /dev/null @@ -1,24 +0,0 @@ -version: '3' - -services: - some-scylla: - image: scylladb/scylla - container_name: some-scylla - volumes: - - ./storage/n1:/var/lib/scylla - ports: - - "9042:9042" - - some-scylla2: - image: scylladb/scylla - container_name: some-scylla2 - command: --seeds=some-scylla - volumes: - - ./storage/n2:/var/lib/scylla - - some-scylla3: - image: scylladb/scylla - container_name: some-scylla3 - command: --seeds=some-scylla - volumes: - - ./storage/n3:/var/lib/scylla \ No newline at end of file diff --git a/tests/nginx/Dockerfile b/tests/nginx/Dockerfile deleted file mode 100644 index 47c690b..0000000 --- a/tests/nginx/Dockerfile +++ /dev/null @@ -1,13 +0,0 @@ -FROM nginx:latest - -# Remove the default Nginx configuration file -RUN rm -v /etc/nginx/nginx.conf - -# Copy a configuration file from the current directory -ADD nginx.conf /etc/nginx/ - -ADD sample /usr/share/nginx/html/ -ADD sample /var/www/html/ - -# Expose ports -EXPOSE 90 diff --git a/tests/nginx/nginx.conf b/tests/nginx/nginx.conf deleted file mode 100644 index 128d000..0000000 --- a/tests/nginx/nginx.conf +++ /dev/null @@ -1,61 +0,0 @@ -user www-data; -worker_processes auto; -pid /run/nginx.pid; -include /etc/nginx/modules-enabled/*.conf; - -events { - worker_connections 1024; -} - -http { - ## - # Basic Settings - ## - - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 2048; - # server_tokens off; - - # server_names_hash_bucket_size 64; - # server_name_in_redirect off; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - ## - # SSL Settings - ## - - ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE - ssl_prefer_server_ciphers on; - - ## - # Logging Settings - ## - - access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; - - ## - # Gzip Settings - ## - - gzip on; - - # gzip_vary on; - # gzip_proxied any; - # gzip_comp_level 6; - # gzip_buffers 16 8k; - # gzip_http_version 1.1; - # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript; - - - server { - root /usr/share/nginx/html/; - autoindex on; - listen 90; - } -} \ No newline at end of file diff --git a/tests/nginx/sample/news.png b/tests/nginx/sample/news.png deleted file mode 100644 index 5a71a1d51b376f7306b9d495946ead3c0d10e9af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91573 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 z 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 diff --git a/tests/noqa/expand.py b/tests/noqa/expand.py deleted file mode 100644 index c847a71..0000000 --- a/tests/noqa/expand.py +++ /dev/null @@ -1,40 +0,0 @@ -import base64 -import aiohttp -import asyncio - -queue = asyncio.Queue() - - -def get_base_data(file: str) -> str: - with open(file, "rb") as file: - data = file.read() - return base64.standard_b64encode(data).decode("utf-8") - - -async def task(): - data = get_base_data("./samples/news.png") - async with aiohttp.ClientSession() as sess: - while not queue.empty(): - _ = await queue.get() - async with sess.post( - "http://127.0.0.1:7070/admin/create/image", - json={"format": "png", "data": data} - ) as resp: - assert resp.status == 200 - await asyncio.sleep(0.2) - - -async def main(): - for _ in range(200_000): - queue.put_nowait(None) - - tasks = [task() for _ in range(1)] - t = asyncio.ensure_future(asyncio.gather(*tasks)) - - while not queue.empty() and not t.done(): - print(f"currently, {queue.qsize()} in queue") - await asyncio.sleep(1) - - -if __name__ == '__main__': - asyncio.run(main()) diff --git a/tests/samples/news.png b/tests/samples/news.png deleted file mode 100644 index 5a71a1d51b376f7306b9d495946ead3c0d10e9af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 91573 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 z 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 diff --git a/tests/samples/release.png b/tests/samples/release.png deleted file mode 100644 index cf6ab900c1b373817996e656e504326cf0710a25..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152897 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 z 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 U! str: - with open(file, "rb") as file: - data = file.read() - print(f"original {len(data)}") - return base64.standard_b64encode(data).decode("utf-8") - - -def test_png_upload1(): - global working_ids - data = get_base_data("./samples/sunset.jpeg") - payload = { - "format": "jpeg", - "data": data, - } - r = requests.post("http://127.0.0.1:7070/admin/create/image", json=payload) - data = r.json() - - assert r.status_code == 200 - assert data['data']['category'] == "default" - - file_id = data['data']['file_id'] - working_ids['default'] = file_id - print(file_id) - - -def test_get_img_default(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}") - assert r.status_code == 200 - - -def test_get_img_preset_webp(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?format=webp") - assert r.status_code == 200 - - -def test_get_img_preset_png(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?format=png") - assert r.status_code == 200 - - -def test_get_img_preset_jpeg(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?format=jpeg") - assert r.status_code == 200 - - -def test_get_img_format_gif(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?format=gif") - assert r.status_code == 200 - - -def test_get_img_preset_large(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?preset=large") - assert r.status_code == 200 - - -def test_get_img_preset_medium(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?preset=medium") - assert r.status_code == 200 - - -def test_get_img_preset_small(): - r = requests.get(f"http://127.0.0.1:7070/images/{working_ids['default']}?preset=small") - assert r.status_code == 200 - - -def test_get_nothing1(): - r = requests.get(f"http://127.0.0.1:7070/images/{uuid.uuid4()}") - assert r.status_code == 404 - - -def test_get_nothing2(): - r = requests.get(f"http://127.0.0.1:7070/images/{uuid.uuid4()}?format=png") - assert r.status_code == 404 - - -def test_get_nothing3(): - r = requests.get(f"http://127.0.0.1:7070/images/{uuid.uuid4()}?format=jpeg") - assert r.status_code == 404 - - -def test_get_nothing4(): - r = requests.get(f"http://127.0.0.1:7070/images/{uuid.uuid4()}?format=webp") - assert r.status_code == 404 - - -def test_get_nothing5(): - r = requests.get(f"http://127.0.0.1:7070/images/{uuid.uuid4()}?format=gif") - assert r.status_code == 404 - - -def test_remove_img1(): - r = requests.delete( - f"http://127.0.0.1:7070/admin/delete/image/44524a33-c505-476d-b23b-c42de1fd796a") - print(r.content) - assert r.status_code == 200 - - -if __name__ == '__main__': - test_png_upload1() - test_get_img_default() - test_get_nothing1() - # test_remove_img1()