Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improve our job scheduling service for more resilience #9435

Merged
merged 18 commits into from
Sep 16, 2024

Conversation

vladolaru
Copy link
Contributor

@vladolaru vladolaru commented Sep 13, 2024

Fixes #9434
Related #6662 #5279

Changes proposed in this Pull Request

We improved our job scheduling service to adjust to whether the ActionScheduler has been initialized or not. If it has, we schedule the job immediately. If it hasn't, we hook into the WP action that is fired on the ActionScheduler initialization (action_scheduler_init) and schedule the job then.

Note: This will only work with WooCommerce 7.9.0+ (ActionScheduler 3.5.5+). The provided solution is backward compatible.

Additionally, I took the opportunity to snatch a performance gain and check with as_has_scheduled_action (introduced in ActionScheduler 3.3.0 - quite a while back) if there are scheduled jobs before un-scheduling them. We save up to 3 DB queries this way (see details).

Testing instructions

  1. Checkout the PR's branch on your local client installation
  2. Ensure your client installation is talking to your local server
  3. Make sure you don't have an account connected
  4. Go to your client's WP dashboard > Tools > Scheduled Actions > Pending (http://localhost:8082/wp-admin/tools.php?page=action-scheduler&status=pending) and delete/run any wcpay_ actions.
  5. In another browser tab, go to WCPay Dev Tools and clear the account cache
  6. In your pending scheduled actions list you should have an action with the wcpay_update_compatibility_data hook, scheduled for approx. 2 minutes into the future. Wait a couple of seconds, refresh the page, and see that the time for running the job is decreasing
  7. Clear the account cache again and the action with the wcpay_update_compatibility_data hook should be rescheduled with a scheduled time of approx 2 minutes into the future
  8. Onboard a sandbox account from the Payments page
  9. On your local server, change this line to return the value true:
'has_more_failed_events'                  => true,
  1. Clear the account cache again
  2. Go to your client WP dashboard > Tools > Scheduled Actions > Pending page and you should now see two actions with the hooks wcpay_update_compatibility_data and wcpay_webhook_fetch_events
    Screenshot 2024-09-13 at 18 36 16
  3. Wait a couple of seconds, clear the account cache again, and you will notice that the two jobs got rescheduled (their scheduled datetimes have been reset)
  4. Create a test order on your local store
  5. After you've successfully completed the order, quickly go to the pending Scheduled Actions page and you should have a job with the wcpay_track_new_order hook.

  • Run npm run changelog to add a changelog file, choose patch to leave it empty if the change is not significant. You can add multiple changelog files in one PR by running this command a few times.
  • Covered with tests (or have a good reason not to test in description ☝️)
  • Tested on mobile (or does not apply)

Post merge

@botwoo
Copy link
Collaborator

botwoo commented Sep 13, 2024

Test the build

Option 1. Jetpack Beta

  • Install and activate Jetpack Beta.
  • Use this build by searching for PR number 9435 or branch name fix/9434-action-scheduler-service-schedule-job-init in your-test.site/wp-admin/admin.php?page=jetpack-beta&plugin=woocommerce-payments

Option 2. Jurassic Ninja - available for logged-in A12s

🚀 Launch a JN site with this branch 🚀

ℹ️ Install this Tampermonkey script to get more options.


Build info:

  • Latest commit: b491c8a
  • Build time: 2024-09-16 09:53:17 UTC

Note: the build is updated when a new commit is pushed to this PR.

Copy link
Contributor

@tpaksu tpaksu left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The logic makes sense, and nice catch @oaratovskyi. I think this would be sufficient to ensure AS is initialized before being used. Thanks for the fix! LGTM 🚀 it!

Copy link
Contributor

github-actions bot commented Sep 13, 2024

Size Change: 0 B

Total Size: 1.33 MB

