Skip to content

Commit 09af3f6

Browse files
Merge stable into master
2 parents 2e2afae + 7b2daba commit 09af3f6

File tree

10 files changed

+101
-62
lines changed

10 files changed

+101
-62
lines changed

LICENSE-MPL-RabbitMQ

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ EXHIBIT A -Mozilla Public License.
446446

447447
The Original Code is RabbitMQ.
448448

449-
The Initial Developer of the Original Code is GoPivotal, Inc.
449+
The Initial Developer of the Original Code is Pivotal Software, Inc.
450450
Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.''
451451

452452
[NOTE: The text of this Exhibit A may differ slightly from the text of

check_xref

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
%%
1515
%% The Original Code is RabbitMQ.
1616
%%
17-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
17+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
1818
%% Copyright (c) 2010-2015 Pivotal Software, Inc. All rights reserved.
1919
%%
2020

codegen.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
##
1212
## The Original Code is RabbitMQ.
1313
##
14-
## The Initial Developer of the Original Code is GoPivotal, Inc.
14+
## The Initial Developer of the Original Code is Pivotal Software, Inc.
1515
## Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
1616
##
1717

@@ -106,7 +106,7 @@ def printFileHeader():
106106
%%
107107
%% The Original Code is RabbitMQ.
108108
%%
109-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
109+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
110110
%% Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
111111
%%"""
112112

include/gm_specs.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
%%
1111
%% The Original Code is RabbitMQ.
1212
%%
13-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
13+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
1414
%% Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
1515
%%
1616

include/rabbit.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
%%
1111
%% The Original Code is RabbitMQ.
1212
%%
13-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
13+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
1414
%% Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
1515
%%
1616

include/rabbit_cli.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
%%
1111
%% The Original Code is RabbitMQ.
1212
%%
13-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
13+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
1414
%% Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
1515
%%
1616

include/rabbit_msg_store.hrl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
%%
1111
%% The Original Code is RabbitMQ.
1212
%%
13-
%% The Initial Developer of the Original Code is GoPivotal, Inc.
13+
%% The Initial Developer of the Original Code is Pivotal Software, Inc.
1414
%% Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved.
1515
%%
1616

packaging/windows-exe/rabbitmq_nsi.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ VIProductVersion "%%VERSION%%.0"
3535
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductVersion" "%%VERSION%%"
3636
VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "RabbitMQ Server"
3737
;VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" ""
38-
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "GoPivotal, Inc"
38+
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Pivotal Software, Inc"
3939
;VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "" ; TODO ?
4040
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "Copyright (c) 2007-2015 Pivotal Software, Inc. All rights reserved."
4141
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "RabbitMQ Server"
@@ -89,7 +89,7 @@ Section "RabbitMQ Server (required)" Rabbit
8989
WriteRegStr HKLM ${uninstall} "DisplayName" "RabbitMQ Server"
9090
WriteRegStr HKLM ${uninstall} "UninstallString" "$INSTDIR\uninstall.exe"
9191
WriteRegStr HKLM ${uninstall} "DisplayIcon" "$INSTDIR\uninstall.exe,0"
92-
WriteRegStr HKLM ${uninstall} "Publisher" "GoPivotal, Inc."
92+
WriteRegStr HKLM ${uninstall} "Publisher" "Pivotal Software, Inc."
9393
WriteRegStr HKLM ${uninstall} "DisplayVersion" "%%VERSION%%"
9494
WriteRegDWORD HKLM ${uninstall} "NoModify" 1
9595
WriteRegDWORD HKLM ${uninstall} "NoRepair" 1

scripts/rabbitmq-service.bat

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ if not "!RABBITMQ_NODE_IP_ADDRESS!"=="" (
146146

147147
set RABBITMQ_START_RABBIT=
148148
if "!RABBITMQ_NODE_ONLY!"=="" (
149-
set RABBITMQ_START_RABBIT=-s rabbit boot
149+
set RABBITMQ_START_RABBIT=-s "!RABBITMQ_BOOT_MODULE!" boot
150150
)
151151

152152
if "!RABBITMQ_IO_THREAD_POOL_SIZE!"=="" (
@@ -161,9 +161,10 @@ set ERLANG_SERVICE_ARGUMENTS= ^
161161
+W w ^
162162
+A "!RABBITMQ_IO_THREAD_POOL_SIZE!" ^
163163
+P 1048576 ^
164-
-kernel inet_default_connect_options "[{nodelay,true}]" ^
165164
!RABBITMQ_LISTEN_ARG! ^
166165
!RABBITMQ_SERVER_ERL_ARGS! ^
166+
-kernel inet_default_connect_options "[{nodelay,true}]" ^
167+
!RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS! ^
167168
-sasl errlog_type error ^
168169
-sasl sasl_error_logger false ^
169170
-rabbit error_logger {file,\""!LOGS:\=/!"\"} ^
@@ -177,7 +178,6 @@ set ERLANG_SERVICE_ARGUMENTS= ^
177178
-os_mon start_memsup false ^
178179
-mnesia dir \""!RABBITMQ_MNESIA_DIR:\=/!"\" ^
179180
!RABBITMQ_SERVER_START_ARGS! ^
180-
!RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS! ^
181181
!RABBITMQ_DIST_ARG! ^
182182
!STARVAR!
183183

@@ -191,7 +191,7 @@ set ERLANG_SERVICE_ARGUMENTS=!ERLANG_SERVICE_ARGUMENTS:"=\"!
191191
-stopaction "rabbit:stop_and_halt()." ^
192192
!RABBITMQ_NAME_TYPE! !RABBITMQ_NODENAME! ^
193193
!CONSOLE_FLAG! ^
194-
-comment "A robust and scalable messaging broker" ^
194+
-comment "Multi-protocol open source messaging broker" ^
195195
-args "!ERLANG_SERVICE_ARGUMENTS!" > NUL
196196

197197
goto END

src/rabbit_queue_index.erl

Lines changed: 87 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@
179179
max_journal_entries, on_sync, on_sync_msg,
180180
unconfirmed, unconfirmed_msg}).
181181

182-
-record(segment, {num, path, journal_entries, unacked}).
182+
-record(segment, {num, path, journal_entries,
183+
entries_to_segment, unacked}).
183184

184185
-include("rabbit.hrl").
185186

@@ -194,10 +195,11 @@
194195

195196
-type(hdl() :: ('undefined' | any())).
196197
-type(segment() :: ('undefined' |
197-
#segment { num :: non_neg_integer(),
198-
path :: file:filename(),
199-
journal_entries :: array:array(),
200-
unacked :: non_neg_integer()
198+
#segment { num :: non_neg_integer(),
199+
path :: file:filename(),
200+
journal_entries :: array:array(),
201+
entries_to_segment :: array:array(),
202+
unacked :: non_neg_integer()
201203
})).
202204
-type(seq_id() :: integer()).
203205
-type(seg_dict() :: {dict:dict(), [segment()]}).
@@ -650,30 +652,46 @@ add_to_journal(SeqId, Action, State = #qistate { dirty_count = DCount,
650652

651653
add_to_journal(RelSeq, Action,
652654
Segment = #segment { journal_entries = JEntries,
655+
entries_to_segment = EToSeg,
653656
unacked = UnackedCount }) ->
657+
658+
{Fun, Entry} = action_to_entry(RelSeq, Action, JEntries),
659+
660+
{JEntries1, EToSeg1} =
661+
case Fun of
662+
set ->
663+
{array:set(RelSeq, Entry, JEntries),
664+
array:set(RelSeq, entry_to_segment(RelSeq, Entry, []),
665+
EToSeg)};
666+
reset ->
667+
{array:reset(RelSeq, JEntries),
668+
array:reset(RelSeq, EToSeg)}
669+
end,
670+
654671
Segment #segment {
655-
journal_entries = add_to_journal(RelSeq, Action, JEntries),
672+
journal_entries = JEntries1,
673+
entries_to_segment = EToSeg1,
656674
unacked = UnackedCount + case Action of
657675
?PUB -> +1;
658676
del -> 0;
659677
ack -> -1
660-
end};
678+
end}.
661679

662-
add_to_journal(RelSeq, Action, JEntries) ->
680+
action_to_entry(RelSeq, Action, JEntries) ->
663681
case array:get(RelSeq, JEntries) of
664682
undefined ->
665-
array:set(RelSeq,
666-
case Action of
667-
?PUB -> {Action, no_del, no_ack};
668-
del -> {no_pub, del, no_ack};
669-
ack -> {no_pub, no_del, ack}
670-
end, JEntries);
683+
{set,
684+
case Action of
685+
?PUB -> {Action, no_del, no_ack};
686+
del -> {no_pub, del, no_ack};
687+
ack -> {no_pub, no_del, ack}
688+
end};
671689
({Pub, no_del, no_ack}) when Action == del ->
672-
array:set(RelSeq, {Pub, del, no_ack}, JEntries);
690+
{set, {Pub, del, no_ack}};
673691
({no_pub, del, no_ack}) when Action == ack ->
674-
array:set(RelSeq, {no_pub, del, ack}, JEntries);
692+
{set, {no_pub, del, ack}};
675693
({?PUB, del, no_ack}) when Action == ack ->
676-
array:reset(RelSeq, JEntries)
694+
{reset, none}
677695
end.
678696

679697
maybe_flush_journal(State) ->
@@ -704,18 +722,23 @@ flush_journal(State = #qistate { segments = Segments }) ->
704722
notify_sync(State1 #qistate { dirty_count = 0 }).
705723

706724
append_journal_to_segment(#segment { journal_entries = JEntries,
725+
entries_to_segment = EToSeg,
707726
path = Path } = Segment) ->
708727
case array:sparse_size(JEntries) of
709728
0 -> Segment;
710-
_ -> Seg = array:sparse_foldr(
711-
fun entry_to_segment/3, [], JEntries),
712-
file_handle_cache_stats:update(queue_index_write),
713-
714-
{ok, Hdl} = file_handle_cache:open(Path, ?WRITE_MODE,
715-
[{write_buffer, infinity}]),
716-
file_handle_cache:append(Hdl, Seg),
717-
ok = file_handle_cache:close(Hdl),
718-
Segment #segment { journal_entries = array_new() }
729+
_ ->
730+
file_handle_cache_stats:update(queue_index_write),
731+
732+
{ok, Hdl} = file_handle_cache:open(Path, ?WRITE_MODE,
733+
[{write_buffer, infinity}]),
734+
%% the file_handle_cache also does a list reverse, so this
735+
%% might not be required here, but before we were doing a
736+
%% sparse_foldr, a lists:reverse/1 seems to be the correct
737+
%% thing to do for now.
738+
file_handle_cache:append(Hdl, lists:reverse(array:to_list(EToSeg))),
739+
ok = file_handle_cache:close(Hdl),
740+
Segment #segment { journal_entries = array_new(),
741+
entries_to_segment = array_new([]) }
719742
end.
720743

721744
get_journal_handle(State = #qistate { journal_handle = undefined,
@@ -748,14 +771,16 @@ recover_journal(State) ->
748771
Segments1 =
749772
segment_map(
750773
fun (Segment = #segment { journal_entries = JEntries,
774+
entries_to_segment = EToSeg,
751775
unacked = UnackedCountInJournal }) ->
752776
%% We want to keep ack'd entries in so that we can
753777
%% remove them if duplicates are in the journal. The
754778
%% counts here are purely from the segment itself.
755779
{SegEntries, UnackedCountInSeg} = load_segment(true, Segment),
756-
{JEntries1, UnackedCountDuplicates} =
757-
journal_minus_segment(JEntries, SegEntries),
780+
{JEntries1, EToSeg1, UnackedCountDuplicates} =
781+
journal_minus_segment(JEntries, EToSeg, SegEntries),
758782
Segment #segment { journal_entries = JEntries1,
783+
entries_to_segment = EToSeg1,
759784
unacked = (UnackedCountInJournal +
760785
UnackedCountInSeg -
761786
UnackedCountDuplicates) }
@@ -842,10 +867,11 @@ segment_find_or_new(Seg, Dir, Segments) ->
842867
{ok, Segment} -> Segment;
843868
error -> SegName = integer_to_list(Seg) ++ ?SEGMENT_EXTENSION,
844869
Path = filename:join(Dir, SegName),
845-
#segment { num = Seg,
846-
path = Path,
847-
journal_entries = array_new(),
848-
unacked = 0 }
870+
#segment { num = Seg,
871+
path = Path,
872+
journal_entries = array_new(),
873+
entries_to_segment = array_new([]),
874+
unacked = 0 }
849875
end.
850876

851877
segment_find(Seg, {_Segments, [Segment = #segment { num = Seg } |_]}) ->
@@ -885,20 +911,20 @@ segment_nums({Segments, CachedSegments}) ->
885911
segments_new() ->
886912
{dict:new(), []}.
887913

888-
entry_to_segment(_RelSeq, {?PUB, del, ack}, Buf) ->
889-
Buf;
890-
entry_to_segment(RelSeq, {Pub, Del, Ack}, Buf) ->
914+
entry_to_segment(_RelSeq, {?PUB, del, ack}, Initial) ->
915+
Initial;
916+
entry_to_segment(RelSeq, {Pub, Del, Ack}, Initial) ->
891917
%% NB: we are assembling the segment in reverse order here, so
892918
%% del/ack comes first.
893919
Buf1 = case {Del, Ack} of
894920
{no_del, no_ack} ->
895-
Buf;
921+
Initial;
896922
_ ->
897923
Binary = <<?REL_SEQ_ONLY_PREFIX:?REL_SEQ_ONLY_PREFIX_BITS,
898924
RelSeq:?REL_SEQ_BITS>>,
899925
case {Del, Ack} of
900-
{del, ack} -> [[Binary, Binary] | Buf];
901-
_ -> [Binary | Buf]
926+
{del, ack} -> [[Binary, Binary] | Initial];
927+
_ -> [Binary | Initial]
902928
end
903929
end,
904930
case Pub of
@@ -987,7 +1013,10 @@ add_segment_relseq_entry(KeepAcked, RelSeq, {SegEntries, Unacked}) ->
9871013
end.
9881014

9891015
array_new() ->
990-
array:new([{default, undefined}, fixed, {size, ?SEGMENT_ENTRY_COUNT}]).
1016+
array_new(undefined).
1017+
1018+
array_new(Default) ->
1019+
array:new([{default, Default}, fixed, {size, ?SEGMENT_ENTRY_COUNT}]).
9911020

9921021
bool_to_int(true ) -> 1;
9931022
bool_to_int(false) -> 0.
@@ -1033,19 +1062,29 @@ segment_plus_journal1({?PUB, del, no_ack}, {no_pub, no_del, ack}) ->
10331062
%% Remove from the journal entries for a segment, items that are
10341063
%% duplicates of entries found in the segment itself. Used on start up
10351064
%% to clean up the journal.
1036-
journal_minus_segment(JEntries, SegEntries) ->
1065+
%%
1066+
%% We need to update the entries_to_segment since they are just a
1067+
%% cache of what's on the journal.
1068+
journal_minus_segment(JEntries, EToSeg, SegEntries) ->
10371069
array:sparse_foldl(
1038-
fun (RelSeq, JObj, {JEntriesOut, UnackedRemoved}) ->
1070+
fun (RelSeq, JObj, {JEntriesOut, EToSegOut, UnackedRemoved}) ->
10391071
SegEntry = array:get(RelSeq, SegEntries),
10401072
{Obj, UnackedRemovedDelta} =
10411073
journal_minus_segment1(JObj, SegEntry),
1042-
{case Obj of
1043-
keep -> JEntriesOut;
1044-
undefined -> array:reset(RelSeq, JEntriesOut);
1045-
_ -> array:set(RelSeq, Obj, JEntriesOut)
1046-
end,
1047-
UnackedRemoved + UnackedRemovedDelta}
1048-
end, {JEntries, 0}, JEntries).
1074+
{JEntriesOut1, EToSegOut1} =
1075+
case Obj of
1076+
keep ->
1077+
{JEntriesOut, EToSegOut};
1078+
undefined ->
1079+
{array:reset(RelSeq, JEntriesOut),
1080+
array:reset(RelSeq, EToSegOut)};
1081+
_ ->
1082+
{array:set(RelSeq, Obj, JEntriesOut),
1083+
array:set(RelSeq, entry_to_segment(RelSeq, Obj, []),
1084+
EToSegOut)}
1085+
end,
1086+
{JEntriesOut1, EToSegOut1, UnackedRemoved + UnackedRemovedDelta}
1087+
end, {JEntries, EToSeg, 0}, JEntries).
10491088

10501089
%% Here, the result is a tuple with the first element containing the
10511090
%% item we are adding to or modifying in the (initially fresh) journal

0 commit comments

Comments
 (0)