Action Scheduler clean up

Action Scheduler is a library for triggering a WordPress hook to run at some time in the future. It is used in a lot of large plugins to handle background processing of large job queues. It is an extremely useful tool. Unfortunately, it is also easy for bugs to make the queue or logs explode in size.

I had a fun runaway action scheduler issue to deal with at work today that ended up creating 26.7M rows in the wp_actionscheduler_actions table before we patched the bug, so I had to figure out how to clean it up. I’m blogging about what I learned so future me can doesn’t have to figure it out again.

Action Scheduler Defaults

By default, after every run, Action Scheduler cleans up completed and canceled actions older than 31 days. It does not clean up failed actions by default. Failed actions will stay in the wp_actionscheduler_actions table until manually cleaned up.

You can change the default retention period or statuses that are cleaned up with filters:

action_scheduler_default_cleaner_statuses

action_scheduler_retention_period

Action Scheduler CLI

wp action-scheduler clean

wp action-scheduler clean --batch-size=500 --batches=1000

wp action-scheduler clean --status=failed --batch-size=50 --before='90 days ago'

Bash

Bash and sql to delete 50K rows at a time with 2s delay after each delete, pausing to re-assess every 1M rows:

for i in $(seq 1 20); do echo "Batch $i/20..."; wp db query "DELETE FROM wp_actionscheduler_actions WHERE status = 'canceled' LIMIT 50000;"; sleep 2; done

Truncate

The fastest option.

Export pending actions

TRUNCATE TABLE wp_actionscheduler_actions;

Import pending actions

Processing backed up queues

First try https://github.com/woocommerce/action-scheduler-high-volume

When all else fails, use the CLI, increase the batch size, --force, and if it is big enough to have multiple runs going, make it more efficient by having each run focus on a different group or hook.