My friend Seb Rose recently found an interesting bug in cyber-dojo.
He found it when trying to create a start-point for our upcoming ACCU
pre-conference tutorial on
The cyber-dojo server first http POSTs the incoming code and test files to the runner
service which runs the tests and determines the colour of the traffic-light
(red, amber, or green). Then the code and test files, together with stdout and the traffic-light colour are http POSTed to the storer
service. When the size of the POST request reached a certain size the storer failed with a Broken pipe (errno::EPIPE) message. What was interesting was that the runner did not
fail. This was interesting because the runner and the storer services both use the same sinatra
web server each running in their own docker
container controlled by Docker Compose
. It turned out the settings in the docker-compose.yml file for runner and storer were slightly different...
Both services were running in a read_only container, runner had a temporary file-system, storer did not.
This was the difference. I'm guessing that somewhere under the hood sinatra switches to writing to /tmp when the incoming http POST gets bigger than a certain size. Adding [tmpfs: /tmp] to storer fixed the bug! Thanks Seb.
Post a Comment