@@ -38,14 +38,51 @@ setup_schema() ->
3838 }).
3939
4040setup_schema_in_mnesia () ->
41- case mnesia :create_table ( ? JMS_TOPIC_TABLE
42- , [ {attributes , record_info (fields , ? JMS_TOPIC_RECORD )}
43- , {record_name , ? JMS_TOPIC_RECORD }
44- , {type , set } ]
45- ) of
46- {atomic , ok } -> ok ;
47- {aborted , {already_exists , ? JMS_TOPIC_TABLE }} -> ok
48- end ,
41+ TableName = ? JMS_TOPIC_TABLE ,
42+ rabbit_log :info (
43+ " Creating table ~ts for JMS topic exchange" ,
44+ [TableName ]),
45+ _ = try
46+ rabbit_table :create (
47+ TableName ,
48+ [{attributes , record_info (fields , ? JMS_TOPIC_RECORD )},
49+ {record_name , ? JMS_TOPIC_RECORD },
50+ {type , set }]),
51+ % % The JMS topic exchange table must be available on all nodes.
52+ % % If it existed on only one node, messages could not be published
53+ % % to JMS topic exchanges and routed to topic subscribers if the node
54+ % % was unavailable.
55+ % % The call below makes sure this node has a copy of the table.
56+ case rabbit_table :ensure_table_copy (TableName , node (), ram_copies ) of
57+ ok ->
58+ % % Next, we try to fix other nodes in the cluster if they are
59+ % % running a version of RabbitMQ which does not replicate the
60+ % % table. All nodes must have a replica for Mnesia operations
61+ % % to work properly. Therefore the code below is to make older
62+ % % compatible with newer nodes.
63+ Replicas = mnesia :table_info (TableName , all_nodes ),
64+ Members = rabbit_nodes :list_running (),
65+ MissingOn = Members -- Replicas ,
66+ lists :foreach (
67+ fun (Node ) ->
68+ % % Errors from adding a replica on those older nodes
69+ % % are ignored however. They should not be fatal. The
70+ % % problem will solve by itself once all nodes are
71+ % % upgraded.
72+ _ = rpc :call (
73+ Node ,
74+ rabbit_table , ensure_table_copy ,
75+ [TableName , Node , ram_copies ])
76+ end , MissingOn ),
77+ ok ;
78+ Error ->
79+ Error
80+ end
81+ catch throw :Reason ->
82+ rabbit_log :error (
83+ " Failed to create JMS topic exchange table: ~tp " ,
84+ [Reason ])
85+ end ,
4986 ok .
5087
5188% % -------------------------------------------------------------------
0 commit comments