Wei-Chiu Chuang created HDDS-14983:
--------------------------------------

             Summary: [Docs] Snapshot diff lifecycle
                 Key: HDDS-14983
                 URL: https://issues.apache.org/jira/browse/HDDS-14983
             Project: Apache Ozone
          Issue Type: Improvement
          Components: documentation, Snapshot
            Reporter: Wei-Chiu Chuang


The lifecycle of a Snapshot Diff in Ozone is an asynchronous, job-based process 
designed to handle potentially millions of key changes without blocking
  the Ozone Manager.

  Based on SnapshotDiffManager.java, here is the step-by-step lifecycle:

  1. Initiation & Job Queuing (getSnapshotDiffReport)
   * Request: A user requests a diff between fromSnapshot and toSnapshot.
   * Job Key: A unique snapDiffJobKey is generated using the UUIDs of the two 
snapshots.
   * Check/Create Job:
       * If a job already exists for this pair, its current status is returned.
       * If no job exists, a new SnapshotDiffJob is created with status QUEUED 
and persisted in the snapDiffJobTable (RocksDB).
   * Submission: The job is submitted to the snapDiffExecutor (a thread pool). 
The status transitions from QUEUED to IN_PROGRESS.

  2. Preparation & Snapshots Opening (generateSnapshotDiffReport)
   * Metrics: Increments the numSnapshotDiffJobs metric.
   * Snapshot Handles: The service acquires "Active Snapshot" handles 
(rcFromSnapshot, rcToSnapshot) which are reference-counted to prevent the 
snapshots
     from being deleted while the diff is running.
   * Temporary Tables: Three temporary RocksDB Column Families (CF) are created 
specifically for this Job ID:
       1. fromSnapshotColumnFamily: Maps Object IDs to Key Names in the source.
       2. toSnapshotColumnFamily: Maps Object IDs to Key Names in the target.
       3. objectIDsColumnFamily: Tracks the union of unique Object IDs and 
whether they are directories.

  3. Delta Discovery (getDeltaFilesAndDiffKeysToObjectIdToKeyMap)
   * Efficient Diff (Native): If enabled, it uses the RocksDBCheckpointDiffer 
to identify the exact SST files that changed between the two snapshot
     checkpoints.
   * Full Diff (Fallback): If native libs are missing or a full diff is forced, 
it performs a complete scan of the key tables.
   * SST Parsing: It streams keys from the delta SST files.
   * Object Mapping: It populates the temporary "Object ID to Key Name" maps. 
This is critical for detecting Renames (same Object ID, different Key Name).

  4. Path Resolution (FSO specific)
   * FSO Layout: If the bucket is File System Optimized (FSO), keys are stored 
as ParentID/FileName.
   * Path Resolver: The FSODirectoryPathResolver is used to recursively resolve 
the ParentID into a full human-readable path (e.g.,
     vol1/bucket1/dir1/file1).


  5. Report Generation (generateDiffReport)
   * Comparison: The service iterates through the union of all Object IDs found 
in the delta.
   * Classification: It classifies changes into four types:
       * CREATE: Present in toSnapshot map but not fromSnapshot.
       * DELETE: Present in fromSnapshot map but not toSnapshot.
       * RENAME: Present in both maps with the same Object ID but different 
paths/names.
       * MODIFY: Present in both with the same path, but metadata (like ACLs or 
Block Versions) has changed.
   * Persistence: The resulting DiffReportEntry objects are serialized and 
stored in the snapDiffReportTable.

  6. Finalization
   * Status Update: On success, the job status in snapDiffJobTable is updated 
to DONE, and the totalDiffEntries count is saved.
   * Cleanup: The temporary Column Families used for Object ID mapping are 
dropped and closed. The snapshot reference counts are decremented.

  7. Consumption & Pagination (createPageResponse)
   * Polling: The client polls the OM for the report.
   * Paged Results: Since reports can be massive, the OM returns them in pages.
   * Token: Each response includes a token (the index of the next entry). The 
client provides this token in the next call to fetch the subsequent page.

  8. Garbage Collection (Background)
   * Cleanup Service: (Referenced as DiffCleanupService) After a configurable 
interval, a background task deletes the job from snapDiffJobTable and the
     associated report entries from snapDiffReportTable to reclaim space.

  Summary of Job Statuses:
   * QUEUED: Job registered, waiting for a thread.
   * IN_PROGRESS: Currently scanning SSTs or generating the report.
   * DONE: Report is ready for paging.
   * FAILED: An error occurred (e.g., I/O error); includes a reason.
   * REJECTED: Too many concurrent jobs; the client should retry later.
   * CANCELLED: The job was manually stopped via a cancel request.

 

 



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to