[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#821757: wheezy-pu: package xapian-core/1.2.12-2



Package: release.debian.org
Severity: normal
Tags: wheezy
User: release.debian.org@packages.debian.org
Usertags: pu

I'd like to update xapian-core in wheezy to fix a bug which can cause
database corruption.  This is triggered by certain usage patterns, and
the recoll package is known to be affected:

https://bugs.debian.org/808610

I've attached a debdiff for the proposed upload.  The patch added is
from the upstream git repo - it's been on git master since 2015-04-28,
and in upstream stable releases since 2015-05-20.

There's already a pending request to address this in jessie:

https://bugs.debian.org/820059

The patch for wheezy is exactly the same as that for jessie, except with
a "quilt refresh" to adjust the line numbers of some of the hunks.

Cheers,
    Olly
diff -Nru xapian-core-1.2.12/debian/changelog xapian-core-1.2.12/debian/changelog
--- xapian-core-1.2.12/debian/changelog	2012-12-11 17:22:23.000000000 +1300
+++ xapian-core-1.2.12/debian/changelog	2016-04-19 13:14:15.000000000 +1200
@@ -1,3 +1,10 @@
+xapian-core (1.2.12-2+deb7u1) oldstable; urgency=medium
+
+  * New patch increment-cursor-version-on-cancel-or-reopen.patch fixing
+    possible database corruption, especially with recoll.  (Closes: #808610)
+
+ -- Olly Betts <olly@survex.com>  Tue, 19 Apr 2016 13:13:31 +1200
+
 xapian-core (1.2.12-2) unstable; urgency=low
 
   * New patch fix-db-write-lock.patch which fixes database write locking to
diff -Nru xapian-core-1.2.12/debian/patches/increment-cursor-version-on-cancel-or-reopen.patch xapian-core-1.2.12/debian/patches/increment-cursor-version-on-cancel-or-reopen.patch
--- xapian-core-1.2.12/debian/patches/increment-cursor-version-on-cancel-or-reopen.patch	1970-01-01 12:00:00.000000000 +1200
+++ xapian-core-1.2.12/debian/patches/increment-cursor-version-on-cancel-or-reopen.patch	2016-04-19 13:13:25.000000000 +1200
@@ -0,0 +1,197 @@
+Description: Increment cursor version of cancel or reopen
+ Potentially increment the cursor version on cancel() or when the database is
+ reopened, and flag the current cursor version as used when a cursor is
+ rebuilt.
+ .
+ Fixes database corruption issues with certain usage patterns, which recoll
+ can trigger.
+Author: Olly Betts <olly@survex.com>
+Origin: upstream, https://trac.xapian.org/changeset/826d1a19cc356e7bf66c1681626e70af32967447/git and https://trac.xapian.org/changeset/d784290ce015958474f965817f7a41f1483c3e03/git
+Bug: https://trac.xapian.org/ticket/675
+Bug-Debian: https://bugs.debian.org/808610
+Forwarded: https://trac.xapian.org/ticket/675
+Last-Update: 2016-04-19
+
+--- a/backends/brass/brass_cursor.cc
++++ b/backends/brass/brass_cursor.cc
+@@ -1,7 +1,7 @@
+ /* brass_cursor.cc: Btree cursor implementation
+  *
+  * Copyright 1999,2000,2001 BrightStation PLC
+- * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012 Olly Betts
++ * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012,2015 Olly Betts
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License as
+@@ -99,6 +99,7 @@
+     C[level].n = B->C[level].n;
+     C[level].p = B->C[level].p;
+     version = B->cursor_version;
++    B->cursor_created_since_last_modification = true;
+ }
+ 
+ BrassCursor::~BrassCursor()
+--- a/backends/brass/brass_table.cc
++++ b/backends/brass/brass_table.cc
+@@ -1435,6 +1435,11 @@
+ 
+     base_letter = ch;
+ 
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
++
+     /* ready to open the main file */
+ 
+     RETURN(true);
+@@ -1975,6 +1980,11 @@
+     changed_n = 0;
+     changed_c = DIR_START;
+     seq_count = SEQ_START_POINT;
++
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
+ }
+ 
+ /************ B-tree reading ************/
+--- a/backends/chert/chert_cursor.cc
++++ b/backends/chert/chert_cursor.cc
+@@ -1,7 +1,7 @@
+ /* chert_cursor.cc: Btree cursor implementation
+  *
+  * Copyright 1999,2000,2001 BrightStation PLC
+- * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012 Olly Betts
++ * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012,2015 Olly Betts
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License as
+@@ -97,6 +97,7 @@
+     C[level].n = B->C[level].n;
+     C[level].p = B->C[level].p;
+     version = B->cursor_version;
++    B->cursor_created_since_last_modification = true;
+ }
+ 
+ ChertCursor::~ChertCursor()
+--- a/backends/chert/chert_table.cc
++++ b/backends/chert/chert_table.cc
+@@ -1438,6 +1438,11 @@
+ 
+     base_letter = ch;
+ 
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
++
+     /* ready to open the main file */
+ 
+     RETURN(true);
+@@ -1994,6 +1999,11 @@
+     changed_n = 0;
+     changed_c = DIR_START;
+     seq_count = SEQ_START_POINT;
++
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
+ }
+ 
+ /************ B-tree reading ************/
+--- a/backends/flint/flint_cursor.cc
++++ b/backends/flint/flint_cursor.cc
+@@ -1,7 +1,7 @@
+ /* flint_cursor.cc: Btree cursor implementation
+  *
+  * Copyright 1999,2000,2001 BrightStation PLC
+- * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012 Olly Betts
++ * Copyright 2002,2003,2004,2005,2006,2007,2008,2009,2010,2012,2015 Olly Betts
+  *
+  * This program is free software; you can redistribute it and/or
+  * modify it under the terms of the GNU General Public License as
+@@ -97,6 +97,7 @@
+     C[level].n = B->C[level].n;
+     C[level].p = B->C[level].p;
+     version = B->cursor_version;
++    B->cursor_created_since_last_modification = true;
+ }
+ 
+ FlintCursor::~FlintCursor()
+--- a/backends/flint/flint_table.cc
++++ b/backends/flint/flint_table.cc
+@@ -1427,6 +1427,11 @@
+ 
+     base_letter = ch;
+ 
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
++
+     /* ready to open the main file */
+ 
+     return true;
+@@ -1976,6 +1981,11 @@
+     changed_n = 0;
+     changed_c = DIR_START;
+     seq_count = SEQ_START_POINT;
++
++    if (cursor_created_since_last_modification) {
++	cursor_created_since_last_modification = false;
++	++cursor_version;
++    }
+ }
+ 
+ /************ B-tree reading ************/
+--- a/tests/api_backend.cc
++++ b/tests/api_backend.cc
+@@ -788,3 +788,45 @@
+ 		   Xapian::Auto::open_stub("nosuchdirectory", Xapian::DB_OPEN));
+     return true;
+ }
++
++/// Regression test for #675, fixed in 1.3.3 and 1.2.21.
++DEFINE_TESTCASE(cursorbug1, brass || chert || flint) {
++    Xapian::WritableDatabase wdb = get_writable_database();
++    Xapian::Database db = get_writable_database_as_database();
++    Xapian::Enquire enq(db);
++    enq.set_query(Xapian::Query::MatchAll);
++    Xapian::MSet mset;
++    // The original problem triggers for chert and glass on repeat==7.
++    for (int repeat = 0; repeat < 10; ++repeat) {
++	tout.str(string());
++	tout << "iteration #" << repeat << endl;
++
++	const int ITEMS = 10;
++	int free_id = db.get_doccount();
++	int offset = max(free_id, ITEMS * 2) - (ITEMS * 2);
++	int limit = offset + (ITEMS * 2);
++
++	mset = enq.get_mset(offset, limit);
++	for (Xapian::MSetIterator m1 = mset.begin(); m1 != mset.end(); ++m1) {
++	    (void)m1.get_document().get_value(0);
++	}
++
++	for (int i = free_id; i <= free_id + ITEMS; ++i) {
++	    Xapian::Document doc;
++	    const string & id = str(i);
++	    string qterm = "Q" + id;
++	    doc.add_value(0, id);
++	    doc.add_boolean_term(qterm);
++	    wdb.replace_document(qterm, doc);
++	}
++	wdb.commit();
++
++	db.reopen();
++	mset = enq.get_mset(offset, limit);
++	for (Xapian::MSetIterator m2 = mset.begin(); m2 != mset.end(); ++m2) {
++	    (void)m2.get_document().get_value(0);
++	}
++    }
++
++    return true;
++}
diff -Nru xapian-core-1.2.12/debian/patches/series xapian-core-1.2.12/debian/patches/series
--- xapian-core-1.2.12/debian/patches/series	2012-12-11 17:22:00.000000000 +1300
+++ xapian-core-1.2.12/debian/patches/series	2016-04-19 13:12:53.000000000 +1200
@@ -1,2 +1,3 @@
 fix-db-write-lock.patch
 replication-above-32GB.patch
+increment-cursor-version-on-cancel-or-reopen.patch

Attachment: signature.asc
Description: PGP signature


Reply to: