ID:1496464
 
BYOND Version:504
Operating System:Linux
Web Browser:Chrome 32.0.1700.102
Applies to:Dream Maker
Status: Verified

A member of our crack team of bug testers has verified that this issue is reproducible, and has handed it off to the development team for investigation.
Descriptive Problem Summary:
After running a loop a few times it eventually comes to a halt.

Numbered Steps to Reproduce Problem:
From what I have deduced, running shell() a numerous amount of times creates a wide range of issues. This being one of them.
Code Snippet (if applicable) to Reproduce Problem:
proc/displayServers()
if((!worldrestoring)&&(!worldSaving)&&(!GettingCPUUsage))
world << "DEBUG: 1"
GettingCPUUsage=1
// authIDs=new/list
for(var/S in serverList)
world << "DEBUG: 2 [S]"
var/list/SL=serverList[S]
if(!istype(SL,/list))
continue
if(SL.len<1)
continue
// var/serverChild/T = SL[SL[1]]
// if(T)
for(var/F in serverList[S])
world << "DEBUG: 3 [F]"
var/serverChild/U = serverList[S][F]
if((istype(U,/serverChild))&&(U.PID))
world << "DEBUG: 4 [F] & [U.PID]" //FREEZES UP HERE
if(shell("kill -0 [U.PID]") == 1) //POSSIBLE CAUSE
world << "DEBUG: 4.1 [F] & [U.PID]"
text2file("Key:[U.Key]| Name: [U.Name]| Folder: [U.Folder] | Time: [time2text(world.realtime,"MMM DD, YYYY")] [timeOfDay]","Crash.txt")
del(U)
else
world << "DEBUG: 4.2 [F] & [U.CPU]"
U.CPU="[getCPU_Usage(U.PID)]%"
U.name = "[U.Name] - CPU: [U.CPU]"
world << "DEBUG: 5 [F] && [U.CPU]"
sleep(1)
GettingCPUUsage=0


Expected Results:
What's expected is that the for loop completes and it hits GettingCPUUsage=0, allowing displayServers() to be ran again.

Actual Results:


It never reaches GettingCPUUsage=0 because it never reaches DEBUG: 5, let alone 4.1 or 4.2. Thus, the displayServers() proc can no longer be used because GettingCPUUsage will always = 1 until I reboot, yet again.

My guess is that as soon as it performs shell("kill -0...") that it freezes up from being ran so many times.

This also goes to say that my game itself freezes as well. It uses shell() quite a lot for some of its procs to handle things related to PIDs.

Does the problem occur:
Every time? Or how often? It seems to happen when displayServers() is ran a lot (takes about 30 seconds to 2 minutes of running the loop).
In other games? N/A
In other user accounts? Yes. I've had multiple people initiate the loop for displayServers() and it produces the same results.
On other computers? Yes.

When does the problem NOT occur?
When displayServers() is not being ran.

Did the problem NOT occur in any earlier versions? If so, what was the last version that worked? (Visit http://www.byond.com/download/build to download old versions for testing.) No. This has been an issue for a long time now. Since v501.1207 (Stable).

Workarounds:
N/A
Bump?

I have proof that shell() has some issues. Considering the fact that after I stopped using displayServers() as a whole (and now players can't see when their game has crashed or if their CPU is high), the main Shell Server Utility seems to no longer crash randomly.

I was wondering if this could be looked in to. I also have a core dump and a buggy.rsc.. But I don't know what buggy is for or how that one got there.
Just adding some other experience with this issue:

A SS13 host was running modified code which made heavy use of shell() for text2speech, but the server consistently crashed about half an hour into the round during busy times.
If they removed the shell calls, it was fine, but it was also fine with the shell calls after they moved from Linux to Windows.

Possibly relatedly, another SS13 server was having severe crash issues before they moved to Windows, and they used shell() semi-frequently.
It's been 10 days and the game still has yet to crash since I removed displayServers().
Bump

It is proven this procedure needs a revision.
I also use it for Server Manager so I'd be glad to not see this overlooked.
@Xirre

How does it go with kill -9 or kill -1 ?
I don't use -9. However, the problem isn't relying on the command I run but the proc I run, shell(). Multiple other commands that I run with shell() cause this issue when done a lot. It either stops or it hangs the entire application, leaving everyone still in a "connected" state but not being able to do anything.
This is a really hard issue to pin down. When shell() is called, the server actually polls every tick to see if the child process is still running. I do see an issue where this could be a problem for threaded servers, that probably ties into another report. But I don't see the how there could be a problem in non-threaded code.

Linux allows the child processes to send a signal back, which maybe is happening at a bad time. I wouldn't expect that to be the case outside of threads, but maybe something is off timing-wise that's just throwing a monkey wrench into everything. In threaded mode, I definitely see where this could be a problem, but you've seen this on Linux builds that didn't support threading. I can fix the threading issue for the next beta, but I'm not sure I understand yet why this would cause problems non-threaded so I'll keep looking.
If there's anything I can do to further debug for you, let me know and I'll do it.
Stephen001 changed status to 'Verified'
Do we actually have a test case that verifies this? I haven't been able to see this in action.
I'll try to produce something after I wake up.
I have a feeling that the fix in id:1959087 may have fixed this too, as a side effect. Before shell() is called, the server flushes any pending savefiles. Depending on stack depth and what was written to the file, it's plausible that the savefile stack overflow was killing the proc prematurely. Please retest in 509.1306.
mob/Login()
..()
for(var/i = 0 to 100)
world << i
if(shell("echo [i]"))
world << "I like pineapples: [++i]"
else
world << "I don't like pineapples."
world << "The end."


This wasn't tested with the original code. However, I made something fairly similar. The code above.

It works on Windows 10 Home 64-Bit v508.1299 (STABLE).
It doesn't work on Debian 7 Wheezy v508.1299 (STABLE).
It is untested on Windows 10 Home 64-Bit v508.1306 (BETA).
It doesn't work on Debian 7 Wheezy v508.1306 (BETA).

My output?

Debian 7:
0


Windows:
0
I don't like pineapples.
The end.
1
I don't like pineapples.
The end.
2
I don't like pineapples.
The end.
3
I don't like pineapples.
The end.
4
I don't like pineapples.
The end.
5
I don't like pineapples.
The end.
6
I don't like pineapples.
The end.
7
I don't like pineapples.
The end.
8
I don't like pineapples.
The end.
9
I don't like pineapples.
The end.
10
I don't like pineapples.
The end.
11
I don't like pineapples.
The end.
12
I don't like pineapples.
The end.
13
I don't like pineapples.
The end.
14
I don't like pineapples.
The end.
15
I don't like pineapples.
The end.
16
I don't like pineapples.
The end.
17
I don't like pineapples.
The end.
18
I don't like pineapples.
The end.
19
I don't like pineapples.
The end.
20
I don't like pineapples.
The end.
21
I don't like pineapples.
The end.
22
I don't like pineapples.
The end.
23
I don't like pineapples.
The end.
24
I don't like pineapples.
The end.
25
I don't like pineapples.
The end.
26
I don't like pineapples.
The end.
27
I don't like pineapples.
The end.
28
I don't like pineapples.
The end.
29
I don't like pineapples.
The end.
30
I don't like pineapples.
The end.
31
I don't like pineapples.
The end.
32
I don't like pineapples.
The end.
33
I don't like pineapples.
The end.
34
I don't like pineapples.
The end.
35
I don't like pineapples.
The end.
36
I don't like pineapples.
The end.
37
I don't like pineapples.
The end.
38
I don't like pineapples.
The end.
39
I don't like pineapples.
The end.
40
I don't like pineapples.
The end.
41
I don't like pineapples.
The end.
42
I don't like pineapples.
The end.
43
I don't like pineapples.
The end.
44
I don't like pineapples.
The end.
45
I don't like pineapples.
The end.
46
I don't like pineapples.
The end.
47
I don't like pineapples.
The end.
48
I don't like pineapples.
The end.
49
I don't like pineapples.
The end.
50
I don't like pineapples.
The end.
51
I don't like pineapples.
The end.
52
I don't like pineapples.
The end.
53
I don't like pineapples.
The end.
54
I don't like pineapples.
The end.
55
I don't like pineapples.
The end.
56
I don't like pineapples.
The end.
57
I don't like pineapples.
The end.
58
I don't like pineapples.
The end.
59
I don't like pineapples.
The end.
60
I don't like pineapples.
The end.
61
I don't like pineapples.
The end.
62
I don't like pineapples.
The end.
63
I don't like pineapples.
The end.
64
I don't like pineapples.
The end.
65
I don't like pineapples.
The end.
66
I don't like pineapples.
The end.
67
I don't like pineapples.
The end.
68
I don't like pineapples.
The end.
69
I don't like pineapples.
The end.
70
I don't like pineapples.
The end.
71
I don't like pineapples.
The end.
72
I don't like pineapples.
The end.
73
I don't like pineapples.
The end.
74
I don't like pineapples.
The end.
75
I don't like pineapples.
The end.
76
I don't like pineapples.
The end.
77
I don't like pineapples.
The end.
78
I don't like pineapples.
The end.
79
I don't like pineapples.
The end.
80
I don't like pineapples.
The end.
81
I don't like pineapples.
The end.
82
I don't like pineapples.
The end.
83
I don't like pineapples.
The end.
84
I don't like pineapples.
The end.
85
I don't like pineapples.
The end.
86
I don't like pineapples.
The end.
87
I don't like pineapples.
The end.
88
I don't like pineapples.
The end.
89
I don't like pineapples.
The end.
90
I don't like pineapples.
The end.
91
I don't like pineapples.
The end.
92
I don't like pineapples.
The end.
93
I don't like pineapples.
The end.
94
I don't like pineapples.
The end.
95
I don't like pineapples.
The end.
96
I don't like pineapples.
The end.
97
I don't like pineapples.
The end.
98
I don't like pineapples.
The end.
99
I don't like pineapples.
The end.
100
I don't like pineapples.
The end.


I don't think he likes pineapples. The if statement isn't going through like it normally would. Perhaps Windows is different?
The weird thing is, you're seeing failure immediately in this case, not just after a few loop iterations. Very bizarre, unless the project is throwing trust questions at you in Linux and you haven't responded. (To be safe, make sure you definitely run it in trusted mode.) But if your info is correct, it appears open savefiles were not part of the problem.
In response to Lummox JR
Lummox JR wrote:
unless the project is throwing trust questions

I completely forgot about that. Running it in trusted mode manually now.

Edit: It gives the same output as Windows now. But, this is on the latest version. I haven't downgraded (mainly because I just recently shutdown all the games for an upgrade).

0
I don't like pineapples.
The end.
1
I don't like pineapples.
The end.
2
I don't like pineapples.
The end.
3
I don't like pineapples.
The end.
4
I don't like pineapples.
The end.
5
I don't like pineapples.
The end.
6
I don't like pineapples.
The end.
7
I don't like pineapples.
The end.
8
I don't like pineapples.
The end.
9
I don't like pineapples.
The end.
10
I don't like pineapples.
The end.
11
I don't like pineapples.
The end.
12
I don't like pineapples.
The end.
13
I don't like pineapples.
The end.
14
I don't like pineapples.
The end.
15
I don't like pineapples.
The end.
16
I don't like pineapples.
The end.
17
I don't like pineapples.
The end.
18
I don't like pineapples.
The end.
19
I don't like pineapples.
The end.
20
I don't like pineapples.
The end.
21
I don't like pineapples.
The end.
22
I don't like pineapples.
The end.
23
I don't like pineapples.
The end.
24
I don't like pineapples.
The end.
25
I don't like pineapples.
The end.
26
I don't like pineapples.
The end.
27
I don't like pineapples.
The end.
28
I don't like pineapples.
The end.
29
I don't like pineapples.
The end.
30
I don't like pineapples.
The end.
31
I don't like pineapples.
The end.
32
I don't like pineapples.
The end.
33
I don't like pineapples.
The end.
34
I don't like pineapples.
The end.
35
I don't like pineapples.
The end.
36
I don't like pineapples.
The end.
37
I don't like pineapples.
The end.
38
I don't like pineapples.
The end.
39
I don't like pineapples.
The end.
40
I don't like pineapples.
The end.
41
I don't like pineapples.
The end.
42
I don't like pineapples.
The end.
43
I don't like pineapples.
The end.
44
I don't like pineapples.
The end.
45
I don't like pineapples.
The end.
46
I don't like pineapples.
The end.
47
I don't like pineapples.
The end.
48
I don't like pineapples.
The end.
49
I don't like pineapples.
The end.
50
I don't like pineapples.
The end.
51
I don't like pineapples.
The end.
52
I don't like pineapples.
The end.
53
I don't like pineapples.
The end.
54
I don't like pineapples.
The end.
55
I don't like pineapples.
The end.
56
I don't like pineapples.
The end.
57
I don't like pineapples.
The end.
58
I don't like pineapples.
The end.
59
I don't like pineapples.
The end.
60
I don't like pineapples.
The end.
61
I don't like pineapples.
The end.
62
I don't like pineapples.
The end.
63
I don't like pineapples.
The end.
64
I don't like pineapples.
The end.
65
I don't like pineapples.
The end.
66
I don't like pineapples.
The end.
67
I don't like pineapples.
The end.
68
I don't like pineapples.
The end.
69
I don't like pineapples.
The end.
70
I don't like pineapples.
The end.
71
I don't like pineapples.
The end.
72
I don't like pineapples.
The end.
73
I don't like pineapples.
The end.
74
I don't like pineapples.
The end.
75
I don't like pineapples.
The end.
76
I don't like pineapples.
The end.
77
I don't like pineapples.
The end.
78
I don't like pineapples.
The end.
79
I don't like pineapples.
The end.
80
I don't like pineapples.
The end.
81
I don't like pineapples.
The end.
82
I don't like pineapples.
The end.
83
I don't like pineapples.
The end.
84
I don't like pineapples.
The end.
85
I don't like pineapples.
The end.
86
I don't like pineapples.
The end.
87
I don't like pineapples.
The end.
88
I don't like pineapples.
The end.
89
I don't like pineapples.
The end.
90
I don't like pineapples.
The end.
91
I don't like pineapples.
The end.
92
I don't like pineapples.
The end.
93
I don't like pineapples.
The end.
94
I don't like pineapples.
The end.
95
I don't like pineapples.
The end.
96
I don't like pineapples.
The end.
97
I don't like pineapples.
The end.
98
I don't like pineapples.
The end.
99
I don't like pineapples.
The end.
100
I don't like pineapples.
The end.


I guess we can assume that it was fixed earlier than 509.1306? The way I solved the issue was that I just threw the if(shell()) in a spawn(). That was my hackish way of fixing the issue.