Hi all, I've been very busy lately, and then I went for a holiday, so I didn't update the blog. Sorry!
I recently came back from the seaside and started to work on a bug I had since forever. I thought it was a deeply rooted bug that was spread in different methods. It turns out it was not like that. And that's what I discovered:
First of all, I had this array that kept count of how many distributed processes answered a pull request. Each process has an ID, and it corresponded with the index of the array. The array first is filled with
false values. As an example, imagine process ID 0 that is polled. At first the value in the array at index 0 is
false, but when the process answers, I set the value in the array at index 0 to true.
If the process don't reply after a certain threshold time, I execute something. I used to check this by going through the array in this way:
for(var i = 0; i < processes.length; i++)
if(!array[i])
//do something
In other words, if
array[i] is false, it means the process did not answer.
This could look correct if only I would take into account the fact that, concurrently, some processes may be spawned, thus increasing the
processes array. Since I didn't polled the newborn processes, I don't want them to be checked. Of course, with the shown code, this was happening. Luckily, JavaScript fills with
undefined the indexes of an array which have not be initialised; but on the other hand the evaluation of
!undefined is the same as the evaluation of
!false. This clearly lead to a bug which always executed something, even if it was not the case. Again, luckily with JavaScript I could correct this very easily:
for(var i = 0; i < processes.length; i++)
if(array[i] === false)
//do something
And that's it!