Skip to content

Commit

Permalink
Merge pull request eqlabs#1641 from eqlabs/krisztian/use-cached-state…
Browse files Browse the repository at this point in the history
…ments-on-storage-hot-path

feat(storage): use cached prepared statements on execution hot-path
  • Loading branch information
kkovaacs committed Dec 12, 2023
2 parents c7910b1 + debbc0f commit d03a3ea
Show file tree
Hide file tree
Showing 3 changed files with 156 additions and 103 deletions.
41 changes: 24 additions & 17 deletions crates/storage/src/connection/block.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,21 +179,23 @@ pub(super) fn block_id(
pub(super) fn block_exists(tx: &Transaction<'_>, block: BlockId) -> anyhow::Result<bool> {
match block {
BlockId::Latest => {
tx.inner()
.query_row("SELECT EXISTS(SELECT 1 FROM canonical_blocks)", [], |row| {
row.get(0)
})
let mut stmt = tx
.inner()
.prepare_cached("SELECT EXISTS(SELECT 1 FROM canonical_blocks)")?;
stmt.query_row([], |row| row.get(0))
}
BlockId::Number(number) => {
let mut stmt = tx
.inner()
.prepare_cached("SELECT EXISTS(SELECT 1 FROM canonical_blocks WHERE number = ?)")?;
stmt.query_row(params![&number], |row| row.get(0))
}
BlockId::Hash(hash) => {
let mut stmt = tx
.inner()
.prepare_cached("SELECT EXISTS(SELECT 1 FROM canonical_blocks WHERE hash = ?)")?;
stmt.query_row(params![&hash], |row| row.get(0))
}
BlockId::Number(number) => tx.inner().query_row(
"SELECT EXISTS(SELECT 1 FROM canonical_blocks WHERE number = ?)",
params![&number],
|row| row.get(0),
),
BlockId::Hash(hash) => tx.inner().query_row(
"SELECT EXISTS(SELECT 1 FROM canonical_blocks WHERE hash = ?)",
params![&hash],
|row| row.get(0),
),
}
.map_err(|e| e.into())
}
Expand Down Expand Up @@ -252,10 +254,15 @@ pub(super) fn block_header(
Ok(header)
};

let mut stmt = tx
.inner()
.prepare_cached(&sql)
.context("Preparing block header query")?;

let header = match block {
BlockId::Latest => tx.inner().query_row(&sql, [], parse_row),
BlockId::Number(number) => tx.inner().query_row(&sql, params![&number], parse_row),
BlockId::Hash(hash) => tx.inner().query_row(&sql, params![&hash], parse_row),
BlockId::Latest => stmt.query_row([], parse_row),
BlockId::Number(number) => stmt.query_row(params![&number], parse_row),
BlockId::Hash(hash) => stmt.query_row(params![&hash], parse_row),
}
.optional()
.context("Querying for block header")?;
Expand Down
55 changes: 33 additions & 22 deletions crates/storage/src/connection/class.rs
Original file line number Diff line number Diff line change
Expand Up @@ -111,7 +111,7 @@ pub(super) fn classes_exist(
) -> anyhow::Result<Vec<bool>> {
let mut stmt = transaction
.inner()
.prepare("SELECT 1 FROM class_definitions WHERE hash = ?")?;
.prepare_cached("SELECT 1 FROM class_definitions WHERE hash = ?")?;

Ok(classes
.iter()
Expand All @@ -137,13 +137,12 @@ pub(super) fn class_definition_with_block_number(
Ok((block_number, definition))
};

let result = transaction
let mut stmt = transaction
.inner()
.query_row(
"SELECT definition, block_number FROM class_definitions WHERE hash = ?",
params![&class_hash],
from_row,
)
.prepare_cached("SELECT definition, block_number FROM class_definitions WHERE hash = ?")?;

let result = stmt
.query_row(params![&class_hash], from_row)
.optional()
.context("Querying for class definition")?;

Expand Down Expand Up @@ -177,22 +176,34 @@ pub(super) fn compressed_class_definition_at_with_block_number(
};

match block_id {
BlockId::Latest => tx.inner().query_row(
"SELECT definition, block_number FROM class_definitions WHERE hash=? AND block_number IS NOT NULL",
params![&class_hash],
from_row,
),
BlockId::Number(number) => tx.inner().query_row(
"SELECT definition, block_number FROM class_definitions WHERE hash=? AND block_number <= ?",
params![&class_hash, &number],
from_row,
),
BlockId::Hash(hash) => tx.inner().query_row(
r"SELECT definition, block_number FROM class_definitions
BlockId::Latest => {
let mut stmt = tx.inner().prepare_cached(
"SELECT definition, block_number FROM class_definitions WHERE hash=? AND block_number IS NOT NULL",
)?;
stmt.query_row(
params![&class_hash],
from_row,
)
}
BlockId::Number(number) => {
let mut stmt = tx.inner().prepare_cached(
"SELECT definition, block_number FROM class_definitions WHERE hash=? AND block_number <= ?",
)?;
stmt.query_row(
params![&class_hash, &number],
from_row,
)
}
BlockId::Hash(hash) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT definition, block_number FROM class_definitions
WHERE hash = ? AND block_number <= (SELECT number from canonical_blocks WHERE hash = ?)",
params![&class_hash, &hash],
from_row,
),
)?;
stmt.query_row(
params![&class_hash, &hash],
from_row,
)
}
}
.optional()
.context("Querying for class definition")
Expand Down
163 changes: 99 additions & 64 deletions crates/storage/src/connection/state_update.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,29 +280,38 @@ pub(super) fn storage_value(
key: StorageAddress,
) -> anyhow::Result<Option<StorageValue>> {
match block {
BlockId::Latest => tx.inner().query_row(
r"SELECT storage_value FROM storage_updates
BlockId::Latest => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT storage_value FROM storage_updates
WHERE contract_address = ? AND storage_address = ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &key],
|row| row.get_storage_value(0),
),
BlockId::Number(number) => tx.inner().query_row(
r"SELECT storage_value FROM storage_updates
)?;
stmt.query_row(params![&contract_address, &key], |row| {
row.get_storage_value(0)
})
}
BlockId::Number(number) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT storage_value FROM storage_updates
WHERE contract_address = ? AND storage_address = ? AND block_number <= ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &key, &number],
|row| row.get_storage_value(0),
),
BlockId::Hash(hash) => tx.inner().query_row(
r"SELECT storage_value FROM storage_updates
)?;
stmt.query_row(params![&contract_address, &key, &number], |row| {
row.get_storage_value(0)
})
}
BlockId::Hash(hash) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT storage_value FROM storage_updates
WHERE contract_address = ? AND storage_address = ? AND block_number <= (
SELECT number FROM canonical_blocks WHERE hash = ?
)
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &key, &hash],
|row| row.get_storage_value(0),
),
)?;
stmt.query_row(params![&contract_address, &key, &hash], |row| {
row.get_storage_value(0)
})
}
}
.optional()
.map_err(|e| e.into())
Expand All @@ -314,25 +323,37 @@ pub(super) fn contract_exists(
block_id: BlockId,
) -> anyhow::Result<bool> {
match block_id {
BlockId::Number(number) => tx.inner().query_row(
"SELECT EXISTS(SELECT 1 FROM contract_updates WHERE contract_address = ? AND block_number <= ?)",
params![&contract_address, &number],
|row| row.get(0),
),
BlockId::Hash(hash) => tx.inner().query_row(
r"SELECT EXISTS(
SELECT 1 FROM contract_updates WHERE contract_address = ? AND block_number <= (
SELECT number FROM canonical_blocks WHERE hash = ?
)
)",
params![&contract_address, &hash],
|row| row.get(0),
),
BlockId::Latest => tx.inner().query_row(
"SELECT EXISTS(SELECT 1 FROM contract_updates WHERE contract_address = ?)",
params![&contract_address],
|row| row.get(0),
),
BlockId::Number(number) => {
let mut stmt = tx.inner().prepare_cached(
"SELECT EXISTS(SELECT 1 FROM contract_updates WHERE contract_address = ? AND block_number <= ?)",
)?;
stmt.query_row(
params![&contract_address, &number],
|row| row.get(0),
)
}
BlockId::Hash(hash) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT EXISTS(
SELECT 1 FROM contract_updates WHERE contract_address = ? AND block_number <= (
SELECT number FROM canonical_blocks WHERE hash = ?
)
)",
)?;
stmt.query_row(
params![&contract_address, &hash],
|row| row.get(0),
)
}
BlockId::Latest => {
let mut stmt = tx.inner().prepare_cached(
"SELECT EXISTS(SELECT 1 FROM contract_updates WHERE contract_address = ?)",
)?;
stmt.query_row(
params![&contract_address],
|row| row.get(0),
)
}
}
.context("Querying that contract exists")
}
Expand All @@ -343,29 +364,36 @@ pub(super) fn contract_nonce(
block_id: BlockId,
) -> anyhow::Result<Option<ContractNonce>> {
match block_id {
BlockId::Latest => tx.inner().query_row(
r"SELECT nonce FROM nonce_updates
BlockId::Latest => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT nonce FROM nonce_updates
WHERE contract_address = ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address],
|row| row.get_contract_nonce(0),
),
BlockId::Number(number) => tx.inner().query_row(
r"SELECT nonce FROM nonce_updates
)?;
stmt.query_row(params![&contract_address], |row| row.get_contract_nonce(0))
}
BlockId::Number(number) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT nonce FROM nonce_updates
WHERE contract_address = ? AND block_number <= ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &number],
|row| row.get_contract_nonce(0),
),
BlockId::Hash(hash) => tx.inner().query_row(
r"SELECT nonce FROM nonce_updates
)?;
stmt.query_row(params![&contract_address, &number], |row| {
row.get_contract_nonce(0)
})
}
BlockId::Hash(hash) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT nonce FROM nonce_updates
WHERE contract_address = ? AND block_number <= (
SELECT number FROM canonical_blocks WHERE hash = ?
)
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &hash],
|row| row.get_contract_nonce(0),
),
)?;
stmt.query_row(params![&contract_address, &hash], |row| {
row.get_contract_nonce(0)
})
}
}
.optional()
.map_err(|e| e.into())
Expand All @@ -377,29 +405,36 @@ pub(super) fn contract_class_hash(
contract_address: ContractAddress,
) -> anyhow::Result<Option<ClassHash>> {
match block_id {
BlockId::Latest => tx.inner().query_row(
r"SELECT class_hash FROM contract_updates
BlockId::Latest => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT class_hash FROM contract_updates
WHERE contract_address = ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address],
|row| row.get_class_hash(0),
),
BlockId::Number(number) => tx.inner().query_row(
r"SELECT class_hash FROM contract_updates
)?;
stmt.query_row(params![&contract_address], |row| row.get_class_hash(0))
}
BlockId::Number(number) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT class_hash FROM contract_updates
WHERE contract_address = ? AND block_number <= ?
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &number],
|row| row.get_class_hash(0),
),
BlockId::Hash(hash) => tx.inner().query_row(
r"SELECT class_hash FROM contract_updates
)?;
stmt.query_row(params![&contract_address, &number], |row| {
row.get_class_hash(0)
})
}
BlockId::Hash(hash) => {
let mut stmt = tx.inner().prepare_cached(
r"SELECT class_hash FROM contract_updates
WHERE contract_address = ? AND block_number <= (
SELECT number FROM canonical_blocks WHERE hash = ?
)
ORDER BY block_number DESC LIMIT 1",
params![&contract_address, &hash],
|row| row.get_class_hash(0),
),
)?;
stmt.query_row(params![&contract_address, &hash], |row| {
row.get_class_hash(0)
})
}
}
.optional()
.map_err(|e| e.into())
Expand Down

0 comments on commit d03a3ea

Please sign in to comment.