|
|
|
@ -12,9 +12,7 @@ use std::{ |
|
|
|
time::{Duration, Instant}, |
|
|
|
time::{Duration, Instant}, |
|
|
|
}; |
|
|
|
}; |
|
|
|
use tokio::sync::oneshot::Sender; |
|
|
|
use tokio::sync::oneshot::Sender; |
|
|
|
use tracing::{debug, warn}; |
|
|
|
use tracing::debug; |
|
|
|
|
|
|
|
|
|
|
|
pub const MILLI: Duration = Duration::from_millis(1); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
thread_local! { |
|
|
|
thread_local! { |
|
|
|
static READ_CONNECTION: RefCell<Option<&'static Connection>> = RefCell::new(None); |
|
|
|
static READ_CONNECTION: RefCell<Option<&'static Connection>> = RefCell::new(None); |
|
|
|
@ -164,16 +162,7 @@ impl Tree for SqliteTable { |
|
|
|
#[tracing::instrument(skip(self, key, value))] |
|
|
|
#[tracing::instrument(skip(self, key, value))] |
|
|
|
fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> { |
|
|
|
fn insert(&self, key: &[u8], value: &[u8]) -> Result<()> { |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
|
|
|
|
|
|
|
|
let start = Instant::now(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
self.insert_with_guard(&guard, key, value)?; |
|
|
|
self.insert_with_guard(&guard, key, value)?; |
|
|
|
|
|
|
|
|
|
|
|
let elapsed = start.elapsed(); |
|
|
|
|
|
|
|
if elapsed > MILLI { |
|
|
|
|
|
|
|
warn!("insert took {:?} : {}", elapsed, &self.name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
drop(guard); |
|
|
|
drop(guard); |
|
|
|
|
|
|
|
|
|
|
|
let watchers = self.watchers.read(); |
|
|
|
let watchers = self.watchers.read(); |
|
|
|
@ -220,20 +209,11 @@ impl Tree for SqliteTable { |
|
|
|
fn remove(&self, key: &[u8]) -> Result<()> { |
|
|
|
fn remove(&self, key: &[u8]) -> Result<()> { |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
|
|
|
|
|
|
|
|
let start = Instant::now(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
guard.execute( |
|
|
|
guard.execute( |
|
|
|
format!("DELETE FROM {} WHERE key = ?", self.name).as_str(), |
|
|
|
format!("DELETE FROM {} WHERE key = ?", self.name).as_str(), |
|
|
|
[key], |
|
|
|
[key], |
|
|
|
)?; |
|
|
|
)?; |
|
|
|
|
|
|
|
|
|
|
|
let elapsed = start.elapsed(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if elapsed > MILLI { |
|
|
|
|
|
|
|
debug!("remove: took {:012?} : {}", elapsed, &self.name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// debug!("remove key: {:?}", &key);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ok(()) |
|
|
|
Ok(()) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@ -326,8 +306,6 @@ impl Tree for SqliteTable { |
|
|
|
fn increment(&self, key: &[u8]) -> Result<Vec<u8>> { |
|
|
|
fn increment(&self, key: &[u8]) -> Result<Vec<u8>> { |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
let guard = self.engine.write_lock(); |
|
|
|
|
|
|
|
|
|
|
|
let start = Instant::now(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let old = self.get_with_guard(&guard, key)?; |
|
|
|
let old = self.get_with_guard(&guard, key)?; |
|
|
|
|
|
|
|
|
|
|
|
let new = |
|
|
|
let new = |
|
|
|
@ -335,26 +313,11 @@ impl Tree for SqliteTable { |
|
|
|
|
|
|
|
|
|
|
|
self.insert_with_guard(&guard, key, &new)?; |
|
|
|
self.insert_with_guard(&guard, key, &new)?; |
|
|
|
|
|
|
|
|
|
|
|
let elapsed = start.elapsed(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if elapsed > MILLI { |
|
|
|
|
|
|
|
debug!("increment: took {:012?} : {}", elapsed, &self.name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// debug!("increment key: {:?}", &key);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ok(new) |
|
|
|
Ok(new) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#[tracing::instrument(skip(self, prefix))] |
|
|
|
#[tracing::instrument(skip(self, prefix))] |
|
|
|
fn scan_prefix<'a>(&'a self, prefix: Vec<u8>) -> Box<dyn Iterator<Item = TupleOfBytes> + 'a> { |
|
|
|
fn scan_prefix<'a>(&'a self, prefix: Vec<u8>) -> Box<dyn Iterator<Item = TupleOfBytes> + 'a> { |
|
|
|
// let name = self.name.clone();
|
|
|
|
|
|
|
|
// self.iter_from_thread(
|
|
|
|
|
|
|
|
// format!(
|
|
|
|
|
|
|
|
// "SELECT key, value FROM {} WHERE key BETWEEN ?1 AND ?1 || X'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' ORDER BY key ASC",
|
|
|
|
|
|
|
|
// name
|
|
|
|
|
|
|
|
// )
|
|
|
|
|
|
|
|
// [prefix]
|
|
|
|
|
|
|
|
// )
|
|
|
|
|
|
|
|
Box::new( |
|
|
|
Box::new( |
|
|
|
self.iter_from(&prefix, false) |
|
|
|
self.iter_from(&prefix, false) |
|
|
|
.take_while(move |(key, _)| key.starts_with(&prefix)), |
|
|
|
.take_while(move |(key, _)| key.starts_with(&prefix)), |
|
|
|
|