Hello Kudu Jenkins,

I'd like you to reexamine a change. Please visit

    http://gerrit.cloudera.org:8080/24452

to look at the new patch set (#2).

Change subject: KUDU-3783 Extend clean-superblock guarantee into 
LoadFromSuperBlock
......................................................................

KUDU-3783 Extend clean-superblock guarantee into LoadFromSuperBlock

Patches under KUDU-1060 only guarantee a clean superblock if cleanup
happens through DeleteTabletData, ignoring crash-recovery path:
1. A crash occurs after a superblock was written with orphaned block
   entries, but before cleanup Flush() that re-syncs a superblock with
   empty list of orphaned block entries.
2. On the next startup LoadFromSuperBlock() calls DeleteOrphanedBlocks()
   that deletes the orphaned blocks from disk as well as in-memory list.
   But it doesn't sync a clean superblock afterwards.
3. For a tombstoned tablet that doesn't receive any writes(i.e., flush),
   on-disk superblock always has those stale orphaned block entries.
   Every subsequent restart would trigger parsing of those block entries
   and repeated call to DeleteOrphanedBlocks() that is a per-restart
   cost proportional to:
   No. of tombstoned tablets x No. of orphaned blocks per tablet

The patch adds a fix by calling Flush() after DeleteOrphanedBlocks,
during load-time to persist a clean superblock (gated by
--enable_orphaned_block_cleanup_on_load). This converts the recurring
per-restart reprocessing into a one-time cost on the first restart,
which is precisely what the newly added unit test i.e.,
BenchmarkCleanStartupAfterOrphanCleanup demonstrates.

Some benchmarking stats:
=== KUDU-3783 Startup Overhead Benchmark ===
  Tablets                    : 1000
  Orphaned blocks / tablet   : 1000000
  With cleanup + Flush()     : 613387 ms
  Without cleanup + Flush()  : 253331 ms
  Extra overhead (Flush x N) : 360056 ms
  Avg overhead per tablet    : 360 ms

=== KUDU-3783 One-Time-Cost Benchmark ===
  Tablets                                    : 1000
  Orphaned blocks / tablet                   : 1000000
  Pass 1 - 1st restart (fix ON, dirty)       : 629216 ms  [cleanup+Flush for 
all tablets]
  Pass 2 - 2nd restart (fix ON, clean)       : 114 ms  [superblocks already 
clean]
  Pass 3 - clean baseline (fix OFF, clean)   : 112 ms  [no orphaned blocks to 
parse]
  Pass 4 - legacy baseline (fix OFF, dirty)  : 262499 ms  [parses orphan IDs, 
no Flush]
  Pass1 overhead vs Pass4 legacy             : 366717 ms
  Pass2 vs Pass3 clean baseline              : 2 ms  (should be ~0)

Change-Id: I729395085fb845daa667b1374dc1ac4291a0c30b
---
M src/kudu/tablet/tablet_metadata-test.cc
M src/kudu/tablet/tablet_metadata.cc
M src/kudu/tablet/tablet_metadata.h
3 files changed, 503 insertions(+), 1 deletion(-)


  git pull ssh://gerrit.cloudera.org:29418/kudu refs/changes/52/24452/2
--
To view, visit http://gerrit.cloudera.org:8080/24452
To unsubscribe, visit http://gerrit.cloudera.org:8080/settings

Gerrit-Project: kudu
Gerrit-Branch: master
Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I729395085fb845daa667b1374dc1ac4291a0c30b
Gerrit-Change-Number: 24452
Gerrit-PatchSet: 2
Gerrit-Owner: Ashwani Raina <[email protected]>
Gerrit-Reviewer: Kudu Jenkins (120)

Reply via email to