node: Allow for "WAL" mode in sqlite
This solves concurrency issues between the node and http daemon.
This commit is contained in:
parent
25c6660a59
commit
21cced05c1
|
|
@ -26,6 +26,9 @@ $ rad config
|
||||||
},
|
},
|
||||||
"connect": [],
|
"connect": [],
|
||||||
"externalAddresses": [],
|
"externalAddresses": [],
|
||||||
|
"db": {
|
||||||
|
"journalMode": "rollback"
|
||||||
|
},
|
||||||
"tor": null,
|
"tor": null,
|
||||||
"network": "main",
|
"network": "main",
|
||||||
"log": "INFO",
|
"log": "INFO",
|
||||||
|
|
|
||||||
|
|
@ -89,6 +89,7 @@ mod routes {
|
||||||
},
|
},
|
||||||
"connect": [],
|
"connect": [],
|
||||||
"externalAddresses": [],
|
"externalAddresses": [],
|
||||||
|
"db": { "journalMode": "rollback" },
|
||||||
"tor": null,
|
"tor": null,
|
||||||
"network": "main",
|
"network": "main",
|
||||||
"log": "INFO",
|
"log": "INFO",
|
||||||
|
|
|
||||||
|
|
@ -156,7 +156,7 @@ impl Runtime {
|
||||||
let policy = config.policy;
|
let policy = config.policy;
|
||||||
|
|
||||||
log::info!(target: "node", "Opening node database..");
|
log::info!(target: "node", "Opening node database..");
|
||||||
let db = home.database_mut()?;
|
let db = home.database_mut()?.journal_mode(config.db.journal_mode)?;
|
||||||
let mut stores: service::Stores<_> = db.clone().into();
|
let mut stores: service::Stores<_> = db.clone().into();
|
||||||
|
|
||||||
log::info!(target: "node", "Opening policy database..");
|
log::info!(target: "node", "Opening policy database..");
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ use localtime::LocalDuration;
|
||||||
|
|
||||||
use crate::node;
|
use crate::node;
|
||||||
use crate::node::policy::{Policy, Scope};
|
use crate::node::policy::{Policy, Scope};
|
||||||
use crate::node::{Address, Alias, NodeId};
|
use crate::node::{db, Address, Alias, NodeId};
|
||||||
|
|
||||||
/// Target number of peers to maintain connections to.
|
/// Target number of peers to maintain connections to.
|
||||||
pub const TARGET_OUTBOUND_PEERS: usize = 8;
|
pub const TARGET_OUTBOUND_PEERS: usize = 8;
|
||||||
|
|
@ -260,6 +260,14 @@ pub enum TorConfig {
|
||||||
Transparent,
|
Transparent,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Database configuration.
|
||||||
|
#[derive(Debug, Default, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub struct DbConfig {
|
||||||
|
#[serde(default)]
|
||||||
|
pub journal_mode: db::JournalMode,
|
||||||
|
}
|
||||||
|
|
||||||
/// Service configuration.
|
/// Service configuration.
|
||||||
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
|
|
@ -279,6 +287,9 @@ pub struct Config {
|
||||||
/// Specify the node's public addresses
|
/// Specify the node's public addresses
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub external_addresses: Vec<Address>,
|
pub external_addresses: Vec<Address>,
|
||||||
|
/// Database config.
|
||||||
|
#[serde(default)]
|
||||||
|
pub db: DbConfig,
|
||||||
/// Tor configuration.
|
/// Tor configuration.
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub tor: Option<TorConfig>,
|
pub tor: Option<TorConfig>,
|
||||||
|
|
@ -321,6 +332,7 @@ impl Config {
|
||||||
listen: vec![],
|
listen: vec![],
|
||||||
connect: HashSet::default(),
|
connect: HashSet::default(),
|
||||||
external_addresses: vec![],
|
external_addresses: vec![],
|
||||||
|
db: DbConfig::default(),
|
||||||
network: Network::default(),
|
network: Network::default(),
|
||||||
tor: None,
|
tor: None,
|
||||||
relay: Relay::default(),
|
relay: Relay::default(),
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,19 @@ pub enum Error {
|
||||||
NoRows,
|
NoRows,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Database journal mode.
|
||||||
|
#[derive(Debug, Default, Copy, Clone, serde::Serialize, serde::Deserialize)]
|
||||||
|
#[serde(rename_all = "camelCase")]
|
||||||
|
pub enum JournalMode {
|
||||||
|
/// "WAL" mode. Good for concurrent reads & writes, but keeps some extra files around.
|
||||||
|
#[serde(rename = "wal")]
|
||||||
|
WriteAheadLog,
|
||||||
|
/// Default "rollback" mode. Certain writes may block reads.
|
||||||
|
#[serde(alias = "rollback")]
|
||||||
|
#[default]
|
||||||
|
Rollback,
|
||||||
|
}
|
||||||
|
|
||||||
/// A file-backed database storing information about the network.
|
/// A file-backed database storing information about the network.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Database {
|
pub struct Database {
|
||||||
|
|
@ -93,6 +106,19 @@ impl Database {
|
||||||
Ok(Self { db: Arc::new(db) })
|
Ok(Self { db: Arc::new(db) })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set journal mode.
|
||||||
|
pub fn journal_mode(self, mode: JournalMode) -> Result<Self, Error> {
|
||||||
|
match mode {
|
||||||
|
JournalMode::Rollback => {
|
||||||
|
self.db.execute("PRAGMA journal_mode = DELETE;")?;
|
||||||
|
}
|
||||||
|
JournalMode::WriteAheadLog => {
|
||||||
|
self.db.execute("PRAGMA journal_mode = WAL;")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
|
|
||||||
/// Create a new in-memory database.
|
/// Create a new in-memory database.
|
||||||
pub fn memory() -> Result<Self, Error> {
|
pub fn memory() -> Result<Self, Error> {
|
||||||
let db = sql::Connection::open_thread_safe(":memory:")?;
|
let db = sql::Connection::open_thread_safe(":memory:")?;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue