From f64d2e1c29e2d6ed6a3c57ab6dd1dec1506c1211 Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Sat, 6 Jul 2024 10:34:03 +0100 Subject: [PATCH 1/2] De-reference Type/Bucket/Key Maybe otherwise small binaries which hold a reference count to a much larger binary --- src/riak_object.erl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/riak_object.erl b/src/riak_object.erl index 6b04dcfcd..66c20f9f1 100644 --- a/src/riak_object.erl +++ b/src/riak_object.erl @@ -1241,12 +1241,18 @@ nextgenrepl_decode(<<1:4/integer, C:1/integer, R:1/integer, _:2/integer, 0:32/integer, BL:32/integer, B:BL/binary, KL:32/integer, K:KL/binary, ObjBin/binary>>) -> - nextgenrepl_decode(B, K, C == 1, R == 1, ObjBin); + nextgenrepl_decode(binary:copy(B), binary:copy(K), C == 1, R == 1, ObjBin); nextgenrepl_decode(<<1:4/integer, C:1/integer, R:1/integer, _:2/integer, TL:32/integer, T:TL/binary, BL:32/integer, B:BL/binary, KL:32/integer, K:KL/binary, ObjBin/binary>>) -> - nextgenrepl_decode({T, B}, K, C == 1, R == 1, ObjBin). + nextgenrepl_decode( + {binary:copy(T), binary:copy(B)}, + binary:copy(K), + C == 1, + R == 1, + ObjBin + ). nextgenrepl_decode(B, K, _, true, MetaBin) -> <> = From bf1ad38c2a25d0c94f1af6b12bdac10fe7ea9711 Mon Sep 17 00:00:00 2001 From: Martin Sumner Date: Sun, 7 Jul 2024 18:41:17 +0100 Subject: [PATCH 2/2] Only copy if > 64 bytes Has already been copied to the local heap otherwise --- src/riak_object.erl | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/riak_object.erl b/src/riak_object.erl index 66c20f9f1..e32c84899 100644 --- a/src/riak_object.erl +++ b/src/riak_object.erl @@ -1237,23 +1237,36 @@ nextgenrepl_binarykey(B, K) -> %% @doc Deocde for nextgenrepl -spec nextgenrepl_decode(binary()) -> riak_object()|repl_ref(). -nextgenrepl_decode(<<1:4/integer, C:1/integer, R:1/integer, _:2/integer, - 0:32/integer, BL:32/integer, B:BL/binary, - KL:32/integer, K:KL/binary, - ObjBin/binary>>) -> - nextgenrepl_decode(binary:copy(B), binary:copy(K), C == 1, R == 1, ObjBin); -nextgenrepl_decode(<<1:4/integer, C:1/integer, R:1/integer, _:2/integer, - TL:32/integer, T:TL/binary, BL:32/integer, B:BL/binary, - KL:32/integer, K:KL/binary, - ObjBin/binary>>) -> +nextgenrepl_decode( + <<1:4/integer, C:1/integer, R:1/integer, _:2/integer, + 0:32/integer, + BL:32/integer, B:BL/binary, KL:32/integer, K:KL/binary, + ObjBin/binary>>) -> nextgenrepl_decode( - {binary:copy(T), binary:copy(B)}, - binary:copy(K), + maybe_copy(B, BL), + maybe_copy(K, KL), + C == 1, + R == 1, + ObjBin + ); +nextgenrepl_decode( + <<1:4/integer, C:1/integer, R:1/integer, _:2/integer, + TL:32/integer, T:TL/binary, + BL:32/integer, B:BL/binary, KL:32/integer, K:KL/binary, + ObjBin/binary>>) -> + nextgenrepl_decode( + {maybe_copy(T, TL), maybe_copy(B, BL)}, + maybe_copy(K, KL), C == 1, R == 1, ObjBin ). +maybe_copy(B, BL) when BL > 64 -> + binary:copy(B); +maybe_copy(B, _BL) -> + B. + nextgenrepl_decode(B, K, _, true, MetaBin) -> <> = MetaBin,