-
Type:
Bug
-
Resolution: Done
-
Priority:
Major - P3
-
Affects Version/s: None
-
Component/s: Index Maintenance
-
None
-
ALL
-
None
-
None
-
None
-
None
-
None
-
None
-
None
It looks like BtreeCursorImpl::keyAt() checks a v1 index sentinel value for n but not the corresponding (and different) v0 index sentinel value. This causes scary looking assertions in DEBUG mode, but fortunately everything ends up working fine in a normal build. Test below only fails in DEBUG mode.
diff --git a/db/btreecursor.cpp b/db/btreecursor.cpp
index f39d5bb..f81c2ec 100644
--- a/db/btreecursor.cpp
+++ b/db/btreecursor.cpp
@@ -52,7 +52,7 @@ namespace mongo {
assert( !bucket.isNull() );
const BtreeBucket<V> *b = bucket.btree<V>();
int n = b->getN();
- if( n == 0xffff ) {
+ if( n == 0xffff || n == -1 ) {
throw UserException(15850, "keyAt bucket deleted");
}
dassert( n >= 0 && n < 10000 );
diff --git a/jstests/removea.js b/jstests/removea.js
new file mode 100644
index 0000000..2ed3d60
--- /dev/null
+++ b/jstests/removea.js
@@ -0,0 +1,19 @@
+// Test removal of a substantial proportion of inserted elements.
+
+t = db.jstests_removea;
+t.drop();
+
+Random.setRandomSeed(1);
+
+for( v = 0; v < 2; ++v ) {
+ t.ensureIndex({a:1}, {v:v});
+ for( i = 0; i < 10000; ++i ) {
+ t.save( {a:i} );
+ }
+ toDrop = [];
+ for( i = 0; i < 10000; ++i ) {
+ toDrop.push( Random.randInt(10000) );
+ }
+ t.remove( {a:{$in:toDrop}} );
+ assert( !db.getLastError() );
+}
- is related to
-
SERVER-4575 two somewhat redundant procedures for updating btree cursors when a btree bucket is deallocated; invalid debug warning
-
- Closed
-