Closed
Description
Code
use std::error::Error;
use tokio::net::TcpStream;
use tokio::prelude::*;
use tokio::io::BufReader;
use tokio::sync::mpsc;
use serde_json;
use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize)]
pub struct TakerHello {
pub protocol_version_min: u32,
pub protocol_version_max: u32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "method", rename_all = "lowercase")]
pub enum TakerToMakerMessage {
TakerHello(TakerHello),
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Offer {
pub absolute_fee: u32,
pub amount_relative_fee: f32,
pub max_size: u64,
pub min_size: u64,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "method", rename_all = "lowercase")]
pub enum MakerToTakerMessage {
Offer(Offer),
}
pub struct OfferAddress {
pub offer: Offer,
pub socket_address: String, //string for now when its "localhost:port"
}
async fn sync_offerbook() -> Result<Vec<OfferAddress>, Box<dyn Error>> {
let (syncd_offers_writer, mut syncd_offers_reader) =
mpsc::channel::<Option<OfferAddress>>(100);
for host in &["localhost:6102", "localhost:16102"] {
//TODO add timeouts to deal with indefinite hangs
let mut tx = syncd_offers_writer.clone();
tokio::spawn(async move {
let mut socket = match TcpStream::connect(host).await {
Ok(s) => s,
Err(_e) => {
tx.send(None).await;
return;
}
};
let (socket_reader, mut socket_writer) = socket.split();
let mut socket_reader = BufReader::new(socket_reader);
let mut message_packet = serde_json::to_vec(
&TakerToMakerMessage::TakerHello(TakerHello {
protocol_version_min: 0,
protocol_version_max: 0,
})
).unwrap();
message_packet.push(b'\n');
message_packet.append(
&mut serde_json::to_vec(
&TakerToMakerMessage::TakerHello(TakerHello {
protocol_version_min: 0,
protocol_version_max: 0,
})
).unwrap()
);
message_packet.push(b'\n');
//TODO error handling here
socket_writer.write_all(&message_packet).await.unwrap();
let mut line = String::new();
let n = match socket_reader.read_line(&mut line).await {
Ok(0) | Err(_e) => {
tx.send(None).await;
return;
},
Ok(n) => n,
};
});
}
Ok(vec![])
}
fn main() {
println!("hello world");
}
Cargo.toml
[package]
name = "indium"
version = "0.1.0"
authors = ["chris-belcher <[email protected]>"]
edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
tokio = { version = "0.3", features = ["full"] }
futures = "0.3"
Meta
rustc --version --verbose
:
rustc 1.44.1 (c7087fe00 2020-06-17)
binary: rustc
commit-hash: c7087fe00d2ba919df1d813c040a5d47e43b0fe7
commit-date: 2020-06-17
host: x86_64-unknown-linux-gnu
release: 1.44.1
LLVM version: 9.0
Error output
$ cargo check
Checking indium v0.1.0 (/home/username/coding/project/indium-compiler-crash)
error[E0408]: variable `_e` is not bound in all patterns
--> src/main.rs:83:17
|
83 | Ok(0) | Err(_e) => {
| ^^^^^ -- variable not in all patterns
| |
| pattern doesn't bind `_e`
thread 'rustc' panicked at 'no entry found for key', src/librustc_mir_build/build/mod.rs:345:9
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: rustc 1.44.1 (c7087fe00 2020-06-17) running on x86_64-unknown-linux-gnu
note: compiler flags: -C debuginfo=2 -C incremental --crate-type bin
note: some of the compiler flags provided by cargo are hidden
error: aborting due to previous error
For more information about this error, try `rustc --explain E0408`.
error: could not compile `indium`.
To learn more, run the command again with --verbose.
Backtrace
$ RUST_BACKTRACE=1 cargo build
Compiling indium v0.1.0 (/home/username/coding/project/indium-compiler-crash)
error[E0408]: variable `_e` is not bound in all patterns
--> src/main.rs:83:17
|
83 | Ok(0) | Err(_e) => {
| ^^^^^ -- variable not in all patterns
| |
| pattern doesn't bind `_e`
thread 'rustc' panicked at 'no entry found for key', src/librustc_mir_build/build/mod.rs:345:9
stack backtrace:
0: backtrace::backtrace::libunwind::trace
at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
1: backtrace::backtrace::trace_unsynchronized
at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
2: std::sys_common::backtrace::_print_fmt
at src/libstd/sys_common/backtrace.rs:78
3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
at src/libstd/sys_common/backtrace.rs:59
4: core::fmt::write
at src/libcore/fmt/mod.rs:1069
5: std::io::Write::write_fmt
at src/libstd/io/mod.rs:1504
6: std::sys_common::backtrace::_print
at src/libstd/sys_common/backtrace.rs:62
7: std::sys_common::backtrace::print
at src/libstd/sys_common/backtrace.rs:49
8: std::panicking::default_hook::{{closure}}
at src/libstd/panicking.rs:198
9: std::panicking::default_hook
at src/libstd/panicking.rs:218
10: rustc_driver::report_ice
11: <alloc::boxed::Box<F> as core::ops::function::Fn<A>>::call
at /rustc/c7087fe00d2ba919df1d813c040a5d47e43b0fe7/src/liballoc/boxed.rs:1022
12: proc_macro::bridge::client::<impl proc_macro::bridge::Bridge>::enter::{{closure}}::{{closure}}
at /rustc/c7087fe00d2ba919df1d813c040a5d47e43b0fe7/src/libproc_macro/bridge/client.rs:305
13: std::panicking::rust_panic_with_hook
at src/libstd/panicking.rs:515
14: rust_begin_unwind
at src/libstd/panicking.rs:419
15: core::panicking::panic_fmt
at src/libcore/panicking.rs:111
16: core::option::expect_failed
at src/libcore/option.rs:1260
17: rustc_mir_build::build::matches::<impl rustc_mir_build::build::Builder>::bind_and_guard_matched_candidate
18: rustc_mir_build::build::matches::traverse_candidate
19: rustc_mir_build::build::matches::traverse_candidate
20: rustc_mir_build::build::matches::<impl rustc_mir_build::build::Builder>::bind_pattern
21: rustc_mir_build::build::scope::<impl rustc_mir_build::build::Builder>::in_scope
22: <core::iter::adapters::Map<I,F> as core::iter::traits::iterator::Iterator>::fold
23: rustc_mir_build::build::expr::into::<impl rustc_mir_build::build::Builder>::into_expr
24: rustc_mir_build::build::expr::into::<impl rustc_mir_build::build::Builder>::into_expr
25: rustc_mir_build::build::block::<impl rustc_mir_build::build::Builder>::ast_block_stmts
26: rustc_mir_build::build::expr::into::<impl rustc_mir_build::build::Builder>::into_expr
27: rustc_mir_build::build::expr::into::<impl rustc_mir_build::build::Builder>::into_expr
28: rustc_mir_build::build::expr::into::<impl rustc_mir_build::build::Builder>::into_expr
29: rustc_mir_build::build::construct_fn
30: rustc_infer::infer::InferCtxtBuilder::enter
31: rustc_mir_build::build::mir_built
32: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::mir_built>::compute
33: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
34: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
35: rustc_query_system::query::plumbing::get_query
36: rustc_mir::transform::check_unsafety::unsafety_check_result
37: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::unsafety_check_result>::compute
38: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
39: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
40: rustc_query_system::query::plumbing::get_query
41: <rustc_mir::transform::check_unsafety::UnsafetyChecker as rustc_middle::mir::visit::Visitor>::visit_rvalue
42: <rustc_mir::transform::check_unsafety::UnsafetyChecker as rustc_middle::mir::visit::Visitor>::visit_statement
43: rustc_mir::transform::check_unsafety::unsafety_check_result
44: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::unsafety_check_result>::compute
45: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
46: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
47: rustc_query_system::query::plumbing::get_query
48: <rustc_mir::transform::check_unsafety::UnsafetyChecker as rustc_middle::mir::visit::Visitor>::visit_rvalue
49: <rustc_mir::transform::check_unsafety::UnsafetyChecker as rustc_middle::mir::visit::Visitor>::visit_statement
50: rustc_mir::transform::check_unsafety::unsafety_check_result
51: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::unsafety_check_result>::compute
52: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
53: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
54: rustc_query_system::query::plumbing::get_query
55: rustc_mir::transform::mir_const
56: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::mir_const>::compute
57: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
58: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
59: rustc_query_system::query::plumbing::get_query
60: rustc_mir::transform::mir_validated
61: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::mir_validated>::compute
62: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
63: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
64: rustc_query_system::query::plumbing::get_query
65: rustc_mir::borrow_check::mir_borrowck
66: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::mir_borrowck>::compute
67: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
68: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
69: rustc_query_system::query::plumbing::get_query
70: rustc_typeck::collect::type_of::type_of
71: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
72: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
73: rustc_query_system::query::plumbing::get_query
74: rustc_middle::ty::util::<impl rustc_middle::ty::context::TyCtxt>::try_expand_impl_trait_type::OpaqueTypeExpander::expand_opaque_ty
75: rustc_middle::ty::util::<impl rustc_middle::ty::context::TyCtxt>::try_expand_impl_trait_type
76: rustc_typeck::check::check_item_type
77: rustc_middle::hir::map::Map::visit_item_likes_in_module
78: rustc_typeck::check::check_mod_item_types
79: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::check_mod_item_types>::compute
80: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
81: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
82: rustc_query_system::query::plumbing::get_query
83: rustc_query_system::query::plumbing::ensure_query
84: rustc_typeck::check_crate
85: rustc_interface::passes::analysis
86: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::analysis>::compute
87: rustc_middle::dep_graph::<impl rustc_query_system::dep_graph::DepKind for rustc_middle::dep_graph::dep_node::DepKind>::with_deps
88: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
89: rustc_query_system::query::plumbing::get_query
90: rustc_middle::ty::context::tls::enter_global
91: rustc_interface::interface::run_compiler_in_existing_thread_pool
92: scoped_tls::ScopedKey<T>::set
93: rustc_ast::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: internal compiler error: unexpected panic
note: the compiler unexpectedly panicked. this is a bug.
note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports
note: rustc 1.44.1 (c7087fe00 2020-06-17) running on x86_64-unknown-linux-gnu
note: compiler flags: -C debuginfo=2 -C incremental --crate-type bin
note: some of the compiler flags provided by cargo are hidden
query stack during panic:
#0 [mir_built] building MIR for
#1 [unsafety_check_result] unsafety-checking `sync_offerbook::{{closure}}#0::{{closure}}#0`
#2 [unsafety_check_result] unsafety-checking `sync_offerbook::{{closure}}#0`
#3 [unsafety_check_result] unsafety-checking `sync_offerbook`
#4 [mir_const] processing `sync_offerbook`
#5 [mir_validated] processing `sync_offerbook`
#6 [mir_borrowck] borrow-checking `sync_offerbook`
#7 [type_of] processing `sync_offerbook::{{opaque}}#0`
#8 [check_mod_item_types] checking item types in top-level module
#9 [analysis] running analysis passes on this crate
end of query stack
error: aborting due to previous error
For more information about this error, try `rustc --explain E0408`.
error: could not compile `indium`.
To learn more, run the command again with --verbose.
If I use Ok(0) | Err(_) => {
instead of Ok(0) | Err(_e) => {
then the crash doesn't happen