diff --git a/boot.php b/boot.php index d0215e81f..497451224 100644 --- a/boot.php +++ b/boot.php @@ -2365,6 +2365,36 @@ function get_lockpath() { return ""; } +/** + * @brief Returns the path where spool files are stored + * + * @return string Spool path + */ +function get_spoolpath() { + $spoolpath = get_config('system','spoolpath'); + if (($spoolpath != "") AND is_dir($spoolpath) AND is_writable($spoolpath)) { + return($spoolpath); + } + + $temppath = get_temppath(); + + if ($temppath != "") { + $spoolpath = $temppath."/spool"; + + if (!is_dir($spoolpath)) { + mkdir($spoolpath); + } elseif (!is_writable($spoolpath)) { + $spoolpath = $temppath; + } + + if (is_dir($spoolpath) AND is_writable($spoolpath)) { + set_config("system", "spoolpath", $spoolpath); + return($spoolpath); + } + } + return ""; +} + function get_temppath() { $a = get_app(); diff --git a/include/items.php b/include/items.php index e9354b62d..0445c4490 100644 --- a/include/items.php +++ b/include/items.php @@ -417,6 +417,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa $dsprsig = null; if (x($arr,'dsprsig')) { + $encoded_signature = $arr['dsprsig']; $dsprsig = json_decode(base64_decode($arr['dsprsig'])); unset($arr['dsprsig']); } @@ -845,15 +846,27 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa } } else { // This can happen - for example - if there are locking timeouts. - logger("Item wasn't stored - we quit here."); - q("COMMIT"); + q("ROLLBACK"); + + // Store the data into a spool file so that we can try again later. + + // At first we restore the Diaspora signature that we removed above. + if (isset($encoded_signature)) { + $arr['dsprsig'] = $encoded_signature; + } + + // Now we store the data in the spool directory + $file = 'item-'.round(microtime(true) * 10000).".msg"; + $spool = get_spoolpath().'/'.$file; + file_put_contents($spool, json_encode($arr)); + logger("Item wasn't stored - Item was spooled into file ".$file, LOGGER_DEBUG); return 0; } if ($current_post == 0) { // This is one of these error messages that never should occur. logger("couldn't find created item - we better quit now."); - q("COMMIT"); + q("ROLLBACK"); return 0; } @@ -868,7 +881,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa if (!dbm::is_result($r)) { // This shouldn't happen, since COUNT always works when the database connection is there. logger("We couldn't count the stored entries. Very strange ..."); - q("COMMIT"); + q("ROLLBACK"); return 0; } @@ -883,7 +896,7 @@ function item_store($arr,$force_parent = false, $notify = false, $dontcache = fa } elseif ($r[0]["entries"] == 0) { // This really should never happen since we quit earlier if there were problems. logger("Something is terribly wrong. We haven't found our created entry."); - q("COMMIT"); + q("ROLLBACK"); return 0; } diff --git a/include/poller.php b/include/poller.php index b3a66fc38..925de3fe5 100644 --- a/include/poller.php +++ b/include/poller.php @@ -556,6 +556,9 @@ function clear_worker_processes() { function poller_run_cron() { logger('Add cron entries', LOGGER_DEBUG); + // Check for spooled items + proc_run(PRIORITY_HIGH, "include/spool_post.php"); + // Run the cron job that calls all other jobs proc_run(PRIORITY_MEDIUM, "include/cron.php"); diff --git a/include/spool_post.php b/include/spool_post.php new file mode 100644 index 000000000..c42928a67 --- /dev/null +++ b/include/spool_post.php @@ -0,0 +1,49 @@ + diff --git a/mod/worker.php b/mod/worker.php index aebffed74..c202a28d6 100644 --- a/mod/worker.php +++ b/mod/worker.php @@ -14,8 +14,10 @@ function worker_init($a){ return; } - // We don't need the following lines if we can execute background jobs + // We don't need the following lines if we can execute background jobs. + // So we just wake up the worker if it sleeps. if (function_exists("proc_open")) { + call_worker_if_idle(); return; }