Line data Source code
1 : use std::io::{Read, Write, stdin, stdout};
2 : use std::time::Duration;
3 :
4 : use clap::Parser;
5 : use pageserver_api::models::{PagestreamRequest, PagestreamTestRequest};
6 : use utils::id::{TenantId, TimelineId};
7 : use utils::lsn::Lsn;
8 :
9 : #[derive(clap::Parser)]
10 : struct Args {
11 0 : connstr: String,
12 0 : tenant_id: TenantId,
13 0 : timeline_id: TimelineId,
14 : }
15 :
16 : #[tokio::main]
17 0 : async fn main() -> anyhow::Result<()> {
18 0 : let Args {
19 0 : connstr,
20 0 : tenant_id,
21 0 : timeline_id,
22 0 : } = Args::parse();
23 0 : let client = pageserver_client::page_service::Client::new(connstr).await?;
24 0 : let client = client.pagestream(tenant_id, timeline_id).await?;
25 0 : let (mut sender, _receiver) = client.split();
26 0 :
27 0 : eprintln!("filling the pipe");
28 0 : let mut msg = 0;
29 0 : loop {
30 0 : msg += 1;
31 0 : let fut = sender.send(pageserver_api::models::PagestreamFeMessage::Test(
32 0 : PagestreamTestRequest {
33 0 : hdr: PagestreamRequest {
34 0 : reqid: 0,
35 0 : request_lsn: Lsn(23),
36 0 : not_modified_since: Lsn(23),
37 0 : },
38 0 : batch_key: 42,
39 0 : message: format!("message {}", msg),
40 0 : },
41 0 : ));
42 0 : let Ok(res) = tokio::time::timeout(Duration::from_secs(10), fut).await else {
43 0 : eprintln!("pipe seems full");
44 0 : break;
45 0 : };
46 0 : let _: () = res?;
47 0 : }
48 0 :
49 0 : let n = stdout().write(b"R")?;
50 0 : assert_eq!(n, 1);
51 0 : stdout().flush()?;
52 0 :
53 0 : eprintln!("waiting for signal to tell us to exit");
54 0 :
55 0 : let mut buf = [0u8; 1];
56 0 : stdin().read_exact(&mut buf)?;
57 0 :
58 0 : eprintln!("termination signal received, exiting");
59 0 :
60 0 : anyhow::Ok(())
61 0 : }
|