Fix: Prevent recovery when full resync is needed

- Modify needs_recovery() to return tuple (needs_recovery, is_full_resync)
- Skip recover_local_tracking() when full resync is needed
- This prevents creating new sync tracking record that would cause incremental sync
- Ensures full sync is actually performed when server requests it
parent af8200da
...@@ -1018,8 +1018,12 @@ class ReportsSyncResponseHandler(ResponseHandler): ...@@ -1018,8 +1018,12 @@ class ReportsSyncResponseHandler(ResponseHandler):
client_id = self._get_client_id() client_id = self._get_client_id()
server_info = self.query_server_last_sync(client_id) server_info = self.query_server_last_sync(client_id)
# Check if recovery is needed # Check if recovery is needed (returns tuple: (needs_recovery, is_full_resync))
if self.needs_recovery(server_info): recovery_info = self.needs_recovery(server_info)
needs_recovery, is_full_resync = recovery_info
if needs_recovery and not is_full_resync:
# Only recover if not a full resync scenario
logger.warning("Local tracking mismatch detected, recovering from server...") logger.warning("Local tracking mismatch detected, recovering from server...")
if server_info and self.recover_local_tracking(server_info): if server_info and self.recover_local_tracking(server_info):
logger.info("Successfully recovered local tracking from server") logger.info("Successfully recovered local tracking from server")
...@@ -1027,8 +1031,7 @@ class ReportsSyncResponseHandler(ResponseHandler): ...@@ -1027,8 +1031,7 @@ class ReportsSyncResponseHandler(ResponseHandler):
logger.error("Failed to recover local tracking, proceeding with caution") logger.error("Failed to recover local tracking, proceeding with caution")
# Check if server indicated full resync is needed # Check if server indicated full resync is needed
needs_full_resync = server_info and server_info.get('needs_full_resync', False) if is_full_resync:
if needs_full_resync:
logger.warning("Server indicated full resync is needed - performing full sync") logger.warning("Server indicated full resync is needed - performing full sync")
# Force full sync by setting start_date to datetime.min # Force full sync by setting start_date to datetime.min
date_range = 'all' date_range = 'all'
...@@ -1562,11 +1565,17 @@ class ReportsSyncResponseHandler(ResponseHandler): ...@@ -1562,11 +1565,17 @@ class ReportsSyncResponseHandler(ResponseHandler):
logger.error(f"Error recovering local tracking: {e}") logger.error(f"Error recovering local tracking: {e}")
return False return False
def needs_recovery(self, server_info: Optional[Dict[str, Any]]) -> bool: def needs_recovery(self, server_info: Optional[Dict[str, Any]]) -> tuple[bool, bool]:
"""Check if local tracking needs recovery from server""" """Check if local tracking needs recovery from server
Returns:
tuple: (needs_recovery, is_full_resync)
- needs_recovery: True if recovery is needed
- is_full_resync: True if full resync is needed (don't recover, just clear)
"""
if not server_info: if not server_info:
# No server info available, can't determine recovery need # No server info available, can't determine recovery need
return False return (False, False)
try: try:
# Check if server explicitly indicates full resync is needed # Check if server explicitly indicates full resync is needed
...@@ -1580,7 +1589,8 @@ class ReportsSyncResponseHandler(ResponseHandler): ...@@ -1580,7 +1589,8 @@ class ReportsSyncResponseHandler(ResponseHandler):
logger.warning(f"Server indicates full resync is needed (needs_full_resync={needs_full_resync}, last_sync_id={last_sync_id}) - clearing local tracking") logger.warning(f"Server indicates full resync is needed (needs_full_resync={needs_full_resync}, last_sync_id={last_sync_id}) - clearing local tracking")
# Clear local tracking to force full resync # Clear local tracking to force full resync
self._clear_local_tracking() self._clear_local_tracking()
return True # Return (True, True) - needs recovery but it's a full resync scenario
return (True, True)
session = self.db_manager.get_session() session = self.db_manager.get_session()
try: try:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment