1
0
mirror of https://github.com/MariaDB/server.git synced 2026-10-23 18:49:29 +03:00
Files
Andrei Elkin d0164223c5 MDEV-41214 PURGE BINARY LOGS does not delete non-active binlog files
PURGE BINARY LOGS could end with a warning instead of deleting files, as
the test below shows when run on the base of this commit. The warning
names a wrong reason. It follows an automatic purge that was refused by
the slave guard, slave_connections_needed_for_purge: the automatic purge
does not delete a binlog while it might still be needed by a slave, not
necessarily a connected one, that is while fewer than the variable's
number of slaves are connected.
Since MDEV-34504 the manual PURGE is meant to ignore the guard.
Yet it still protects a binlog that a slave is reading.

Technically this was possible because the automatic and the manual purge
share a code path, can_purge_log(), which cached the refusal and replayed
it, under the reason of the first arm below, to any later purge:

  if (is_active(name) ||
      (!is_relay_log && waiting_for_slave_to_change_binlog &&
       purge_sending_new_binlog_file == sending_new_binlog_file &&
       !strcmp(name, purge_binlog_name)))
    reason= "it is the current active binlog";

So "active" had to be read as "active or busy". The fix removes this
duality too: the two arms are now separate and have their own reasons.

The main issue is fixed by narrowing the busy arm with an additional
`!interactive &&` conjunct, so that a manual PURGE never consults the
cached refusal.

Running the test below on an unfixed 11.4 server (source tree at commit
42038e1145) fails with "Result length mismatch" and, in part 2, this
diff against the recorded result:

   PURGE BINARY LOGS TO 'master-bin.000006';
  +Warnings:
  +Note	1375	Binary log 'master-bin.000003' is not purged because it is the current active binlog
   SHOW WARNINGS;
   Level	Code	Message
  +Note	1375	Binary log 'master-bin.000003' is not purged because it is the current active binlog
   show binary logs;
   Log_name	File_size
  +master-bin.000003	#
  +master-bin.000004	#
  +master-bin.000005	#
   master-bin.000006	#
   master-bin.000007	#
   master-bin.000008	#

Test binlog.binlog_purge_stale_refusal_cache: the test sets
slave_connections_needed_for_purge=1, binlog_expire_logs_seconds=0 and
max_binlog_total_size=0 first and restores them at the end. It starts
with RESET MASTER so that the binlog names, 000003 and so on, do not depend
on the tests run before it in the same mtr environment. Part 1 is a control with
nothing cached; part 2 makes an automatic purge refuse 000003 (the files
must be older than binlog_expire_logs_seconds, hence --real_sleep 2 before
the rotation) and then runs PURGE BINARY LOGS TO 'master-bin.000006',
which must remove 000003..000005.

As a workaround, a PURGE could work if the following settings are made
before it, in this order:

  SET GLOBAL binlog_expire_logs_seconds=0, slave_connections_needed_for_purge=0;

The second setting invalidates the cached refusal. The first one keeps
the purge that this setting triggers from refusing and caching again.
Note that both settings change the server's policy, not only this one
PURGE: the time-based expiry and the slave guard are off until they are
restored.
2026-10-14 17:25:11 +03:00
..
2026-05-08 08:00:01 +02:00
2025-10-25 00:19:11 +07:00
…
2026-07-23 11:12:27 +02:00
2026-07-28 13:14:38 +02:00
…
2025-09-04 18:08:39 +03:00
…
…
…
…
2024-12-02 11:35:34 +02:00
2024-11-29 12:37:46 +02:00
2024-10-30 15:11:17 +01:00
…
2026-01-28 21:52:18 +01:00
2026-10-13 07:04:14 +03:00
2026-10-13 07:49:28 +03:00
2024-12-02 11:35:34 +02:00
…
…
…
2026-06-15 12:50:45 +02:00
2025-09-04 18:08:39 +03:00
2026-08-30 17:39:50 +02:00
2024-11-29 13:43:17 +02:00
…
…
2026-10-13 07:49:28 +03:00
2026-10-13 07:49:28 +03:00
2024-12-02 11:35:34 +02:00
2024-12-05 10:11:58 +01:00
2026-08-19 08:40:05 +02:00
2026-07-28 13:14:38 +02:00
2026-08-19 08:13:54 +02:00
2026-01-28 14:22:20 +01:00
2026-06-26 13:45:38 +03:00
2026-01-28 21:52:18 +01:00
2026-01-28 14:22:20 +01:00
2026-01-28 14:22:20 +01:00
2026-10-13 07:49:28 +03:00
2024-12-02 11:35:34 +02:00
2026-07-14 12:49:36 +10:00
2024-11-29 13:43:17 +02:00
2024-07-08 22:40:16 +02:00
2024-06-17 12:02:03 +03:00
2025-04-26 10:53:02 +02:00
2024-05-21 19:38:51 +02:00
…
…
2025-04-26 10:53:02 +02:00
2026-10-13 07:04:14 +03:00
2026-08-19 08:40:05 +02:00
2026-10-13 07:04:14 +03:00
2026-05-08 08:00:01 +02:00
…
…
2025-09-04 18:08:39 +03:00
2026-04-01 10:49:05 +03:00
…
2024-09-18 07:38:49 +03:00
2024-12-02 11:35:34 +02:00
…
…
2026-07-28 13:14:38 +02:00
2024-05-21 19:38:51 +02:00
2026-08-19 08:40:05 +02:00
2026-01-28 21:52:18 +01:00
2026-10-13 07:04:14 +03:00
2026-08-19 08:40:05 +02:00
2026-07-28 13:14:38 +02:00
2024-12-02 11:35:34 +02:00
2026-07-28 13:14:38 +02:00
2026-05-08 08:00:01 +02:00
2026-08-19 08:40:05 +02:00
2026-05-08 08:00:01 +02:00
2024-12-02 11:35:34 +02:00
…
2025-09-04 18:08:39 +03:00
2024-07-22 15:14:50 +02:00
2026-10-13 07:04:14 +03:00
2026-05-08 08:00:01 +02:00
2026-10-13 07:49:28 +03:00
2026-06-15 12:50:45 +02:00
2026-07-28 13:14:38 +02:00
2026-10-13 07:04:14 +03:00
2026-10-13 07:04:14 +03:00
2026-08-19 08:40:05 +02:00
2026-08-19 08:40:05 +02:00
2026-06-15 12:50:45 +02:00
2026-06-15 10:43:23 +02:00
2024-12-02 11:35:34 +02:00
2026-08-19 08:40:05 +02:00
2026-08-19 08:40:05 +02:00
2026-10-13 07:04:14 +03:00
2025-10-28 17:49:51 +01:00
2025-10-28 17:49:51 +01:00
2026-10-13 07:04:14 +03:00
2026-10-13 07:04:14 +03:00
2026-10-13 07:04:14 +03:00
2024-12-02 11:35:34 +02:00
2026-08-19 08:13:54 +02:00
2025-09-04 18:08:39 +03:00
2026-08-19 08:40:05 +02:00
2025-01-14 23:45:41 +01:00
2024-06-24 13:09:47 +03:00
2025-01-30 12:01:11 +01:00
2024-11-29 13:43:17 +02:00
2026-05-08 08:00:01 +02:00
2025-09-04 18:08:39 +03:00
2026-04-01 10:49:05 +03:00
2024-12-02 11:35:34 +02:00
2026-01-28 21:52:18 +01:00
2026-01-02 11:06:05 +02:00
2024-10-03 13:24:43 +03:00
2026-03-23 08:44:54 +02:00
2026-07-23 11:12:27 +02:00
2026-07-23 11:12:27 +02:00
2026-07-28 13:14:38 +02:00
2025-03-03 11:07:56 +02:00
2026-03-17 18:57:42 +01:00
2026-01-28 21:52:18 +01:00
2026-08-19 08:40:05 +02:00
…
2024-08-21 09:30:54 +02:00
2026-04-01 10:49:05 +03:00
2025-09-24 13:40:09 +03:00
2025-09-04 18:08:39 +03:00
2024-06-27 10:26:09 +03:00
2025-01-09 07:58:08 +02:00
2024-10-30 15:11:17 +01:00
2024-11-29 12:37:46 +02:00
…
2026-10-13 07:04:14 +03:00
2025-09-19 12:31:14 +03:00
2025-09-04 18:08:39 +03:00
2026-10-13 07:04:14 +03:00
2026-07-28 13:14:38 +02:00
2026-05-08 08:00:01 +02:00
2024-04-15 18:54:30 +02:00
2026-08-19 08:40:05 +02:00
2026-01-28 21:52:18 +01:00
2024-07-03 12:45:30 +02:00
2026-08-19 08:40:05 +02:00
2026-08-19 08:40:05 +02:00
2026-07-23 11:12:27 +02:00
2026-08-19 08:40:05 +02:00
2026-10-13 07:04:14 +03:00
2025-09-04 18:08:39 +03:00
2026-05-08 08:00:01 +02:00
2026-08-19 08:40:05 +02:00
2026-03-17 11:30:41 +02:00
2024-03-28 10:51:36 +02:00
2025-09-16 17:01:39 +03:00
2026-10-13 07:49:28 +03:00
2026-07-28 13:14:38 +02:00
2025-01-30 12:01:11 +01:00
2025-03-27 08:01:47 +02:00
…
2026-08-19 08:40:05 +02:00
2026-07-28 13:14:38 +02:00
2024-12-02 11:35:34 +02:00
2024-11-23 08:14:23 -07:00
2026-08-19 08:40:05 +02:00
2026-07-28 13:14:38 +02:00
2026-07-28 13:14:38 +02:00
2026-06-15 12:50:45 +02:00
2026-08-19 08:40:05 +02:00
2026-08-19 08:40:05 +02:00
2026-07-28 13:14:38 +02:00
2025-09-04 18:08:39 +03:00
2024-06-24 13:09:47 +03:00
2025-07-28 19:40:10 +02:00
…
2024-02-15 13:53:21 +01:00
2024-12-02 11:35:34 +02:00
2024-12-02 11:35:34 +02:00
2026-08-19 08:40:05 +02:00
2025-04-26 10:53:02 +02:00
2024-02-21 13:08:23 +02:00
2025-11-28 12:56:27 +02:00
2025-11-28 12:56:27 +02:00
2024-06-27 10:26:09 +03:00
2026-10-13 07:04:14 +03:00
2026-06-21 15:32:20 +02:00
2026-08-19 08:40:05 +02:00
2024-10-03 13:24:43 +03:00
2024-09-09 13:50:38 +03:00
2026-08-19 08:40:05 +02:00
2026-07-23 11:12:27 +02:00
2026-07-23 11:12:27 +02:00
2026-08-19 08:40:05 +02:00
2026-04-01 10:49:05 +03:00
2025-07-28 19:40:10 +02:00