This commit is contained in:
Kevin Carter 2025-11-19 20:13:35 +00:00
parent a07626e422
commit b975b98cc7

View File

@ -1,5 +1,6 @@
import json import json
import os import os
import time
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Dict, Optional, Tuple, List from typing import Dict, Optional, Tuple, List
@ -157,6 +158,31 @@ class ProvisioningService:
self.neo4j_service.create_database(school_db) self.neo4j_service.create_database(school_db)
self.neo4j_service.create_database(curriculum_db) self.neo4j_service.create_database(curriculum_db)
# Wait for databases to be fully available (Neo4j needs time to make new databases accessible)
logger.info(f"Waiting for databases to be fully available...")
time.sleep(2) # Initial wait
# Verify databases exist with retries
max_retries = 5
retry_delay = 1
for attempt in range(max_retries):
try:
# Check if school_db exists
check_result = self.neo4j_service.check_database_exists(school_db)
if check_result.get("exists", False):
logger.info(f"Database {school_db} is available")
break
else:
if attempt < max_retries - 1:
logger.info(f"Database {school_db} not yet available, retrying in {retry_delay}s... (attempt {attempt + 1}/{max_retries})")
time.sleep(retry_delay)
else:
logger.warning(f"Database {school_db} may not be fully available, proceeding anyway...")
except Exception as e:
logger.warning(f"Error checking database existence: {e}, proceeding anyway...")
if attempt < max_retries - 1:
time.sleep(retry_delay)
metadata = institute.get("metadata") or {} metadata = institute.get("metadata") or {}
if isinstance(metadata, str): if isinstance(metadata, str):
try: try:
@ -173,12 +199,30 @@ class ProvisioningService:
website=institute.get("website", "https://example.com"), website=institute.get("website", "https://example.com"),
) )
neon.init_neontology_connection() # Retry node creation with exponential backoff
try: max_node_retries = 3
create_or_merge_neontology_node(school_node, database=_CC_SCHOOLS_DB, operation='merge') for attempt in range(max_node_retries):
create_or_merge_neontology_node(school_node, database=school_db, operation='merge') try:
finally: neon.init_neontology_connection()
neon.close_neontology_connection() try:
create_or_merge_neontology_node(school_node, database=_CC_SCHOOLS_DB, operation='merge')
create_or_merge_neontology_node(school_node, database=school_db, operation='merge')
logger.info(f"Successfully created school nodes in databases")
break # Success, exit retry loop
finally:
neon.close_neontology_connection()
except Exception as e:
if "Database" in str(e) and "not found" in str(e):
if attempt < max_node_retries - 1:
wait_time = (attempt + 1) * 2 # Exponential backoff: 2s, 4s, 6s
logger.warning(f"Database not yet available, waiting {wait_time}s before retry (attempt {attempt + 1}/{max_node_retries}): {e}")
time.sleep(wait_time)
else:
logger.error(f"Failed to create school nodes after {max_node_retries} attempts: {e}")
raise
else:
# Different error, don't retry
raise
# Try to persist database references back to Supabase (best effort) # Try to persist database references back to Supabase (best effort)
updates = { updates = {