dynamic HH page size patch by jbellis; reviewed by brandonwilliams for CASSANDRA-3624
Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/190fb8c8 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/190fb8c8 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/190fb8c8 Branch: refs/heads/trunk Commit: 190fb8c8eaf8127228118ab5559e21c4d694f21e Parents: 1a3a526 Author: Jonathan Ellis <[email protected]> Authored: Wed Dec 28 20:58:22 2011 -0600 Committer: Jonathan Ellis <[email protected]> Committed: Wed Jan 4 10:05:34 2012 -0600 ---------------------------------------------------------------------- CHANGES.txt | 1 + .../apache/cassandra/db/HintedHandOffManager.java | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/190fb8c8/CHANGES.txt ---------------------------------------------------------------------- diff --git a/CHANGES.txt b/CHANGES.txt index 287fed8..7bb9f6d 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,4 +1,5 @@ 1.0.7 + * fix regression in HH page size calculation (CASSANDRA-3624) * retry failed stream on IOException (CASSANDRA-3686) * allow configuring bloom_filter_fp_chance (CASSANDRA-3497) * attempt hint delivery every ten minutes, or when failure detector http://git-wip-us.apache.org/repos/asf/cassandra/blob/190fb8c8/src/java/org/apache/cassandra/db/HintedHandOffManager.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/HintedHandOffManager.java b/src/java/org/apache/cassandra/db/HintedHandOffManager.java index a028bdf..6661ee3 100644 --- a/src/java/org/apache/cassandra/db/HintedHandOffManager.java +++ b/src/java/org/apache/cassandra/db/HintedHandOffManager.java @@ -87,7 +87,7 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean public static final String HINTS_CF = "HintsColumnFamily"; private static final Logger logger_ = LoggerFactory.getLogger(HintedHandOffManager.class); - private static final int PAGE_SIZE = 1024; + private static final int PAGE_SIZE = 128; private static final int LARGE_NUMBER = 65536; // 64k nodes ought to be enough for anybody. // in 0.8, subcolumns were KS-CF bytestrings, and the data was stored in the "normal" storage there. @@ -270,10 +270,20 @@ public class HintedHandOffManager implements HintedHandOffManagerMBean int rowsReplayed = 0; ByteBuffer startColumn = ByteBufferUtil.EMPTY_BYTE_BUFFER; + int pageSize = PAGE_SIZE; + // read less columns (mutations) per page if they are very large + if (hintStore.getMeanColumns() > 0) + { + int averageColumnSize = (int) (hintStore.getMeanRowSize() / hintStore.getMeanColumns()); + pageSize = Math.min(PAGE_SIZE, DatabaseDescriptor.getInMemoryCompactionLimit() / averageColumnSize); + pageSize = Math.max(2, pageSize); // page size of 1 does not allow actual paging b/c of >= behavior on startColumn + logger_.debug("average hinted-row column size is {}; using pageSize of {}", averageColumnSize, pageSize); + } + delivery: while (true) { - QueryFilter filter = QueryFilter.getSliceFilter(epkey, new QueryPath(HINTS_CF), startColumn, ByteBufferUtil.EMPTY_BYTE_BUFFER, false, PAGE_SIZE); + QueryFilter filter = QueryFilter.getSliceFilter(epkey, new QueryPath(HINTS_CF), startColumn, ByteBufferUtil.EMPTY_BYTE_BUFFER, false, pageSize); ColumnFamily hintsPage = ColumnFamilyStore.removeDeleted(hintStore.getColumnFamily(filter), Integer.MAX_VALUE); if (pagingFinished(hintsPage, startColumn)) break;
