Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor legacy update queue #17510

Closed
wants to merge 4 commits into from
Closed

Conversation

acdlite
Copy link
Collaborator

@acdlite acdlite commented Dec 3, 2019

Based on #17483

Refactors legacy update queue to incorporate rebasing fix. Uses nearly the same approach as the hook update queue but has to handle a few other cases.

Managed to remove some older, poorly factored code related to error handling.

To-do

  • One remaining unit test to fix
  • Fix Flow

@codesandbox-ci
Copy link

codesandbox-ci bot commented Dec 3, 2019

This pull request is automatically built and testable in CodeSandbox.

To see build info of the built libraries, click here or the icon next to each commit SHA.

Latest deployment of this branch, based on commit 99444a2:

Sandbox Source
strange-pine-xtjqd Configuration

@sizebot
Copy link

sizebot commented Dec 3, 2019

Details of bundled changes.

Comparing: 3c1efa0...99444a2

react-dom

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-dom.profiling.min.js -0.3% +0.1% 123.69 KB 123.27 KB 38.81 KB 38.84 KB NODE_PROFILING
react-dom-server.browser.development.js 0.0% 0.0% 140.67 KB 140.67 KB 36.94 KB 36.94 KB UMD_DEV
react-dom-server.browser.production.min.js 0.0% 0.0% 20.39 KB 20.39 KB 7.48 KB 7.48 KB UMD_PROD
react-dom-test-utils.development.js 0.0% 0.0% 56.18 KB 56.18 KB 15.54 KB 15.55 KB UMD_DEV
react-dom-unstable-fizz.browser.development.js 0.0% +0.1% 3.88 KB 3.88 KB 1.55 KB 1.55 KB UMD_DEV
react-dom-test-utils.production.min.js 0.0% 🔺+0.1% 11.18 KB 11.18 KB 4.15 KB 4.15 KB UMD_PROD
react-dom-unstable-fizz.browser.production.min.js 0.0% 🔺+0.6% 1.21 KB 1.21 KB 708 B 712 B UMD_PROD
ReactDOMServer-dev.js 0.0% 0.0% 140.21 KB 140.21 KB 35.48 KB 35.48 KB FB_WWW_DEV
react-dom-test-utils.development.js 0.0% 0.0% 54.45 KB 54.45 KB 15.21 KB 15.21 KB NODE_DEV
ReactDOMServer-prod.js 0.0% 0.0% 48.91 KB 48.91 KB 11.18 KB 11.18 KB FB_WWW_PROD
react-dom-unstable-fizz.browser.development.js 0.0% +0.1% 3.71 KB 3.71 KB 1.5 KB 1.5 KB NODE_DEV
react-dom-test-utils.production.min.js 0.0% 🔺+0.1% 10.95 KB 10.95 KB 4.09 KB 4.09 KB NODE_PROD
react-dom-unstable-fizz.browser.production.min.js 0.0% 🔺+0.5% 1.05 KB 1.05 KB 640 B 643 B NODE_PROD
react-dom.development.js -0.2% -0.1% 955.66 KB 953.78 KB 216.06 KB 215.84 KB UMD_DEV
react-dom.production.min.js -0.4% -0.0% 119.74 KB 119.31 KB 38.46 KB 38.45 KB UMD_PROD
react-dom.profiling.min.js -0.3% +0.1% 123.42 KB 123 KB 39.56 KB 39.58 KB UMD_PROFILING
react-dom.development.js -0.2% -0.1% 949.73 KB 947.85 KB 214.48 KB 214.26 KB NODE_DEV
react-dom-server.node.development.js 0.0% 0.0% 137.71 KB 137.71 KB 36.16 KB 36.17 KB NODE_DEV
react-dom.production.min.js -0.3% 0.0% 119.88 KB 119.46 KB 37.79 KB 37.8 KB NODE_PROD
react-dom-server.node.production.min.js 0.0% 0.0% 20.72 KB 20.72 KB 7.61 KB 7.61 KB NODE_PROD
react-dom-server.browser.development.js 0.0% 0.0% 136.6 KB 136.6 KB 35.94 KB 35.94 KB NODE_DEV
react-dom-server.browser.production.min.js 0.0% 0.0% 20.31 KB 20.31 KB 7.46 KB 7.46 KB NODE_PROD
react-dom-unstable-native-dependencies.development.js 0.0% 0.0% 60.1 KB 60.1 KB 15.78 KB 15.78 KB UMD_DEV
react-dom-unstable-native-dependencies.production.min.js 0.0% 🔺+0.1% 10.73 KB 10.73 KB 3.67 KB 3.67 KB UMD_PROD
ReactDOM-dev.js -0.2% -0.1% 978.24 KB 976.19 KB 217.02 KB 216.74 KB FB_WWW_DEV
ReactDOM-prod.js 0.0% 🔺+0.2% 402.25 KB 402.28 KB 73.07 KB 73.19 KB FB_WWW_PROD
react-dom-unstable-native-dependencies.development.js 0.0% 0.0% 59.77 KB 59.77 KB 15.65 KB 15.65 KB NODE_DEV
react-dom-unstable-fizz.node.development.js 0.0% +0.1% 4.42 KB 4.42 KB 1.65 KB 1.65 KB NODE_DEV
ReactDOM-profiling.js 0.0% +0.2% 404.04 KB 404.08 KB 74.01 KB 74.13 KB FB_WWW_PROFILING
react-dom-unstable-native-dependencies.production.min.js 0.0% 🔺+0.1% 10.48 KB 10.48 KB 3.57 KB 3.58 KB NODE_PROD
react-dom-unstable-fizz.node.production.min.js 0.0% 🔺+0.4% 1.21 KB 1.21 KB 696 B 699 B NODE_PROD

react-native-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
ReactFabric-prod.js 0.0% 🔺+0.4% 268.96 KB 268.98 KB 46.22 KB 46.4 KB RN_FB_PROD
ReactNativeRenderer-dev.js -0.3% -0.2% 750.39 KB 748.34 KB 158.89 KB 158.6 KB RN_OSS_DEV
ReactFabric-profiling.js 0.0% +0.4% 279.07 KB 279.08 KB 48.06 KB 48.23 KB RN_FB_PROFILING
ReactNativeRenderer-prod.js 0.0% 🔺+0.3% 277.3 KB 277.32 KB 47.61 KB 47.77 KB RN_FB_PROD
ReactNativeRenderer-profiling.js 0.0% +0.3% 286.23 KB 286.25 KB 49.33 KB 49.49 KB RN_FB_PROFILING
ReactFabric-dev.js -0.3% -0.2% 755.83 KB 753.78 KB 159.73 KB 159.44 KB RN_OSS_DEV
ReactFabric-prod.js 0.0% 🔺+0.4% 268.61 KB 268.63 KB 46.14 KB 46.32 KB RN_OSS_PROD
ReactFabric-profiling.js 0.0% +0.3% 278.72 KB 278.74 KB 47.99 KB 48.15 KB RN_OSS_PROFILING
ReactFabric-dev.js -0.3% -0.2% 756.01 KB 753.96 KB 159.81 KB 159.53 KB RN_FB_DEV
ReactNativeRenderer-prod.js 0.0% 🔺+0.3% 276.91 KB 276.93 KB 47.54 KB 47.7 KB RN_OSS_PROD
ReactNativeRenderer-profiling.js 0.0% +0.3% 285.85 KB 285.87 KB 49.26 KB 49.42 KB RN_OSS_PROFILING
ReactNativeRenderer-dev.js -0.3% -0.2% 750.57 KB 748.51 KB 158.97 KB 158.68 KB RN_FB_DEV

react-test-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-test-renderer.development.js -0.3% -0.2% 619.16 KB 617.28 KB 132.02 KB 131.81 KB UMD_DEV
react-test-renderer.production.min.js -0.6% 🔺+0.2% 71.85 KB 71.43 KB 21.95 KB 21.99 KB UMD_PROD
ReactTestRenderer-dev.js -0.3% -0.2% 629.94 KB 627.88 KB 131.2 KB 130.9 KB FB_WWW_DEV
react-test-renderer-shallow.development.js 0.0% 0.0% 39.15 KB 39.15 KB 10.01 KB 10.01 KB UMD_DEV
react-test-renderer-shallow.production.min.js 0.0% 🔺+0.1% 11.6 KB 11.6 KB 3.58 KB 3.58 KB UMD_PROD
react-test-renderer-shallow.development.js 0.0% 0.0% 33.1 KB 33.1 KB 8.53 KB 8.54 KB NODE_DEV
react-test-renderer-shallow.production.min.js 0.0% 🔺+0.1% 11.73 KB 11.73 KB 3.69 KB 3.69 KB NODE_PROD
react-test-renderer.development.js -0.3% -0.2% 614.43 KB 612.55 KB 130.84 KB 130.61 KB NODE_DEV
react-test-renderer.production.min.js -0.6% 🔺+0.1% 71.54 KB 71.13 KB 21.59 KB 21.62 KB NODE_PROD

react-noop-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-noop-renderer.development.js +1.3% +1.2% 35 KB 35.45 KB 8 KB 8.1 KB NODE_DEV
react-noop-renderer.production.min.js 🔺+1.1% 🔺+1.3% 11.85 KB 11.97 KB 3.78 KB 3.83 KB NODE_PROD
react-noop-renderer-flight-client.production.min.js 0.0% 🔺+0.5% 574 B 574 B 422 B 424 B NODE_PROD
react-noop-renderer-flight-server.development.js 0.0% +0.3% 2.18 KB 2.18 KB 960 B 963 B NODE_DEV
react-noop-renderer-flight-server.production.min.js 0.0% 🔺+0.5% 1007 B 1007 B 566 B 569 B NODE_PROD
react-noop-renderer-server.development.js 0.0% +0.2% 1.98 KB 1.98 KB 905 B 907 B NODE_DEV
react-noop-renderer-server.production.min.js 0.0% 🔺+0.4% 901 B 901 B 513 B 515 B NODE_PROD
react-noop-renderer-persistent.development.js +1.3% +1.2% 35.11 KB 35.57 KB 8.02 KB 8.12 KB NODE_DEV
react-noop-renderer-persistent.production.min.js 🔺+1.1% 🔺+1.4% 11.87 KB 11.99 KB 3.79 KB 3.84 KB NODE_PROD

react-art

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
ReactART-dev.js -0.3% -0.2% 618.27 KB 616.22 KB 128.63 KB 128.34 KB FB_WWW_DEV
ReactART-prod.js 0.0% 🔺+0.3% 235.6 KB 235.64 KB 39.88 KB 40.01 KB FB_WWW_PROD
react-art.development.js -0.3% -0.1% 674.24 KB 672.35 KB 146.34 KB 146.12 KB UMD_DEV
react-art.production.min.js -0.4% 🔺+0.1% 106.81 KB 106.39 KB 32.43 KB 32.45 KB UMD_PROD
react-art.development.js -0.3% -0.2% 604.88 KB 603 KB 128.95 KB 128.73 KB NODE_DEV
react-art.production.min.js -0.6% 🔺+0.2% 71.78 KB 71.36 KB 21.49 KB 21.54 KB NODE_PROD

react-reconciler

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-reconciler-persistent.development.js -0.3% -0.2% 603.39 KB 601.51 KB 127.04 KB 126.81 KB NODE_DEV
react-reconciler-reflection.development.js 0.0% 0.0% 19.09 KB 19.09 KB 6.23 KB 6.23 KB NODE_DEV
react-reconciler-persistent.production.min.js -0.6% 🔺+0.1% 72.59 KB 72.17 KB 21.33 KB 21.35 KB NODE_PROD
react-reconciler-reflection.production.min.js 0.0% 🔺+0.2% 2.86 KB 2.86 KB 1.24 KB 1.24 KB NODE_PROD
react-reconciler.development.js -0.3% -0.2% 605.92 KB 604.03 KB 128.14 KB 127.91 KB NODE_DEV
react-reconciler.production.min.js -0.6% 🔺+0.1% 74.81 KB 74.38 KB 21.9 KB 21.91 KB NODE_PROD

ReactDOM: size: 0.0%, gzip: 0.0%

Size changes (experimental)

Generated by 🚫 dangerJS against 99444a2

@sizebot
Copy link

sizebot commented Dec 3, 2019

Details of bundled changes.

Comparing: 3c1efa0...99444a2

react-reconciler

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-reconciler.production.min.js -0.6% 🔺+0.1% 72.57 KB 72.14 KB 21.32 KB 21.34 KB NODE_PROD
react-reconciler-reflection.production.min.js 0.0% 🔺+0.2% 2.85 KB 2.85 KB 1.23 KB 1.24 KB NODE_PROD
react-reconciler-persistent.development.js -0.3% -0.2% 603.38 KB 601.49 KB 127.03 KB 126.8 KB NODE_DEV
react-reconciler-persistent.production.min.js -0.6% 🔺+0.1% 72.58 KB 72.15 KB 21.32 KB 21.35 KB NODE_PROD
react-reconciler.development.js -0.3% -0.2% 605.91 KB 604.02 KB 128.14 KB 127.91 KB NODE_DEV
react-reconciler-reflection.development.js 0.0% 0.0% 19.08 KB 19.08 KB 6.23 KB 6.23 KB NODE_DEV

react-noop-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-noop-renderer.production.min.js 🔺+1.1% 🔺+1.4% 11.83 KB 11.96 KB 3.77 KB 3.82 KB NODE_PROD
react-noop-renderer-persistent.development.js +1.3% +1.2% 35.1 KB 35.56 KB 8.01 KB 8.11 KB NODE_DEV
react-noop-renderer-persistent.production.min.js 🔺+1.1% 🔺+1.4% 11.85 KB 11.98 KB 3.78 KB 3.83 KB NODE_PROD
react-noop-renderer-flight-server.development.js 0.0% +0.2% 2.17 KB 2.17 KB 952 B 954 B NODE_DEV
react-noop-renderer-flight-server.production.min.js 0.0% 🔺+0.2% 994 B 994 B 558 B 559 B NODE_PROD
react-noop-renderer.development.js +1.3% +1.2% 34.98 KB 35.44 KB 8 KB 8.1 KB NODE_DEV
react-noop-renderer-server.development.js 0.0% +0.2% 1.97 KB 1.97 KB 897 B 899 B NODE_DEV
react-noop-renderer-server.production.min.js 0.0% 🔺+0.2% 888 B 888 B 504 B 505 B NODE_PROD
react-noop-renderer-flight-client.development.js 0.0% +0.3% 1.62 KB 1.62 KB 770 B 772 B NODE_DEV
react-noop-renderer-flight-client.production.min.js 0.0% 🔺+0.5% 561 B 561 B 413 B 415 B NODE_PROD

react-dom

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-dom-unstable-native-dependencies.production.min.js 0.0% 🔺+0.1% 10.46 KB 10.46 KB 3.56 KB 3.57 KB NODE_PROD
react-dom.development.js -0.2% -0.1% 955.64 KB 953.76 KB 216.03 KB 215.81 KB UMD_DEV
react-dom-server.browser.production.min.js 0.0% 0.0% 19.85 KB 19.85 KB 7.38 KB 7.38 KB NODE_PROD
react-dom-unstable-fizz.browser.development.js 0.0% +0.1% 3.87 KB 3.87 KB 1.54 KB 1.54 KB UMD_DEV
react-dom.production.min.js -0.4% 🔺+0.1% 116.39 KB 115.97 KB 37.45 KB 37.49 KB UMD_PROD
react-dom-unstable-fizz.browser.production.min.js 0.0% 🔺+0.4% 1.2 KB 1.2 KB 701 B 704 B UMD_PROD
react-dom.profiling.min.js -0.4% 0.0% 119.96 KB 119.53 KB 38.56 KB 38.58 KB UMD_PROFILING
react-dom.development.js -0.2% -0.1% 949.71 KB 947.83 KB 214.46 KB 214.24 KB NODE_DEV
react-dom-unstable-fizz.browser.development.js 0.0% +0.1% 3.7 KB 3.7 KB 1.49 KB 1.5 KB NODE_DEV
react-dom.production.min.js -0.4% 0.0% 116.5 KB 116.08 KB 36.86 KB 36.86 KB NODE_PROD
react-dom-unstable-native-dependencies.development.js 0.0% 0.0% 60.08 KB 60.08 KB 15.77 KB 15.77 KB UMD_DEV
react-dom-unstable-fizz.browser.production.min.js 0.0% 🔺+0.5% 1.04 KB 1.04 KB 632 B 635 B NODE_PROD
react-dom.profiling.min.js -0.3% 0.0% 120.19 KB 119.78 KB 37.84 KB 37.85 KB NODE_PROFILING
react-dom-unstable-native-dependencies.production.min.js 0.0% 🔺+0.1% 10.72 KB 10.72 KB 3.66 KB 3.67 KB UMD_PROD
react-dom-unstable-native-dependencies.development.js 0.0% 0.0% 59.76 KB 59.76 KB 15.64 KB 15.64 KB NODE_DEV
react-dom-test-utils.development.js 0.0% 0.0% 56.17 KB 56.17 KB 15.54 KB 15.54 KB UMD_DEV
react-dom-server.node.production.min.js 0.0% 0.0% 20.26 KB 20.26 KB 7.53 KB 7.53 KB NODE_PROD
react-dom-test-utils.production.min.js 0.0% 🔺+0.1% 11.17 KB 11.17 KB 4.14 KB 4.14 KB UMD_PROD
react-dom-test-utils.development.js 0.0% 0.0% 54.44 KB 54.44 KB 15.21 KB 15.21 KB NODE_DEV
react-dom-unstable-fizz.node.development.js 0.0% +0.1% 4.4 KB 4.4 KB 1.64 KB 1.64 KB NODE_DEV
react-dom-test-utils.production.min.js 0.0% 🔺+0.1% 10.94 KB 10.94 KB 4.08 KB 4.08 KB NODE_PROD
react-dom-server.browser.development.js 0.0% 0.0% 140.64 KB 140.64 KB 36.93 KB 36.94 KB UMD_DEV
react-dom-unstable-fizz.node.production.min.js 0.0% 🔺+0.3% 1.2 KB 1.2 KB 688 B 690 B NODE_PROD

react-art

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-art.development.js -0.3% -0.1% 674.22 KB 672.33 KB 146.34 KB 146.12 KB UMD_DEV
react-art.production.min.js -0.4% 🔺+0.1% 104.79 KB 104.37 KB 31.83 KB 31.85 KB UMD_PROD
react-art.development.js -0.3% -0.2% 604.86 KB 602.98 KB 128.94 KB 128.72 KB NODE_DEV
react-art.production.min.js -0.6% 0.0% 69.8 KB 69.38 KB 21.01 KB 21.02 KB NODE_PROD

react-test-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
react-test-renderer.development.js -0.3% -0.2% 619.14 KB 617.25 KB 132.01 KB 131.8 KB UMD_DEV
react-test-renderer.production.min.js -0.6% 🔺+0.2% 71.82 KB 71.4 KB 21.93 KB 21.98 KB UMD_PROD
react-test-renderer.development.js -0.3% -0.2% 614.41 KB 612.52 KB 130.83 KB 130.6 KB NODE_DEV
react-test-renderer.production.min.js -0.6% 🔺+0.1% 71.52 KB 71.1 KB 21.57 KB 21.6 KB NODE_PROD
react-test-renderer-shallow.development.js 0.0% 0.0% 39.13 KB 39.13 KB 10 KB 10 KB UMD_DEV
react-test-renderer-shallow.production.min.js 0.0% 🔺+0.1% 11.58 KB 11.58 KB 3.57 KB 3.58 KB UMD_PROD
react-test-renderer-shallow.development.js 0.0% 0.0% 33.09 KB 33.09 KB 8.52 KB 8.53 KB NODE_DEV
react-test-renderer-shallow.production.min.js 0.0% 🔺+0.1% 11.72 KB 11.72 KB 3.68 KB 3.68 KB NODE_PROD

react-native-renderer

File Filesize Diff Gzip Diff Prev Size Current Size Prev Gzip Current Gzip ENV
ReactNativeRenderer-dev.js -0.3% -0.2% 750.55 KB 748.5 KB 158.96 KB 158.67 KB RN_FB_DEV
ReactNativeRenderer-prod.js 0.0% 🔺+0.3% 277.29 KB 277.31 KB 47.6 KB 47.76 KB RN_FB_PROD
ReactNativeRenderer-profiling.js 0.0% +0.3% 286.22 KB 286.24 KB 49.32 KB 49.48 KB RN_FB_PROFILING
ReactFabric-dev.js -0.3% -0.2% 756 KB 753.95 KB 159.8 KB 159.52 KB RN_FB_DEV
ReactFabric-prod.js 0.0% 🔺+0.4% 268.95 KB 268.97 KB 46.21 KB 46.39 KB RN_FB_PROD
ReactFabric-profiling.js 0.0% +0.4% 279.05 KB 279.07 KB 48.05 KB 48.22 KB RN_FB_PROFILING
ReactNativeRenderer-dev.js -0.3% -0.2% 750.38 KB 748.33 KB 158.88 KB 158.59 KB RN_OSS_DEV
ReactNativeRenderer-prod.js 0.0% 🔺+0.3% 276.9 KB 276.92 KB 47.53 KB 47.69 KB RN_OSS_PROD
ReactNativeRenderer-profiling.js 0.0% +0.3% 285.83 KB 285.85 KB 49.25 KB 49.41 KB RN_OSS_PROFILING
ReactFabric-dev.js -0.3% -0.2% 755.82 KB 753.76 KB 159.72 KB 159.43 KB RN_OSS_DEV
ReactFabric-prod.js 0.0% 🔺+0.4% 268.6 KB 268.62 KB 46.13 KB 46.31 KB RN_OSS_PROD
ReactFabric-profiling.js 0.0% +0.3% 278.71 KB 278.73 KB 47.98 KB 48.15 KB RN_OSS_PROFILING

ReactDOM: size: -0.4%, gzip: 🔺+0.1%

Size changes (stable)

Generated by 🚫 dangerJS against 99444a2

@acdlite acdlite force-pushed the queue-refactor branch 3 times, most recently from 1cc8f85 to 275cc2f Compare December 4, 2019 15:31
@acdlite acdlite marked this pull request as ready for review December 4, 2019 15:41
const first = pending.next;
if (first !== null) {
// Still circular.
update.next = first;
Copy link
Collaborator

@sebmarkbage sebmarkbage Dec 6, 2019

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's this about, we need this for it to stay circular, no? Maybe we're missing a test?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All I did was remove the first !== null check. Which is unnecessary because update.next is never null.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think the diff makes it look like I deleted the assignment but really all I deleted was the type check that surrounds it.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actually, to rephrase, it's not really a type check that I deleted. In the old implementation, the queue was only sometimes circular. It would eventually "unravel" to linear so that the old nodes could be garbage collected. But in the new implementation, the pending queue is always circular. So you don't need to check for if it's circular or not.

@@ -160,7 +160,7 @@ describe('createSubscription', () => {

it('should still work if unsubscription is managed incorrectly', async () => {
const Subscription = createSubscription({
getCurrentValue: source => undefined,
getCurrentValue: source => source.value,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this a breaking change?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I looked into this for a while and I think the old version was just wrong and it accidentally worked with the old implementation. I'm going to try to write a failing test for what's in master.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Never mind, I found the bug. Will add a test.

Adds a failing test case where an update that was committed is
later skipped over during a rebase. This should never happen.
lastCapturedEffect: Update<State> | null,
baseQueue: Update<State> | null,
shared: SharedQueue<State>,
effects: Array<Update<State>> | null,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why is this an array as opposed to a linked list like the hooks form? Harder to see how they correlate.

I was considering a refactor to arrays but with a different take (inline fields instead of objects) . However, I wanted to do that as a separate refactor.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Idk I just chose one :D

This felt like a different trade off from the hooks one because these effects are relatively rare. Only when you pass a callback to setState. It's more like the emitEffect API.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

So it didn't seem worth putting a nextEffect field on the update type

@acdlite acdlite force-pushed the queue-refactor branch 2 times, most recently from 57816d9 to 862287b Compare December 9, 2019 19:47
This test passes in the old legacy update queue implementation. I'm
adding this before the refactor to prevent a regression.
Refactors legacy update queue to incoporate rebasing fix. Uses nearly
the same approach as the hook update queue but has to handle a few
other cases.
acdlite added a commit that referenced this pull request Dec 9, 2019
Fixes a bug related to rebasing updates. Once an update has committed,
it should never un-commit, even if interrupted by a higher priority
update. The fix includes a refactor of how update queues work.

This commit is a combination of two PRs:

- #17483 by @sebmarkbage refactors the hook update queue
- #17510 by @acdlite refactors the class and root update queue

Landing one without the other would cause state updates to sometimes be
inconsistent across components, so I've combined them into a single
commit in case they need to be reverted.

Co-authored-by: Sebastian Markbåge <[email protected]>
Co-authored-by: Andrew Clark <[email protected]>
@acdlite
Copy link
Collaborator Author

acdlite commented Dec 9, 2019

I squashed this with the hooks refactor and landed as b617db3 so it can be atomically reverted.

@acdlite acdlite closed this Dec 9, 2019
acdlite added a commit to acdlite/react that referenced this pull request Dec 9, 2019
Fixes a bug related to rebasing updates. Once an update has committed,
it should never un-commit, even if interrupted by a higher priority
update. The fix includes a refactor of how update queues work.

This commit is a combination of two PRs:

- facebook#17483 by @sebmarkbage refactors the hook update queue
- facebook#17510 by @acdlite refactors the class and root update queue

Landing one without the other would cause state updates to sometimes be
inconsistent across components, so I've combined them into a single
commit in case they need to be reverted.

Co-authored-by: Sebastian Markbåge <[email protected]>
Co-authored-by: Andrew Clark <[email protected]>
acdlite added a commit that referenced this pull request Dec 11, 2019
* Refactor Update Queues to Fix Rebasing Bug

Fixes a bug related to rebasing updates. Once an update has committed,
it should never un-commit, even if interrupted by a higher priority
update. The fix includes a refactor of how update queues work.

This commit is a combination of two PRs:

- #17483 by @sebmarkbage refactors the hook update queue
- #17510 by @acdlite refactors the class and root update queue

Landing one without the other would cause state updates to sometimes be
inconsistent across components, so I've combined them into a single
commit in case they need to be reverted.

Co-authored-by: Sebastian Markbåge <[email protected]>
Co-authored-by: Andrew Clark <[email protected]>

* Initialize update queue object on mount

Instead of lazily initializing update queue objects on the first update,
class and host root queues are created on mount. This simplifies the
logic for appending new updates and matches what we do for hooks.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants