Fix panic on closing tcpstream

next
Sayan Nandan 4 years ago
parent bfb1e39fe6
commit dd1d42fae0
No known key found for this signature in database
GPG Key ID: C31EFD7DDA12AEE0

@ -1,17 +1,23 @@
# Terrabase - The new in-memory database
Terrabase is an effort to provide the best of key/value stores, document stores and columnar databases - **simplicity, flexibility and queryability at scale**. This project is currently in a <b>pre-alpha</b> stage and is undergoing rapid development.
# Terrabase**DB** - The next-generation database
![Status: Pre-Alpha](https://img.shields.io/badge/Status-Pre--alpha-critical?style=flat-square)
![Version: 0.1.0](https://img.shields.io/badge/Development-Actively%20Developed-success?style=flat-square) ![GitHub release (latest by date)](https://img.shields.io/github/v/release/terrabasedb/terrabase?style=flat-square)
## What is TerrabaseDB?
TerrabaseDB (or TDB for short) is an effort to provide the best of key/value stores, document stores and columnar databases - **simplicity, flexibility and queryability at scale**. This project is currently in a <b>pre-alpha</b> stage and is undergoing rapid development.
## Status
As noted earlier, Terrabase is pre-alpha software and the entire API is subject to major breaking changes, at the moment.
As noted earlier, TerrabaseDB is pre-alpha software and the entire API is subject to major breaking changes, at the moment.
## Getting started
We have an experimental client and server implementation for the database already. You can download a pre-built binary for `x86_64-linux` in the releases section and try it out!
* First unzip the file
* Start the database server by running `./tdb`
* Start the client by running `./tsh`
* Start the database server by running `./tdb`
* Start the client by running `./tsh`
* You can run commands like `SET sayan 17` , `GET cat` , `UPDATE cat 100` or `DEL cat` !
## Goals

@ -0,0 +1,5 @@
# This is a simple script which creates a release build and
# moves the release builds into my $HOME/bin folder
cargo build --release
cp target/release/tdb target/release/tsh $HOME/bin
echo 'Done!'

@ -135,7 +135,7 @@ impl CHandler {
};
match try_df {
Ok(df) => self.con.write_response(self.db.execute_query(df)).await,
Err(e) => self.con.close_conn_with_error(e).await,
Err(e) => return self.con.close_conn_with_error(e).await,
}
}
}

@ -102,19 +102,13 @@ impl Connection {
let mut bufreader = BufReader::new(&mut self.stream);
let mut metaline_buf = String::with_capacity(DEF_QMETALINE_BUFSIZE);
bufreader.read_line(&mut metaline_buf).await.unwrap();
let pqmf = match PreQMF::from_buffer(metaline_buf) {
Ok(pq) => pq,
Err(e) => return Err(e),
};
let pqmf = PreQMF::from_buffer(metaline_buf)?;
let (mut metalayout_buf, mut dataframe_buf) = (
String::with_capacity(pqmf.metaline_size),
vec![0; pqmf.content_size],
);
bufreader.read_line(&mut metalayout_buf).await.unwrap();
let ss = match get_sizes(metalayout_buf) {
Ok(ss) => ss,
Err(e) => return Err(e),
};
let ss = get_sizes(metalayout_buf)?;
bufreader.read(&mut dataframe_buf).await.unwrap();
let qdf = QueryDataframe {
data: extract_idents(dataframe_buf, ss),
@ -123,13 +117,22 @@ impl Connection {
Ok(qdf)
}
pub async fn write_response(&mut self, resp: Vec<u8>) {
if let Ok(_) = self.stream.write(&resp).await {
if let Err(_) = self.stream.write_all(&resp).await {
eprintln!(
"Error while writing to stream: {:?}",
self.stream.peer_addr()
);
return;
}
if let Err(_) = self.stream.flush().await {
eprintln!(
"Error while flushing data to stream: {:?}",
self.stream.peer_addr()
);
return;
} else {
eprintln!("Error writing response to {:?}", self.stream.peer_addr())
}
}
pub async fn close_conn_with_error(&mut self, bytes: impl RespBytes) {
self.stream.write_all(&bytes.into_response()).await.unwrap();
self.write_response(bytes.into_response()).await
}
}

Loading…
Cancel
Save