diff --git a/storage-bigtable/src/bigtable.rs b/storage-bigtable/src/bigtable.rs index ac2de0ee4c..d2e01e4c11 100644 --- a/storage-bigtable/src/bigtable.rs +++ b/storage-bigtable/src/bigtable.rs @@ -458,6 +458,31 @@ impl) -> InterceptedRequestResult> BigTable { Ok(rows.into_iter().map(|r| r.0).collect()) } + /// Check whether a row key exists in a `table` + pub async fn row_key_exists(&mut self, table_name: &str, row_key: RowKey) -> Result { + self.refresh_access_token().await; + + let response = self + .client + .read_rows(ReadRowsRequest { + table_name: format!("{}{}", self.table_prefix, table_name), + app_profile_id: self.app_profile_id.clone(), + rows_limit: 1, + rows: Some(RowSet { + row_keys: vec![row_key.into_bytes()], + row_ranges: vec![], + }), + filter: Some(RowFilter { + filter: Some(row_filter::Filter::StripValueTransformer(true)), + }), + }) + .await? + .into_inner(); + + let rows = self.decode_read_rows_response(response).await?; + Ok(!rows.is_empty()) + } + /// Get latest data from `table`. /// /// All column families are accepted, and only the latest version of each column cell will be diff --git a/storage-bigtable/src/lib.rs b/storage-bigtable/src/lib.rs index fa96d3a102..2349e0b762 100644 --- a/storage-bigtable/src/lib.rs +++ b/storage-bigtable/src/lib.rs @@ -535,6 +535,22 @@ impl LedgerStorage { }) } + /// Does the confirmed block exist in the Bigtable + pub async fn confirmed_block_exists(&self, slot: Slot) -> Result { + debug!( + "LedgerStorage::confirmed_block_exists request received: {:?}", + slot + ); + inc_new_counter_debug!("storage-bigtable-query", 1); + let mut bigtable = self.connection.client(); + + let block_exists = bigtable + .row_key_exists("blocks", slot_to_blocks_key(slot)) + .await?; + + Ok(block_exists) + } + pub async fn get_signature_status(&self, signature: &Signature) -> Result { debug!( "LedgerStorage::get_signature_status request received: {:?}",