Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upMove away from Promise.all way and check if we need to finish manually #26395
Conversation
highfive
commented
May 3, 2020
|
Heads up! This PR modifies the following files:
|
highfive
commented
May 3, 2020
|
also cc @Manishearth |
|
@bors-servo try=wpt |
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
|
|
@bors-servo try=wpt I also refactored Also, I can't reproduce the failure in previous try locally... I suspect there will be some intermittent failures |
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
@bors-servo try=wpt
|
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
|
|
btw, is it worth writing the ASCII graph in PR description into |
|
r? @Manishearth |
|
Seems overall okay, but i'm having a hard time understanding how the resolution works: could you add more comments to the fetch modules and advance_finished_and_link functions? also it seems like the advance_finished_and_link function, which contains a bunch of loops, is called a lot, but i'm unsure how necessary that is since it's unclear to me what the function is doing |
|
@bors-servo try=wpt |
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
|
|
@bors-servo retry
|
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
|
|
@bors-servo retry
is this same as #26862? |
Move away from Promise.all way and check if we need to finish manually
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the `Ready` and `FetchFailed` status are quite confusing
and we actually don't need them so they're removed in this patch. Then,
we will always go to `Finished` instead.
It would basically be following steps:
```
+-----------------+
| Failed to fetch | ----------+
+--------------+ +----------+ / +-----------------+ |
| Fetch module | ----> | Fetching | ---+ v
+--------------+ +----------+ \ +---------+ +---------------------+
| Fetched | | Advance to Finished |
+---------+ +---------------------+
| ^
v |
+-------------------+ |
| Fetch descendants | ----- if no descendants
+-------------------+
|
V
+----------------------+
| Fetching Descendants |
+----------------------+
```
In `Advance to Finished`, it means that module script is about to finished so it will
1. Notify all of its `ready` and `not finished` parents to finish
2. Link (instantiate) the module
3. Resolve its promise to notify owner(s) to finish
<!-- Please describe your changes on the following line: -->
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [x] `./mach build -d` does not report any errors
- [x] `./mach test-tidy` does not report any errors
- [x] These changes fix #25442
- [x] These changes do not require tests because it basically refactors the script module and should not break anything.
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
|
|
|
@bors-servo retry |
|
|
In servo#26395, we moved from `recursive checking` of dependency status to check only the _current module_'s dependency status and its descendant dependency status and also circular dependency status. However, it will cause an issue. For example, if the module dependency is like following ``` a -> b -> c -> d -> e f -> g -> h -> c -> d -> e ``` In this example, if the d module is still under fetching but g is trying to advance to finish. Then, it will cause a panic because module d is g's grand-grand-grand-descendant which means it's still under fetching and we can't instantiate module g. Ideally, we should get rid of the checking in servo#26903 so, before servo#26903 fixed, we can just move back to the recursive checking way which will ensure all descendants are not fetching.
CYBAI commentedMay 3, 2020
In the previous Promise.all way, we registered a promise for every
module script which means we will need to do many complex checkings like
"is this top level?" and it will make us much more difficult to understand
how the module script algorithm works.
In the new manual checking way, we will only register promises for top
level modules to notify its owner (e.g. the script element) to finish
the load. So, we can understand it much more easily and would be more
spec-aligned.
Also, I think the
ReadyandFetchFailedstatus are quite confusingand we actually don't need them so they're removed in this patch. Then,
we will always go to
Finishedinstead.It would basically be following steps:
In
Advance to Finished, it means that module script is about to finished so it willreadyandnot finishedparents to finish./mach build -ddoes not report any errors./mach test-tidydoes not report any errors