@@ -287,7 +287,8 @@ namespace
287287 {
288288 return capabilities;
289289 }
290- wsrep::view view_from_native (const wsrep_view_info& view_info)
290+ wsrep::view view_from_native (const wsrep_view_info& view_info,
291+ const wsrep::id& own_id)
291292 {
292293 std::vector<wsrep::view::member> members;
293294 for (int i (0 ); i < view_info.memb_num ; ++i)
@@ -303,6 +304,25 @@ namespace
303304 sizeof (view_info.members [i].incoming )));
304305 members.push_back (wsrep::view::member (id, name, incoming));
305306 }
307+
308+ int own_idx (-1 );
309+ if (own_id.is_undefined ())
310+ {
311+ // If own ID is undefined, obtain it from the view. This is
312+ // the case on the initial connect to cluster.
313+ own_idx = view_info.my_idx ;
314+ }
315+ else
316+ {
317+ // If the node has already obtained its ID from cluster,
318+ // its position in the view (or lack thereof) must be determined
319+ // by the ID.
320+ for (size_t i (0 ); i < members.size (); ++i)
321+ {
322+ if (own_id == members[i].id ()) { own_idx = i; break ; }
323+ }
324+ }
325+
306326 return wsrep::view (
307327 wsrep::gtid (
308328 wsrep::id (view_info.state_id .uuid .data ,
@@ -311,7 +331,7 @@ namespace
311331 wsrep::seqno (view_info.view ),
312332 map_view_status_from_native (view_info.status ),
313333 map_capabilities_from_native (view_info.capabilities ),
314- view_info. my_idx ,
334+ own_idx ,
315335 view_info.proto_ver ,
316336 members);
317337 }
@@ -325,12 +345,14 @@ namespace
325345 const wsrep_view_info_t * view_info)
326346 {
327347 assert (app_ctx);
328- wsrep::view view (view_from_native (*view_info));
329348 wsrep::server_state& server_state (
330349 *reinterpret_cast <wsrep::server_state*>(app_ctx));
350+ assert (server_state.id ().is_undefined ());
351+ wsrep::view view (view_from_native (*view_info, server_state.id ()));
352+ assert (view.own_index () >= 0 );
331353 try
332354 {
333- server_state.on_connect (view. state_id () );
355+ server_state.on_connect (view);
334356 return WSREP_CB_SUCCESS;
335357 }
336358 catch (const wsrep::runtime_error& e)
@@ -354,7 +376,7 @@ namespace
354376 reinterpret_cast <wsrep::high_priority_service*>(recv_ctx));
355377 try
356378 {
357- wsrep::view view (view_from_native (*view_info));
379+ wsrep::view view (view_from_native (*view_info, server_state. id () ));
358380 server_state.on_view (view, high_priority_service);
359381 return WSREP_CB_SUCCESS;
360382 }
0 commit comments