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