Skip to content

Commit 574e188

Browse files
authored
Merge pull request #6050 from kantai/feat/check-md-index
Perf: Check and create metadata index in ClarityDB
2 parents 3c91a78 + 2ff51a2 commit 574e188

File tree

2 files changed

+54
-6
lines changed

2 files changed

+54
-6
lines changed

clarity/src/vm/database/sqlite.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,16 +254,13 @@ impl SqliteConnection {
254254

255255
Ok(())
256256
}
257+
257258
pub fn memory() -> Result<Connection> {
258259
let contract_db = SqliteConnection::inner_open(":memory:")?;
259260
SqliteConnection::initialize_conn(&contract_db)?;
260261
Ok(contract_db)
261262
}
262-
pub fn open(filename: &str) -> Result<Connection> {
263-
let contract_db = SqliteConnection::inner_open(filename)?;
264-
SqliteConnection::check_schema(&contract_db)?;
265-
Ok(contract_db)
266-
}
263+
267264
pub fn check_schema(conn: &Connection) -> Result<()> {
268265
let sql = "SELECT sql FROM sqlite_master WHERE name=?";
269266
let _: String = conn
@@ -272,10 +269,13 @@ impl SqliteConnection {
272269
let _: String = conn
273270
.query_row(sql, params!["metadata_table"], |row| row.get(0))
274271
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
272+
let _: String = conn
273+
.query_row(sql, params!["md_blockhashes"], |row| row.get(0))
274+
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
275275
Ok(())
276276
}
277277

278-
pub fn inner_open(filename: &str) -> Result<Connection> {
278+
fn inner_open(filename: &str) -> Result<Connection> {
279279
let conn = Connection::open(filename)
280280
.map_err(|x| InterpreterError::SqliteError(IncomparableError { err: x }))?;
281281

stackslib/src/clarity_vm/clarity.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1940,6 +1940,7 @@ impl ClarityTransactionConnection<'_, '_> {
19401940
#[cfg(test)]
19411941
mod tests {
19421942
use std::fs;
1943+
use std::path::PathBuf;
19431944

19441945
use clarity::vm::analysis::errors::CheckErrors;
19451946
use clarity::vm::database::{ClarityBackingStore, STXBalance};
@@ -1950,10 +1951,57 @@ mod tests {
19501951
use stacks_common::types::sqlite::NO_PARAMS;
19511952

19521953
use super::*;
1954+
use crate::chainstate::stacks::index::marf::{MARFOpenOpts, MarfConnection as _};
19531955
use crate::chainstate::stacks::index::ClarityMarfTrieId;
19541956
use crate::clarity_vm::database::marf::MarfedKV;
19551957
use crate::core::{PEER_VERSION_EPOCH_1_0, PEER_VERSION_EPOCH_2_0, PEER_VERSION_EPOCH_2_05};
19561958

1959+
#[test]
1960+
pub fn create_md_index() {
1961+
let path_db = "/tmp/stacks-node-tests/creat_md_index";
1962+
std::fs::remove_dir_all(path_db);
1963+
let mut path = PathBuf::from(path_db);
1964+
1965+
std::fs::create_dir_all(&path).unwrap();
1966+
1967+
path.push("marf.sqlite");
1968+
let marf_path = path.to_str().unwrap().to_string();
1969+
1970+
let mut marf_opts = MARFOpenOpts::default();
1971+
marf_opts.external_blobs = true;
1972+
1973+
let mut marf: MARF<StacksBlockId> = MARF::from_path(&marf_path, marf_opts).unwrap();
1974+
1975+
let tx = marf.storage_tx().unwrap();
1976+
1977+
tx.query_row("PRAGMA journal_mode = WAL;", NO_PARAMS, |_row| Ok(()))
1978+
.unwrap();
1979+
1980+
tx.execute(
1981+
"CREATE TABLE IF NOT EXISTS data_table
1982+
(key TEXT PRIMARY KEY, value TEXT)",
1983+
NO_PARAMS,
1984+
)
1985+
.unwrap();
1986+
1987+
tx.execute(
1988+
"CREATE TABLE IF NOT EXISTS metadata_table
1989+
(key TEXT NOT NULL, blockhash TEXT, value TEXT,
1990+
UNIQUE (key, blockhash))",
1991+
NO_PARAMS,
1992+
)
1993+
.unwrap();
1994+
1995+
tx.commit().unwrap();
1996+
1997+
assert!(SqliteConnection::check_schema(marf.sqlite_conn()).is_err());
1998+
1999+
MarfedKV::open(path_db, None, None).unwrap();
2000+
2001+
// schema should be good now
2002+
assert!(SqliteConnection::check_schema(marf.sqlite_conn()).is_ok());
2003+
}
2004+
19572005
#[test]
19582006
pub fn bad_syntax_test() {
19592007
let marf = MarfedKV::temporary();

0 commit comments

Comments
 (0)