Springle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/145507

Change subject: Use MariaDB event scheduler to automatically delay dbstore1001. 
This saves running separate pt-slave-delay processes, plus is easy to disable 
single channels, or all of them, by:
......................................................................

Use MariaDB event scheduler to automatically delay dbstore1001.
This saves running separate pt-slave-delay processes, plus is easy
to disable single channels, or all of them, by:

a) STOP SLAVE 'sX' IO_THREAD
b) SET GLOBAL event_scheduler=0;

Change-Id: I1a218f741a3797a36fbdf19619535c79984861c5
---
A dbtools/events_dbstore_delayed.sql
1 file changed, 160 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/software 
refs/changes/07/145507/1

diff --git a/dbtools/events_dbstore_delayed.sql 
b/dbtools/events_dbstore_delayed.sql
new file mode 100644
index 0000000..f18b902
--- /dev/null
+++ b/dbtools/events_dbstore_delayed.sql
@@ -0,0 +1,160 @@
+-- Events for dbstore1001
+
+set @cache_sql_log_bin := @@session.sql_log_bin;
+set @@session.sql_log_bin = 1;
+
+set @cache_event_scheduler := @@global.event_scheduler;
+set @@global.event_scheduler = 0;
+
+create database if not exists ops;
+
+use ops;
+
+-- Remember, table is replicated!
+-- https://wikitech.wikimedia.org/wiki/MariaDB#Schema_Changes
+
+create table if not exists event_log (
+  server_id int unsigned  not null,
+  stamp     datetime      not null,
+  event     varchar(100)  not null,
+  content   varchar(1024) not null,
+  index server_stamp (server_id, stamp)
+) engine=innodb default charset=binary;
+
+create table if not exists slave_status
+engine=connect default charset=binary
+connection='mysql://status:status@localhost/test'
+table_type='mysql' srcdef='show all slaves status';
+
+create table if not exists slave_delay (
+  server_id int unsigned  not null,
+  stamp     datetime      not null,
+  con       varchar(5)    not null,
+  lag       int,
+  primary key (server_id, con)
+) engine=InnoDB default charset=binary;
+
+-- Avoid replicating event DDL. Delayed events should only be created
+-- on dbstore1001 though they may rely on replicated tables like event_log.
+
+set @@session.sql_log_bin = 0;
+
+delimiter ;;
+
+-- Housekeeping
+
+drop event if exists wmf_dbstore_purge;;
+
+create event wmf_dbstore_purge
+
+    on schedule every 15 minute starts date(now())
+
+    do begin
+
+        declare sid int;
+
+        set sid := @@server_id;
+
+        delete from event_log where stamp < now() - interval 1 day and 
server_id = sid;
+
+    end ;;
+
+drop event if exists wmf_dbstore_delay;;
+
+create event wmf_dbstore_delay
+
+    on schedule every 5 second starts date(now())
+
+    do begin
+
+        declare sid       int;
+        declare all_done  int default 0;
+        declare con_name  varchar(10);
+        declare io_state  varchar(5);
+        declare sql_state varchar(5);
+        declare sql_error int;
+        declare lag_secs  int;
+        declare sd_stamp  datetime;
+        declare sd_lag    int;
+
+        declare sql_threads cursor for
+            select
+                ss.Connection_Name,
+                ss.Slave_IO_Running,
+                ss.Slave_SQL_Running,
+                ss.Last_SQL_Errno,
+                ss.Seconds_Behind_Master,
+                sd.stamp,
+                sd.lag
+            from slave_status ss
+            left join slave_delay sd
+            on ss.Connection_Name = sd.con
+            and sd.server_id = @@server_id;
+
+        declare continue handler for not found set all_done = 1;
+
+        set sid := @@server_id;
+
+        if (get_lock('wmf_dbstore_delay', 1) = 0) then
+            signal sqlstate value '45000' set message_text = 'get_lock';
+        end if;
+
+        set all_done = 0;
+        open sql_threads;
+
+        repeat fetch sql_threads into con_name, io_state, sql_state, 
sql_error, lag_secs, sd_stamp, sd_lag;
+
+            if (con_name is not null and io_state = 'Yes' and sql_error = 0) 
then
+
+                if (sql_state = 'Yes' and lag_secs is not null) then
+
+                    replace into slave_delay values (sid, now(), con_name, 
lag_secs);
+
+                    if (lag_secs < 86400) then
+
+                        set @sql := concat(
+                            'stop slave "', con_name, '" sql_thread'
+                        );
+
+                        prepare stmt from @sql; execute stmt; deallocate 
prepare stmt;
+
+                        insert into event_log values (sid, now(), 
'wmf_dbstore_delay',
+                            concat(@sql)
+                        );
+
+                    end if;
+
+                end if;
+
+                if (sql_state = 'No' and (sd_stamp is null or sd_lag is null 
or sd_stamp < now() - interval 5 minute or sd_lag > 87400)) then
+
+                    set @sql := concat(
+                        'start slave "', con_name, '" sql_thread'
+                    );
+
+                    prepare stmt from @sql; execute stmt; deallocate prepare 
stmt;
+
+                    insert into event_log values (sid, now(), 
'wmf_dbstore_delay',
+                        concat(@sql)
+                    );
+
+                end if;
+
+            end if;
+
+            until all_done
+        end repeat;
+
+        close sql_threads;
+
+        -- https://mariadb.atlassian.net/browse/MDEV-4602
+        select 1 from (select 1) as t;
+
+        do release_lock('wmf_dbstore_delay');
+
+    end ;;
+
+delimiter ;
+
+set @@session.sql_log_bin = @cache_sql_log_bin;
+set @@global.event_scheduler = @cache_event_scheduler;

-- 
To view, visit https://gerrit.wikimedia.org/r/145507
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I1a218f741a3797a36fbdf19619535c79984861c5
Gerrit-PatchSet: 1
Gerrit-Project: operations/software
Gerrit-Branch: master
Gerrit-Owner: Springle <sprin...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to