-
Notifications
You must be signed in to change notification settings - Fork 9.4k
Avoids endless loop of indexers being marked as invalid #29196
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
Avoids endless loop of indexers being marked as invalid #29196
Conversation
Hi @hostep. Thank you for your contribution
❗ Automated tests can be triggered manually with an appropriate comment:
You can find more information about the builds here ℹ️ Please run only needed test builds instead of all when developing. Please run all test builds before sending your PR for review. For more details, please, review the Magento Contributor Guide documentation. 🕙 You can find the schedule on the Magento Community Calendar page. 📞 The triage of Pull Requests happens in the queue order. If you want to speed up the delivery of your contribution, please join the Community Contributions Triage session to discuss the appropriate ticket. 🎥 You can find the recording of the previous Community Contributions Triage on the Magento Youtube Channel ✏️ Feel free to post questions/proposals/feedback related to the Community Contributions Triage process to the corresponding Slack Channel |
@magento run all tests |
758a885
to
f0c6453
Compare
@magento run Static Tests,Unit Tests |
@magento run Unit Tests |
@magento run all tests |
Hi @hostep. That's a good point, thank you for your collaboration. Additionally, I would create a separate service i.e. |
@magento run WebAPI Tests |
Just some extra information regarding the server impact we noticed due to this change.
|
And some further info for the people interested. |
Hi @rogyar, thank you for the review. |
@magento create issue |
@magento run all tests |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @hostep, thanks for your pull request, please follow a small comment regards your changes (I think it may be important). Also, I strongly recommend avoiding the code duplication between this class and IndexerReindexCommand
, by duplicating the code we are leaving a gap that could result in these 2 classes having different behavior again, what do you think? Thanks.
private function validateSharedIndex(string $sharedIndex): self | ||
{ | ||
if (empty($sharedIndex)) { | ||
throw new \InvalidArgumentException( |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I guess it would be important to handle this exception on the reindexAllInvalid
, otherwise, the whole command would keep failing on a specific indexer and not move forward. Also, I would recommend logging the exception msg.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You are probably right, but this falls out of scope of this PR, it might fit better in the refactoring step which should happen when resolving #29297
Sorry for being so strict, but I want to this bug to be fixed as soon as possible and not being held back by "code quality" requirements. That can happen later. The refactoring will probably not take that much time, but rewriting all the automated tests will take a significant amount of time and I don't have a lot of free time at the moment. Sorry!
Hi @rogyar, thank you for the review. |
@hostep hello! I cannot reproduce the issue you are fixing in this PR. Can you please provide some additional information? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Cannot reproduce by provided test steps.
Pull Request state was updated. Re-review required.
QA passed. |
Hi @hostep, thank you for your contribution! |
Thanks for merging and for the extra assistance by @engcom-Golf & @engcom-Foxtrot! |
This issue was happening for us on a Magento 2.3.5 store, I've pushed the core PR code to a module/composer package for anyone that needs it on earlier versions https://github.com/develodesign/magento-2-indexer-loop-fix |
Description (*)
Hi
This was discovered on a particular project where we noticed that the indexers
catalogrule_rule
andcatalog_category_product
are constantly being marked asReindex required
.The cronjob
indexer_reindex_all_invalid
is running and is supposed to fix this, but that doesn't happen.If however, I stop the cronjobs, and manually execute
bin/magento indexer:reindex catalogrule_rule catalog_category_product
we see a different behavior and onlycatalog_category_product
is then marked asReindex required.
. If I then execute eitherbin/magento indexer:reindex catalog_category_product
or let the cronjobindexer_reindex_all_invalid
take over again, everything is getting back to a stable state and all indexers are marked asReady
.So this means that the execution of the
indexer_reindex_all_invalid
cronjob andbin/magento indexer:reindex {all-invalid-indexers}
are behaving differently which isn't correct in my opinion.We've seen this happening with Magento OS 2.3.5, and I was able to reproduce it on the
2.4-develop
branch (using commit f39a2e0)I currently only have a way to reproduce it by using the database of this particular project and we also need a particular module from Amasty installed as well (the Improved Layered Navigation module version 2.14.3).
But in my opinion it's not a bug in the Amasty module but a problem in core Magento since we see a difference in behavior in how invalid indexers are reindexed if you do it manually or if the cronjob executes it.
After searching around a bit I noticed a particular commit which was only applied to the manual reindexing command: MAGETWO-51540: Linked indexers catalog_category_product and catalog_product_cateogry do not set valid status after shell run.
So I now introduced these same changes to the code which is used by the
indexer_reindex_all_invalid
cronjob and after testing these changes on both our project (on Magento 2.3.5) as on my test on the2.4-develop
branch, it looks like it fixes the issue.In my opinion, this is a pretty important bugfix, because this bug causes the server of this particular project to have a high CPU load because of the constant reindexing which happens with every cron run which is not necessary.
In my opinion, we should also try to refactor the code so both
bin/magento indexer:reindex
as the cronjobindexer_reindex_all_invalid
should use the same code so we can avoid in the future where one fix is applied to one part and forgotten about in the other part.I've currently chosen not to refactor this so it's easier to review these changes, and maybe somebody can follow up in a later PR to refactor this?
Related Pull Requests
Fixed Issues (if relevant)
Manual testing scenarios (*)
bin/magento setup:upgrade
bin/magento indexer:reindex
so all indexers are marked as validbin/magento indexer:reset catalogrule_rule catalog_category_product
bin/magento indexer:status
(the two indexers should be marked as invalid)php n98-magerun2.phar sys:cron:run indexer_reindex_all_invalid
bin/magento indexer:status
(the two indexers are still marked as invalid)php n98-magerun2.phar sys:cron:run indexer_reindex_all_invalid
bin/magento indexer:status
(the two indexers are still marked as invalid)bin/magento indexer:reindex catalogrule_rule catalog_category_product
bin/magento indexer:status
(only one indexers is marked as invalid:catalog_category_product
)php n98-magerun2.phar sys:cron:run indexer_reindex_all_invalid
bin/magento indexer:status
(All indexers are now finally marked as valid)With this PR applied, after step 8, we can jump immediately to step 13. This is probably still not 100% fixing the problem since I would expect all indexers to be marked as valid after this, but maybe that Amasty module is intervening here, not exactly sure without more deeper debugging.
If somebody needs the database from this project, I'm willing to provide it to you in private via Slack for example, but it can contain confidential information, so please I'm asking internal Magento devs to not abuse the information in the database.
Thanks!
Questions or comments
Maybe a reproducible case is written down in internal ticket MAGETWO-51540 which you can try to reproduce using the
indexer_reindex_all_invalid
cronjob?Contribution checklist (*)
Resolved issues: