From a27b364e854e6fed8829714fd81022bb2ab2e689 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 9 Jun 2024 19:13:54 -0400 Subject: [PATCH 1/6] feat: provided better error message in case "Connection refused" caused by Redis --- rpc-server/src/main.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/rpc-server/src/main.rs b/rpc-server/src/main.rs index 0142af2d..12139f2a 100644 --- a/rpc-server/src/main.rs +++ b/rpc-server/src/main.rs @@ -44,9 +44,14 @@ async fn main() -> anyhow::Result<()> { let blocks_info_by_finality_clone = std::sync::Arc::clone(&server_context.blocks_info_by_finality); let near_rpc_client_clone = near_rpc_client.clone(); + let redis_client = redis::Client::open(rpc_server_config.general.redis_url.clone())? .get_connection_manager() - .await?; + .await + .map_err(|err| { + tracing::error!("Failed to connect to Redis: {:?}", err); + err + })?; let redis_client_clone = redis_client.clone(); // We need to update final block from Redis and Lake From 3ddaf839acc91612698f8b03ef3ff8dff856c110 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Sun, 9 Jun 2024 20:24:23 -0400 Subject: [PATCH 2/6] feat: added redis dependency to docker compose files --- examples/postgres-compose.yml | 10 ++++++++++ examples/rightsizing-compose.yml | 12 +++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/examples/postgres-compose.yml b/examples/postgres-compose.yml index dfdc24c7..266ce078 100644 --- a/examples/postgres-compose.yml +++ b/examples/postgres-compose.yml @@ -2,6 +2,7 @@ version: '3.7' x-common-variables: &common-variables CHAIN_ID: mainnet + REDIS_URL: redis://redis:6379/ DATABASE_URL: postgres:5432 DATABASE_USER: postgres DATABASE_PASSWORD: password @@ -29,6 +30,7 @@ services: - 8000:8000 depends_on: - postgres + - redis restart: on-failure state-indexer: @@ -45,6 +47,7 @@ services: - 8080:8080 depends_on: - postgres + - redis restart: on-failure tx-indexer: @@ -61,6 +64,7 @@ services: - 8081:8081 depends_on: - postgres + - redis restart: on-failure postgres: @@ -72,3 +76,9 @@ services: POSTGRES_PASSWORD: password ports: - 5432:5432 + + redis: + image: redis/redis-stack-server:latest + restart: always + ports: + - 6379:6379 diff --git a/examples/rightsizing-compose.yml b/examples/rightsizing-compose.yml index e1b16671..e1d97ee4 100644 --- a/examples/rightsizing-compose.yml +++ b/examples/rightsizing-compose.yml @@ -2,6 +2,7 @@ version: '3.7' x-common-variables: &common-variables CHAIN_ID: mainnet + REDIS_URL: redis://redis:6379/ DATABASE_URL: postgres:5432 DATABASE_USER: postgres DATABASE_PASSWORD: password @@ -31,6 +32,7 @@ services: - 8000:8000 depends_on: - postgres + - redis state-indexer: build: @@ -46,6 +48,7 @@ services: - 8080:8080 depends_on: - postgres + - redis restart: on-failure tx-indexer: @@ -57,12 +60,12 @@ services: environment: <<: *common-variables TX_INDEXER_ID: tx-indexer-local - command: [ "from-interruption" ] ports: - 8081:8081 depends_on: - postgres + - redis restart: on-failure postgres: @@ -74,3 +77,10 @@ services: POSTGRES_PASSWORD: password ports: - 5432:5432 + + redis: + image: redis/redis-stack-server:latest + container_name: redis-stack-server + ports: + - 6379:6379 + restart: always From 62b2989955f4de98be2cc47e8878d49fa5f452d2 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 10 Jun 2024 13:20:24 -0400 Subject: [PATCH 3/6] feat: made redis an optional dependency --- rpc-server/src/main.rs | 42 +++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/rpc-server/src/main.rs b/rpc-server/src/main.rs index 12139f2a..ce6293cf 100644 --- a/rpc-server/src/main.rs +++ b/rpc-server/src/main.rs @@ -49,25 +49,26 @@ async fn main() -> anyhow::Result<()> { .get_connection_manager() .await .map_err(|err| { - tracing::error!("Failed to connect to Redis: {:?}", err); - err - })?; - let redis_client_clone = redis_client.clone(); + tracing::warn!("Failed to connect to Redis: {:?}", err); + }) + .ok(); // We need to update final block from Redis and Lake // Because we can't be sure that Redis has the latest block // And Lake can be used as a backup source - // Update final block from Redis - tokio::spawn(async move { - utils::update_final_block_regularly_from_redis( - blocks_cache_clone, - blocks_info_by_finality_clone, - redis_client_clone, - near_rpc_client_clone, - ) - .await - }); + // Update final block from Redis if Redis is available + if let Some(redis_client) = redis_client.clone() { + tokio::spawn(async move { + utils::update_final_block_regularly_from_redis( + blocks_cache_clone, + blocks_info_by_finality_clone, + redis_client, + near_rpc_client_clone, + ) + .await + }); + } // Update final block from Lake let blocks_cache_clone = std::sync::Arc::clone(&server_context.blocks_cache); @@ -83,11 +84,14 @@ async fn main() -> anyhow::Result<()> { .await }); - let blocks_info_by_finality = std::sync::Arc::clone(&server_context.blocks_info_by_finality); - tokio::spawn(async move { - utils::update_optimistic_block_regularly(blocks_info_by_finality, redis_client.clone()) - .await - }); + // Update optimistic block from Redis if Redis is available + if let Some(redis_client) = redis_client { + let blocks_info_by_finality = + std::sync::Arc::clone(&server_context.blocks_info_by_finality); + tokio::spawn(async move { + utils::update_optimistic_block_regularly(blocks_info_by_finality, redis_client).await + }); + } let rpc = Server::new() .with_data(Data::new(server_context.clone())) From 0f3b7e4d0bb0a96f9f814ca8542306cac839349d Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 10 Jun 2024 13:22:09 -0400 Subject: [PATCH 4/6] chore: downgraded block fetching error logs to the warn level --- rpc-server/src/utils.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rpc-server/src/utils.rs b/rpc-server/src/utils.rs index 1df95040..3a0259a8 100644 --- a/rpc-server/src/utils.rs +++ b/rpc-server/src/utils.rs @@ -278,7 +278,7 @@ pub async fn update_final_block_regularly_from_redis( } } Err(err) => { - tracing::error!("Error to get final block from redis: {:?}", err); + tracing::warn!("Error to get final block from redis: {:?}", err); } } } @@ -319,7 +319,7 @@ pub async fn update_optimistic_block_regularly( } } Err(err) => { - tracing::error!("Error to get optimistic block from redis: {:?}", err); + tracing::warn!("Error to get optimistic block from redis: {:?}", err); } } From 1a6c04a108dfcede72b710b8b1f2426c17168e06 Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 10 Jun 2024 13:29:13 -0400 Subject: [PATCH 5/6] chore: set `OPTIMISTIC_UPDATING` to not working --- rpc-server/src/main.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/rpc-server/src/main.rs b/rpc-server/src/main.rs index ce6293cf..ac1c8c30 100644 --- a/rpc-server/src/main.rs +++ b/rpc-server/src/main.rs @@ -49,6 +49,7 @@ async fn main() -> anyhow::Result<()> { .get_connection_manager() .await .map_err(|err| { + crate::metrics::OPTIMISTIC_UPDATING.set_not_working(); tracing::warn!("Failed to connect to Redis: {:?}", err); }) .ok(); From 2a04ba3914128c8a0af01060123b249fda1383fb Mon Sep 17 00:00:00 2001 From: Ivan Frolov Date: Mon, 10 Jun 2024 13:32:34 -0400 Subject: [PATCH 6/6] docs: added info about Redis --- rpc-server/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rpc-server/README.md b/rpc-server/README.md index 02e65a28..ba2c408c 100644 --- a/rpc-server/README.md +++ b/rpc-server/README.md @@ -89,6 +89,10 @@ This feature flag enables the shadow data consistency checks. With this feature We encountered a problem with the design of the table `account_access_keys` and overall design of the logic around it. We had to disable the table and proxy the calls of the `query.access_key_list` method to the real NEAR RPC. However, we still aren't ready to get rid of the code and that's why we hid it under the feature flag. We are planning to remove the code in the future and remove the feature flag. +## Redis (Optional) + +Redis is used as an optional dependency when paired with the near_state_indexer feature. To use Redis, you need to specify the REDIS_URL in the .env file and set up a server using docker or `redis-server` command. Redis can be used to cache the state data indexed by the near_state_indexer for faster retrieval and reduced load on the database. + ## Metrics (Prometheus) The read-rpc-server exposes Prometheus-compatible metrics at the `/metrics` endpoint. @@ -113,4 +117,4 @@ For example, method `block` will have these metrics: - `BLOCK_ERROR_1` - `BLOCK_ERROR_2` - `BLOCK_ERROR_3` -- `BLOCK_ERROR_4` \ No newline at end of file +- `BLOCK_ERROR_4`