jpahullo / moodle-tool_mergeusers

Merge users script for Moodle

Home Page:https://moodle.org/plugins/view.php?plugin=tool_mergeusers

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

queue merge users requests to be executen only by cron

jpahullo opened this issue · comments

We have discovered that in our Moodle instance, with high activity, merging users fails, mostly of the times due to DELETE sentences over any table, due to activity on it, with messages like Lock wait timeout exceeded; try restarting transaction. DELETE FROM mdl_...

Instead, running the same merging for the same users in time ranges where Moodle site has low activity, they run perfectly.

So, I propose to queue merging actions from web, list them on the log as pending to be processed by cron (or something similar) and define a cron task to process these queued requests for merging users. So, merging will be delayed.

It only happens when Moodle users have a lot of information, a lot of records. So may be we could define a best effort approach: try to run them immediately via web, or in case of failure, queue it to be processed by the new scheduled task. We could define N times as maximum execution of the merging request. An initial value, as in other places from Moodle, we could set N=3.

Hi @jpahullo

This issue is biting us too. It seems like it happens with user that have big number of records to delete.

Exception thrown when merging: 'Error writing to database".
Lock wait timeout exceeded; try restarting transaction
Trace:
#0 /var/www/site/lib/dml/mysqli_native_moodle_database.php(1167): moodle_database->query_end(false)
#1 /var/www/site/admin/tool/mergeusers/lib/table/generictablemerger.php(262): mysqli_native_moodle_database->execute('DELETE FROM mdl...')
#2 /var/www/site/admin/tool/mergeusers/lib/table/generictablemerger.php(237): GenericTableMerger->updateRecords(Array, Array, 'userid', Array, Array)
#3 /var/www/site/admin/tool/mergeusers/lib/table/generictablemerger.php(88): GenericTableMerger->updateAllRecords(Array, Array, 'userid', Array, Array)
#4 /var/www/site/admin/tool/mergeusers/lib/mergeusertool.php(268): GenericTableMerger->merge(Array, Array, Array)
#5 /var/www/site/admin/tool/mergeusers/lib/mergeusertool.php(192): MergeUserTool->_merge('56400', '61267')
#6 /var/www/site/admin/tool/mergeusers/index.php(135): MergeUserTool->merge('56400', '61267')
#7 {main}

Kind regards,
Mikhail