diff --git a/pageserver/src/config.rs b/pageserver/src/config.rs index fb70ea327d..3004c062a6 100644 --- a/pageserver/src/config.rs +++ b/pageserver/src/config.rs @@ -354,6 +354,22 @@ impl PageServerConf { self.timelines_path(tenantid).join(timelineid.to_string()) } + pub fn traces_path(&self) -> PathBuf { + self.workdir.join("traces") + } + + pub fn trace_path( + &self, + tenant_id: &ZTenantId, + timeline_id: &ZTimelineId, + connection_id: &ZTimelineId, // TODO make a new type + ) -> PathBuf { + self.traces_path() + .join(tenant_id.to_string()) + .join(timeline_id.to_string()) + .join(connection_id.to_string()) + } + // // Postgres distribution paths // diff --git a/pageserver/src/page_service.rs b/pageserver/src/page_service.rs index f0b672c40a..21d224738c 100644 --- a/pageserver/src/page_service.rs +++ b/pageserver/src/page_service.rs @@ -64,21 +64,21 @@ pub enum PagestreamBeMessage { } #[derive(Debug)] -struct PagestreamExistsRequest { +pub struct PagestreamExistsRequest { latest: bool, lsn: Lsn, rel: RelTag, } #[derive(Debug)] -struct PagestreamNblocksRequest { +pub struct PagestreamNblocksRequest { latest: bool, lsn: Lsn, rel: RelTag, } #[derive(Debug)] -struct PagestreamGetPageRequest { +pub struct PagestreamGetPageRequest { latest: bool, lsn: Lsn, rel: RelTag, @@ -86,34 +86,34 @@ struct PagestreamGetPageRequest { } #[derive(Debug)] -struct PagestreamDbSizeRequest { +pub struct PagestreamDbSizeRequest { latest: bool, lsn: Lsn, dbnode: u32, } #[derive(Debug)] -struct PagestreamExistsResponse { +pub struct PagestreamExistsResponse { exists: bool, } #[derive(Debug)] -struct PagestreamNblocksResponse { +pub struct PagestreamNblocksResponse { n_blocks: u32, } #[derive(Debug)] -struct PagestreamGetPageResponse { +pub struct PagestreamGetPageResponse { page: Bytes, } #[derive(Debug)] -struct PagestreamErrorResponse { +pub struct PagestreamErrorResponse { message: String, } #[derive(Debug)] -struct PagestreamDbSizeResponse { +pub struct PagestreamDbSizeResponse { db_size: i64, } @@ -452,9 +452,9 @@ impl PageServerHandler { // Make request tracer if needed let repo = tenant_mgr::get_repository_for_tenant(tenant_id)?; - let trace_read_requests = repo.get_trace_read_requests(); - let mut tracer = if trace_read_requests { - Some(Tracer::new()) + let mut tracer = if repo.get_trace_read_requests() { + let path = repo.conf.trace_path(&tenant_id, &timeline_id, &timeline_id); + Some(Tracer::new(path)) } else { None }; diff --git a/pageserver/src/trace.rs b/pageserver/src/trace.rs index 74f80532e8..818fc5f13f 100644 --- a/pageserver/src/trace.rs +++ b/pageserver/src/trace.rs @@ -1,6 +1,9 @@ use crate::page_service::PagestreamFeMessage; +use std::{fs::File, io::Write, path::PathBuf}; -pub struct Tracer {} +pub struct Tracer { + output: File, +} impl Drop for Tracer { fn drop(&mut self) { @@ -9,8 +12,10 @@ impl Drop for Tracer { } impl Tracer { - pub fn new() -> Self { - Tracer {} + pub fn new(path: PathBuf) -> Self { + Tracer { + output: File::create(path).expect("failed to create trace file"), + } } pub fn trace(&mut self, _msg: &PagestreamFeMessage) { @@ -18,6 +23,6 @@ impl Tracer { } pub fn flush(&mut self) { - // TODO(now) implement + self.output.flush().expect("failed to flush trace file"); } }