edit in src/main.rs at line 11
−
− const LEASE_DURATION: i64 = 10;
edit in src/main.rs at line 42
+ .takes_value(true),
+ )
+ .arg(
+ clap::Arg::with_name("lease")
+ .long("lease")
edit in src/main.rs at line 60
+ let lease = matches.value_of("lease").unwrap().parse().unwrap_or(60);
edit in src/main.rs at line 68
+ let host_ = host.clone();
+ let is_leader_ = is_leader.clone();
replacement in src/main.rs at line 102
[3.835]→[3.1071:1127](∅→∅),
[3.1071]→[3.1071:1127](∅→∅) − lead_.send(String::new()).unwrap();
+ let is_leader = host_ == is_leader_.borrow().as_str();
+ if is_leader {
+ // Trigger a resign. We're not rewinding if we
+ // were the leader.
+ lead_.send(String::new()).unwrap();
+ }
replacement in src/main.rs at line 114
[3.49]→[3.1757:1843](∅→∅),
[3.1074]→[3.1757:1843](∅→∅),
[3.1757]→[3.1757:1843](∅→∅),
[3.1843]→[3.1128:1142](∅→∅),
[3.1142]→[3.1867:1893](∅→∅),
[3.1867]→[3.1867:1893](∅→∅),
[3.1893]→[3.1143:1190](∅→∅),
[3.1190]→[3.1893:1935](∅→∅),
[3.1893]→[3.1893:1935](∅→∅),
[3.1935]→[3.50:80](∅→∅),
[3.80]→[3.1935:1943](∅→∅),
[3.1935]→[3.1935:1943](∅→∅),
[3.1943]→[2.0:84](∅→∅) − let mut election_observer = tokio::spawn(observe_elections(
− host.clone(),
− port,
− password.clone(),
− db_name.clone(),
− path.clone(),
− lead.clone(),
− db.clone(),
− process_lock.clone(),
− ));
− let mut race = tokio::spawn(race(host.clone(), is_leader.clone(), db.clone()));
+ let mut election_observer = tokio::spawn(observe_elections(host.clone(), lead.clone()));
+ let mut race = tokio::spawn(race(host.clone(), lease, is_leader.clone(), db.clone()));
replacement in src/main.rs at line 129
edit in src/main.rs at line 184
replacement in src/main.rs at line 189
− match race_(host.clone(), leader.clone(), pool.clone()).await {
+ match race_(host.clone(), lease, leader.clone(), pool.clone()).await {
edit in src/main.rs at line 202
replacement in src/main.rs at line 208
[3.1777]→[3.1777:1842](∅→∅) − let lease = client.lease_grant(LEASE_DURATION, None).await?;
+ let lease = client.lease_grant(leased as i64, None).await?;
replacement in src/main.rs at line 214
[3.1995]→[3.1995:2088](∅→∅) − tokio::time::sleep(std::time::Duration::from_secs(LEASE_DURATION as u64 / 2)).await;
+ tokio::time::sleep(std::time::Duration::from_secs(leased as u64 / 2)).await;
replacement in src/main.rs at line 221
[3.2273]→[3.2273:2370](∅→∅) − tokio::time::sleep(std::time::Duration::from_secs(LEASE_DURATION as u64 / 2)).await;
+ tokio::time::sleep(std::time::Duration::from_secs(leased as u64 / 2)).await;
replacement in src/main.rs at line 253
[3.5969]→[3.5969:5997](∅→∅) − async fn observe_elections(
+ async fn observe_elections(host: String, lead: Arc<Sender<String>>) -> Result<(), anyhow::Error> {
+ let mut client = Client::connect(["localhost:2379"], None).await?;
+ let mut obs = client.observe("postrep").await?;
+ while let Some(m) = obs.message().await? {
+ let leader = m.kv().unwrap().value_str()?;
+ debug!(
+ "observe_elections: leader = {:?}, host = {:?}",
+ leader, host
+ );
+ lead.send(leader.to_string()).unwrap();
+ }
+ Ok(())
+ }
+
+ async fn check_postgres(
replacement in src/main.rs at line 273
[3.2236]→[3.2236:2267](∅→∅) − lead: Arc<Sender<String>>,
+ mut is_leader_: Receiver<String>,
edit in src/main.rs at line 277
[3.6165]→[3.6165:6236](∅→∅) − let mut client = Client::connect(["localhost:2379"], None).await?;
replacement in src/main.rs at line 278
[3.1537]→[3.6236:6288](∅→∅),
[3.6236]→[3.6236:6288](∅→∅),
[3.2659]→[3.6288:6335](∅→∅),
[3.6288]→[3.6288:6335](∅→∅),
[3.6367]→[3.6367:6418](∅→∅),
[3.6418]→[3.1538:1598](∅→∅) − let mut obs = client.observe("postrep").await?;
− while let Some(m) = obs.message().await? {
− let leader = m.kv().unwrap().value_str()?;
− debug!("leader = {:?}, host = {:?}", leader, host);
+ loop {
+ is_leader_.changed().await.unwrap();
+ let leader = is_leader_.borrow().to_string();
replacement in src/main.rs at line 282
[3.6748]→[3.2725:2773](∅→∅) − lead.send(leader.to_string()).unwrap();
+ debug!("check_postgres: leader = {:?} host = {:?}", leader, host);
edit in src/main.rs at line 290
[3.2888]→[3.1687:1765](∅→∅) − debug!("is_leader = {:?}, was_leader = {:?}", is_leader, was_leader);
replacement in src/main.rs at line 303
[3.2226]→[3.915:1002](∅→∅) − rewind(&process_lock, &path, port, &db_name, leader, &password).await;
+ rewind(
+ &process_lock,
+ &path,
+ port,
+ &db_name,
+ is_leader_.clone(),
+ &password,
+ )
+ .await;
edit in src/main.rs at line 319
+ debug!("is_leader = {:?}, was_leader = {:?}", is_leader, was_leader);
edit in src/main.rs at line 322
[3.6948]→[3.6948:6959](∅→∅) edit in src/main.rs at line 324
[3.3137]→[2.572:1573](∅→∅) − async fn check_postgres(
− host: String,
− port: u16,
− password: String,
− db_name: String,
− path: String,
− leader: Arc<Sender<String>>,
− pool: Arc<Mutex<Option<tokio_postgres::Client>>>,
− process_lock: Arc<Mutex<()>>,
− ) -> Result<(), anyhow::Error> {
− loop {
− let leader = leader.borrow().to_string();
− if leader != host {
− let mut needs_rewind = false;
− let pool_ = { pool.lock().await.take() };
− if let Some(pool_) = pool_ {
− needs_rewind = pool_
− .query_opt("SELECT 1 FROM pg_stat_wal_receiver", &[])
− .await?
− .is_none();
− *pool.lock().await = Some(pool_);
− }
− if needs_rewind {
− debug!("leader: {:?}", leader);
− rewind(&process_lock, &path, port, &db_name, &leader, &password).await
− }
− }
− tokio::time::sleep(std::time::Duration::from_secs(10)).await
− }
− }
−
replacement in src/main.rs at line 359
[3.1461]→[3.1461:1479](∅→∅) + leader: Receiver<String>,
replacement in src/main.rs at line 376
− tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ if !success {
+ tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ }
edit in src/main.rs at line 382
+ let source = format!(
+ "port={} user=postgres dbname={} host={}",
+ port,
+ db_name,
+ &*leader.borrow()
+ );
+ info!("rewind {:?}", leader);
replacement in src/main.rs at line 391
[3.2838]→[3.2838:3125](∅→∅) − .args([
− "-D",
− &path,
− "-R",
− "--source-server",
− &format!(
− "port={} user=postgres dbname={} host={}",
− port, db_name, leader
− ),
− ])
+ .args(["-D", &path, "-R", "--source-server", &source])
replacement in src/main.rs at line 398
[3.3374]→[3.3374:3443](∅→∅) − tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ if !success {
+ tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ }
replacement in src/main.rs at line 407
[3.1135]→[3.1135:1165](∅→∅) + leader.borrow().as_str(),
+ password,
replacement in src/main.rs at line 423
[3.1589]→[3.1589:1658](∅→∅) − tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ if !success {
+ tokio::time::sleep(std::time::Duration::from_secs(1)).await;
+ }
edit in src/main.rs at line 427
+ let out = Command::new("systemctl")
+ .args(["restart", "nest"])
+ .output()
+ .await
+ .expect("failed to execute process");
+ std::io::stdout().write_all(&out.stdout).unwrap();
+ std::io::stderr().write_all(&out.stderr).unwrap();
+
replacement in Cargo.toml at line 3
− description = "A clustering tool for PostgreSQL, based on Etcd"
+ description = "A clustering tool for PostgreSQL"
replacement in Cargo.toml at line 12
replacement in Cargo.toml at line 20
edit in Cargo.lock at line 3
edit in Cargo.lock at line 77
+
+ [[package]]
+ name = "axum"
+ version = "0.5.11"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "c2cc6e8e8c993cb61a005fab8c1e5093a29199b7253b05a6883999312935c1ff"
+ dependencies = [
+ "async-trait",
+ "axum-core",
+ "bitflags",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "hyper",
+ "itoa",
+ "matchit",
+ "memchr",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "serde",
+ "sync_wrapper",
+ "tokio",
+ "tower",
+ "tower-http",
+ "tower-layer",
+ "tower-service",
+ ]
+
+ [[package]]
+ name = "axum-core"
+ version = "0.2.6"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "cf4d047478b986f14a13edad31a009e2e05cb241f9805d0d75e4cba4e129ad4d"
+ dependencies = [
+ "async-trait",
+ "bytes",
+ "futures-util",
+ "http",
+ "http-body",
+ "mime",
+ ]
replacement in Cargo.lock at line 129
[3.9970]→[3.9970:9988](∅→∅) replacement in Cargo.lock at line 131
[3.10053]→[3.10053:10131](∅→∅) − checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
+ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
edit in Cargo.lock at line 155
+ name = "cc"
+ version = "1.0.73"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+ [[package]]
edit in Cargo.lock at line 182
+ name = "cmake"
+ version = "0.1.48"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
+ dependencies = [
+ "cc",
+ ]
+
+ [[package]]
replacement in Cargo.lock at line 236
[3.12391]→[3.12391:12409](∅→∅) replacement in Cargo.lock at line 238
[3.12474]→[3.12474:12552](∅→∅) − checksum = "3d80294643e620e280bece8df0eca6933c3c3cec2b3179803ef00b76183e9f5e"
+ checksum = "9fb8664f6ea68aba5503d42dd1be786b0f1bd9b7972e7f40208c83ef74db91bf"
edit in Cargo.lock at line 246
+ "tower",
+ "tower-service",
replacement in Cargo.lock at line 258
[3.12878]→[3.12878:12896](∅→∅) replacement in Cargo.lock at line 260
[3.12961]→[3.12961:13039](∅→∅) − checksum = "37ab347416e802de484e4d03c7316c48f1ecb56574dfd4a46a80f173ce1de04d"
+ checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
replacement in Cargo.lock at line 378
[3.16036]→[3.16036:16045](∅→∅) + "wasi 0.10.2+wasi-snapshot-preview1",
replacement in Cargo.lock at line 383
[3.16072]→[3.16072:16090](∅→∅) replacement in Cargo.lock at line 385
[3.16155]→[3.16155:16233](∅→∅) − checksum = "825343c4eef0b63f541f8903f395dc5beb362a979b5799a84062527ef1e37726"
+ checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57"
replacement in Cargo.lock at line 396
[3.16360]→[3.16360:16375](∅→∅) replacement in Cargo.lock at line 402
[3.16421]→[3.16421:16439](∅→∅) replacement in Cargo.lock at line 404
[3.16504]→[3.16504:16582](∅→∅) − checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"
+ checksum = "db0d4cf898abf0081f964436dc980e96670a0f36863e4b83aaacdb65c9d7ccc3"
replacement in Cargo.lock at line 408
[3.16609]→[3.16609:16627](∅→∅) replacement in Cargo.lock at line 410
[3.16692]→[3.16692:16814](∅→∅) − checksum = "87cbf45460356b7deeb5e3415b5563308c0a9b057c85e12b06ad551f98d0a6ac"
− dependencies = [
− "unicode-segmentation",
− ]
+ checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
replacement in Cargo.lock at line 433
[3.17298]→[3.17298:17316](∅→∅) replacement in Cargo.lock at line 435
[3.17381]→[3.17381:17459](∅→∅) − checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11"
+ checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
replacement in Cargo.lock at line 444
[3.17537]→[3.17537:17555](∅→∅) replacement in Cargo.lock at line 446
[3.17620]→[3.17620:17698](∅→∅) − checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737"
+ checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
edit in Cargo.lock at line 454
+ name = "http-range-header"
+ version = "0.3.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
+
+ [[package]]
replacement in Cargo.lock at line 461
[3.17788]→[3.17788:17806](∅→∅) replacement in Cargo.lock at line 463
[3.17871]→[3.17871:17949](∅→∅) − checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437"
+ checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
replacement in Cargo.lock at line 479
[3.18362]→[3.18362:18381](∅→∅) replacement in Cargo.lock at line 481
[3.18446]→[3.18446:18524](∅→∅) − checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54"
+ checksum = "42dc3c131584288d375f2d07f822b0cb012d8c6fb899a5b9fdb3cb7eb9b6004f"
replacement in Cargo.lock at line 493
[3.18670]→[3.18670:18686](∅→∅) edit in Cargo.lock at line 502
+ name = "hyper-timeout"
+ version = "0.4.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+ dependencies = [
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tokio-io-timeout",
+ ]
+
+ [[package]]
replacement in Cargo.lock at line 515
[3.18780]→[3.18780:18798](∅→∅) replacement in Cargo.lock at line 517
[3.18863]→[3.18863:18941](∅→∅) − checksum = "824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"
+ checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
replacement in Cargo.lock at line 534
[3.19239]→[3.19239:19257](∅→∅) replacement in Cargo.lock at line 536
[3.19322]→[3.19322:19400](∅→∅) − checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
+ checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
replacement in Cargo.lock at line 543
[3.19457]→[3.19457:19475](∅→∅) replacement in Cargo.lock at line 545
[3.19540]→[3.19540:19618](∅→∅) − checksum = "dd25036021b0de88a0aff6b850051563c6516d0bf53f8638938edbb9de732736"
+ checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
replacement in Cargo.lock at line 555
[3.19840]→[3.19840:19859](∅→∅) replacement in Cargo.lock at line 557
[3.19924]→[3.19924:20002](∅→∅) − checksum = "18794a8ad5b29321f790b55d93dfba91e125cb1a9edbd4f8e3150acc771c1a5e"
+ checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
edit in Cargo.lock at line 582
+
+ [[package]]
+ name = "matchit"
+ version = "0.5.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "73cbba799671b762df5a175adf59ce145165747bb891505c43d09aefbbf38beb"
replacement in Cargo.lock at line 602
[3.20918]→[3.20918:20936](∅→∅) replacement in Cargo.lock at line 604
[3.21001]→[3.21001:21079](∅→∅) − checksum = "b16bd47d9e329435e309c58469fe0791c2d0d1ba96ec0954152a5ae2b04387dc"
+ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
replacement in Cargo.lock at line 607
[3.21092]→[3.21092:21124](∅→∅) − name = "mio"
− version = "0.7.11"
+ name = "mime"
+ version = "0.3.16"
replacement in Cargo.lock at line 610
[3.21189]→[3.21189:21333](∅→∅) − checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956"
− dependencies = [
− "libc",
− "log",
− "miow",
− "ntapi",
− "winapi",
− ]
+ checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
replacement in Cargo.lock at line 613
[3.21346]→[3.21346:21378](∅→∅) − name = "miow"
− version = "0.3.7"
+ name = "mio"
+ version = "0.8.4"
replacement in Cargo.lock at line 616
[3.21443]→[3.21443:21521](∅→∅) − checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21"
+ checksum = "57ee1c23c7c63b0c9250c339ffdc69255f110b298b901b9f6c82547b7b87caaf"
replacement in Cargo.lock at line 618
[3.21538]→[3.21538:21549](∅→∅) + "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys",
edit in Cargo.lock at line 631
[3.21756]→[3.21756:21975](∅→∅) − name = "ntapi"
− version = "0.3.6"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "3f6bb902e437b6d86e03cce10a7e2af662292c5dfef23b65899ea3ac9354ad44"
− dependencies = [
− "winapi",
− ]
−
− [[package]]
replacement in Cargo.lock at line 685
[3.23372]→[3.23372:23390](∅→∅) replacement in Cargo.lock at line 687
[3.23455]→[3.23455:23533](∅→∅) − checksum = "467d164a6de56270bd7c4d070df81d07beace25012d5103ced4e9ff08d6afdb7"
+ checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
replacement in Cargo.lock at line 733
[3.24564]→[3.24564:24582](∅→∅) replacement in Cargo.lock at line 735
[3.24647]→[3.24647:24725](∅→∅) − checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
+ checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
edit in Cargo.lock at line 792
+
+ [[package]]
+ name = "prettyplease"
+ version = "0.1.15"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "9e1516508b396cefe095485fdce673007422f5e48e82934b7b423dc26aa5e6a4"
+ dependencies = [
+ "proc-macro2",
+ "syn",
+ ]
replacement in Cargo.lock at line 817
[3.26335]→[3.26335:26354](∅→∅) replacement in Cargo.lock at line 819
[3.26419]→[3.26419:26497](∅→∅) − checksum = "a152013215dca273577e18d2bf00fa862b89b24169fb78c4c95aeb07992c9cec"
+ checksum = "dd96a1e8ed2596c337f8eae5f24924ec83f5ad5ab21ea8e455d3566c69fbcaf7"
replacement in Cargo.lock at line 821
[3.26514]→[3.26514:26530](∅→∅) replacement in Cargo.lock at line 826
[3.26560]→[3.26560:26578](∅→∅) replacement in Cargo.lock at line 828
[3.26643]→[3.26643:26721](∅→∅) − checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2"
+ checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e"
replacement in Cargo.lock at line 836
[3.26801]→[3.26801:26819](∅→∅) replacement in Cargo.lock at line 838
[3.26884]→[3.26884:26962](∅→∅) − checksum = "32d3ebd75ac2679c2af3a92246639f9fcc8a442ee420719cc4fe195b98dd5fa3"
+ checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab"
edit in Cargo.lock at line 841
edit in Cargo.lock at line 845
edit in Cargo.lock at line 851
replacement in Cargo.lock at line 858
[3.27132]→[3.27132:27150](∅→∅) replacement in Cargo.lock at line 860
[3.27215]→[3.27215:27293](∅→∅) − checksum = "169a15f3008ecb5160cba7d37bcd690a7601b6d30cfb87a117d45e59d52af5d4"
+ checksum = "7b670f45da57fb8542ebdbb6105a925fe571b67f9e7ed9f47a06a84e72b4e7cc"
replacement in Cargo.lock at line 871
[3.27405]→[3.27405:27423](∅→∅) replacement in Cargo.lock at line 873
[3.27488]→[3.27488:27566](∅→∅) − checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb"
+ checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68"
replacement in Cargo.lock at line 939
[3.29037]→[3.29037:29055](∅→∅) replacement in Cargo.lock at line 941
[3.29120]→[3.29120:29198](∅→∅) − checksum = "ce5f1ceb7f74abbce32601642fcf8e8508a8a8991e0621c7d750295b9095702b"
+ checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
replacement in Cargo.lock at line 950
[3.29297]→[3.29297:29316](∅→∅) replacement in Cargo.lock at line 952
[3.29381]→[3.29381:29459](∅→∅) − checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
+ checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
edit in Cargo.lock at line 968
+
+ [[package]]
+ name = "serde"
+ version = "1.0.138"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "1578c6245786b9d168c5447eeacfb96856573ca56c9d68fdcf394be134882a47"
replacement in Cargo.lock at line 1017
[3.30995]→[3.30995:31013](∅→∅) replacement in Cargo.lock at line 1019
[3.31078]→[3.31078:31156](∅→∅) − checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2"
+ checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
replacement in Cargo.lock at line 1049
[3.31857]→[3.31857:31876](∅→∅) replacement in Cargo.lock at line 1051
[3.31941]→[3.31941:32019](∅→∅) − checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
+ checksum = "c50aef8a904de4c23c788f104b7dddc7d6f79c647c7c8ce4cc8f73eb0ca773dd"
replacement in Cargo.lock at line 1055
[3.32062]→[3.32062:32078](∅→∅) edit in Cargo.lock at line 1059
+ name = "sync_wrapper"
+ version = "0.1.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
+
+ [[package]]
replacement in Cargo.lock at line 1113
[3.33281]→[3.348:366](∅→∅) replacement in Cargo.lock at line 1115
[3.33364]→[3.367:445](∅→∅) − checksum = "0a38d31d7831c6ed7aad00aa4c12d9375fd225a6dd77da1d25b707346319a975"
+ checksum = "c51a52ed6686dd62c320f9b89299e9dfb46f730c7a48e635c19f21d116cb1439"
edit in Cargo.lock at line 1117
[3.33459]→[3.33459:33471](∅→∅) edit in Cargo.lock at line 1125
edit in Cargo.lock at line 1128
+ ]
+
+ [[package]]
+ name = "tokio-io-timeout"
+ version = "1.2.0"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+ dependencies = [
+ "pin-project-lite",
+ "tokio",
replacement in Cargo.lock at line 1142
[3.33647]→[3.33647:33665](∅→∅) replacement in Cargo.lock at line 1144
[3.33730]→[3.33730:33808](∅→∅) − checksum = "caf7b11a536f46a809a8a9f0bb4237020f70ecbf115b842360afb127ea2fda57"
+ checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
replacement in Cargo.lock at line 1171
[3.34287]→[3.34287:34302](∅→∅) replacement in Cargo.lock at line 1176
[3.34339]→[3.34339:34357](∅→∅) replacement in Cargo.lock at line 1178
[3.34422]→[3.34422:34500](∅→∅) − checksum = "e177a5d8c3bf36de9ebe6d58537d8879e964332f93fb3339e43f618c81361af0"
+ checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9"
edit in Cargo.lock at line 1200
+ name = "tokio-util"
+ version = "0.7.3"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "cc463cd8deddc3770d20f9852143d50bf6094e640b485cb2e189a2099085ff45"
+ dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+ ]
+
+ [[package]]
replacement in Cargo.lock at line 1215
[3.34891]→[3.34891:34909](∅→∅) replacement in Cargo.lock at line 1217
[3.34974]→[3.34974:35052](∅→∅) − checksum = "2ac42cd97ac6bd2339af5bcabf105540e21e45636ec6fa6aae5e85d44db31be0"
+ checksum = "5be9d60db39854b30b835107500cf0aca0b0d14d6e1c3de124217c23a29c2ddb"
edit in Cargo.lock at line 1221
edit in Cargo.lock at line 1230
replacement in Cargo.lock at line 1237
[3.35288]→[3.35288:35303](∅→∅) edit in Cargo.lock at line 1239
replacement in Cargo.lock at line 1247
[3.35399]→[3.35399:35417](∅→∅) replacement in Cargo.lock at line 1249
[3.35482]→[3.35482:35560](∅→∅) − checksum = "c695de27302f4697191dda1c7178131a8cb805463dda02864acb80fe1322fdcf"
+ checksum = "d9263bf4c9bfaae7317c1c2faf7f18491d2fe476f70c414b73bf5d445b00ffa1"
edit in Cargo.lock at line 1251
replacement in Cargo.lock at line 1260
[3.35657]→[3.35657:35675](∅→∅) replacement in Cargo.lock at line 1262
[3.35740]→[3.35740:35818](∅→∅) − checksum = "bf0aa6dfc29148c3826708dabbfa83c121eeb84df4d1468220825e3a33651687"
+ checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
edit in Cargo.lock at line 1268
replacement in Cargo.lock at line 1272
[3.35926]→[3.35926:35958](∅→∅) − "tokio-stream",
− "tokio-util",
edit in Cargo.lock at line 1279
+ name = "tower-http"
+ version = "0.3.4"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "3c530c8675c1dbf98facee631536fa116b5fb6382d7dd6dc1b118d970eafe3ba"
+ dependencies = [
+ "bitflags",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "http",
+ "http-body",
+ "http-range-header",
+ "pin-project-lite",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ ]
+
+ [[package]]
edit in Cargo.lock at line 1374
+ name = "unicode-ident"
+ version = "1.0.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "5bd2fe26506023ed7b5e1e315add59d6f584c621d037f9368fea9cfb988f368c"
+
+ [[package]]
edit in Cargo.lock at line 1387
[3.38271]→[3.38271:38475](∅→∅) −
− [[package]]
− name = "unicode-segmentation"
− version = "1.7.1"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "bb0d2e7be6ae3a5fa87eed5fb451aff96f2573d2694942e40543ae0bbe19c796"
edit in Cargo.lock at line 1393
[3.38672]→[3.38672:38867](∅→∅) −
− [[package]]
− name = "unicode-xid"
− version = "0.2.2"
− source = "registry+https://github.com/rust-lang/crates.io-index"
− checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
edit in Cargo.lock at line 1423
+ name = "wasi"
+ version = "0.11.0+wasi-snapshot-preview1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
+
+ [[package]]
edit in Cargo.lock at line 1468
+
+ [[package]]
+ name = "windows-sys"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
+ dependencies = [
+ "windows_aarch64_msvc",
+ "windows_i686_gnu",
+ "windows_i686_msvc",
+ "windows_x86_64_gnu",
+ "windows_x86_64_msvc",
+ ]
+
+ [[package]]
+ name = "windows_aarch64_msvc"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
+
+ [[package]]
+ name = "windows_i686_gnu"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
+
+ [[package]]
+ name = "windows_i686_msvc"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
+
+ [[package]]
+ name = "windows_x86_64_gnu"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
+
+ [[package]]
+ name = "windows_x86_64_msvc"
+ version = "0.36.1"
+ source = "registry+https://github.com/rust-lang/crates.io-index"
+ checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"