at://nekomimi.pet/sh.tangled.repo.pull/3m5zrhmq67x22
Back to Collection
Record JSON
{
"$type": "sh.tangled.repo.pull",
"createdAt": "2025-11-20T03:41:38Z",
"patch": "From 484d7bcedd6cc984c9d44001e10cce73e28561b6 Mon Sep 17 00:00:00 2001\nFrom: \"@nekomimi.pet\" \u003cmeowskulls@nekomimi.pet\u003e\nDate: Wed, 19 Nov 2025 21:49:35 -0500\nSubject: [PATCH] slingshot: add configurable cache sizes, host, and ports\n\n - Add --cache-memory-mb and --cache-disk-gb flags\n - Add --host and --port for HTTP server\n - Add --metrics-port for prometheus metrics server\n---\n slingshot/src/firehose_cache.rs | 6 ++++--\n slingshot/src/main.rs | 31 ++++++++++++++++++++++++++-----\n slingshot/src/server.rs | 9 ++++++++-\n 3 files changed, 38 insertions(+), 8 deletions(-)\n\ndiff --git a/slingshot/src/firehose_cache.rs b/slingshot/src/firehose_cache.rs\nindex 1ff33da..29ce666 100644\n--- a/slingshot/src/firehose_cache.rs\n+++ b/slingshot/src/firehose_cache.rs\n@@ -4,15 +4,17 @@ use std::path::Path;\n \n pub async fn firehose_cache(\n cache_dir: impl AsRef\u003cPath\u003e,\n+ memory_mb: usize,\n+ disk_gb: usize,\n ) -\u003e Result\u003cHybridCache\u003cString, CachedRecord\u003e, String\u003e {\n let cache = HybridCacheBuilder::new()\n .with_name(\"firehose\")\n- .memory(64 * 2_usize.pow(20))\n+ .memory(memory_mb * 2_usize.pow(20))\n .with_weighter(|k: \u0026String, v| k.len() + std::mem::size_of_val(v))\n .storage(Engine::large())\n .with_device_options(\n DirectFsDeviceOptions::new(cache_dir)\n- .with_capacity(2_usize.pow(30)) // TODO: configurable (1GB to have something)\n+ .with_capacity(disk_gb * 2_usize.pow(30))\n .with_file_size(16 * 2_usize.pow(20)), // note: this does limit the max cached item size, warning jumbo records\n )\n .build()\ndiff --git a/slingshot/src/main.rs b/slingshot/src/main.rs\nindex ae5fdbb..8d7706d 100644\n--- a/slingshot/src/main.rs\n+++ b/slingshot/src/main.rs\n@@ -25,6 +25,21 @@ struct Args {\n /// where to keep disk caches\n #[arg(long)]\n cache_dir: PathBuf,\n+ /// memory cache size in MB\n+ #[arg(long, default_value_t = 64)]\n+ cache_memory_mb: usize,\n+ /// disk cache size in GB\n+ #[arg(long, default_value_t = 1)]\n+ cache_disk_gb: usize,\n+ /// host for HTTP server (when not using --domain)\n+ #[arg(long, default_value = \"127.0.0.1\")]\n+ host: String,\n+ /// port for HTTP server (when not using --domain)\n+ #[arg(long, default_value_t = 3000)]\n+ port: u16,\n+ /// port for metrics/prometheus server\n+ #[arg(long, default_value_t = 8765)]\n+ metrics_port: u16,\n /// the domain pointing to this server\n ///\n /// if present:\n@@ -62,10 +77,10 @@ async fn main() -\u003e Result\u003c(), String\u003e {\n \n let args = Args::parse();\n \n- if let Err(e) = install_metrics_server() {\n+ if let Err(e) = install_metrics_server(args.metrics_port) {\n log::error!(\"failed to install metrics server: {e:?}\");\n } else {\n- log::info!(\"metrics listening at http://0.0.0.0:8765\");\n+ log::info!(\"metrics listening at http://0.0.0.0:{}\", args.metrics_port);\n }\n \n std::fs::create_dir_all(\u0026args.cache_dir).map_err(|e| {\n@@ -83,7 +98,12 @@ async fn main() -\u003e Result\u003c(), String\u003e {\n log::info!(\"cache dir ready at at {cache_dir:?}.\");\n \n log::info!(\"setting up firehose cache...\");\n- let cache = firehose_cache(cache_dir.join(\"./firehose\")).await?;\n+ let cache = firehose_cache(\n+ cache_dir.join(\"./firehose\"),\n+ args.cache_memory_mb,\n+ args.cache_disk_gb,\n+ )\n+ .await?;\n log::info!(\"firehose cache ready.\");\n \n let mut tasks: tokio::task::JoinSet\u003cResult\u003c(), MainTaskError\u003e\u003e = tokio::task::JoinSet::new();\n@@ -112,6 +132,8 @@ async fn main() -\u003e Result\u003c(), String\u003e {\n args.domain,\n args.acme_contact,\n args.certs,\n+ args.host,\n+ args.port,\n server_shutdown,\n )\n .await?;\n@@ -172,10 +194,9 @@ async fn main() -\u003e Result\u003c(), String\u003e {\n Ok(())\n }\n \n-fn install_metrics_server() -\u003e Result\u003c(), metrics_exporter_prometheus::BuildError\u003e {\n+fn install_metrics_server(port: u16) -\u003e Result\u003c(), metrics_exporter_prometheus::BuildError\u003e {\n log::info!(\"installing metrics server...\");\n let host = [0, 0, 0, 0];\n- let port = 8765;\n PrometheusBuilder::new()\n .set_quantiles(\u0026[0.5, 0.9, 0.99, 1.0])?\n .set_bucket_duration(std::time::Duration::from_secs(300))?\ndiff --git a/slingshot/src/server.rs b/slingshot/src/server.rs\nindex 7985dd2..1a97b25 100644\n--- a/slingshot/src/server.rs\n+++ b/slingshot/src/server.rs\n@@ -694,6 +694,8 @@ pub async fn serve(\n domain: Option\u003cString\u003e,\n acme_contact: Option\u003cString\u003e,\n certs: Option\u003cPathBuf\u003e,\n+ host: String,\n+ port: u16,\n shutdown: CancellationToken,\n ) -\u003e Result\u003c(), ServerError\u003e {\n let repo = Arc::new(repo);\n@@ -752,7 +754,12 @@ pub async fn serve(\n )\n .await\n } else {\n- run(TcpListener::bind(\"127.0.0.1:3000\"), app, shutdown).await\n+ run(\n+ TcpListener::bind(format!(\"{host}:{port}\")),\n+ app,\n+ shutdown,\n+ )\n+ .await\n }\n }\n \n-- \n2.51.0\n\n\n",
"source": {
"branch": "main",
"repo": "at://did:plc:ttdrpj45ibqunmfhdsb4zdwq/sh.tangled.repo/3m5zqiuceiz22",
"sha": "484d7bcedd6cc984c9d44001e10cce73e28561b6"
},
"target": {
"branch": "main",
"repo": "at://did:plc:lulmyldiq4sb2ikags5sfb25/sh.tangled.repo/3lvsxzinfz222"
},
"title": "slingshot: configurable cache sizes"
}