-
Notifications
You must be signed in to change notification settings - Fork 810
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
Huge memory leak with Jest/Enzyme after upgrading to react-modal 3.X #593
Comments
Hi @ryami333, can you give more information about this tests?...or is there anything unusual about how are you using |
This seems to be an issue with |
@diasbruno I'm not doing anything like that, no. I'm using import React from 'react';
import { render } from 'enzyme'; // 3.3.0 (latest)
import toJson from 'enzyme-to-json'; // 3.3.0 (latest)
describe('FooComponent', () => {
let wrapper;
it('renders without crashing', () => {
wrapper = render(
<FooComponent />,
);
});
it('matches existing snapshot', () => {
expect(toJson(wrapper)).toMatchSnapshot();
});
}); Early on, the tests are all appearing to pass, but they just get slower and slower, and eventually the test runner hangs and those node heap errors start spewing. @enapupe yeah portals seem the most likely candidate don't they? |
@diasbruno have you had any success replicating this bug? I'm still unable to upgrade at all. Using latest versions of I've managed to find that it works with Enzyme's 'mount' but not with 'render'. |
This can be related to the environment the modal is been rendered src/components/Modal.js#L187. It will just return |
But why would returning null result in a big memory exception? Returning null is a perfectly valid render return value. |
It's possible that the modal is not clean up resources properly. Can you write a small app with test? It would be better to debug. |
Here you go @diasbruno: https://github.com/ryami333/react-modal-memory-exception This is a 'Create React App' web-app, where I've done the following:
Simply run |
The modal seems to be rendered. I'll try to see what is going on.
|
This could be an issue with |
@rharriso Thanks for the info. I'll try to dig in. |
@diasbruno some more info WRT This issue remained with the latest version |
Some resources to help tracking this issue: https://github.com/felixge/node-memory-leak-tutorial |
It seems to be stuck in an infinity loop on: ReactDOMServerRenderer.prototype.read = function read(bytes) {
// bytes = Infinity
...
var child = frame.children[frame.childIndex++]; // always $$typeof: Symbol(react.portal)
...
} |
Well...your test has passed. :) PASS src/App.test.js (347.669s)
â renders without crashing (342764ms)
Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 348.978s, estimated 1404s
Ran all test suites related to changed files.
Watch Usage
⺠Press a to run all tests.
⺠Press p to filter by a filename regex pattern.
⺠Press t to filter by a test name regex pattern.
⺠Press q to quit watch mode.
⺠Press Enter to trigger a test run.
|
Try to apply this patch on your project and tell me your results. diff --git a/react-dom-server.node.development.js b/dd.js
index 2039700..d4832da 100644
--- a/react-dom-server.node.development.js
+++ b/dd.js
@@ -2227,7 +2227,8 @@ var ReactDOMServerRenderer = function () {
}
continue;
}
- var child = frame.children[frame.childIndex++];
+ frame.childIndex++;
+ var child = frame.children[frame.childIndex];
{
setCurrentDebugStack(this.stack);
} patch -p1 < patch.diff node_modules/react-dom/cjs/react-dom-server.node.development.js |
It's not a proper fix, I still need to investigate more, it's just to have an idea of what is going on... |
cc @ryami333 Please let me know when you get a chance to try this patch. |
@diasbruno I tried this out on my test suite. And it works! |
@rharriso sorry, forgot to mention you. Thanks for trying it. |
After some investigation, I reached the same state as facebook/react/issues/11565. |
@diasbruno that patch works for me too! Does this mean you will create a PR for react itself? |
Actually, it's not a fix. The things I wrote here are just for logging. That (patch) is really incorrect since it will skip the WARNING: it is not known the side-effects of this patch. :) |
Yes I did, one with over 200 render tests. |
Interesting. I'll continue investigating to find the problem (if possible). |
Sorry, I should qualify my response a little bit - the tests don't all pass, but they no longer crash. |
@diasbruno, yes. It's a private company project with 600 tests |
However, the error was see in our integration test suite, which renders with ReactDOM, not enzyme |
@rharriso so you are using some kind of browser? |
No, these tests just make sure the page responds with 200. |
There is a second patch I made, it should work with I'll publish on a fork of |
@diasbruno Let me know what you want me to test out. |
The potential bug is: while (React.isValidElement(child)) {. If the So, it will end up in an infinity loop ({child: nextChild, context} = resolve(child, context));. Note that in the current revision, it seems to have a fix $$typeof !== REACT_PORTAL_TYPE. I ended up with this code before I looked the current version of react: function isPortalElement(object) {
return typeof object === 'object' && object !== null && object.$$typeof === REACT_PORTAL_TYPE;
} if (React.isPortalElement(child)) {
child = null;
}
return { child: child, context: context }; @rharriso @ryami333 If you can't upgrade your react version, let me know so I can provide the patch to this version. |
@diasbruno I probably can't |
@diasbruno - what do you mean by upgrading React? I've been experiencing this on the latesr version of React (16.2.0) |
You are right. Totally forgot I was on the I'm trying to finish the patch to submit to The patch is available here. |
Sorry for dumping a lot of information that might be confusing or not organized (that's because I was starting to get confused by the many packages involved in this issue and I was starting to look into the |
@diasbruno Can you advice the best way to avoid this problem for now (until fix merged into next version of react)? |
@asborisov I avoided this by removing |
@asborisov @rharriso Follow the react issue I've mention here. Many ideas/workaround have been publish there. |
I downgrade to 2.4.2 and looks it work now. Will wait until correct fix is merged |
Summary:
For a while now, I've been unable to upgrade to
react-modal
3.X in my React 16 project with Jest/Enzyme because when I run tests Node itself actually crashes and I usually have to take some fairly nuclear steps such as force-quitting the process in my activity monitor app in order to use it again. The latest 2.X release ofreact-modal
is totally fine.Steps to reproduce:
react-modal
from2.4.1
to3.X
npm run jest
*Note that I've replaced the actual path and username in this snippet.
The text was updated successfully, but these errors were encountered: