Closed Bug 1098965 Opened 10 years ago Closed 10 years ago

test_sqlite.js: test_close_database_on_gc uses one Promise for 100 databases

Categories

(Toolkit :: Async Tooling, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla37

People

(Reporter: WeirdAl, Assigned: WeirdAl)

References

Details

Attachments

(1 file, 2 obsolete files)

let deferred = Promise.defer();

  for (let i = 0; i < 100; ++i) {
    let c = yield getDummyDatabase("gc_" + i);
    c._connectionData._deferredClose.promise.then(deferred.resolve);
  }
// ...
  yield deferred.promise;

The way I read that, once a single call to deferredClose passes, the test has essentially passed.

Filed as UNCO because I don't know SQLite or this code at all.
Attached patch promiseAllDBs.diff (obsolete) — Splinter Review
If this bug is legitimate, this patch should suffice.
Comment on attachment 8522742 [details] [diff] [review]
promiseAllDBs.diff

Review of attachment 8522742 [details] [diff] [review]:
-----------------------------------------------------------------

let's have David take a look, I think the bug is legitimate but maybe there was a reason for that.
Attachment #8522742 - Flags: review?(dteller)
Actually, this is a trick used in several gc-related tests. Since the gc used to be conservative, we can end up in a situation in which something in memory is misinterpreted as a reference to a JS object, which then used to prevent that object from being garbage-collected. Using 100 objects instead of 1 made (almost) sure that at least one of the objects didn't have any fake reference pointing to it.

Now, these days, the gc has been rewritten, and I think it has become exact. If so, we can get rid of this trick. Jason, can you confirm that?
Flags: needinfo?(jorendorff)
Comment on attachment 8522742 [details] [diff] [review]
promiseAllDBs.diff

Canceling review until we have info from Jason.
Attachment #8522742 - Flags: review?(dteller)
Forwarding.
Flags: needinfo?(terrence)
Yes, the conservative scanner is disabled on all branches; you should not need any tricks like this anymore.
Flags: needinfo?(terrence)
Comment on attachment 8522742 [details] [diff] [review]
promiseAllDBs.diff

Restoring review request per comment 3 and comment 6.
Flags: needinfo?(jorendorff)
Attachment #8522742 - Flags: review?(dteller)
Comment on attachment 8522742 [details] [diff] [review]
promiseAllDBs.diff

Review of attachment 8522742 [details] [diff] [review]:
-----------------------------------------------------------------

::: toolkit/modules/tests/xpcshell/test_sqlite.js
@@ +1048,3 @@
>      let c = yield getDummyDatabase("gc_" + i);
>      c._connectionData._deferredClose.promise.then(deferred.resolve);
> +    collectedPromises.push(deferred.promise);

Let's take the opportunity to use `new Promise` instead of `Promise.defer()`.
Attachment #8522742 - Flags: review?(dteller) → feedback+
Attached patch promiseAllDBs.diff (obsolete) — Splinter Review
Updated per feedback comments.  Also, bringing it closer to bug 1095267.
Assignee: nobody → ajvincent
Attachment #8522742 - Attachment is obsolete: true
Status: UNCONFIRMED → ASSIGNED
Ever confirmed: true
Attachment #8526177 - Flags: review?(dteller)
Comment on attachment 8526177 [details] [diff] [review]
promiseAllDBs.diff

Review of attachment 8526177 [details] [diff] [review]:
-----------------------------------------------------------------

::: toolkit/modules/tests/xpcshell/test_sqlite.js
@@ +25,5 @@
> +  }
> +  let resolve, reject;
> +  let promise = new Promise(forward);
> +  return [promise, resolve, reject];
> +}

Rather than reinventing it, you should use PromiseUtils.defer.

@@ +1068,5 @@
>    // references. This is needed at the moment, otherwise
>    // garbage-collection takes place after the shutdown barrier and the
>    // test will timeout. Once that is fixed, we can remove this line
>    // and be fine as long as at least one connection is
>    // garbage-collected.

"as long as at least one connection is garbage-collected" => "as long as the connections are garbage-collected"
Attachment #8526177 - Flags: review?(dteller) → feedback+
We can't fully convert over to native promises for this test, because that causes a hang (see bug 1095267 comment 1).  Further testing, however, shows we can make Promise.jsm's Promise.all work with PromiseUtils.defer()'s native promises.  So the hang has to be in Promise.all.
Attachment #8526177 - Attachment is obsolete: true
Attachment #8526741 - Flags: review?(dteller)
Attachment #8526741 - Flags: review?(dteller) → review+
Keywords: checkin-needed
Hi Alex, would it be possible to get a try link ? Thanks!
Flags: needinfo?(ajvincent)
Keywords: checkin-needed
yoric, alex told me he don't have commit rights - could you do the try push, maybe we could give alex also L1 access
Flags: needinfo?(dteller)
try: https://treeherder.mozilla.org/ui/#/jobs?repo=try&revision=1f1b1cb8755d
WeirdAl, if you wish to apply for L1, I can vouch for you.
Flags: needinfo?(dteller)
Please tell me this patch isn't being held because of the needinfo for L1...
Flags: needinfo?(ajvincent)
(In reply to Alex Vincent [:WeirdAl] from comment #15)
> Please tell me this patch isn't being held because of the needinfo for L1...

nope that was more because the checkin-needed keyword was deleted in comment 13 while waiting for the try run and then never added back again. 

Will do the checkin
https://hg.mozilla.org/mozilla-central/rev/7c95c7d31d45
Status: ASSIGNED → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Whiteboard: [fixed-in-fx-team]
Target Milestone: --- → mozilla37
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: