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

net.socket:connect() - leaks memory on DNS lookup fail #234

Closed
Toshik opened this issue Feb 20, 2015 · 6 comments
Closed

net.socket:connect() - leaks memory on DNS lookup fail #234

Toshik opened this issue Feb 20, 2015 · 6 comments

Comments

@Toshik
Copy link

Toshik commented Feb 20, 2015

NodeMCU 0.9.5 build 20150213 powered by Lua 5.1.4

net.socket:connect() leaks memory when called by hostname and DNS query failed. Base leak is about 240 bytes per call.

Test case:

function TestDNSLeak()
     c=net.createConnection(net.TCP, 0)
     c:connect(80, "bad-name.tld")
     tmr.alarm(1, 3000, 0, function() print("hack socket close, MEM: "..node.heap()) c:close() end) -- socket timeout hack
     print("MEM: "..node.heap())
end

Now run TestDNSLeak() every 5 seconds (do it not too fast, to get timer executed):

TestDNSLeak()
MEM: 20288
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20840
TestDNSLeak()
MEM: 19952
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20608
TestDNSLeak()
MEM: 19672
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20336
TestDNSLeak()
MEM: 19456
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20160
TestDNSLeak()
MEM: 19208
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 19936
TestDNSLeak()
MEM: 19008
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 19704
@dvv
Copy link
Contributor

dvv commented Feb 20, 2015

It's not necessarily a leak as Lua performs garbage collection lazily.
Try calling collectgarbage("collect") before printing heap amount first. TIA

@Toshik
Copy link
Author

Toshik commented Feb 20, 2015

@dvv I have ran into that issue - my DNS was dead and ESP drains all memory...

Anyway, even with garbage collector same issue:

function TestDNSLeak()
     c=net.createConnection(net.TCP, 0)
     c:connect(80, "bad-name.tld")
     tmr.alarm(1, 3000, 0, function() collectgarbage("collect") print("hack socket close, MEM: "..node.heap()) c:close() end) -- socket timeout hack
     print("MEM: "..node.heap())
end
> TestDNSLeak()
MEM: 20072
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20696
TestDNSLeak()
MEM: 19736
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
> hack socket close, MEM: 20464
TestDNSLeak()
MEM: 19488
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20184
TestDNSLeak()
MEM: 19264
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20000
TestDNSLeak()
MEM: 19072
> DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 19808

@mikewen
Copy link

mikewen commented Feb 20, 2015

This is related:
#189

If able to specify DNS servers, it would be helpful.
Google's DNS servers are much better than my local ISP's.

On Fri, Feb 20, 2015 at 4:59 AM, Toshik notifications@github.com wrote:

@dvv https://github.com/dvv I have ran into that issue - my DNS was
dead and ESP drains all memory...

Anyway, even with garbage collector same issue:

function TestDNSLeak()
c=net.createConnection(net.TCP, 0)
c:connect(80, "bad-name.tld")
tmr.alarm(1, 3000, 0, function() collectgarbage("collect") print("hack socket close, MEM: "..node.heap()) c:close() end) -- socket timeout hack
print("MEM: "..node.heap())
end

TestDNSLeak()
MEM: 20072
DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20696
TestDNSLeak()
MEM: 19736
DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20464
TestDNSLeak()
MEM: 19488
DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20184
TestDNSLeak()
MEM: 19264
DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 20000
TestDNSLeak()
MEM: 19072
DNS retry 1!
DNS retry 2!
DNS retry 3!
DNS retry 4!
DNS Fail!
hack socket close, MEM: 19808


Reply to this email directly or view it on GitHub
#234 (comment)
.

@Suxsem
Copy link

Suxsem commented Feb 21, 2015

I can reproduce this

@nodemcu
Copy link
Collaborator

nodemcu commented Mar 11, 2015

try newest release latest

@UserXYZ
Copy link

UserXYZ commented Oct 9, 2015

This problem is still relevant, and I opened a new issue about it since I can't reopen this one...basically, the test used is the same like this here, and behaviour goes from full restart immediatelly, after a few dns retry/fail attempts or after some undefined time, like 10 minutes or more...

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

No branches or pull requests

5 participants