ℹ️ View Unchanged
Filename Size
release/woocommerce-payments/assets/css/admin.css 1.08 kB
release/woocommerce-payments/assets/css/admin.rtl.css 1.08 kB
release/woocommerce-payments/assets/css/success.css 173 B
release/woocommerce-payments/assets/css/success.rtl.css 173 B
release/woocommerce-payments/dist/blocks-checkout-rtl.css 2.52 kB
release/woocommerce-payments/dist/blocks-checkout.css 2.52 kB
release/woocommerce-payments/dist/blocks-checkout.js 66.6 kB
release/woocommerce-payments/dist/cart-block.js 16.3 kB
release/woocommerce-payments/dist/cart.js 5.73 kB
release/woocommerce-payments/dist/checkout-rtl.css 927 B
release/woocommerce-payments/dist/checkout.css 927 B
release/woocommerce-payments/dist/checkout.js 32.4 kB
release/woocommerce-payments/dist/express-checkout-rtl.css 230 B
release/woocommerce-payments/dist/express-checkout.css 230 B
release/woocommerce-payments/dist/express-checkout.js 14.3 kB
release/woocommerce-payments/dist/frontend-tracks.js 858 B
release/woocommerce-payments/dist/index-rtl.css 39.2 kB
release/woocommerce-payments/dist/index.css 39.2 kB
release/woocommerce-payments/dist/index.js 302 kB
release/woocommerce-payments/dist/multi-currency-analytics.js 1.08 kB
release/woocommerce-payments/dist/multi-currency-rtl.css 4.5 kB
release/woocommerce-payments/dist/multi-currency-switcher-block.js 60.5 kB
release/woocommerce-payments/dist/multi-currency.css 4.5 kB
release/woocommerce-payments/dist/multi-currency.js 57.2 kB
release/woocommerce-payments/dist/order-rtl.css 730 B
release/woocommerce-payments/dist/order.css 730 B
release/woocommerce-payments/dist/order.js 42 kB
release/woocommerce-payments/dist/payment-gateways-rtl.css 1.35 kB
release/woocommerce-payments/dist/payment-gateways.css 1.35 kB
release/woocommerce-payments/dist/payment-gateways.js 38.4 kB
release/woocommerce-payments/dist/payment-request-rtl.css 230 B
release/woocommerce-payments/dist/payment-request.css 230 B
release/woocommerce-payments/dist/payment-request.js 13.7 kB
release/woocommerce-payments/dist/plugins-page-rtl.css 386 B
release/woocommerce-payments/dist/plugins-page.css 386 B
release/woocommerce-payments/dist/plugins-page.js 20.1 kB
release/woocommerce-payments/dist/product-details-rtl.css 433 B
release/woocommerce-payments/dist/product-details.css 436 B
release/woocommerce-payments/dist/product-details.js 11.6 kB
release/woocommerce-payments/dist/settings-rtl.css 11.6 kB
release/woocommerce-payments/dist/settings.css 11.5 kB
release/woocommerce-payments/dist/settings.js 223 kB
release/woocommerce-payments/dist/subscription-edit-page.js 703 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal-rtl.css 524 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.css 524 B
release/woocommerce-payments/dist/subscription-product-onboarding-modal.js 20.2 kB
release/woocommerce-payments/dist/subscription-product-onboarding-toast.js 730 B
release/woocommerce-payments/dist/subscriptions-empty-state-rtl.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.css 120 B
release/woocommerce-payments/dist/subscriptions-empty-state.js 19.3 kB
release/woocommerce-payments/dist/tokenized-payment-request-rtl.css 230 B
release/woocommerce-payments/dist/tokenized-payment-request.css 230 B
release/woocommerce-payments/dist/tokenized-payment-request.js 14.5 kB
release/woocommerce-payments/dist/tos-rtl.css 235 B
release/woocommerce-payments/dist/tos.css 235 B
release/woocommerce-payments/dist/tos.js 21.8 kB
release/woocommerce-payments/dist/woopay-direct-checkout.js 6.14 kB
release/woocommerce-payments/dist/woopay-express-button.js 24.1 kB
release/woocommerce-payments/dist/woopay-rtl.css 4.54 kB
release/woocommerce-payments/dist/woopay.css 4.51 kB
release/woocommerce-payments/dist/woopay.js 71.3 kB
release/woocommerce-payments/includes/subscriptions/assets/css/plugin-page.css 625 B
release/woocommerce-payments/includes/subscriptions/assets/js/plugin-page.js 814 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/i18n-loader.js 2.46 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/jetpack-script-data.js 735 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/build/react-jsx-runtime.js 553 B
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/i18n-loader.js 1.02 kB
release/woocommerce-payments/vendor/automattic/jetpack-assets/src/js/script-data.js 69 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/babel.config.js 163 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.css 2.45 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.js 14.2 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/identity-crisis.rtl.css 2.45 kB
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.js 280 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-admin-create-user.rtl.css 198 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.css 625 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.js 333 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-login.rtl.css 626 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/jetpack-sso-users.js 417 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-ajax.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/dist/tracks-callables.js 584 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.css 215 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-admin-create-user.js 521 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.css 721 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-login.js 412 B
release/woocommerce-payments/vendor/automattic/jetpack-connection/src/sso/jetpack-sso-users.js 621 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/about.css 1.04 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-empty-state.css 294 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin-order-statuses.css 408 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/admin.css 3.59 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/checkout.css 301 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/modal.css 746 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/view-subscription.css 574 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/css/wcs-upgrade.css 414 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin-pointers.js 543 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/admin.js 9.4 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.js 6.78 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/jstz.min.js 3.84 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-coupon.js 545 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/meta-boxes-subscription.js 2.52 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.js 22.2 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/moment.min.js 11.7 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/payment-method-restrictions.js 1.29 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/admin/wcs-meta-boxes-order.js 507 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/payment-methods.js 358 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/single-product.js 428 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/view-subscription.js 1.38 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/frontend/wcs-cart.js 782 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/modal.js 1.09 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/assets/js/wcs-upgrade.js 1.26 kB
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.css 391 B
release/woocommerce-payments/vendor/woocommerce/subscriptions-core/build/index.js 3.04 kB

compressed-size-action

@vladolaru vladolaru self-assigned this Sep 13, 2024
@vladolaru vladolaru requested a review from a team September 13, 2024 15:42
@vladolaru vladolaru changed the title Fix/9434 action scheduler service schedule job init Improve our job scheduling service for more resilience Sep 13, 2024
@vladolaru vladolaru marked this pull request as ready for review September 13, 2024 15:43
@vladolaru
Copy link
Contributor Author

Thank you for digging into the flaky unit tests on GitHub CI, @tpaksu! I also thought about force-calling the AS init hook, but refrained from it because of the danger of side effects, the primary one being that the AS is not initialized, but we are "letting the world know" that it has.

But since we have no better way forward, and it is only affecting our unit tests, I think we can go with it and revisit if it turns out to bite us in the back.

@tpaksu
Copy link
Contributor

tpaksu commented Sep 16, 2024

@vladolaru the action action_scheduler_init doesn't seem to be triggered anywhere in the code on GH Actions, and because of that the job isn't scheduled.

When I searched for ActionScheduler::init in my local client folder, it seems there are 4-5 different versions installed:

  • 3.7.2
  • 3.1.6
  • 3.8.0
  • 3.8.2
  • 3.7.4

and on plugins_loaded hook, it calls ActionScheduler_Versions::initialize_latest_version() which seems to be stubbed in /vendor/php-stubs/woocommerce-stubs/woocommerce-packages-stubs.php with an empty body.

I don't know if this is the real cause on GH, but maybe, we can add another clause to the function you modified on our side, that checks if the plugins_loaded hook did run, and action_scheduler_init is didn't run, and ActionScheduler_Versions class exists, then initialize the ActionScheduler manually with ActionScheduler_Versions::initialize_latest_version() or ActionScheduler::init(), to fix this on GH Actions.

@vladolaru
Copy link
Contributor Author

Update: After much investigation with @tpaksu (see p1726471929778379/1719838546.986229-slack-C03KTTK2YMA), we found out why PHPUnit tests were failing in GitHub CI jobs, while they didn't locally. The reason is that we are using WC 7.6.0 in CI, and that version ships with a too-old version of ActionScheduler, one that doesn't fire the action_scheduler_init hook.

To maintain backward compatibility (until we increase the minimum supported WC version - there was an attempt to do so), we introduced logic to check for the WC 7.9.0 version.

Copy link
Contributor

@oaratovskyi oaratovskyi left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changes look good and work according to the instructions! :shipit:

@vladolaru vladolaru added this pull request to the merge queue Sep 16, 2024
Merged via the queue into develop with commit 0b88126 Sep 16, 2024
25 checks passed
@vladolaru vladolaru deleted the fix/9434-action-scheduler-service-schedule-job-init branch September 16, 2024 10:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Notices are triggered due to scheduling AS jobs too early
4 participants