@@ -126,7 +126,7 @@ pub use data::Storage;
126126/// Encapuslate access to the blocks table for a chain.
127127mod data {
128128 use crate :: diesel:: dsl:: IntervalDsl ;
129- use crate :: AsyncPgConnection ;
129+ use crate :: { catalog , AsyncPgConnection } ;
130130 use diesel:: dsl:: sql;
131131 use diesel:: insert_into;
132132 use diesel:: sql_types:: { Array , Binary , Bool , Nullable , Text } ;
@@ -1648,8 +1648,6 @@ mod data {
16481648 }
16491649 }
16501650
1651- const CALL_CACHE_CONTRACT_ADDRESS_INDEX : & str = "call_cache_contract_address" ;
1652-
16531651 /// Ensure that an index on `contract_address` exists on the
16541652 /// call_cache table to speed up deletion queries. If the index does
16551653 /// not exist, create it concurrently.
@@ -1658,46 +1656,54 @@ mod data {
16581656 conn : & mut AsyncPgConnection ,
16591657 logger : & Logger ,
16601658 ) -> Result < ( ) , StoreError > {
1659+ const CONTRACT_INDEX : & str = "call_cache_contract_address" ;
1660+
16611661 let ( schema_name, table_qname) = match self {
16621662 Storage :: Shared => ( "public" , "public.eth_call_cache" . to_string ( ) ) ,
16631663 Storage :: Private ( Schema {
16641664 name, call_cache, ..
16651665 } ) => ( name. as_str ( ) , call_cache. qname . clone ( ) ) ,
16661666 } ;
16671667
1668- let has_index = crate :: catalog:: table_has_index (
1669- conn,
1670- schema_name,
1671- Self :: CALL_CACHE_CONTRACT_ADDRESS_INDEX ,
1672- )
1673- . await ?;
1668+ let has_index = catalog:: table_has_index ( conn, schema_name, CONTRACT_INDEX ) . await ?;
16741669
1675- if !has_index {
1676- let start = Instant :: now ( ) ;
1677- info ! (
1678- logger,
1679- "Creating index {} on {}.contract_address; \
1680- this may take a long time",
1681- Self :: CALL_CACHE_CONTRACT_ADDRESS_INDEX ,
1682- table_qname
1683- ) ;
1670+ let idx_valid =
1671+ catalog:: check_index_is_valid ( conn, schema_name, CONTRACT_INDEX ) . await ?;
1672+
1673+ if has_index && idx_valid {
1674+ return Ok ( ( ) ) ;
1675+ }
1676+
1677+ if !idx_valid {
16841678 conn. batch_execute ( & format ! (
1685- "create index concurrently if not exists {} \
1686- on {}(contract_address)",
1687- Self :: CALL_CACHE_CONTRACT_ADDRESS_INDEX ,
1688- table_qname
1679+ "drop index concurrently if exists {schema_name}.{}" ,
1680+ CONTRACT_INDEX
16891681 ) )
16901682 . await ?;
1691- let duration = start. elapsed ( ) ;
1692- info ! (
1693- logger,
1694- "Finished creating index {} on {}.contract_address in {:?}" ,
1695- Self :: CALL_CACHE_CONTRACT_ADDRESS_INDEX ,
1696- table_qname,
1697- duration
1698- ) ;
16991683 }
17001684
1685+ let start = Instant :: now ( ) ;
1686+ info ! (
1687+ logger,
1688+ "Creating index {} on {}.contract_address; \
1689+ this may take a long time",
1690+ CONTRACT_INDEX ,
1691+ table_qname
1692+ ) ;
1693+ conn. batch_execute ( & format ! (
1694+ "create index concurrently {} on {}(contract_address)" ,
1695+ CONTRACT_INDEX , table_qname
1696+ ) )
1697+ . await ?;
1698+ let duration = start. elapsed ( ) ;
1699+ info ! (
1700+ logger,
1701+ "Finished creating index {} on {}.contract_address in {:?}" ,
1702+ CONTRACT_INDEX ,
1703+ table_qname,
1704+ duration
1705+ ) ;
1706+
17011707 Ok ( ( ) )
17021708 }
17031709
0 commit comments