diff --git a/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Edit/Tab/Form.php b/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Edit/Tab/Form.php index c9c9941..aa71fc2 100644 --- a/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Edit/Tab/Form.php +++ b/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Edit/Tab/Form.php @@ -154,6 +154,20 @@ protected function _prepareForm() ) ); + $fieldset->addField( + 'memory_limit', + 'select', + array( + 'name' => 'memory_limit', + 'label' => $this->__('Memory limit'), + 'title' => $this->__('Memory limit'), + 'class' => '', + 'required' => false, + 'options' => Mage::getSingleton('aoe_scheduler/adminhtml_source_memorylimit')->toArray(), + 'after_element_html' => $this->getOriginalValueSnippet($job, 'memory_limit'), + ) + ); + $fieldset->addField( 'is_active', 'select', diff --git a/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Grid.php b/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Grid.php index a21e0dc..01c2757 100644 --- a/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Grid.php +++ b/app/code/community/Aoe/Scheduler/Block/Adminhtml/Job/Grid.php @@ -86,9 +86,10 @@ protected function _prepareColumns() $this->addColumn( 'job_code', array( - 'header' => $this->__('Job code'), - 'index' => 'job_code', - 'sortable' => false, + 'header' => $this->__('Job code'), + 'index' => 'job_code', + 'sortable' => false, + 'column_css_class' => 'job_code' ) ); @@ -127,6 +128,15 @@ protected function _prepareColumns() 'sortable' => false, ) ); + $this->addColumn( + 'memory_limit', + array( + 'header' => $this->__('Memory Limit'), + 'index' => 'memory_limit', + 'type' => 'select', + 'options' => Mage::getSingleton('aoe_scheduler/adminhtml_source_memorylimit')->toArray() + ) + ); $this->addColumn( 'parameters', array( diff --git a/app/code/community/Aoe/Scheduler/Model/Adminhtml/Source/Memorylimit.php b/app/code/community/Aoe/Scheduler/Model/Adminhtml/Source/Memorylimit.php new file mode 100644 index 0000000..1e9fb4d --- /dev/null +++ b/app/code/community/Aoe/Scheduler/Model/Adminhtml/Source/Memorylimit.php @@ -0,0 +1,41 @@ + Mage::helper('aoe_scheduler')->__('Default'), + '128M' => '128 Mo', + '256M' => '256 Mo', + '512M' => '512 Mo' + ); + } + + /** + * @return array + */ + public function toOptionArray() + { + $options = array(); + $array = $this->toArray(); + foreach ($array as $value => $label) { + $options[] = array( + 'label' => $label, + 'value' => $value + ); + } + return $options; + } + +} \ No newline at end of file diff --git a/app/code/community/Aoe/Scheduler/Model/Job.php b/app/code/community/Aoe/Scheduler/Model/Job.php index f7b46a3..cf3a85e 100755 --- a/app/code/community/Aoe/Scheduler/Model/Job.php +++ b/app/code/community/Aoe/Scheduler/Model/Job.php @@ -14,6 +14,8 @@ * @method string getScheduleConfigPath() * @method Aoe_Scheduler_Model_Job setRunModel($runModel) * @method string getRunModel() + * @method Aoe_Scheduler_Model_Job setMemoryLimit($memory_limit) + * @method string getMemoryLimit() * @method Aoe_Scheduler_Model_Job setParameters($parameters) * @method string getParameters() * @method Aoe_Scheduler_Model_Job setGroups($groups) diff --git a/app/code/community/Aoe/Scheduler/Model/Resource/Job.php b/app/code/community/Aoe/Scheduler/Model/Resource/Job.php index 6190ac0..4c2ecd9 100644 --- a/app/code/community/Aoe/Scheduler/Model/Resource/Job.php +++ b/app/code/community/Aoe/Scheduler/Model/Resource/Job.php @@ -266,6 +266,11 @@ private function getJobDataFromConfig($jobCode, $useDefaultScope = false, $defau } elseif ($default !== null) { $values['schedule/cron_expr'] = $default; } + if (isset($config['memory_limit'])) { + $values['memory_limit'] = $config['memory_limit']; + } elseif ($default !== null) { + $values['memory_limit'] = $default; + } if (isset($config['parameters'])) { $values['parameters'] = $config['parameters']; } elseif ($default !== null) { @@ -326,6 +331,7 @@ public function getJobDataFromModel(Aoe_Scheduler_Model_Job $job) 'run/model' => $job->getRunModel(), 'schedule/config_path' => $job->getScheduleConfigPath(), 'schedule/cron_expr' => $job->getScheduleCronExpr(), + 'memory_limit' => $job->getMemoryLimit(), 'parameters' => $job->getParameters(), 'groups' => $job->getGroups(), 'is_active' => ($job->getIsActive() ? '1' : '0'), @@ -352,6 +358,7 @@ public function setModelFromJobData(Aoe_Scheduler_Model_Job $job, array $data) $job->setScheduleCronExpr(isset($data['schedule/cron_expr']) ? $data['schedule/cron_expr'] : ''); $job->setParameters(isset($data['parameters']) ? $data['parameters'] : ''); $job->setGroups(isset($data['groups']) ? $data['groups'] : ''); + $job->setMemoryLimit(isset($data['memory_limit']) ? $data['memory_limit'] : ''); $job->setIsActive(isset($data['is_active']) ? $data['is_active'] : ''); return $job; } diff --git a/app/code/community/Aoe/Scheduler/Model/Schedule.php b/app/code/community/Aoe/Scheduler/Model/Schedule.php index d31dd10..15d155d 100755 --- a/app/code/community/Aoe/Scheduler/Model/Schedule.php +++ b/app/code/community/Aoe/Scheduler/Model/Schedule.php @@ -181,6 +181,7 @@ public function runNow($tryLockJob = true, $forceRun = false) if (!$job) { Mage::throwException(sprintf("Could not create job with jobCode '%s'", $this->getJobCode())); } + $this->manageMemoryLimit($job); $startTime = time(); $this @@ -943,4 +944,18 @@ public function setLastRunUser($user = null) return $this; } + /** + * Dynamically change memory limit from job configuration + * @param Aoe_Scheduler_Model_Job $job + */ + private function manageMemoryLimit($job) + { + $phpMemoryLimit = ini_get('memory_limit'); + $jobMemoryLimit = $job->getMemoryLimit(); + if (!in_array($phpMemoryLimit, array(-1, '')) && $phpMemoryLimit < $jobMemoryLimit) { + ini_set('memory_limit', $jobMemoryLimit); + $this->log('Set memory limit to ' . $jobMemoryLimit . ' for job code : '.$job->getJobCode()); + } + } + } diff --git a/app/code/community/Aoe/Scheduler/controllers/Adminhtml/JobController.php b/app/code/community/Aoe/Scheduler/controllers/Adminhtml/JobController.php index e500cc9..98b1adb 100644 --- a/app/code/community/Aoe/Scheduler/controllers/Adminhtml/JobController.php +++ b/app/code/community/Aoe/Scheduler/controllers/Adminhtml/JobController.php @@ -163,7 +163,7 @@ public function editAction() $this->_initAction() ->_addBreadcrumb($this->__('Edit Job'), $this->__('Edit Job')) ->_title($this->__('Edit Job')) - ->renderLayout(); + ->renderLayout(); } protected function _filterPostData($data) @@ -270,6 +270,31 @@ public function deleteAction() return; } + /** + * Ajax action: change memory + * + * @return void + */ + public function changeMemoryAction() + { + $success = false; + if (($jobCode = $this->getRequest()->getParam('job_code')) && !is_null($memoryLimit = $this->getRequest()->getParam('memory_limit'))) { + $configPath = 'crontab/jobs/' . $jobCode . '/memory_limit'; + if ($memoryLimit != Mage::getStoreConfig($configPath)) { + try { + Mage::getModel('core/config')->saveConfig($configPath, $memoryLimit); + Mage::app()->getCache()->clean(Zend_Cache::CLEANING_MODE_MATCHING_TAG, array(Mage_Core_Model_Config::CACHE_TAG)); + $success = true; + } catch (Exception $e) { + Mage::helper('magextrem_utils/logger') + ->setFilename('magextrem/aoe_scheduler') + ->logException($e); + } + } + } + $this->getResponse()->setBody(Zend_Json::encode(array('success' => (int)$success))); + } + /** * ACL checking * diff --git a/app/design/adminhtml/default/default/layout/aoe_scheduler/aoe_scheduler.xml b/app/design/adminhtml/default/default/layout/aoe_scheduler/aoe_scheduler.xml index 57b32e1..5b7198c 100644 --- a/app/design/adminhtml/default/default/layout/aoe_scheduler/aoe_scheduler.xml +++ b/app/design/adminhtml/default/default/layout/aoe_scheduler/aoe_scheduler.xml @@ -40,6 +40,10 @@ aoe_scheduler/StyleSheet/bars.css + skin_jsaoe_scheduler/JavaScript/memory_limit.js + + + diff --git a/app/design/adminhtml/default/default/template/aoe_scheduler/javascript_url.phtml b/app/design/adminhtml/default/default/template/aoe_scheduler/javascript_url.phtml new file mode 100644 index 0000000..d166c8f --- /dev/null +++ b/app/design/adminhtml/default/default/template/aoe_scheduler/javascript_url.phtml @@ -0,0 +1,7 @@ + + + \ No newline at end of file diff --git a/skin/adminhtml/default/default/aoe_scheduler/JavaScript/memory_limit.js b/skin/adminhtml/default/default/aoe_scheduler/JavaScript/memory_limit.js new file mode 100644 index 0000000..9ffea83 --- /dev/null +++ b/skin/adminhtml/default/default/aoe_scheduler/JavaScript/memory_limit.js @@ -0,0 +1,19 @@ +document.observe('dom:loaded', function () { + $$('#job_grid_table select[name="memory_limit"]').invoke('observe', 'change', function (event) { + var job_code = this.up('tr').down('.job_code').textContent.trim(); + var memory_limit = this.value; + new Ajax.Request( + BASE_ADMIN_URL + 'job/changeMemory', + { + method: 'post', + parameters: {job_code: job_code, memory_limit: memory_limit}, + onSuccess: function (transport) { + var json = transport.responseText.evalJSON() || '{}'; + if (!json.success) { + alert('error saving memory limit, please check your logs'); + } + } + } + ); + }); +}); \ No newline at end of file