Closed Bug 772211 Opened 12 years ago Closed 11 years ago

Sync should not use addVisit

Categories

(Firefox :: Sync, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla21

People

(Reporter: Yoric, Assigned: Yoric)

References

Details

(Whiteboard: [sync:history][sync:rigor])

Attachments

(1 file, 5 obsolete files)

      No description provided.
Attachment #640348 - Flags: review?(mak77)
Attachment #640348 - Flags: review?(gps)
Comment on attachment 640348 [details] [diff] [review]
Replacing use of addPage with async code.

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

The underlying API is synchronous. By changing it to synchronous, you introduce a race condition where the TPS test driver could advance before data has been added to the database.

The change to use the async APIs can be done: we just need to wait on the callback before returning from the function. You should be able to Cu.import("resource://services-common/async.js") and do something like:

  let cb = Async.makeSpinningCallback();
  
  PlacesUtils.asyncHistory.updatePlaces(places, {
    handleError: function Add_handleError() {
      cb(new Error("Error adding history entry."));
    }
    handleResult: function Add_handleResult() {
      cb(null);
    },
    handleCompletion: function Add_handleCompletion() {
      cb(null);
    }
  });
  cb.wait();

A proper solution would be to refactor the TPS APIs to be async. But, I don't think you want to tackle that ;)
Attachment #640348 - Flags: review?(gps) → review-
Here we go. Local tests work, but with TryServer hiccups, I have not been able to get confirmation from TryServer.
Attachment #640348 - Attachment is obsolete: true
Attachment #640348 - Flags: review?(mak77)
Attachment #642229 - Flags: review?(gps)
(In reply to Gregory Szorc [:gps] from comment #1)
> Comment on attachment 640348 [details] [diff] [review]
> A proper solution would be to refactor the TPS APIs to be async. But, I
> don't think you want to tackle that ;)

Not quite yet :) By the way, is there a bug# for this? If you need OS.File features, feel free to ping me.
(In reply to David Rajchenbach Teller [:Yoric] from comment #2)
> Created attachment 642229 [details] [diff] [review]
> Replacing use of addPage with async code v2
> 
> Here we go. Local tests work, but with TryServer hiccups, I have not been
> able to get confirmation from TryServer.

TPS tests don't run on the buildbot infrastructure, so a Try push won't exercise this.

There is some documentation at https://developer.mozilla.org/en/TPS_Tests. Not sure if it is current.

> By the way, is there a bug# for this?

No. We generally don't want to touch TPS unless we have to.
Ah, I just understood that what I was patching is just a test. This patch is probably not very useful, then.
Comment on attachment 642229 [details] [diff] [review]
Replacing use of addPage with async code v2

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

This looks good. But, I can't verify it because my m-c builds are doing:

 assertion failure: target, at /Users/gps/src/services-central/storage/src/mozStorageAsyncStatementExecution.cpp:190

If this lands in services-central, TPS will run on the server on checkin. So, we can always try to land. If it breaks, we back out.
Attachment #642229 - Flags: review?(gps) → review+
Comment on attachment 642229 [details] [diff] [review]
Replacing use of addPage with async code v2

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

There's something to fix in the callback (trying to interrupt twice), apart that I will be fine with gps final review pass, I don't have further comments.

::: services/sync/tps/extensions/tps/modules/history.jsm
@@ +107,5 @@
>      Logger.AssertTrue("visits" in item && "uri" in item,
>        "History entry in test file must have both 'visits' " +
>        "and 'uri' properties");
>      let uri = Services.io.newURI(item.uri, null, null);
> +    let places = {

ideally this is a single "place"

@@ +109,5 @@
>        "and 'uri' properties");
>      let uri = Services.io.newURI(item.uri, null, null);
> +    let places = {
> +      uri: uri,
> +      visits:[]

missing space after colon

@@ +116,5 @@
> +      places.visits.push({
> +        visitDate: usSinceEpoch + (visit.date * 60 * 60 * 1000 * 1000),
> +        transitionType: visit.type,
> +        referrerURI: null,
> +        sessionId: null

since this is a jsval, you don't have to define null properties, they are optional, so can be omitted.

@@ +122,3 @@
>      }
> +    if ("title" in item) {
> +      places.title = item.title;

I suppose (can be verified easily), you may just use title: item.title in the places object definition, if undefined/null the other side should get a void string and ignore it.

@@ +131,5 @@
> +        handleResult: function Add_handleResult() {
> +          cb(null);
> +        },
> +        handleCompletion: function Add_handleCompletion() {
> +          cb(null);

calling both in handleResult/Error and handleCompletion is going to notify and continue twice... you should just do one of those, I suggest using completion and track error/success internally.
Attachment #642229 - Flags: review?(mak77) → review+
David, do you plan to update the patch here, are you looking for help completing it?
Summary: Sync should not use addPage → Sync should not use addVisit
I can find other addVisit entities in Sync:

services/sync/tps/extensions/tps/modules/history.jsm
services/sync/tests/unit/test_history_tracker.js
Flags: needinfo?(dteller)
Bear in mind that Sync's history engine does handle visit-level granularity, so -- without yet taking the time to dig into the API; still drinking morning coffee! -- some use of visit-level APIs might be appropriate.
The fact is that nsINavHistoryService::AddVisit will not exist anymore, any visits update must go through mozIAsyncHistory::updatePlaces(), that is the async replacement for AddVisit. Nothing changes regarding granularity, it's just sync API being replaced by an async API.
(In reply to Marco Bonardo [:mak] from comment #11)
> The fact is that nsINavHistoryService::AddVisit will not exist anymore, any
> visits update must go through mozIAsyncHistory::updatePlaces(), that is the
> async replacement for AddVisit. Nothing changes regarding granularity, it's
> just sync API being replaced by an async API.

Got it. Putting this on the list of things to keep an eye on…
Hardware: x86 → All
(In reply to Marco Bonardo [:mak] from comment #8)
> David, do you plan to update the patch here, are you looking for help
> completing it?

Sorry, your additional review had been lost in bugspam. I will try and update this soonish. How urgent is this patch?
Flags: needinfo?(dteller)
(In reply to David Rajchenbach Teller [:Yoric] from comment #13)
> Sorry, your additional review had been lost in bugspam. I will try and
> update this soonish. How urgent is this patch?

I'd like to remove addVisit in the Firefox 21 bracket, so by the end of Jan.
Also applied to test_history_tracker.js
Attachment #694388 - Attachment is obsolete: true
Same one with yet another typo removed. Try: https://tbpl.mozilla.org/?tree=Try&rev=73ad8a53ec73
Attachment #694760 - Attachment is obsolete: true
Attachment #695083 - Flags: review?(mak77)
Attachment #695083 - Flags: review?(gps)
Comment on attachment 695083 [details] [diff] [review]
Replacing use of addPage with async code v5

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

Stealing gps's review flag, because he has other things to do!

Just nits and sadness :D

Thanks for taking care of this, David!

::: services/sync/tests/unit/test_history_tracker.js
@@ +35,5 @@
> +    uri: uri,
> +    visits: [ {
> +      visitDate: Date.now() * 1000,
> +      transitionType: 1
> +    } ]

Nit: surplus spaces, trailing commas. Should be:

  let place = {
    uri: uri,
    visits: [{
      transitionType: 1,
      visitDate: Date.now() * 1000,
    }],
  };

@@ +39,5 @@
> +    } ]
> +  };
> +  let cb = Async.makeSpinningCallback();
> +  PlacesUtils.asyncHistory.updatePlaces(place, {
> +    handleError: function Add_handleError() {

Nit: lose the "Add_".

@@ +47,5 @@
> +      cb(null);
> +    },
> +    handleCompletion: function Add_handleCompletion(status) {
> +       // Nothing to do
> +     }

Nit: correct indentation on these two lines, add period at end of comment, add trailing comma.

@@ +50,5 @@
> +       // Nothing to do
> +     }
> +   });
> +  // Spin the event loop to embed this async call in a sync API
> +  cb.wait();

Given that this is test code, I'd rather not, but meh! We'll fix it when we get rid of trackers.

::: services/sync/tps/extensions/tps/modules/history.jsm
@@ +120,5 @@
>      }
> +    if ("title" in item) {
> +      place.title = item.title;
> +    }
> +    let cb = Async.makeSpinningCallback();

Newline before "let cb", please.

@@ +130,5 @@
> +          cb(null);
> +        },
> +        handleCompletion: function Add_handleCompletion(status) {
> +          // Nothing to do
> +        }

Same comments apply here.

(It's a pity we have this code duplication. Oh well.)
Attachment #695083 - Flags: review?(gps) → review+
Comment on attachment 695083 [details] [diff] [review]
Replacing use of addPage with async code v5

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

::: services/sync/tests/unit/test_history_tracker.js
@@ +34,5 @@
> +  let place = {
> +    uri: uri,
> +    visits: [ {
> +      visitDate: Date.now() * 1000,
> +      transitionType: 1

Please replace this hardcoded number with the proper PlacesUtils.history.TRANSITION_LINK

@@ +43,5 @@
> +    handleError: function Add_handleError() {
> +      cb(new Error("Error adding history entry"));
> +    },
> +    handleResult: function Add_handleResult() {
> +      cb(null);

I think there's no point in the explicit null argument, just omit it...

@@ +46,5 @@
> +    handleResult: function Add_handleResult() {
> +      cb(null);
> +    },
> +    handleCompletion: function Add_handleCompletion(status) {
> +       // Nothing to do

since you don't use status you can avoid defining it

::: services/sync/tps/extensions/tps/modules/history.jsm
@@ +120,3 @@
>      }
> +    if ("title" in item) {
> +      place.title = item.title;

much <3 for removing another instance of setPageTitle (bug 752217) :)

@@ +126,5 @@
> +        handleError: function Add_handleError() {
> +          cb(new Error("Error adding history entry"));
> +        },
> +        handleResult: function Add_handleResult() {
> +          cb(null);

ditto

@@ +129,5 @@
> +        handleResult: function Add_handleResult() {
> +          cb(null);
> +        },
> +        handleCompletion: function Add_handleCompletion(status) {
> +          // Nothing to do

ditto on status
Attachment #695083 - Flags: review?(mak77) → review+
Status: NEW → ASSIGNED
Whiteboard: [sync:history][sync:rigor]
Comment on attachment 699080 [details] [diff] [review]
Replacing use of addPage with async code v6

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

::: services/sync/tps/extensions/tps/modules/history.jsm
@@ +115,3 @@
>      for each (visit in item.visits) {
> +      place.visits.push({
> +        visitDate: usSinceEpoch + (visit.date * 60 * 60 * 1000 * 1000),

While you're here, could you lift that constant somewhere and make it meaningful: is it MICROSECONDS_PER_HOUR? Is that even correct?
https://hg.mozilla.org/mozilla-central/rev/9017046063ec
Status: ASSIGNED → RESOLVED
Closed: 11 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla21
Component: Firefox Sync: Backend → Sync
Product: Cloud Services → Firefox
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: