Skip to content

Commit a743354

Browse files
committed
[JAVA-289]: driver does not allow doc sizes matching the server limit, for both insert and find
1 parent 5b8538e commit a743354

File tree

5 files changed

+17
-7
lines changed

5 files changed

+17
-7
lines changed

src/main/com/mongodb/Bytes.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,12 @@ public class Bytes extends BSON {
4848

4949
/** Little-endian */
5050
public static final ByteOrder ORDER = ByteOrder.LITTLE_ENDIAN;
51-
52-
static final int MAX_OBJECT_SIZE = 1024 * 1024 * 4;
51+
52+
/** this size is used to prevent insertion of objects that are too large for db */
53+
static final int MAX_OBJECT_SIZE = 1024 * 1024 * 32;
54+
55+
/** target size of an insert batch */
56+
static final int BATCH_INSERT_SIZE = 1024 * 1024 * 16;
5357

5458
static final int CONNECTIONS_PER_HOST = Integer.parseInt( System.getProperty( "MONGO.POOLSIZE" , "10" ) );
5559

src/main/com/mongodb/DBApiLayer.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -220,10 +220,13 @@ protected WriteResult insert(DBObject[] arr, boolean shouldApply , com.mongodb.W
220220
for ( ; cur<arr.length; cur++ ){
221221
DBObject o = arr[cur];
222222
int sz = om.putObject( o );
223+
// server is better suited to decide on object size
224+
// indeed driver may be talking to dbs with different limits
225+
// also max size is tough to catch on updates, so here it's just an extra check
223226
if ( sz > Bytes.MAX_OBJECT_SIZE )
224227
throw new IllegalArgumentException( "object too big: " + sz );
225228

226-
if ( om.size() > ( 4 * 1024 * 1024 ) ){
229+
if ( om.size() > Bytes.BATCH_INSERT_SIZE ){
227230
cur++;
228231
break;
229232
}

src/main/com/mongodb/util/JSON.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ public static void serialize( Object o , StringBuilder buf ){
155155
return;
156156
}
157157

158-
if (o instanceof byte[]) {
158+
if (o instanceof byte[] || o instanceof Binary) {
159159
buf.append("<Binary Data>");
160160
return;
161161
}

src/main/org/bson/BSONDecoder.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,8 @@ String readCStr()
429429
String readUTF8String()
430430
throws IOException {
431431
int size = readInt();
432-
if ( size <= 0 || size > ( 3 * 1024 * 1024 ) )
432+
// this is just protection in case it's corrupted, to avoid huge strings
433+
if ( size <= 0 || size > ( 32 * 1024 * 1024 ) )
433434
throw new BSONException( "bad string size: " + size );
434435

435436
if ( size < _inputBuffer.length / 2 ){

src/test/com/mongodb/JavaClientTest.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -534,13 +534,15 @@ public void testObjectIdCompat2(){
534534

535535
@Test
536536
public void testLargeBulkInsert(){
537+
// max size should be obtained from server
538+
int maxObjSize = 16 * 1024 * 1024;
537539
DBCollection c = _db.getCollection( "largebulk" );
538540
c.drop();
539541
String s = "asdasdasd";
540542
while ( s.length() < 10000 )
541543
s += s;
542544
List<DBObject> l = new ArrayList<DBObject>();
543-
final int num = 3 * ( Bytes.MAX_OBJECT_SIZE / s.length() );
545+
final int num = 3 * ( maxObjSize / s.length() );
544546

545547
for ( int i=0; i<num; i++ ){
546548
l.add( BasicDBObjectBuilder.start()
@@ -553,7 +555,7 @@ public void testLargeBulkInsert(){
553555
assertEquals( num , c.find().count() );
554556

555557
s = l.toString();
556-
assertTrue( s.length() > Bytes.MAX_OBJECT_SIZE );
558+
assertTrue( s.length() > maxObjSize );
557559

558560
boolean worked = false;
559561
try {

0 commit comments

Comments
 (0)