From 81f5dd7774119e6f35f4594a68b25e53a22e65f2 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Wed, 09 Nov 2011 08:40:23 -0500
Subject: [PATCH] Consider replication delays in session storage

---
 program/steps/mail/compose.inc    |    8 ++++++++
 program/include/rcube_session.php |   12 ++++++++++++
 2 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/program/include/rcube_session.php b/program/include/rcube_session.php
index e8bd9d0..22aa550 100644
--- a/program/include/rcube_session.php
+++ b/program/include/rcube_session.php
@@ -394,6 +394,18 @@
 
 
   /**
+   * Re-read session data from storage backend
+   */
+  public function reload()
+  {
+    if ($this->key && $this->memcache)
+      $this->mc_read($this->key);
+    else if ($this->key)
+      $this->db_read($this->key);
+  }
+
+
+  /**
    * Serialize session data
    */
   private function serialize($vars)
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index 6961bf8..c527ce1 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -31,6 +31,14 @@
 $COMPOSE_ID = get_input_value('_id', RCUBE_INPUT_GET);
 $_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID];
 
+// give replicated session storage some time to synchronize
+$retries = 0;
+while ($COMPOSE_ID && !is_array($_SESSION['compose']) && $RCMAIL->db->is_replicated() && $retries++ < 5) {
+  usleep(500000);
+  $RCMAIL->session->reload();
+  $_SESSION['compose'] = $_SESSION['compose_data_'.$COMPOSE_ID];
+}
+
 // Nothing below is called during message composition, only at "new/forward/reply/draft" initialization or
 // if a compose-ID is given (i.e. when the compose step is opened in a new window/tab).
 if (!is_array($_SESSION['compose']))

--
Gitblit v1.9.1