mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-15 09:28:27 +08:00
fix(jira): prevent missed incremental updates after issue edits (#13674)
### What problem does this PR solve? Fixes [#13505](https://github.com/infiniflow/ragflow/issues/13505): Jira incremental sync could miss updated issues after initial sync, especially near time boundaries. Root cause: - Jira JQL uses minute-level precision for `updated` filters. - Incremental windows had no overlap buffer, so boundary updates could be skipped. - Sync log cursor tracking used a backward-facing update for `poll_range_start`. - Existing-doc updates in `upload_document` lacked a KB ownership guard for doc-id collisions. What changed: - Added Jira incremental overlap buffer (`time_buffer_seconds`, defaulting to `JIRA_SYNC_TIME_BUFFER_SECONDS`) when building JQL lower-bound time. - Preserved second-level post-filtering to avoid duplicate reprocessing while still catching boundary updates. - Improved Jira sync logging to include start/end window and overlap configuration. - Updated sync cursor tracking in `increase_docs` to keep `poll_range_start` moving forward with max update time. - Added KB ID safety check before updating existing document records in `upload_document`. Verification performed: - Python syntax compile checks passed for modified files. - Manual verification flow: 1. Run full Jira sync. 2. Edit an already-indexed Jira issue. 3. Run next incremental sync. 4. Confirm updated content is re-ingested into KB. ### Type of change - [x] Bug Fix (non-breaking change which fixes an issue) --------- Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -183,10 +183,11 @@ class SyncLogsService(CommonService):
|
||||
ConnectorService.update_by_id(connector_id, {"status": TaskStatus.SCHEDULE})
|
||||
|
||||
@classmethod
|
||||
def increase_docs(cls, id, min_update, max_update, doc_num, err_msg="", error_count=0):
|
||||
def increase_docs(cls, id, max_update, doc_num, err_msg="", error_count=0):
|
||||
# Keep sync monotonic.
|
||||
cls.model.update(new_docs_indexed=cls.model.new_docs_indexed + doc_num,
|
||||
total_docs_indexed=cls.model.total_docs_indexed + doc_num,
|
||||
poll_range_start=fn.COALESCE(fn.LEAST(cls.model.poll_range_start,min_update), min_update),
|
||||
poll_range_start=fn.COALESCE(fn.GREATEST(cls.model.poll_range_start, max_update), max_update),
|
||||
poll_range_end=fn.COALESCE(fn.GREATEST(cls.model.poll_range_end, max_update), max_update),
|
||||
error_msg=cls.model.error_msg + err_msg,
|
||||
error_count=cls.model.error_count + error_count,
|
||||
|
||||
@@ -444,6 +444,17 @@ class FileService(CommonService):
|
||||
e, doc = DocumentService.get_by_id(doc_id)
|
||||
if e:
|
||||
try:
|
||||
if str(doc.kb_id) != str(kb.id):
|
||||
logging.warning(
|
||||
"Existing document id collision detected for %s: belongs to kb_id=%s, incoming kb_id=%s. "
|
||||
"Skipping update to avoid cross-KB overwrite.",
|
||||
doc_id,
|
||||
doc.kb_id,
|
||||
kb.id,
|
||||
)
|
||||
user_msg = "Existing document id collision with another knowledge base; skipping update."
|
||||
err.append(file.filename + ": " + user_msg)
|
||||
continue
|
||||
blob = file.read()
|
||||
new_hash = xxhash.xxh128(blob).hexdigest()
|
||||
old_hash = doc.content_hash or ""
|
||||
|
||||
Reference in New Issue
Block a user