Shrinidhi Shridhar Talpankar created HBASE-30154:
----------------------------------------------------

             Summary: HFiles Deleted While Still Referenced by HFileLinks in 
Cloned Table
                 Key: HBASE-30154
                 URL: https://issues.apache.org/jira/browse/HBASE-30154
             Project: HBase
          Issue Type: Bug
          Components: master, regionserver
    Affects Versions: 2.6.2
            Reporter: Shrinidhi Shridhar Talpankar


There is a race condition where Hfiles referenced by cloned table can be 
permanently deleted by HFileLinkCleaner causing data loss. We've seen this 
happening on HBase 2.6.2, but looking at the latest code it seems that the race 
can still happen there.
The sequence of operations that leads to this issue:
 # Regions merged in the parent table.
 # Snapshot taken while a merged region still holds reference files, and that 
snapshot is then cloned. RestoreSnapshotHelper.restoreReferenceFile() creates 
HFileLink Reference files in the clone (e.g. 
srcTable=srcRegion-hfile.cloneRegion) but does not write back-references to the 
archive directory.
 # Parent table compacted. CatalogJanitor GCs the pre-merge regions, archiving 
their HFiles.
 # HFileLinkCleaner sees no back-references for those archived HFiles and 
deletes them.
 # Every subsequent region open/scan on the cloned table fails with 
FileNotFoundException.

 

Logs evidence supporting the above flow:
h4. 07:41:16Z — Merge 1 Initiated (RegionNormalizer)

The {{RegionNormalizerWorker}} identified regions {{e95408fd}} (4511 MB) and 
{{565ae77f}} (128 MB) as candidates for merging due to size imbalance. It 
submitted {{MergeTableRegionsProcedure}} (pid=2307105).
INFO [normalizer-worker-0] master.HMaster: merge regions 
[e95408fd3383e18df6f3a171a6bfc05d, 565ae77f2c2e16d6ee539dd95540a240] INFO 
[PEWorker-9] procedure.MasterProcedureScheduler: Took xlock for pid=2307105, 
state=RUNNABLE:MERGE_TABLE_REGIONS_PREPARE
Source regions unassigned from regionserver-11 and regionserver-13.
h4. 07:41:18Z — Merge 1 Completes → {{43bb39bf}} created
INFO [PEWorker-14] procedure2.ProcedureExecutor: Finished pid=2307105, 
state=SUCCESS; MergeTableRegionsProcedure table=aeris_v2, 
regions=[e95408fd3383e18df6f3a171a6bfc05d, 565ae77f2c2e16d6ee539dd95540a240], 
force=false in 2.0710 sec
Merged region {{43bb39bf414f2c2bb4c453a7c4ace246}} is assigned to 
regionserver-11. Its store directory contains HFileLinks pointing back to the 
source region directories.
h4. 09:41:16Z — Merge 2 Initiated (RegionNormalizer)

The normalizer identified regions {{449b39800}} (2964 MB) and {{c8bcf55f}} 
(1694 MB) and submitted {{MergeTableRegionsProcedure}} (pid=2307118).
INFO [normalizer-worker-0] master.HMaster: merge regions 
[449b39800c6efb9ce3eca36410d292c1, c8bcf55fde67e62655c51caec1a2ca96]
h4. 09:41:19Z — Merge 2 Completes → {{d5243cea}} created
INFO [PEWorker-9] procedure2.ProcedureExecutor: Finished pid=2307118, 
state=SUCCESS; MergeTableRegionsProcedure table=aeris_v2, 
regions=[449b39800c6efb9ce3eca36410d292c1, c8bcf55fde67e62655c51caec1a2ca96], 
force=false in 2.7930 sec
Merged region {{d5243cea04f0a22e4292c1d006580385}} is assigned to 
regionserver-88. Contains HFileLinks to {{449b39800}} and {{c8bcf55f}} source 
HFiles.
h4. 14:02:59Z — Major Compaction Starts on {{d5243cea}} (regionserver-88)

The merged region immediately triggers a high-priority major compaction 
(labeled as "recently split daughter region" — this is the HBase labeling for 
merged regions). The compaction includes 9 files, among which are HFileLinks to 
the source regions:
INFO [longCompactions-0] regionserver.HStore: Starting compaction of 
d5243cea.../e... 
hdfs://.../d5243cea.../e/d2d48db764e645d1ad5eb2bb1d1409c0.c8bcf55fde67e62655c51caec1a2ca96->...
 
hdfs://.../d5243cea.../e/3c9628b6aeaa4ae5944667d35ddf0fc3.c8bcf55fde67e62655c51caec1a2ca96->...
 totalSize=4.6 G
*This compaction will take 44 minutes and 53 seconds.*
h4. ~14:24Z — ⚠️ Snapshot Taken WHILE Compaction is Running

A snapshot {{aeris_v2_triforce_snapshot_1773843841734812535}} is taken of 
{{{}aeris_v2{}}}. The snapshot name encodes a Unix timestamp of approximately 
{{1773843841}} seconds, corresponding to ~14:24 UTC March 18, 2026.

At this moment: - {{d5243cea}} still contains HFileLinks to 
{{{}449b39800{}}}/{{{}c8bcf55f{}}} (compaction has NOT finished) - {{43bb39bf}} 
still contains HFileLinks to {{{}e95408fd{}}}/{{{}565ae77f{}}}

The snapshot manifest captures this state — the merged regions' HFileLinks to 
the source regions are part of the snapshot.
h4. 14:24:15Z - 14:28:05Z — Clone Created: 
{{aeris_v2_triforce_archive_1773843841734812535}}

{{CloneSnapshotProcedure}} runs, invoking {{RestoreSnapshotHelper}} which 
creates HFileLinks in the new archive table pointing directly to the source 
region directories (the ones being cleaned up after merge). Key HFileLinks 
added:
INFO [RestoreSnapshot-pool-5] snapshot.RestoreSnapshotHelper: Adding HFileLink 
37211e9b8f2744f3a7e2707594b39fbb.565ae77f2c2e16d6ee539dd95540a240 from cloned 
region in snapshot aeris_v2_triforce_snapshot_1773843841734812535 to 
table=aeris_v2_triforce_archive_1773843841734812535 INFO 
[RestoreSnapshot-pool-7] snapshot.RestoreSnapshotHelper: Adding HFileLink 
09aa8849c2d64984942a80b026e4a19e.449b39800c6efb9ce3eca36410d292c1 from cloned 
region in snapshot aeris_v2_triforce_snapshot_1773843841734812535 to 
table=aeris_v2_triforce_archive_1773843841734812535
Clone procedure completes at 14:28:05Z:
INFO [PEWorker-16] procedure.CloneSnapshotProcedure: Clone 
snapshot=aeris_v2_triforce_snapshot_1773843841734812535 on 
table=aeris_v2_triforce_archive_1773843841734812535 completed!
h4. 14:47:52Z — ⚠️ Compaction of {{d5243cea}} Completes

After 44 minutes and 53 seconds, the major compaction finishes:
INFO [longCompactions-0] regionserver.CompactSplit: Completed compaction 
region=aeris_v2,...d5243cea04f0a22e4292c1d006580385., 
storeName=d5243cea04f0a22e4292c1d006580385/e, duration=44mins, 53sec INFO 
[longCompactions-0] regionserver.HStore: Completed compaction of 9 (all) 
file(s) in d5243cea04f0a22e4292c1d006580385/e into 
9e904c6e8b2247cf9c0463aecc1d67b1 (size=4.4 G)
The HFileLinks to {{449b39800}} and {{c8bcf55f}} are *removed* from 
{{{}d5243cea{}}}'s store directory. These source region files are no longer 
referenced by any live region in {{{}aeris_v2{}}}. This is the gate condition 
for {{GCMultipleMergedRegionsProcedure}} to proceed.
h4. 14:51:50Z — 💥 GCMultipleMergedRegionsProcedure Deletes Source Regions 
(Group 2)

{{GCMultipleMergedRegionsProcedure}} (pid=2326702) runs immediately (only 93ms 
total execution):
INFO [PEWorker-11] procedure.MasterProcedureScheduler: Took xlock for 
pid=2326702, state=RUNNABLE:GC_MERGED_REGIONS_PREPARE; 
GCMultipleMergedRegionsProcedure child=d5243cea04f0a22e4292c1d006580385, 
parents:[449b39800c6efb9ce3eca36410d292c1], [c8bcf55fde67e62655c51caec1a2ca96] 
INFO [PEWorker-4] hbase.MetaTableAccessor: Deleted 
aeris_v2,...449b39800c6efb9ce3eca36410d292c1. INFO [PEWorker-11] 
hbase.MetaTableAccessor: Deleted aeris_v2,...c8bcf55fde67e62655c51caec1a2ca96. 
INFO [PEWorker-10] procedure2.ProcedureExecutor: Finished pid=2326702, 
state=SUCCESS; GCMultipleMergedRegionsProcedure 
child=d5243cea04f0a22e4292c1d006580385, 
parents:[449b39800c6efb9ce3eca36410d292c1], [c8bcf55fde67e62655c51caec1a2ca96] 
in 93 msec
The HDFS directories for {{449b39800c6efb9ce3eca36410d292c1}} and 
{{c8bcf55fde67e62655c51caec1a2ca96}} — including both {{/hbase/data/}} and 
{{/hbase/archive/}} paths — are deleted. The HFileLinks in 
{{aeris_v2_triforce_archive}} now point to non-existent paths.
h4. 15:27:37Z — Compaction Triggered on {{43bb39bf}}

A flush on {{43bb39bf}} completes, requesting compaction:
INFO [MemStoreFlusher.1] regionserver.HRegion: Finished flush of 
43bb39bf414f2c2bb4c453a7c4ace246 in 73ms, compaction requested=true
h4. 17:15:36Z — First FileNotFoundException (Group 2: {{{}449b39800{}}})

{{aeris_v2_triforce_archive}} attempts to read through HFileLinks, fails:
java.io.FileNotFoundException: HFileLink locations=[ 
hdfs://aeris/hbase/data/default/aeris_v2/449b39800c6efb9ce3eca36410d292c1/e/09aa8849c2d64984942a80b026e4a19e,
 
hdfs://aeris/hbase/archive/data/default/aeris_v2/449b39800c6efb9ce3eca36410d292c1/e/09aa8849c2d64984942a80b026e4a19e,
 
hdfs://aeris/hbase/.tmp/data/default/aeris_v2/449b39800c6efb9ce3eca36410d292c1/e/09aa8849c2d64984942a80b026e4a19e,
 
hdfs://aeris/hbase/mobdir/data/default/aeris_v2/449b39800c6efb9ce3eca36410d292c1/e/09aa8849c2d64984942a80b026e4a19e]
All 4 candidate locations checked by {{HFileLink.open()}} are missing.
h4. 18:06:05Z — Compaction of {{43bb39bf}} Completes (regionserver-11)
INFO [longCompactions-0] regionserver.CompactSplit: Completed compaction 
region=aeris_v2,...43bb39bf414f2c2bb4c453a7c4ace246., storeName=e, fileCount=6, 
fileSize=4.5 G, duration=1mins, 35sec
HFileLinks to {{e95408fd}} and {{565ae77f}} are removed from {{{}43bb39bf{}}}. 
GC gate condition met for Group 1.
h4. 18:11:52Z — 💥 GCMultipleMergedRegionsProcedure Deletes Source Regions 
(Group 1)
INFO [PEWorker-13] hbase.MetaTableAccessor: Deleted 
aeris_v2,...565ae77f2c2e16d6ee539dd95540a240. INFO [PEWorker-7] 
hbase.MetaTableAccessor: Deleted aeris_v2,...e95408fd3383e18df6f3a171a6bfc05d. 
INFO [PEWorker-12] procedure2.ProcedureExecutor: Finished pid=2357877, 
state=SUCCESS; GCMultipleMergedRegionsProcedure 
child=43bb39bf414f2c2bb4c453a7c4ace246, 
parents:[e95408fd3383e18df6f3a171a6bfc05d], [565ae77f2c2e16d6ee539dd95540a240] 
in 73 msec
HDFS directories for {{e95408fd3383e18df6f3a171a6bfc05d}} and 
{{565ae77f2c2e16d6ee539dd95540a240}} are deleted.
h4. 21:16:49Z — First FileNotFoundException (Group 1: {{{}565ae77f{}}})
java.io.FileNotFoundException: HFileLink locations=[ 
hdfs://aeris/hbase/data/default/aeris_v2/565ae77f2c2e16d6ee539dd95540a240/e/37211e9b8f2744f3a7e2707594b39fbb,
 ...]
 

 



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

Reply via email to