Closed Bug 744719 Opened 12 years ago Closed 12 years ago

Don't download appcache files one file at a time

Categories

(Core :: Networking: Cache, defect)

defect
Not set
normal

Tracking

()

RESOLVED FIXED
mozilla15
blocking-kilimanjaro +

People

(Reporter: sicking, Assigned: mayhemer)

References

Details

Attachments

(2 files, 3 obsolete files)

Apparently we currently download appcache resources one file at a time. This results in slower downloads. Ideal would be if the nsIOfflineCacheUpdate interface allowed setting "download at the most X files at a time" or some such. That way we can when pinning an app aggressively download the app, while for normal updates download a bit more slowly to avoid tying up the network.

I'm not sure if "download at the most X files at a time" is the right way to tweak bandwidth use. Definitely open to other ideas from people that know network stuff better than me.
I believe we may just run them all in parallel and the http scheduling layer will take care automatically.

I'd like to work on this.
Assignee: nobody → honzab.moz
Status: NEW → ASSIGNED
I personally feel that requiring authors to maintain an accurate size in the manifest file is bound to be troublesome. I'd much prefer a small update time penalty to figure out the size ourselves over assuming that people will consistently get the size in the manifest updated correctly.
(In reply to Johnny Stenback (:jst, jst@mozilla.com) from comment #2)
> I personally feel that requiring authors to maintain an accurate size in the
> manifest file is bound to be troublesome. I'd much prefer a small update
> time penalty to figure out the size ourselves over assuming that people will
> consistently get the size in the manifest updated correctly.

Agree.  Doesn't this comment belong to bug 744713 ?

On a subsequent update we can potentially estimate the new cache version size from the current cache version we have.
Duh, yes, typed that in the wrong tab here. :( Ignore comment 2.
This blocks our webapps story, so blocking kilimanjaro.
blocking-kilimanjaro: --- → +
Attached patch v1 (obsolete) — Splinter Review
Needs more testing (I'll create test just for this new code), but so far seems to be working well.
Attachment #621111 - Flags: review?(dcamp)
Attachment #621111 - Flags: review?(dcamp) → review?(michal.novotny)
Attached patch v1.1 (obsolete) — Splinter Review
- updated to apply on top of bug 744710
- parallel limit now checked before posting next ProcessNextURI() (that saves a loop over all items)
Attachment #621111 - Attachment is obsolete: true
Attachment #621111 - Flags: review?(michal.novotny)
Attachment #623727 - Flags: review?(michal.novotny)
Comment on attachment 623727 [details] [diff] [review]
v1.1

> +nsOfflineCacheUpdateItem::IsInProgress()
> +{
> +    return mState == nsIDOMLoadStatus::REQUESTED.
> +                  || nsIDOMLoadStatus::RECEIVING;
> +}

This should be

    return mState == nsIDOMLoadStatus::REQUESTED ||
           mState == nsIDOMLoadStatus::RECEIVING;


> +    for (PRUint32 i = 0; i < mItems.Length(); ++i) {
> +        nsOfflineCacheUpdateItem * item = mItems[i];
> +
> +        if (item->IsScheduled()) {
> +            runItem = item;
> +            break;
> +        }
> +
> +        if (item->IsCompleted())
> +            ++completedItems;
> +    }

The item handling could be IMO simplified so that we could have 3 lists (e.g. mItemsQueue, mItemsInProgress, mItemsFinished) and would move the item between the lists according to its state. This is just a proposed optimization, feel free to keep the current code...


> +// Maximim number of parallel items loads

s/Maximim/Maximum/


> +    // Set mState to LOADED here rather then in OnStopRequest to prevent

s/rather then/rather than/


> +    // Accroding parallelism this may imply more pinned retries count,

s/Accroding /According to/


> +    // stop anyway.  Also, this code may soon be completelely removed

s/completelely/completely/
Attachment #623727 - Flags: review?(michal.novotny) → review-
(In reply to Michal Novotny (:michal) from comment #8)
> Comment on attachment 623727 [details] [diff] [review]
> v1.1

> The item handling could be IMO simplified so that we could have 3 lists
> (e.g. mItemsQueue, mItemsInProgress, mItemsFinished) and would move the item
> between the lists according to its state. This is just a proposed
> optimization, feel free to keep the current code...

I'll keep the current.  It's IMO safer and better maintainable.
Attached patch v2 (obsolete) — Splinter Review
Added tests that should cover most of the code.  Unfortunatelly there is no way to trigger the IsInProgress method.

https://tbpl.mozilla.org/?tree=Try&rev=b329dd2a1bff
Attachment #623727 - Attachment is obsolete: true
Attachment #627480 - Flags: review?(michal.novotny)
Comment on attachment 627480 [details] [diff] [review]
v2

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

There are still few typos in the patch. r+ with those fixed

::: dom/tests/mochitest/ajax/offline/744719-cancel.cacheManifest
@@ +2,5 @@
> +
> +http://mochi.test:8888/tests/SimpleTest/SimpleTest.js
> +http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/offlineTests.js
> +
> +# more then 15 what is a number of parallel loads

more than

::: dom/tests/mochitest/ajax/offline/744719.cacheManifest
@@ +2,5 @@
> +
> +http://mochi.test:8888/tests/SimpleTest/SimpleTest.js
> +http://mochi.test:8888/tests/dom/tests/mochitest/ajax/offline/offlineTests.js
> +
> +# more then 15 what is a number of parallel loads

more than

::: dom/tests/mochitest/ajax/offline/test_bug744719-cancel.html
@@ +16,5 @@
> +
> +ok(applicationCache.mozItems.length == 0,
> +   "applicationCache.mozItems should be available and empty before associating with a cache.");
> +
> +function updateCaceled()

updateCanceled

@@ +61,5 @@
> +  OfflineTest.finish();
> +}
> +
> +if (OfflineTest.setup()) {
> +  // Wait some time after the update has been canceled to catch potentiall leaks of channels that would cause

potential

::: uriloader/prefetch/nsOfflineCacheUpdate.cpp
@@ +1474,5 @@
>              return;
>          }
>      }
>  
> +    // Accroding to parallelism this may imply more pinned retries count,

According
Attachment #627480 - Flags: review?(michal.novotny) → review+
Thanks Phil.

According the crash, apparently we need to a) prevent call of Finish[NoNotify]() more then one time (just prevent when state is STATE_FINISHED) and b) make items keep the update hard-reffed between successful call to AsyncOpen and after notify of LoadCompleted.
Attached patch v3Splinter Review
https://tbpl.mozilla.org/?tree=Try&rev=a9dbe4b59c3a

- items hard-ref the update
- prevent of duplicate call to Finish()
- fixed the js test code
Attachment #627480 - Attachment is obsolete: true
Attachment #628310 - Flags: review?(michal.novotny)
Attached patch interdiff v2->v3Splinter Review
Attachment #628310 - Flags: review?(michal.novotny) → review+
Status: ASSIGNED → RESOLVED
Closed: 12 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla15
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: