@@ -290,13 +290,23 @@ Plugin_gcs_events_handler::on_suspicions(const std::vector<Gcs_member_identifier
290
290
uit= std::find (tmp_unreachable.begin (), tmp_unreachable.end (), member);
291
291
if (uit != tmp_unreachable.end ())
292
292
{
293
+ if (!member_info->is_unreachable ())
294
+ log_message (MY_WARNING_LEVEL,
295
+ " Member with address %s:%u has become unreachable." ,
296
+ member_info->get_hostname ().c_str (), member_info->get_port ());
297
+
293
298
member_info->set_unreachable ();
294
299
295
300
// remove to not check again against this one
296
301
tmp_unreachable.erase (uit);
297
302
}
298
303
else
299
304
{
305
+ if (member_info->is_unreachable ())
306
+ log_message (MY_WARNING_LEVEL,
307
+ " Member with address %s:%u is reachable again." ,
308
+ member_info->get_hostname ().c_str (), member_info->get_port ());
309
+
300
310
member_info->set_reachable ();
301
311
}
302
312
}
@@ -305,19 +315,23 @@ Plugin_gcs_events_handler::on_suspicions(const std::vector<Gcs_member_identifier
305
315
if ((members.size () - unreachable.size ()) <= (members.size () / 2 ))
306
316
{
307
317
if (!group_partition_handler->get_timeout_on_unreachable ())
308
- log_message (MY_WARNING_LEVEL,
309
- " The member lost contact with a majority of the members in the"
310
- " group. Until the network is restored transactions will block."
311
- " As the value of group_replication_unreachable_majority_timeout"
312
- " is 0 the plugin will wait indefinitely for the network to be"
313
- " restored." );
318
+ log_message (MY_ERROR_LEVEL,
319
+ " This server is not able to reach a majority of members "
320
+ " in the group. This server will now block all updates. "
321
+ " The server will remain blocked until contact with the "
322
+ " majority is restored. "
323
+ " It is possible to use group_replication_force_members "
324
+ " to force a new group membership." );
314
325
else
315
- log_message (MY_WARNING_LEVEL,
316
- " The member lost contact with a majority of the members in the"
317
- " group. Until the network is restored transactions will block."
318
- " The plugin will wait for a network restore or timeout after"
319
- " the period defined on"
320
- " group_replication_unreachable_majority_timeout." );
326
+ log_message (MY_ERROR_LEVEL,
327
+ " This server is not able to reach a majority of members "
328
+ " in the group. This server will now block all updates. "
329
+ " The server will remain blocked for the next %lu seconds. "
330
+ " Unless contact with the majority is restored, after this "
331
+ " time the member will error out and leave the group. "
332
+ " It is possible to use group_replication_force_members "
333
+ " to force a new group membership." ,
334
+ group_partition_handler->get_timeout_on_unreachable ());
321
335
322
336
if (!group_partition_handler->is_partition_handler_running () &&
323
337
!group_partition_handler->is_partition_handling_terminated ())
@@ -342,13 +356,86 @@ Plugin_gcs_events_handler::on_suspicions(const std::vector<Gcs_member_identifier
342
356
{
343
357
/* If it was not running or we canceled it in time */
344
358
log_message (MY_WARNING_LEVEL,
345
- " The member resumed contact with a majority of the members"
346
- " in the group. Regular operation is re-established." );
359
+ " The member has resumed contact with a majority of the "
360
+ " members in the group. Regular operation is restored and "
361
+ " transactions are unblocked." );
347
362
}
348
363
}
349
364
}
350
365
}
351
366
367
+ void
368
+ Plugin_gcs_events_handler::log_members_leaving_message (const Gcs_view& new_view) const
369
+ {
370
+ std::string members_leaving;
371
+ std::string primary_member_host;
372
+
373
+ get_hosts_from_view (new_view.get_leaving_members (), members_leaving, primary_member_host);
374
+
375
+ log_message (MY_WARNING_LEVEL,
376
+ " Members removed from the group: %s" ,
377
+ members_leaving.c_str ());
378
+
379
+ if (!primary_member_host.empty ())
380
+ log_message (MY_INFORMATION_LEVEL,
381
+ " Primary server with address %s left the group. "
382
+ " Electing new Primary." ,
383
+ primary_member_host.c_str ());
384
+ }
385
+
386
+ void
387
+ Plugin_gcs_events_handler::log_members_joining_message (const Gcs_view& new_view) const
388
+ {
389
+ std::string members_joining;
390
+ std::string primary_member_host;
391
+
392
+ get_hosts_from_view (new_view.get_joined_members (), members_joining, primary_member_host);
393
+
394
+ log_message (MY_INFORMATION_LEVEL,
395
+ " Members joined the group: %s" ,
396
+ members_joining.c_str ());
397
+ }
398
+
399
+ void
400
+ Plugin_gcs_events_handler::get_hosts_from_view (const std::vector<Gcs_member_identifier> &members,
401
+ std::string& all_hosts, std::string& primary_host) const
402
+ {
403
+ std::stringstream hosts_string;
404
+ std::stringstream primary_string;
405
+ std::vector<Gcs_member_identifier>::const_iterator all_members_it= members.begin ();
406
+
407
+ while (all_members_it != members.end ())
408
+ {
409
+ Group_member_info* member_info= group_member_mgr->
410
+ get_group_member_info_by_member_id ((*all_members_it));
411
+ all_members_it++;
412
+
413
+ if (member_info == NULL )
414
+ continue ;
415
+
416
+ hosts_string << member_info->get_hostname () << " :" << member_info->get_port ();
417
+
418
+ /* *
419
+ Check in_primary_mode has been added for safety.
420
+ Since primary role is in single-primary mode.
421
+ */
422
+ if (member_info->in_primary_mode () &&
423
+ member_info->get_role () == Group_member_info::MEMBER_ROLE_PRIMARY)
424
+ {
425
+ if (primary_string.tellp () != 0 )
426
+ primary_string << " , " ;
427
+ primary_string << member_info->get_hostname () << " :" << member_info->get_port ();
428
+ }
429
+
430
+ if (all_members_it != members.end ())
431
+ {
432
+ hosts_string << " , " ;
433
+ }
434
+ }
435
+ all_hosts.assign (hosts_string.str ());
436
+ primary_host.assign (primary_string.str ());
437
+ }
438
+
352
439
void
353
440
Plugin_gcs_events_handler::on_view_changed (const Gcs_view& new_view,
354
441
const Exchanged_data &exchanged_data)
@@ -393,8 +480,9 @@ Plugin_gcs_events_handler::on_view_changed(const Gcs_view& new_view,
393
480
{
394
481
/* If it was not running or we canceled it in time */
395
482
log_message (MY_WARNING_LEVEL,
396
- " The member resumed contact with a majority of the members"
397
- " in the group. Regular operation is re-established." );
483
+ " The member has resumed contact with a majority of the "
484
+ " members in the group. Regular operation is restored and "
485
+ " transactions are unblocked." );
398
486
}
399
487
}
400
488
@@ -405,9 +493,15 @@ Plugin_gcs_events_handler::on_view_changed(const Gcs_view& new_view,
405
493
if (!is_leaving && group_partition_handler->is_partition_handling_terminated ())
406
494
return ;
407
495
496
+ if (!is_leaving && new_view.get_leaving_members ().size () > 0 )
497
+ log_members_leaving_message (new_view);
498
+
408
499
// update the Group Manager with all the received states
409
500
this ->update_group_info_manager (new_view, exchanged_data, is_leaving);
410
501
502
+ if (!is_joining && new_view.get_joined_members ().size () > 0 )
503
+ log_members_joining_message (new_view);
504
+
411
505
// enable conflict detection if someone on group have it enabled
412
506
if (local_member_info->in_primary_mode () &&
413
507
group_member_mgr->is_conflict_detection_enabled ())
@@ -439,6 +533,19 @@ Plugin_gcs_events_handler::on_view_changed(const Gcs_view& new_view,
439
533
// Signal that the injected view was delivered
440
534
if (view_change_notifier->is_injected_view_modification ())
441
535
view_change_notifier->end_view_modification ();
536
+
537
+ if (!is_leaving)
538
+ {
539
+ log_message (MY_INFORMATION_LEVEL,
540
+ " Group membership changed to %s on view %s." ,
541
+ group_member_mgr->get_string_current_view_active_hosts ().c_str (),
542
+ gcs_module->get_current_view ()->get_view_id ().get_representation ().c_str ());
543
+ }
544
+ else
545
+ {
546
+ log_message (MY_INFORMATION_LEVEL,
547
+ " Group membership changed: This member has left the group." );
548
+ }
442
549
}
443
550
444
551
bool
@@ -670,12 +777,17 @@ void Plugin_gcs_events_handler::handle_leader_election_if_needed() const
670
777
group_member_mgr->update_member_role (primary_uuid,
671
778
Group_member_info::MEMBER_ROLE_PRIMARY);
672
779
780
+ log_message (MY_INFORMATION_LEVEL, " A new primary with address %s:%u "
781
+ " was elected, enabling conflict detection until the new "
782
+ " primary applies all relay logs." ,
783
+ the_primary->get_hostname ().c_str (),
784
+ the_primary->get_port ());
785
+
673
786
// Check if the session was established, it can (re)set read only mode.
674
787
if (!skip_set_super_readonly)
675
788
{
676
789
if (is_primary_local)
677
790
{
678
- log_message (MY_INFORMATION_LEVEL, " Unsetting super_read_only." );
679
791
if (disable_super_read_only_mode (sql_command_interface))
680
792
{
681
793
log_message (MY_WARNING_LEVEL,
@@ -685,7 +797,6 @@ void Plugin_gcs_events_handler::handle_leader_election_if_needed() const
685
797
}
686
798
else
687
799
{
688
- log_message (MY_INFORMATION_LEVEL, " Setting super_read_only." );
689
800
if (enable_super_read_only_mode (sql_command_interface))
690
801
{
691
802
log_message (MY_WARNING_LEVEL,
@@ -694,6 +805,16 @@ void Plugin_gcs_events_handler::handle_leader_election_if_needed() const
694
805
}
695
806
}
696
807
}
808
+ /* code position limits messaging to primary change */
809
+ if (is_primary_local)
810
+ log_message (MY_INFORMATION_LEVEL,
811
+ " This server is working as primary member." );
812
+ else
813
+ log_message (MY_INFORMATION_LEVEL,
814
+ " This server is working as secondary member with primary "
815
+ " member address %s:%u." ,
816
+ the_primary->get_hostname ().c_str (),
817
+ the_primary->get_port ());
697
818
}
698
819
}
699
820
else if (!skip_set_super_readonly)
@@ -812,11 +933,6 @@ void Plugin_gcs_events_handler::handle_joining_members(const Gcs_view& new_view,
812
933
Group_member_info::MEMBER_IN_RECOVERY,
813
934
Group_member_info::MEMBER_OFFLINE,
814
935
Group_member_info::MEMBER_END);
815
-
816
- log_message (MY_INFORMATION_LEVEL,
817
- " Starting group replication recovery with view_id %s" ,
818
- new_view.get_view_id ().get_representation ().c_str ());
819
-
820
936
/* *
821
937
Set the read mode if not set during start (auto-start)
822
938
*/
@@ -909,10 +1025,6 @@ void Plugin_gcs_events_handler::handle_joining_members(const Gcs_view& new_view,
909
1025
Group_member_info::MEMBER_IN_RECOVERY,
910
1026
Group_member_info::MEMBER_OFFLINE,
911
1027
Group_member_info::MEMBER_END);
912
-
913
- log_message (MY_INFORMATION_LEVEL,
914
- " Marking group replication view change with view_id %s" ,
915
- new_view.get_view_id ().get_representation ().c_str ());
916
1028
/* *
917
1029
If not a joining member, all members should record on their own binlogs a
918
1030
marking event that identifies the frontier between the data the joining
0 commit comments