From f942f49a33268d52996f2b5829f54c4fa9b84f13 Mon Sep 17 00:00:00 2001 From: Devanshu Rajesh Chicholikar Date: Fri, 6 Mar 2026 16:31:24 -0500 Subject: [PATCH] HOTFIX: app starts even if Pinecone is unreachable Root cause of production 502: OptimizedCodeIndexer.__init__() calls Pinecone API at import time (via dependencies.py singleton). When Pinecone connection is refused, entire app crashes before serving any requests. Railway health check never passes -> 502 on all endpoints. Fix: wrap Pinecone init in try/except. If connection fails: - self.index = None - App starts normally, health check passes - Dashboard (repos, usage, settings) works fine - Search/indexing return errors until Pinecone reconnects - Logged as error for monitoring This is the same pattern as our tree-sitter graceful fallback. --- backend/services/indexer_optimized.py | 45 +++++++++++++-------------- 1 file changed, 22 insertions(+), 23 deletions(-) diff --git a/backend/services/indexer_optimized.py b/backend/services/indexer_optimized.py index 60f9486..cd5af65 100644 --- a/backend/services/indexer_optimized.py +++ b/backend/services/indexer_optimized.py @@ -58,30 +58,29 @@ def __init__(self): # Initialize search enhancer self.search_enhancer = SearchEnhancer(self.openai_client) - # Initialize Pinecone - pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY")) - - index_name = os.getenv("PINECONE_INDEX_NAME", "codeintel") - - # Check if index exists and has correct dimensions - existing_indexes = pc.list_indexes().names() - if index_name in existing_indexes: - # Use existing index (dimension already set) - index_info = pc.describe_index(index_name) - logger.info("Using existing Pinecone index", index=index_name, dimension=index_info.dimension) - else: - logger.info("Creating Pinecone index", index=index_name, dimension=EMBEDDING_DIMENSIONS) - pc.create_index( - name=index_name, - dimension=EMBEDDING_DIMENSIONS, - metric="cosine", - spec=ServerlessSpec( - cloud="aws", - region="us-east-1" + # Initialize Pinecone (lazy-safe: app starts even if Pinecone is unreachable) + self.index = None + self._pinecone_index_name = os.getenv("PINECONE_INDEX_NAME", "codeintel") + try: + pc = Pinecone(api_key=os.getenv("PINECONE_API_KEY")) + existing_indexes = pc.list_indexes().names() + if self._pinecone_index_name in existing_indexes: + index_info = pc.describe_index(self._pinecone_index_name) + logger.info("Using existing Pinecone index", index=self._pinecone_index_name, dimension=index_info.dimension) + else: + logger.info("Creating Pinecone index", index=self._pinecone_index_name, dimension=EMBEDDING_DIMENSIONS) + pc.create_index( + name=self._pinecone_index_name, + dimension=EMBEDDING_DIMENSIONS, + metric="cosine", + spec=ServerlessSpec( + cloud="aws", + region="us-east-1" + ) ) - ) - - self.index = pc.Index(index_name) + self.index = pc.Index(self._pinecone_index_name) + except Exception as e: + logger.error("Pinecone initialization failed -- search/indexing unavailable until reconnect", error=str(e)) # Initialize tree-sitter parsers self.parsers = {