feat(tvix/nar-bridge): add 404 handler for GET/HEAD /nar/…

We currently send 405, and that confuses `nix copy`.
Send a 404 for now, and add a futurework, as we can actually at least do
something more meaningful in case we still have that nar hash in our
LRU, which would avoid some unnecessary uploads in some cases.

Change-Id: If625e9bd0fd6506cb73b88962d889aa08315fcea
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11987
Tested-by: BuildkiteCI
Reviewed-by: Brian Olsen <me@griff.name>
This commit is contained in:
Florian Klink 2024-07-20 14:01:24 +02:00 committed by flokli
parent 5d906054da
commit 5bd48de418

View file

@ -1,3 +1,4 @@
use axum::http::StatusCode;
use axum::routing::{head, put}; use axum::routing::{head, put};
use axum::{routing::get, Router}; use axum::{routing::get, Router};
use lru::LruCache; use lru::LruCache;
@ -50,6 +51,10 @@ impl AppState {
pub fn gen_router(priority: u64) -> Router<AppState> { pub fn gen_router(priority: u64) -> Router<AppState> {
Router::new() Router::new()
.route("/", get(root)) .route("/", get(root))
// FUTUREWORK: respond for NARs that we still have in root_nodes (at least HEAD)
// This avoids some unnecessary NAR uploading from multiple concurrent clients, and is cheap.
.route("/nar/:nar_str", get(four_o_four))
.route("/nar/:nar_str", head(four_o_four))
.route("/nar/:nar_str", put(nar::put)) .route("/nar/:nar_str", put(nar::put))
.route("/nar/tvix-castore/:root_node_enc", get(nar::get)) .route("/nar/tvix-castore/:root_node_enc", get(nar::get))
.route("/:narinfo_str", get(narinfo::get)) .route("/:narinfo_str", get(narinfo::get))
@ -61,6 +66,10 @@ async fn root() -> &'static str {
"Hello from nar-bridge" "Hello from nar-bridge"
} }
async fn four_o_four() -> Result<(), StatusCode> {
Err(StatusCode::NOT_FOUND)
}
async fn nix_cache_info(priority: u64) -> String { async fn nix_cache_info(priority: u64) -> String {
format!( format!(
"StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {}\n", "StoreDir: /nix/store\nWantMassQuery: 1\nPriority: {}\n",