aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriendika <info@friendika.com>2011-06-30 21:56:07 -0700
committerFriendika <info@friendika.com>2011-06-30 21:56:07 -0700
commit481cd708acfd3291eed7eba6af596c541651963c (patch)
tree57419b2e19f2102b4e8580bd0d3071514a962bc0
parent84ee783a2acb3ad0575b8f8cadeda1a009d1bd99 (diff)
downloadvolse-hubzilla-481cd708acfd3291eed7eba6af596c541651963c.tar.gz
volse-hubzilla-481cd708acfd3291eed7eba6af596c541651963c.tar.bz2
volse-hubzilla-481cd708acfd3291eed7eba6af596c541651963c.zip
allow polling to mostly survive minor memory shortages.
-rw-r--r--addon/facebook/facebook.php10
-rw-r--r--boot.php12
-rw-r--r--include/poller.php32
3 files changed, 49 insertions, 5 deletions
diff --git a/addon/facebook/facebook.php b/addon/facebook/facebook.php
index 49f193804..c54d5b5f0 100644
--- a/addon/facebook/facebook.php
+++ b/addon/facebook/facebook.php
@@ -376,9 +376,12 @@ function facebook_cron($a,$b) {
logger('facebook_cron');
- set_config('facebook','last_poll', time());
- $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ");
+ // Find the FB users on this site and randomize in case one of them
+ // uses an obscene amount of memory. It may kill this queue run
+ // but hopefully we'll get a few others through on each run.
+
+ $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'post' AND `v` = '1' ORDER BY RAND() ");
if(count($r)) {
foreach($r as $rr) {
// check for new friends once a day
@@ -392,6 +395,9 @@ function facebook_cron($a,$b) {
fb_consume_all($rr['uid']);
}
}
+
+ set_config('facebook','last_poll', time());
+
}
diff --git a/boot.php b/boot.php
index 27c801923..b81bd9cfc 100644
--- a/boot.php
+++ b/boot.php
@@ -2908,3 +2908,15 @@ function get_plugin_info($plugin){
}
return $info;
}}
+
+if(! function_exists('return_bytes')) {
+function return_bytes ($size_str) {
+ switch (substr ($size_str, -1))
+ {
+ case 'M': case 'm': return (int)$size_str * 1048576;
+ case 'K': case 'k': return (int)$size_str * 1024;
+ case 'G': case 'g': return (int)$size_str * 1073741824;
+ default: return $size_str;
+ }
+}}
+
diff --git a/include/poller.php b/include/poller.php
index 4cab5a3b8..666748cbc 100644
--- a/include/poller.php
+++ b/include/poller.php
@@ -2,6 +2,7 @@
require_once("boot.php");
+
function poller_run($argv, $argc){
global $a, $db;
@@ -47,18 +48,26 @@ function poller_run($argv, $argc){
proc_run('php','include/expire.php');
}
-
// clear old cache
q("DELETE FROM `cache` WHERE `updated` < '%s'",
dbesc(datetime_convert('UTC','UTC',"now - 30 days")));
$manual_id = 0;
+ $generation = 0;
$hub_update = false;
$force = false;
+ $restart = false;
if(($argc > 1) && ($argv[1] == 'force'))
$force = true;
+ if(($argc > 1) && ($argv[1] == 'restart')) {
+ $restart = true;
+ $generation = intval($argv[2]);
+ if(! $generation)
+ killme();
+ }
+
if(($argc > 1) && intval($argv[1])) {
$manual_id = intval($argv[1]);
$force = true;
@@ -70,7 +79,8 @@ function poller_run($argv, $argc){
$d = datetime_convert();
- call_hooks('cron', $d);
+ if(! $restart)
+ call_hooks('cron', $d);
$contacts = q("SELECT `id` FROM `contact`
@@ -95,7 +105,7 @@ function poller_run($argv, $argc){
continue;
foreach($res as $contact) {
-
+ logger('processing a contact');
$xml = false;
if($manual_id)
@@ -154,6 +164,22 @@ function poller_run($argv, $argc){
continue;
}
+ // Check to see if we are running out of memory - if so spawn a new process and kill this one
+
+ $avail_memory = return_bytes(ini_get('memory_limit'));
+ $memused = memory_get_peak_usage(true);
+ if(intval($avail_memory)) {
+ if(($memused / $avail_memory) > 0.95) {
+ if($generation + 1 > 10) {
+ logger('poller: maximum number of spawns exceeded. Terminating.');
+ killme();
+ }
+ logger('poller: memory exceeded. ' . $memused . ' bytes used. Spawning new poll.');
+ proc_run('php', 'include/poller.php', 'restart', (string) $generation + 1);
+ killme();
+ }
+ }
+
$importer_uid = $contact['uid'];
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1",