mozilla-sqlite-nfs.patch
author Wolfgang Rosenauer <wr@rosenauer.org>
Fri, 26 Oct 2012 23:25:51 +0200
branchesr10
changeset 570 bcc669f726e5
permissions -rw-r--r--
10.0.10esr
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
570
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     1
# HG changeset patch
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     2
# Parent 7854b317f3c3258c89887b3fbd5f88509445c8e5
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     3
# User Martin Stransky <stransky@redhat.com>
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     4
Bug 433129 - nfs hosted profiles/browsers result in broken search and history, r=asuth
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     5
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     6
diff --git a/storage/src/TelemetryVFS.cpp b/storage/src/TelemetryVFS.cpp
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     7
--- a/storage/src/TelemetryVFS.cpp
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     8
+++ b/storage/src/TelemetryVFS.cpp
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
     9
@@ -34,20 +34,31 @@
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    10
  * and other provisions required by the GPL or the LGPL. If you do not delete
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    11
  * the provisions above, a recipient may use your version of this file under
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    12
  * the terms of any one of the MPL, the GPL or the LGPL.
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    13
  *
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    14
  * ***** END LICENSE BLOCK ***** */
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    15
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    16
 #include <string.h>
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    17
 #include "mozilla/Telemetry.h"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    18
+#include "mozilla/Preferences.h"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    19
 #include "sqlite3.h"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    20
 #include "nsThreadUtils.h"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    21
 #include "mozilla/Util.h"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    22
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    23
+/**
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    24
+ * This preference is a workaround to allow users/sysadmins to identify
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    25
+ * that the profile exists on an NFS share whose implementation
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    26
+ * is incompatible with SQLite's default locking implementation.
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    27
+ * Bug 433129 attempted to automatically identify such file-systems, 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    28
+ * but a reliable way was not found and it was determined that the fallback 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    29
+ * locking is slower than POSIX locking, so we do not want to do it by default.
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    30
+*/
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    31
+#define PREF_NFS_FILESYSTEM   "storage.nfs_filesystem"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    32
+
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    33
 namespace {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    34
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    35
 using namespace mozilla;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    36
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    37
 struct Histograms {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    38
   const char *name;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    39
   const Telemetry::ID readB;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    40
   const Telemetry::ID writeB;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    41
@@ -463,23 +474,33 @@ xNextSystemCall(sqlite3_vfs *vfs, const 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    42
 }
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    43
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    44
 namespace mozilla {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    45
 namespace storage {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    46
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    47
 sqlite3_vfs* ConstructTelemetryVFS()
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    48
 {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    49
 #if defined(XP_WIN)
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    50
-#define EXPECTED_VFS "win32"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    51
+#define EXPECTED_VFS     "win32"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    52
+#define EXPECTED_VFS_NFS "win32"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    53
 #else
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    54
-#define EXPECTED_VFS "unix"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    55
+#define EXPECTED_VFS     "unix"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    56
+#define EXPECTED_VFS_NFS "unix-excl"
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    57
 #endif
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    58
-
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    59
-  sqlite3_vfs *vfs = sqlite3_vfs_find(NULL);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    60
-  const bool expected_vfs = vfs->zName && !strcmp(vfs->zName, EXPECTED_VFS);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    61
+  
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    62
+  bool expected_vfs;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    63
+  sqlite3_vfs *vfs;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    64
+  if (Preferences::GetBool(PREF_NFS_FILESYSTEM)) {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    65
+    vfs = sqlite3_vfs_find(EXPECTED_VFS_NFS);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    66
+    expected_vfs = (vfs != nsnull);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    67
+  }
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    68
+  else {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    69
+    vfs = sqlite3_vfs_find(NULL);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    70
+    expected_vfs = vfs->zName && !strcmp(vfs->zName, EXPECTED_VFS);
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    71
+  }
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    72
   if (!expected_vfs) {
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    73
     return NULL;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    74
   }
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    75
 
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    76
   sqlite3_vfs *tvfs = new ::sqlite3_vfs;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    77
   memset(tvfs, 0, sizeof(::sqlite3_vfs));
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    78
   tvfs->iVersion = 3;
bcc669f726e5 10.0.10esr
Wolfgang Rosenauer <wr@rosenauer.org>
parents:
diff changeset
    79
   // If the SQLite VFS version is updated, this shim must be updated as well.