docs/ref/modules/utils/sync-protocol/sequence-diagrams.md
This document provides visual representations of the interactions between modules and the Agent Sync Protocol during various synchronization scenarios.
sequenceDiagram
participant Module as Internal Module
(FIM/SCA/Inventory)
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
(SQLite)
participant MQ as Message Queue
Module->>ASP: Create instance
(module_name, db_path, mq_funcs)
ASP->>Queue: Initialize database
Queue-->>ASP: Database ready
ASP->>MQ: Setup connection functions
ASP-->>Module: Instance created
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
Note over Module: Detect change
(file modified, check completed, etc.)
Module->>ASP: persistDifference(id, operation, index, data)
ASP->>ASP: Validate parameters
ASP->>Queue: Store in SQLite
Queue-->>ASP: Success
ASP-->>Module: Return
Note over Queue: Data persisted
Ready for sync
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeModule(DELTA, timeout, retries, maxEps)
ASP->>Queue: Get pending differences
Queue-->>ASP: Return data array
Note over ASP,Manager: Session Establishment Phase
ASP->>ASP: Build Start message
ASP->>MQ: Send Start message
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>Manager: Create session
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
ASP->>ASP: Store session_id
Note over ASP,Manager: Data Transfer Phase
loop For each difference
ASP->>ASP: Apply EPS throttling
ASP->>ASP: Build Data message
ASP->>MQ: Send Data[seq_num]
MQ->>AD: Forward Data
AD->>Manager: Forward Data
Manager->>Manager: Process & store
end
Note over ASP,Manager: Session Completion Phase
ASP->>ASP: Build End message
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Manager->>Manager: Validate received data
Manager->>AD: Send EndAck(success)
AD->>ASP: Forward EndAck
ASP->>Queue: Delete data
Queue-->>ASP: Success
ASP-->>Module: Return true (success)
When the manager receives End and immediately enqueues the session for indexing, it responds with EndAck(Processing) as an intermediate acknowledgment. The agent continues waiting without resending End and without consuming a retry attempt.
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeModule(DELTA, timeout, retries, maxEps)
ASP->>Queue: Get pending differences
Queue-->>ASP: Return data array
Note over ASP,Manager: Session Establishment Phase
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
Note over ASP,Manager: Data Transfer Phase
loop For each difference
ASP->>MQ: Send Data[seq_num]
MQ->>AD: Forward Data
AD->>Manager: Forward Data
Manager->>Manager: Process & store
end
Note over ASP,Manager: Session Completion Phase
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Note over Manager: All sequences received.
Enqueue session for indexing.
Send Processing ack immediately.
Manager->>AD: Send EndAck(Processing)
AD->>ASP: Forward EndAck(Processing)
Note over ASP: processingAckReceived = true
Reset wait timer.
Do NOT resend End.
Do NOT increment retry counter.
Note over Manager: Indexing complete.
Manager->>AD: Send EndAck(Ok)
AD->>ASP: Forward EndAck(Ok)
ASP->>Queue: Delete synced data
Queue-->>ASP: Success
ASP-->>Module: Return true (success)
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeModule(DELTA, timeout, retries, maxEps)
ASP->>Queue: Get pending differences
Queue-->>ASP: Return data array[1..100]
Note over ASP,Manager: Session Establishment
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>AD: Send StartAck(session_id=123)
AD->>ASP: Forward StartAck
Note over ASP,Manager: Data Transfer with Loss
ASP->>MQ: Send Data[1..30]
MQ->>AD: Forward Data[1..30]
AD->>Manager: Forward Data[1..30]
Note over MQ,Manager: Network issue:
Data[31..35] lost
ASP->>MQ: Send Data[31..35]
MQ->>AD: Send Data[31..35]
AD--xManager: Lost in transit
ASP->>MQ: Send Data[36..100]
MQ->>AD: Send Data[36..100]
AD->>Manager: Forward Data[36..100]
Note over ASP,Manager: Session Completion Phase
ASP->>MQ: Send End
MQ->>AD: Forward End
AD->>Manager: Forward End
Note over Manager: Detect missing
sequences 31-35
Manager->>AD: Send ReqRet(ranges=[[31,35]])
AD->>ASP: Forward ReqRet
Note over ASP,Manager: Retransmission
ASP->>ASP: Filter data by ranges
ASP->>MQ: Resend Data[31..35]
MQ->>AD: Forward Data[31..35]
AD->>Manager: Forward Data[31..35]
Manager->>Manager: Fill gaps
Manager->>AD: Send EndAck(success)
AD->>ASP: Forward EndAck
ASP-->>Module: Return true
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeModule(FULL, timeout=30s, retries=3, maxEps=1000)
Note over ASP,Manager: Attempt 1
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Note over ASP: Wait 30s
ASP->>ASP: Timeout waiting for StartAck
Note over ASP,Manager: Attempt 2
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Note over Manager: Manager busy/overloaded
Note over ASP: Wait 30s
ASP->>ASP: Timeout waiting for StartAck
Note over ASP,Manager: Attempt 3
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>AD: Send StartAck(session_id=456)
AD->>ASP: Forward StartAck
Note over ASP,Manager: Continue with sync...
ASP->>MQ: Send Data messages
MQ->>AD: Forward Data
AD->>Manager: Forward Data
ASP->>MQ: Send End
MQ->>AD: Forward End
AD->>Manager: Forward End
Manager->>AD: Send EndAck
AD->>ASP: Forward EndAck
ASP-->>Module: Return true (success after retries)
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeModule()
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Note over Manager: Detect invalid
protocol version
Manager->>AD: Send Error(INVALID_VERSION)
AD->>ASP: Forward Error
ASP->>ASP: Set syncFailed flag
ASP->>ASP: Clear sync state
ASP-->>Module: Return false (sync failed)
Note over Module: Handle failure
(log, retry later, etc.)
sequenceDiagram
participant Thread1 as Sync Thread
participant Thread2 as Response Thread
participant ASP as Agent Sync Protocol
participant State as Sync State
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Thread1->>ASP: synchronizeModule()
ASP->>State: Set phase = WaitingStartAck
ASP->>MQ: Send Start
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Thread1->>State: Wait on condition variable
Note over Thread2: agend Receive Loop
Manager->>AD: Send StartAck
AD->>Thread2: Receive StartAck
Thread2->>ASP: parseResponseBuffer(data)
ASP->>State: Validate session & phase
ASP->>State: Set startAckReceived = true
ASP->>State: Notify condition variable
State->>Thread1: Wake up
Thread1->>State: Check startAckReceived
Thread1->>ASP: Continue with data send
ASP->>MQ: Send Data
MQ->>AD: Forward Data
AD->>Manager: Forward Data
ASP->>State: Set phase = WaitingEndAck
Thread1->>State: Wait on condition variable
Note over Thread2: agend Receive Loop
Manager->>AD: Send EndtAck
AD->>Thread2: Receive EndtAck
Thread2->>ASP: parseResponseBuffer(data)
ASP->>State: Validate session & phase
ASP->>State: Set endAckReceived = true
ASP->>State: Notify condition variable
State->>Thread1: Wake up
Thread1->>State: Check endAckReceived
Thread1->>ASP: Delete sent data
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>Module: Calculate checksum for index
Module->>ASP: requiresFullSync(index, checksum, timeout, retries, maxEps)
Note over ASP,Manager: Session Establishment
ASP->>MQ: Send Start(mode=CHECK)
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
Note over ASP,Manager: Send Checksum Only
ASP->>MQ: Send ChecksumModule
MQ->>AD: Forward ChecksumModule
AD->>Manager: Forward ChecksumModule
Note over Manager: Compare checksums
Note over ASP,Manager: Session Completion
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Manager->>Manager: Determine if mismatch
alt Checksum Mismatch
Manager->>AD: Send EndAck(status=Error)
AD->>ASP: Forward EndAck
ASP-->>Module: Return true (full sync needed)
Module->>Module: Schedule full synchronization
else Checksum Match
Manager->>AD: Send EndAck(status=Ok)
AD->>ASP: Forward EndAck
ASP-->>Module: Return false (integrity valid)
Module->>Module: Continue with delta sync
end
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Memory as In-Memory Vector
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Note over Module: Module recovery initiated
loop For each recovery item
Module->>ASP: persistDifferenceInMemory(id, operation, index, data)
ASP->>Memory: Store in memory vector
Memory-->>ASP: Success
end
Note over Module: All recovery data in memory
Module->>ASP: synchronizeModule(FULL, timeout, retries, maxEps)
Note over ASP,Manager: Session Establishment
ASP->>MQ: Send Start(mode=FULL, size=N)
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
Note over ASP,Manager: Data Transfer from Memory
loop For each in-memory item
ASP->>Memory: Get next item
Memory-->>ASP: Return data
ASP->>ASP: Build Data message
ASP->>MQ: Send Data
MQ->>AD: Forward Data
AD->>Manager: Forward Data
end
Note over ASP,Manager: Session Completion
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Manager->>AD: Send EndAck(success)
AD->>ASP: Forward EndAck
ASP-->>Module: Return true (success)
Module->>ASP: clearInMemoryData()
ASP->>Memory: Clear all entries
Memory-->>ASP: Cleared
Note over Module: Recovery complete
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Module->>ASP: synchronizeMetadataOrGroups(METADATA_DELTA, timeout, retries, maxEps, globalVersion)
Note over ASP,Manager: Session Establishment
ASP->>ASP: Validate mode (METADATA/GROUP)
ASP->>MQ: Send Start(mode=METADATA_DELTA)
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>Manager: Prepare to receive metadata
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
Note over ASP,Manager: No Data Messages Sent
Note over ASP,Manager: Immediate Session Completion
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Note over Manager: Process metadata
based on mode
Manager->>AD: Send EndAck(success)
AD->>ASP: Forward EndAck
ASP-->>Module: Return true (success)
Note over Module: Metadata synchronized
without data transfer
sequenceDiagram
participant Module as Internal Module
participant ASP as Agent Sync Protocol
participant Queue as Persistent Queue
participant MQ as Message Queue
participant AD as Wazuh agentd
participant Manager as Wazuh Manager
Note over Module: Module disabled or
specific indices removed
Module->>ASP: notifyDataClean(indices, timeout, retries, maxEps)
ASP->>ASP: Validate indices (non-empty)
Note over ASP: Create PersistedData
for each index
Note over ASP,Manager: Session Establishment
ASP->>MQ: Send Start(mode=DELTA, size=N, indices)
MQ->>AD: Forward Start
AD->>Manager: Forward Start
Manager->>Manager: Create session
Manager->>AD: Send StartAck(session_id)
AD->>ASP: Forward StartAck
ASP->>ASP: Store session_id
Note over ASP,Manager: DataClean Messages Transfer
loop For each index
ASP->>ASP: Build DataClean message
ASP->>MQ: Send DataClean[seq, session, index]
MQ->>AD: Forward DataClean
AD->>Manager: Forward DataClean
Manager->>Manager: Mark index for cleanup
end
Note over ASP,Manager: Session Completion
ASP->>MQ: Send End(session_id)
MQ->>AD: Forward End
AD->>Manager: Forward End
Manager->>Manager: Clean marked indices
Manager->>AD: Send EndAck(success)
AD->>ASP: Forward EndAck
Note over ASP: Success confirmed
ASP->>Queue: clearItemsByIndex(index) for each
Queue-->>ASP: Local data cleared
ASP-->>Module: Return true (success)
Note over Module: Data clean notification
completed successfully