From f4e2e274e09161b4b3d4407044c59d9940f92003 Mon Sep 17 00:00:00 2001 From: martinsumner Date: Wed, 14 Dec 2016 10:27:11 +0000 Subject: [PATCH 1/4] Reintroduce riak metadata extraction The full riak metadata had been stripped from the Ledger update for performance reasons. However, the full metadata is required in order to save a GET before a PUT. Therefore we want to do isolated testing on this change to establish the relative cost value in that cost saving. --- src/leveled_codec.erl | 54 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 45 insertions(+), 9 deletions(-) diff --git a/src/leveled_codec.erl b/src/leveled_codec.erl index f08e2e9..132506c 100644 --- a/src/leveled_codec.erl +++ b/src/leveled_codec.erl @@ -363,8 +363,8 @@ build_metadata_object(PrimaryKey, MD) -> {Tag, _Bucket, _Key, null} = PrimaryKey, case Tag of ?RIAK_TAG -> - {SibCount, Vclock, _Hash, _Size} = MD, - riak_metadata_to_binary(Vclock, SibCount); + {SibData, Vclock, _Hash, _Size} = MD, + riak_metadata_to_binary(Vclock, SibData); ?STD_TAG -> MD end. @@ -373,24 +373,60 @@ build_metadata_object(PrimaryKey, MD) -> riak_extract_metadata(delete, Size) -> {delete, null, null, Size}; riak_extract_metadata(ObjBin, Size) -> - {Vclock, SibCount} = riak_metadata_from_binary(ObjBin), - {SibCount, Vclock, erlang:phash2(ObjBin), Size}. + {Vclock, SibData} = riak_metadata_from_binary(ObjBin), + {SibData, Vclock, erlang:phash2(ObjBin), Size}. %% <>. -riak_metadata_to_binary(Vclock, SibCount) -> +riak_metadata_to_binary(Vclock, SibData) -> VclockBin = term_to_binary(Vclock), VclockLen = byte_size(VclockBin), + % <>. + SibCount = length(SibData), + SibsBin = slimbin_contents(SibData), <>. + VclockBin:VclockLen/binary, SibCount:32/integer, SibsBin/binary>>. riak_metadata_from_binary(V1Binary) -> <> = V1Binary, - <> = Rest, - {binary_to_term(VclockBin), SibCount}. - + % Just grab the Sibling count and not the full metadata + % <> = Rest, + % {binary_to_term(VclockBin), SibCount}. + <> = Rest, + SibMetaBinList = + case SibCount of + 0 -> + []; + SC when is_integer(SC) -> + get_metadata_from_siblings(SibsBin, SibCount, []) + end, + {binary_to_term(VclockBin), SibMetaBinList}. + +% Fixes the value length for each sibling to be zero, and so includes no value +slimbin_content(MetaBin) -> + MetaLen = byte_size(MetaBin), + <<0:32/integer, MetaLen:32/integer, MetaBin:MetaLen/binary>>. + +slimbin_contents(SibMetaBinList) -> + F = fun(MetaBin, Acc) -> + <> + end, + lists:foldl(F, <<>>, SibMetaBinList). + +get_metadata_from_siblings(<<>>, 0, SibMetaBinList) -> + SibMetaBinList; +get_metadata_from_siblings(<>, + SibCount, + SibMetaBinList) -> + <<_ValBin:ValLen/binary, MetaLen:32/integer, Rest1/binary>> = Rest0, + <> = Rest1, + get_metadata_from_siblings(Rest2, + SibCount - 1, + [MetaBin|SibMetaBinList]). + From fe907eb4795402187d43e5fd973fd699675e1fa1 Mon Sep 17 00:00:00 2001 From: martinsumner Date: Wed, 14 Dec 2016 11:38:42 +0000 Subject: [PATCH 2/4] Experiment Perhaps the results ar epaging related - change settings to hold less in memory and see --- src/leveled_penciller.erl | 4 ++-- src/leveled_sft.erl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/leveled_penciller.erl b/src/leveled_penciller.erl index d5b70d1..9be27ec 100644 --- a/src/leveled_penciller.erl +++ b/src/leveled_penciller.erl @@ -197,8 +197,8 @@ -define(CURRENT_FILEX, "crr"). -define(PENDING_FILEX, "pnd"). -define(MEMTABLE, mem). --define(MAX_TABLESIZE, 28000). % This is less than max - but COIN_SIDECOUNT --define(SUPER_MAX_TABLE_SIZE, 40000). +-define(MAX_TABLESIZE, 16000). % This is less than max - but COIN_SIDECOUNT +-define(SUPER_MAX_TABLE_SIZE, 22000). -define(PROMPT_WAIT_ONL0, 5). -define(WORKQUEUE_BACKLOG_TOLERANCE, 4). -define(COIN_SIDECOUNT, 5). diff --git a/src/leveled_sft.erl b/src/leveled_sft.erl index 5b4f24e..77f13bc 100644 --- a/src/leveled_sft.erl +++ b/src/leveled_sft.erl @@ -178,7 +178,7 @@ -define(DWORD_SIZE, 8). -define(CURRENT_VERSION, {0,1}). -define(SLOT_COUNT, 256). --define(SLOT_GROUPWRITE_COUNT, 64). +-define(SLOT_GROUPWRITE_COUNT, 16). -define(BLOCK_SIZE, 32). -define(BLOCK_COUNT, 4). -define(FOOTERPOS_HEADERPOS, 2). @@ -188,7 +188,7 @@ -define(COMPRESSION_LEVEL, 1). -define(HEADER_LEN, 56). -define(ITERATOR_SCANWIDTH, 1). --define(MERGE_SCANWIDTH, 32). +-define(MERGE_SCANWIDTH, 8). -define(BLOOM_WIDTH, 48). -define(DELETE_TIMEOUT, 10000). -define(MAX_KEYS, ?SLOT_COUNT * ?BLOCK_COUNT * ?BLOCK_SIZE). From b92b511166beabb8a918bb73467f6d730d7e4604 Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Wed, 14 Dec 2016 18:49:47 +0000 Subject: [PATCH 3/4] Revert "Experiment" This reverts commit fe907eb4795402187d43e5fd973fd699675e1fa1. --- src/leveled_penciller.erl | 4 ++-- src/leveled_sft.erl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/leveled_penciller.erl b/src/leveled_penciller.erl index 9be27ec..d5b70d1 100644 --- a/src/leveled_penciller.erl +++ b/src/leveled_penciller.erl @@ -197,8 +197,8 @@ -define(CURRENT_FILEX, "crr"). -define(PENDING_FILEX, "pnd"). -define(MEMTABLE, mem). --define(MAX_TABLESIZE, 16000). % This is less than max - but COIN_SIDECOUNT --define(SUPER_MAX_TABLE_SIZE, 22000). +-define(MAX_TABLESIZE, 28000). % This is less than max - but COIN_SIDECOUNT +-define(SUPER_MAX_TABLE_SIZE, 40000). -define(PROMPT_WAIT_ONL0, 5). -define(WORKQUEUE_BACKLOG_TOLERANCE, 4). -define(COIN_SIDECOUNT, 5). diff --git a/src/leveled_sft.erl b/src/leveled_sft.erl index 77f13bc..5b4f24e 100644 --- a/src/leveled_sft.erl +++ b/src/leveled_sft.erl @@ -178,7 +178,7 @@ -define(DWORD_SIZE, 8). -define(CURRENT_VERSION, {0,1}). -define(SLOT_COUNT, 256). --define(SLOT_GROUPWRITE_COUNT, 16). +-define(SLOT_GROUPWRITE_COUNT, 64). -define(BLOCK_SIZE, 32). -define(BLOCK_COUNT, 4). -define(FOOTERPOS_HEADERPOS, 2). @@ -188,7 +188,7 @@ -define(COMPRESSION_LEVEL, 1). -define(HEADER_LEN, 56). -define(ITERATOR_SCANWIDTH, 1). --define(MERGE_SCANWIDTH, 8). +-define(MERGE_SCANWIDTH, 32). -define(BLOOM_WIDTH, 48). -define(DELETE_TIMEOUT, 10000). -define(MAX_KEYS, ?SLOT_COUNT * ?BLOCK_COUNT * ?BLOCK_SIZE). From 4798dc1148ab24ec52a0ecd52ae61e64249e97f5 Mon Sep 17 00:00:00 2001 From: martinsumner Date: Wed, 14 Dec 2016 22:03:38 +0000 Subject: [PATCH 4/4] Write block theory With riak metadata the sft files are about 2MB - so a group write coun of 64 is trying to write in 500 KB chunks. Is this too big? --- src/leveled_sft.erl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/leveled_sft.erl b/src/leveled_sft.erl index 5b4f24e..644e9ca 100644 --- a/src/leveled_sft.erl +++ b/src/leveled_sft.erl @@ -178,7 +178,7 @@ -define(DWORD_SIZE, 8). -define(CURRENT_VERSION, {0,1}). -define(SLOT_COUNT, 256). --define(SLOT_GROUPWRITE_COUNT, 64). +-define(SLOT_GROUPWRITE_COUNT, 16). -define(BLOCK_SIZE, 32). -define(BLOCK_COUNT, 4). -define(FOOTERPOS_HEADERPOS, 2).