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"
}