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

Core data: Fall back to default API batch size of 25. #39524

Closed
wants to merge 2 commits into from

Conversation

dmsnell
Copy link
Member

@dmsnell dmsnell commented Mar 17, 2022

What

Part of #39211

Previously it was possible that we fail to register a batch size from
the server and we leave the batch size null.

In this patch we fallback to the Core-defined default of 25.

Testing Instructions

It may not be possible to test this as it probably can never occur that we get to the point in line 39 without having set maxItems.

Maybe we should type-cast instead to assert that maxItems is set? But it's just a tiny addition as a compromise to prevent playing mind tricks in the type system.

@dmsnell dmsnell requested a review from nerrad as a code owner March 17, 2022 02:56
@github-actions
Copy link

github-actions bot commented Mar 17, 2022

Size Change: +82 B (0%)

Total Size: 1.21 MB

Filename Size Change
build/core-data/index.min.js 14.3 kB +82 B (+1%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 993 B
build/admin-manifest/index.min.js 1.24 kB
build/annotations/index.min.js 2.77 kB
build/api-fetch/index.min.js 2.27 kB
build/autop/index.min.js 2.15 kB
build/blob/index.min.js 487 B
build/block-directory/index.min.js 6.49 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 146 kB
build/block-editor/style-rtl.css 15.1 kB
build/block-editor/style.css 15.1 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 150 B
build/block-library/blocks/audio/editor.css 150 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 445 B
build/block-library/blocks/button/editor.css 445 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 103 B
build/block-library/blocks/code/style.css 103 B
build/block-library/blocks/code/theme-rtl.css 124 B
build/block-library/blocks/code/theme.css 124 B
build/block-library/blocks/columns/editor-rtl.css 108 B
build/block-library/blocks/columns/editor.css 108 B
build/block-library/blocks/columns/style-rtl.css 406 B
build/block-library/blocks/columns/style.css 406 B
build/block-library/blocks/comment-author-avatar/editor-rtl.css 125 B
build/block-library/blocks/comment-author-avatar/editor.css 125 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/comments-query-loop/editor-rtl.css 95 B
build/block-library/blocks/comments-query-loop/editor.css 95 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.56 kB
build/block-library/blocks/cover/style.css 1.56 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 353 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 961 B
build/block-library/blocks/gallery/editor.css 964 B
build/block-library/blocks/gallery/style-rtl.css 1.51 kB
build/block-library/blocks/gallery/style.css 1.51 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 529 B
build/block-library/blocks/image/style.css 535 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 199 B
build/block-library/blocks/latest-posts/editor.css 198 B
build/block-library/blocks/latest-posts/style-rtl.css 447 B
build/block-library/blocks/latest-posts/style.css 446 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 708 B
build/block-library/blocks/navigation-link/editor.css 706 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 375 B
build/block-library/blocks/navigation/editor-rtl.css 2.03 kB
build/block-library/blocks/navigation/editor.css 2.04 kB
build/block-library/blocks/navigation/style-rtl.css 1.89 kB
build/block-library/blocks/navigation/style.css 1.88 kB
build/block-library/blocks/navigation/view.min.js 2.85 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 363 B
build/block-library/blocks/page-list/editor.css 363 B
build/block-library/blocks/page-list/style-rtl.css 175 B
build/block-library/blocks/page-list/style.css 175 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 521 B
build/block-library/blocks/post-comments/style.css 521 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 323 B
build/block-library/blocks/post-template/style.css 323 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 370 B
build/block-library/blocks/pullquote/style.css 370 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 201 B
build/block-library/blocks/quote/style.css 201 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/read-more/style-rtl.css 132 B
build/block-library/blocks/read-more/style.css 132 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 140 B
build/block-library/blocks/separator/editor.css 140 B
build/block-library/blocks/separator/style-rtl.css 233 B
build/block-library/blocks/separator/style.css 233 B
build/block-library/blocks/separator/theme-rtl.css 194 B
build/block-library/blocks/separator/theme.css 194 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 759 B
build/block-library/blocks/site-logo/editor.css 759 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 674 B
build/block-library/blocks/social-links/editor.css 673 B
build/block-library/blocks/social-links/style-rtl.css 1.37 kB
build/block-library/blocks/social-links/style.css 1.36 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 226 B
build/block-library/blocks/tag-cloud/style.css 227 B
build/block-library/blocks/template-part/editor-rtl.css 235 B
build/block-library/blocks/template-part/editor.css 235 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 934 B
build/block-library/common.css 932 B
build/block-library/editor-rtl.css 9.98 kB
build/block-library/editor.css 9.98 kB
build/block-library/index.min.js 169 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 11.2 kB
build/block-library/style.css 11.2 kB
build/block-library/theme-rtl.css 689 B
build/block-library/theme.css 694 B
build/block-serialization-default-parser/index.min.js 1.12 kB
build/block-serialization-spec-parser/index.min.js 2.83 kB
build/blocks/index.min.js 46.8 kB
build/components/index.min.js 218 kB
build/components/style-rtl.css 15.6 kB
build/components/style.css 15.6 kB
build/compose/index.min.js 11.2 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.39 kB
build/customize-widgets/style.css 1.39 kB
build/data-controls/index.min.js 663 B
build/data/index.min.js 8.19 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 518 B
build/dom-ready/index.min.js 336 B
build/dom/index.min.js 4.53 kB
build/edit-navigation/index.min.js 16.1 kB
build/edit-navigation/style-rtl.css 4.04 kB
build/edit-navigation/style.css 4.05 kB
build/edit-post/classic-rtl.css 546 B
build/edit-post/classic.css 547 B
build/edit-post/index.min.js 29.8 kB
build/edit-post/style-rtl.css 7.07 kB
build/edit-post/style.css 7.07 kB
build/edit-site/index.min.js 45 kB
build/edit-site/style-rtl.css 7.58 kB
build/edit-site/style.css 7.56 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.39 kB
build/edit-widgets/style.css 4.39 kB
build/editor/index.min.js 38.4 kB
build/editor/style-rtl.css 3.71 kB
build/editor/style.css 3.71 kB
build/element/index.min.js 4.29 kB
build/escape-html/index.min.js 548 B
build/format-library/index.min.js 6.62 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.66 kB
build/html-entities/index.min.js 454 B
build/i18n/index.min.js 3.79 kB
build/is-shallow-equal/index.min.js 535 B
build/keyboard-shortcuts/index.min.js 1.83 kB
build/keycodes/index.min.js 1.41 kB
build/list-reusable-blocks/index.min.js 1.75 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.94 kB
build/notices/index.min.js 957 B
build/nux/index.min.js 2.12 kB
build/nux/style-rtl.css 751 B
build/nux/style.css 749 B
build/plugins/index.min.js 1.98 kB
build/preferences/index.min.js 1.2 kB
build/primitives/index.min.js 949 B
build/priority-queue/index.min.js 611 B
build/react-i18n/index.min.js 704 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.69 kB
build/reusable-blocks/index.min.js 2.24 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11.1 kB
build/server-side-render/index.min.js 1.61 kB
build/shortcode/index.min.js 1.52 kB
build/token-list/index.min.js 668 B
build/url/index.min.js 1.99 kB
build/vendors/react-dom.min.js 38.5 kB
build/vendors/react.min.js 4.34 kB
build/viewport/index.min.js 1.08 kB
build/warning/index.min.js 280 B
build/widgets/index.min.js 7.21 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.07 kB

compressed-size-action

@adamziel
Copy link
Contributor

AFAIR the default maxItems value may be updated on the backend (filters perhaps?). If we then default to 25 on the frontend, the two may disagree. Cc @TimothyBJacobs for a confidence check

@TimothyBJacobs
Copy link
Member

Correct, if maxItems is still null in that branch it means something went wrong with the previous fetch. I think we should be erroring out in that case.

dmsnell added 2 commits March 21, 2022 18:24
Part of #39211

Previously it was possible that we fail to register a batch size from
the server and we leave the batch size null.

In this patch we fallback to the Core-defined default of 25.
@dmsnell dmsnell force-pushed the core-data/fix-typing-issues-default-processor branch from 5c1c9a9 to f930527 Compare March 22, 2022 01:24
@dmsnell
Copy link
Member Author

dmsnell commented Mar 22, 2022

Thanks to both of you for reviewing this PR.

AFAIR the default maxItems value may be updated on the backend (filters perhaps?).

That's correct, and it's the purpose of the code in this PR to ask the backend what that value is. The problem was that if the request to fetch the batch size failed then all requests for that batch operation would never get sent out.

Instead of sending out those requests the code inside of defaultProcessor crashes and it never makes it to the actual apiFetch for the requests and maxItems remains null.

My effort around setting a default is more for situations where we're unable to get that configured batch size. I'd rather send out something that seems like a reasonable default (the default that PHP uses when no plugins adjust it) than to give up entirely.

The other option we have would be to send out all the requests in parallel, possibly by grouping them in parallel chunks or at-most-N-at-a-time. Given that I couldn't find any reported problems with this I don't want to spend much effort on it, but I also found it hard to just pass by knowing there's this latent bug in here where API requests could suddenly stop processing.

I think we should be erroring out in that case.

I've updated the patch to preserve the error but also to get it out of the way of the execution loop so we can continue to process requests using the default value.

If we're not keen on this I can see a couple other options for the general handling of this value.

  • Noted above, if we don't get a value for a batch size after a certain amount of time, start issuing the requests individually.
  • Given that we're relying on a pre-flight check for batch size and that's going to add a decent lag for the first batched request, we could also set the maxItems to a default value at boot instead of null and let the first batched request send out a second request for batch size.

I'm in favor of the second option because it's simpler still and doesn't need to halt for an error to fall back to the default.

The downside to the approach is that we could send a larger batch size than some plugin has decided to limit the server. If that happens then we would expect the entire batch to fail. Maybe some client-side code would try again and have the actual value for maxItems.

We could also set the value low, like 1 or 5 and let it do it's normal chunking and processing until we have a value for maxItems.

Again though, I don't want to spent too much time on a problem that isn't a known problem. If nobody likes any of these proposed ideas then we can hard-code the type-error into the system and ignore this latent bug for now.

@dmsnell dmsnell requested a review from noisysocks March 22, 2022 01:51
@dmsnell
Copy link
Member Author

dmsnell commented Mar 31, 2022

Closing for now due to lack of interest and review. We can readdress if we want to close this gap. I think there's still something valuable to consider here since we are delaying sending batched requests until we hear back on how many can be accepted at once.

@dmsnell dmsnell closed this Mar 31, 2022
@dmsnell dmsnell deleted the core-data/fix-typing-issues-default-processor branch March 31, 2022 19:51
@adamziel
Copy link
Contributor

adamziel commented Apr 1, 2022

Noted above, if we don't get a value for a batch size after a certain amount of time, start issuing the requests individually.

@dmsnell there is an entire rabbithole of context on that:

tl;dr:

I don't think we're able to provide a consistently good experience without an atomic navigation save endpoint that either stores all the changes at once or doesn't change anything at all. The worst possible scenario here is that 50% of the requests succeeds, and the other 50% does not not - which means the live site now is broken and it's quite hard to communicate how to get it fixed.

Of course, batches are not quite "atomic" in the same way as a database transaction is, but they have some useful mechanics like an all-or-nothing validation. I'd rather not introduce a case where the requests are unexpectedly "unbatched" and sent over one by one.

I've updated the patch to preserve the error but also to get it out of the way of the execution loop so we can continue to process requests using the default value.

I think this would be the best way forward. The worst-case scenario seems to be that the batch size sent exceeds the maxItems as the API knows it and it gets rejected during the validation. So we'd replace an error for an error – seems fair. If that batch would succeed, however, then we'd replace an error for a success – it seems like a pretty good deal!

The only caveat is that I'd add an opt-out switch here for the cases such as:

  • A plugin sets the batch size to a 1000 to ensure some operation does not get split into multiple requests
  • The default of 25 from this PR kicks in anyway

...or, thinking about it more, it would be even better to make the DEFAULT_BATCH_SIZE customizable in JavaScript in the same way as it can be customized on the backend. Perhaps this could even remove the need for having a preflight request at all? Or at least in the 80% use-case? What do you think @TimothyBJacobs ?

@dmsnell
Copy link
Member Author

dmsnell commented Apr 1, 2022

Of course, batches are not quite "atomic" in the same way as a database transaction is, but they have some useful mechanics like an all-or-nothing validation. I'd rather not introduce a case where the requests are unexpectedly "unbatched" and sent over one by one.

Holy coconuts batman, this is a frightening thing to read, that people are using the batch endpoint as a pseudo-transaction.

The worst possible scenario here is that 50% of the requests succeeds, and the other 50% does not not - which means the live site now is broken and it's quite hard to communicate how to get it fixed.

Can't this still happen with normal batching requests within the allotted batch size? there's nothing that makes those requests succeed or fail together, and to the contrary there's logic in there to record the success or failure of individual requests.

make the DEFAULT_BATCH_SIZE customizable in JavaScript

Part of the reason for closing this PR is just that I feel this has warranted more complexity than it deserves already. In fact, if it weren't for the fact that we're injecting latency into the first batch request by waiting on that query (and then also possibly shutting down all batch requests if it fails) then I wouldn't have addressed it.

I would have expected at least an implicit constraint of a batching system to be that there's no guarantee of processing all the requests together. Surprised we're using it to avoid creating an endpoint we know we need.

@adamziel
Copy link
Contributor

adamziel commented Apr 4, 2022

Holy coconuts batman, this is a frightening thing to read, that people are using the batch endpoint as a pseudo-transaction.

It's used in the widgets and the navigation editors. It used to be a bunch of parallel / sequential requests and the batch is already a big improvement on the way to actual atomic operations. Ideally this would be a real MySQL transaction with actual commit and rollback mechanics, but it's unclear how to rollback things like calls to WordPress hooks – especially when there are caches listening to them. We may get there at some point, but it's a process. See the discussions I linked to above for more context.

Can't this still happen with normal batching requests within the allotted batch size? there's nothing that makes those requests succeed or fail together, and to the contrary there's logic in there to record the success or failure of individual requests.

It can still happen and yes, it worries me too. Batches don't solve the problem fully, they just eliminate some of the possible failures like partial network errors, or partial validation problems.

I would have expected at least an implicit constraint of a batching system to be that there's no guarantee of processing all the requests together.

This constraint exists, e.g. when you exceed the max batch size. I'm just hesitant to default to sending the requests one by one.

Surprised we're using it to avoid creating an endpoint we know we need.

I'd love to have such an endpoint, I even had an exploratory PR going. It proved to be more involved than it initially seemed and discontinued at a time, but I believe that transactionality could be achieved given enough effort.

@dmsnell
Copy link
Member Author

dmsnell commented Apr 4, 2022

the batch is already a big improvement on the way to actual atomic operations. Ideally this would be a real MySQL transaction with actual commit and rollback mechanics, but it's unclear how to rollback things like calls to WordPress hooks – especially when there are caches listening to them. We may get there at some point, but it's a process. See the discussions I linked to above for more context.

Batches don't solve the problem fully, they just eliminate some of the possible failures like partial network errors, or partial validation problems.

yeah this discussion can happen elsewhere but the problem is not being unable to perform DB transactions or rollback API calls; it's bound to be the result of duplicating server logic into an array of client-side imperative APIs.

that doesn't mean building a necessary API is easy; it just means that a batch API kicks the can a little further down the road but leaves the problem unchanged. that is, it doesn't just not "solve the problem fully," it leaves the problem unaddressed. that can have value, but we should be careful about communicating that a batch API can do what it can't, and if people are leaning on it for that then it could be useful to put pressure against that behavior otherwise we entrench it as an unlisted expectation which will break things in a very confusing way once that day comes :)

@adamziel
Copy link
Contributor

adamziel commented Apr 5, 2022

it doesn't just not "solve the problem fully," it leaves the problem unaddressed.

@dmsnell I think we mean the same thing, only approaching it from two different angles:

  • Batches do nothing for the problem defined as performing DB transactions or rolling back API calls
  • Batches made a night and day difference for the problem defined as saving a group of entity records almost always leads to a half-broken state

The latter largely doesn't happen now. Is it bulletproof? No, there are cases in which the half-broken state will still happen. I believe the rollbacks are necessary to make any significant progress on these.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants