Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When does automatic partial reindexing actually run in Magento EE 1.13?

Magento 1.13 added partial indexing for most indexes along with the ability to defer the indexing process to a cron job that runs asynchronously.

My question then is, is there an existing cron job that does this or is this something I have to set up myself?

The documentation is not clear on this: http://www.magentocommerce.com/knowledge-base/entry/ee113-indexing#reindex-options

  • Update when scheduled to schedule reindexing using your Magento cron job.
  • The change occurs either within the minute or according to your cron job schedule.

This leads me to believe it's an existing process that runs every time the cron runs.

I see the index cleaner schedule, but that only appears to clear out old records in the change log tables. It does not seem to actually do any indexing.

I can't seem to find a cron job in core code that runs these indexes.

like image 428
kirkmadera Avatar asked Jan 23 '14 23:01

kirkmadera


1 Answers

I think I found it. enterprise_refresh_index

<enterprise_refresh_index>
    <schedule>
        <cron_expr>always</cron_expr>
    </schedule>
    <run>
        <model>enterprise_index/observer::refreshIndex</model>
    </run>
</enterprise_refresh_index>

public function refreshIndex(Mage_Cron_Model_Schedule $schedule)
{
    /** @var $helper Enterprise_Index_Helper_Data */
    $helper = Mage::helper('enterprise_index');

    /** @var $lock Enterprise_Index_Model_Lock */
    $lock   = Enterprise_Index_Model_Lock::getInstance();

    if ($lock->setLock(self::REINDEX_FULL_LOCK)) {

        /**
         * Workaround for fatals and memory crashes: Invalidating indexers that are in progress
         * Successful lock setting is considered that no other full reindex processes are running
         */
        $this->_invalidateInProgressIndexers();

        $client = Mage::getModel('enterprise_mview/client');
        try {

            //full re-index
            $inactiveIndexes = $this->_getInactiveIndexersByPriority();
            $rebuiltIndexes = array();
            foreach ($inactiveIndexes as $inactiveIndexer) {
                $tableName  = (string)$inactiveIndexer->index_table;
                $actionName = (string)$inactiveIndexer->action_model->all;
                $client->init($tableName);
                if ($actionName) {
                    $client->execute($actionName);
                    $rebuiltIndexes[] = $tableName;
                }
            }

            //re-index by changelog
            $indexers = $helper->getIndexers(true);
            foreach ($indexers as $indexerName => $indexerData) {
                $indexTable = (string)$indexerData->index_table;
                $actionName = (string)$indexerData->action_model->changelog;
                $client->init($indexTable);
                if (isset($actionName) && !in_array($indexTable, $rebuiltIndexes)) {
                    $client->execute($actionName);
                }
            }

        } catch (Exception $e) {
            $lock->releaseLock(self::REINDEX_FULL_LOCK);
            throw $e;
        }

        $lock->releaseLock(self::REINDEX_FULL_LOCK);
    }

    return $this;
}

This runs "always" on every cron execution. It runs full reindexes for the indexes that need and and processes the changelog for those that don't.

like image 163
kirkmadera Avatar answered Sep 21 '22 11:09

kirkmadera