Index: includes/database/database.inc =================================================================== RCS file: /cvs/drupal/drupal/includes/database/database.inc,v retrieving revision 1.56 diff -u -r1.56 database.inc --- includes/database/database.inc 27 Jun 2009 09:44:05 -0000 1.56 +++ includes/database/database.inc 29 Jun 2009 21:01:53 -0000 @@ -2687,6 +2687,21 @@ return $query; } +/** + * Helper function to get duration lag from variable + * if one isn't passed, and then set the session variable + * that contains the lag. + * + * @param $duration + * The amount of time to ignore the slave to give it + * time to refresh after an insert or update. + */ +function db_ignore_slave() { + if (!$duration) { + $duration = variable_get('maximum_replication_lag', 300); + } + $_SESSION['ignore_slave_server'] = REQUEST_TIME + $duration; +} /** * @} End of "ingroup database-legacy". Index: modules/comment/comment.module =================================================================== RCS file: /cvs/drupal/drupal/modules/comment/comment.module,v retrieving revision 1.729 diff -u -r1.729 comment.module --- modules/comment/comment.module 27 Jun 2009 10:13:28 -0000 1.729 +++ modules/comment/comment.module 29 Jun 2009 21:03:58 -0000 @@ -972,6 +972,9 @@ 'homepage' => $comment['homepage'], )) ->execute(); + // Ignore slave server temporarily to give time for the + // saved node to be propagated to the slave. + db_ignore_slave(); // Tell the other modules a new comment has been submitted. comment_invoke_comment($comment, 'insert'); // Add an entry to the watchdog log. Index: modules/node/node.module =================================================================== RCS file: /cvs/drupal/drupal/modules/node/node.module,v retrieving revision 1.1075 diff -u -r1.1075 node.module --- modules/node/node.module 27 Jun 2009 18:19:41 -0000 1.1075 +++ modules/node/node.module 29 Jun 2009 21:05:05 -0000 @@ -1003,6 +1003,10 @@ // Clear the page and block caches. cache_clear_all(); + + // Ignore slave server temporarily to give time for the + // saved node to be propagated to the slave. + db_ignore_slave(); } /** Index: modules/system/system.module =================================================================== RCS file: /cvs/drupal/drupal/modules/system/system.module,v retrieving revision 1.716 diff -u -r1.716 system.module --- modules/system/system.module 28 Jun 2009 12:52:57 -0000 1.716 +++ modules/system/system.module 29 Jun 2009 21:06:46 -0000 @@ -872,8 +872,32 @@ drupal_add_css(drupal_get_path('module', 'system') . '/defaults.css'); drupal_add_css(drupal_get_path('module', 'system') . '/system.css'); drupal_add_css(drupal_get_path('module', 'system') . '/system-menus.css'); + + + // Ignore slave database servers for this request. + // + // In Drupal's distributed database structure, new data is written to the master + // and then propagated to the slave servers. This means there is a lag + // between when data is written to the master and when it is available on the slave. + // At these times, we will want to avoid using a slave server temporarily. + // For example, if a user posts a new node then we want to disable the slave + // server for that user temporarily to allow the slave server to catch up. + // That way, that user will see their changes immediately while for other + // users we still get the benefits of having a slave server, just with slightly + // stale data. Code that wants to disable the slave server should use the + // db_set_ignore_slave() function to set $_SESSION['ignore_slave_server'] to + // the timestamp after which the slave can be re-enabled. + if (isset($_SESSION['ignore_slave_server'])) { + if ($_SESSION['ignore_slave_server'] >= REQUEST_TIME) { + Database::ignoreTarget('default', 'slave'); + } + else { + unset($_SESSION['ignore_slave_server']); + } + } } + /** * Implement MODULE_preprocess_HOOK(). */