summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScott Hernandez <scotthernandez@gmail.com>2013-02-28 18:19:47 -0500
committerScott Hernandez <scotthernandez@gmail.com>2013-02-28 18:19:47 -0500
commit6ea3fb90c6a90cad47501c4581c7206545f5e3f3 (patch)
tree69d4d43ec16894dd18855337028568abbfecbe9a
parente63cc1987e8e69e53158a02f393b5a8c8993f492 (diff)
downloadmongo-6ea3fb90c6a90cad47501c4581c7206545f5e3f3.tar.gz
SERVER-7718: JS Timestamp constructor now in seconds (not millis anymore)
-rw-r--r--jstests/aggregation/bugs/server6121.js6
-rw-r--r--jstests/json1.js4
-rw-r--r--jstests/sharding/major_version_check.js8
-rw-r--r--jstests/tool/dumprestore7.js4
-rw-r--r--jstests/ts1.js2
-rw-r--r--src/mongo/scripting/engine_spidermonkey.cpp2
-rw-r--r--src/mongo/scripting/engine_v8.cpp6
-rw-r--r--src/mongo/scripting/sm_db.cpp9
-rw-r--r--src/mongo/scripting/v8_db.cpp6
9 files changed, 31 insertions, 16 deletions
diff --git a/jstests/aggregation/bugs/server6121.js b/jstests/aggregation/bugs/server6121.js
index e775969190a..7aafc959f36 100644
--- a/jstests/aggregation/bugs/server6121.js
+++ b/jstests/aggregation/bugs/server6121.js
@@ -19,7 +19,7 @@ load('jstests/aggregation/extras/utils.js');
// Clear db
db.s6121.drop();
// Populate db
-db.s6121.save({date:new Timestamp(1341337661000, 1)});
+db.s6121.save({date:new Timestamp(1341337661, 1)});
db.s6121.save({date:new Date(1341337661000)});
// Aggregate checking various combinations of the constant and the field
var s6121 = db.s6121.aggregate(
@@ -45,7 +45,7 @@ assert.eq(s6121.result[0], s6121.result[1], 's6121 failed');
// That means that the Timestamp has an "inc" that is the same as the Date has millis.
db.s6121.drop();
db.s6121.save({time:new Timestamp( 0, 1234), date:new Date(1234)});
-db.s6121.save({time:new Timestamp(1000, 1234), date:new Date(1234)});
+db.s6121.save({time:new Timestamp( 1, 1234), date:new Date(1234)});
printjson(db.s6121.find().toArray());
var s6121 = db.s6121.aggregate(
{$project: {
@@ -61,7 +61,7 @@ assert.eq(s6121.result, [{ts_date: true, date_ts: true}
// Clear db for timestamp comparison tests
db.s6121.drop();
-db.s6121.save({time:new Timestamp(1341337661000, 1), time2:new Timestamp(1341337661000, 2)});
+db.s6121.save({time:new Timestamp(1341337661, 1), time2:new Timestamp(1341337661, 2)});
var s6121 = db.s6121.aggregate(
{$project: {
_id: 0,
diff --git a/jstests/json1.js b/jstests/json1.js
index 8fa03eb7b85..054a9b46047 100644
--- a/jstests/json1.js
+++ b/jstests/json1.js
@@ -22,3 +22,7 @@ assert.eq(tojson(x,"",false), '{\n\t"x" : ObjectId("4ad35a73d2e34eb4fc43579a"),\
// Timestamp type
x = {"x" : Timestamp()};
assert.eq(tojson(x,"",false), '{\n\t"x" : Timestamp(0, 0)\n}' , "G")
+
+// Timestamp type, second
+x = {"x" : Timestamp(10,2)};
+assert.eq(tojson(x,"",false), '{\n\t"x" : Timestamp(10, 2)\n}' , "H")
diff --git a/jstests/sharding/major_version_check.js b/jstests/sharding/major_version_check.js
index 10f5466799c..f258a6d8b29 100644
--- a/jstests/sharding/major_version_check.js
+++ b/jstests/sharding/major_version_check.js
@@ -32,9 +32,9 @@ printjson( admin.runCommand({ getShardVersion : coll + "" }) )
printjson( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }) )
// Compare strings b/c timestamp comparison is a bit weird
-assert.eq( tsToObj( Timestamp( 1000, 2 ) ),
+assert.eq( tsToObj( Timestamp( 1, 2 ) ),
tsToObj( admin.runCommand({ getShardVersion : coll + "" }).version ) )
-assert.eq( tsToObj( Timestamp( 1000, 0 ) ),
+assert.eq( tsToObj( Timestamp( 1, 0 ) ),
tsToObj( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }).version ) )
// See if our stale mongos is required to catch up to run a findOne on an existing connection
@@ -42,7 +42,7 @@ staleMongos.getCollection( coll + "" ).findOne()
printjson( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }) )
-assert.eq( tsToObj( Timestamp( 1000, 0 ) ),
+assert.eq( tsToObj( Timestamp( 1, 0 ) ),
tsToObj( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }).version ) )
// See if our stale mongos is required to catch up to run a findOne on a new connection
@@ -51,7 +51,7 @@ staleMongos.getCollection( coll + "" ).findOne()
printjson( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }) )
-assert.eq( tsToObj( Timestamp( 1000, 0 ) ),
+assert.eq( tsToObj( Timestamp( 1, 0 ) ),
tsToObj( staleMongos.getDB( "admin" ).runCommand({ getShardVersion : coll + "" }).version ) )
st.stop() \ No newline at end of file
diff --git a/jstests/tool/dumprestore7.js b/jstests/tool/dumprestore7.js
index 2f129b3fa97..a860b91f415 100644
--- a/jstests/tool/dumprestore7.js
+++ b/jstests/tool/dumprestore7.js
@@ -43,9 +43,7 @@ var master = replTest.getMaster();
step("try mongodump with $timestamp");
var data = "/data/db/dumprestore7-dump1/";
-// We need to divide by 1000 here because the JSON parser interprets the first field of timestamps
-// as seconds while the shell interprets them as milliseconds. See SERVER-7718.
-var query = "{\"ts\":{\"$gt\":{\"$timestamp\" : {\"t\":"+ time.ts.t / 1000 + ",\"i\":" + time.ts.i +" }}}}";
+var query = "{\"ts\":{\"$gt\":{\"$timestamp\" : {\"t\":"+ time.ts.t + ",\"i\":" + time.ts.i +" }}}}";
runMongoProgram( "mongodump", "--host", "127.0.0.1:"+replTest.ports[0], "--db", "local", "--collection", "oplog.rs", "--query", query, "--out", data );
diff --git a/jstests/ts1.js b/jstests/ts1.js
index 062519ceddd..30f7882e863 100644
--- a/jstests/ts1.js
+++ b/jstests/ts1.js
@@ -33,6 +33,6 @@ assert.eq( 0 , t.find( { x : { $type : 3 } } ).itcount() , "B2" )
t.insert( { _id : 100 , x : new Timestamp( 123456 , 50 ) } )
x = t.findOne( { _id : 100 } ).x
-assert.eq( 123000 , x.t , "C1" )
+assert.eq( 123456 , x.t , "C1" )
assert.eq( 50 , x.i , "C2" )
diff --git a/src/mongo/scripting/engine_spidermonkey.cpp b/src/mongo/scripting/engine_spidermonkey.cpp
index 3664ae97479..f43ea2201ef 100644
--- a/src/mongo/scripting/engine_spidermonkey.cpp
+++ b/src/mongo/scripting/engine_spidermonkey.cpp
@@ -592,7 +592,7 @@ namespace spidermonkey {
case Timestamp: {
JSObject * o = JS_NewObject( _context , &timestamp_class , 0 , 0 );
CHECKNEWOBJECT(o,_context,"Timestamp1");
- setProperty( o , "t" , toval( (double)(e.timestampTime()) ) );
+ setProperty( o , "t" , toval( (double)(e.timestampTime() / 1000) ) );
setProperty( o , "i" , toval( (double)(e.timestampInc()) ) );
return OBJECT_TO_JSVAL( o );
}
diff --git a/src/mongo/scripting/engine_v8.cpp b/src/mongo/scripting/engine_v8.cpp
index 2cd074fdc1a..e290240f31f 100644
--- a/src/mongo/scripting/engine_v8.cpp
+++ b/src/mongo/scripting/engine_v8.cpp
@@ -1385,7 +1385,7 @@ namespace mongo {
case mongo::Timestamp: {
v8::Local<v8::Object> sub = readOnly ? readOnlyObjects->NewInstance() :
internalFieldObjects->NewInstance();
- sub->ForceSet(v8::String::New("t"), v8::Number::New(f.timestampTime()));
+ sub->ForceSet(v8::String::New("t"), v8::Number::New(f.timestampTime() / 1000));
sub->ForceSet(v8::String::New("i"), v8::Number::New(f.timestampInc()));
sub->SetInternalField(0, v8::Uint32::New(f.type()));
o->ForceSet(name, sub);
@@ -1578,7 +1578,7 @@ namespace mongo {
}
case mongo::Timestamp:
instance = internalFieldObjects->NewInstance();
- instance->ForceSet(v8::String::New("t"), v8::Number::New(elem.timestampTime()));
+ instance->ForceSet(v8::String::New("t"), v8::Number::New(elem.timestampTime() / 1000 ));
instance->ForceSet(v8::String::New("i"), v8::Number::New(elem.timestampInc()));
instance->SetInternalField(0, v8::Uint32::New(elem.type()));
return instance;
@@ -1657,7 +1657,7 @@ namespace mongo {
case Timestamp:
b.appendTimestamp(elementName,
Date_t(static_cast<uint64_t>(
- obj->Get(v8::String::New("t"))->ToNumber()->Value())),
+ obj->Get(v8::String::New("t"))->ToNumber()->Value() * 1000 )),
obj->Get(v8::String::New("i"))->ToInt32()->Value());
return;
case MinKey:
diff --git a/src/mongo/scripting/sm_db.cpp b/src/mongo/scripting/sm_db.cpp
index a112ec9bd9a..3c53a85768a 100644
--- a/src/mongo/scripting/sm_db.cpp
+++ b/src/mongo/scripting/sm_db.cpp
@@ -1294,6 +1294,13 @@ zzz
c.setProperty( obj, "i", c.toval( 0.0 ) );
}
else {
+ long long t = parseLL(c.toString(argv[0]).c_str());
+ long long largestVal = ((2039LL-1970LL) *365*24*60*60); //seconds between 1970=2038
+ smuassert( cx,
+ ((string)(str::stream()
+ << "The first argument must be in seconds;"
+ << t << " is too large (max " << largestVal << ")")).c_str(),
+ t <= largestVal );
c.setProperty( obj, "t", argv[ 0 ] );
c.setProperty( obj, "i", argv[ 1 ] );
}
@@ -1688,7 +1695,7 @@ zzz
}
if ( JS_InstanceOf( c->_context , o , &timestamp_class , 0 ) ) {
- b.appendTimestamp( name , (unsigned long long)c->getNumber( o , "t" ) , (unsigned int )c->getNumber( o , "i" ) );
+ b.appendTimestamp( name , (unsigned long long)c->getNumber( o , "t" ) * 1000 , (unsigned int )c->getNumber( o , "i" ) );
return true;
}
diff --git a/src/mongo/scripting/v8_db.cpp b/src/mongo/scripting/v8_db.cpp
index dbc12685db5..6857c56b1a0 100644
--- a/src/mongo/scripting/v8_db.cpp
+++ b/src/mongo/scripting/v8_db.cpp
@@ -618,6 +618,12 @@ namespace mongo {
it->ForceSet(scope->v8StringData("i"), v8::Number::New(0));
}
else if (args.Length() == 2) {
+ int64_t t = args[0]->IntegerValue();
+ int64_t largestVal = ((2039LL-1970LL) *365*24*60*60); //seconds between 1970-2038
+ if( t > largestVal )
+ return v8AssertionException( str::stream()
+ << "The first argument must be in seconds;"
+ << t << " is too large (max " << largestVal << ")");
it->ForceSet(scope->v8StringData("t"), args[0]);
it->ForceSet(scope->v8StringData("i"), args[1]);
}