Server Upgrade: Part 1 – the build

new-server-parts

I’ve been on and off for nearly 2 years talking about getting new hardware for the server that runs lowtek.ca. The current server is a modest Atom based board with only 2GB of RAM, I’m pretty sure my phone has more compute power. My reasons for upgrading were mostly so I could move over to using a Docker based deployment, having done a bunch of Docker things for work – I’ve really gotten to like it for managing software stacks. The Atom chip doesn’t support some of the virtualization that is needed, heck – it’s also a 32bit system only. Stalling on buying new hardware wasn’t all that hard, there was always other priorities. Then I discovered the current server was put together 7 years ago! Worse, the IDE drive that is the boot volume is older than that.. Clearly I have a ticking time bomb for a server.

I wanted to get a skylake processor, but was happy to stick with an entry level Pentium – it will let me run all the software I care about and while it’s not the fastest, it will be much much faster than the Atom. I wanted 4 RAM slots on the motherboard, I figure 16GB now – with the potential to double that later. I also needed 6 SATA ports (Raid 5 + boot drive), and if I need to get more I’ll buy a PCIe SATA extension port. I went ASUS based on their durability reputation. I picked up a new power supply (because who wants to trust one that is already 7 years old), and a cheap SSD drive which will be much more reliable than any spinning platter.

If you follow the links, you’ll notice that the first 3 are CanadaComputers and the last two are newegg.ca. I usually buy from CanadaComputers, but while they list the G4400 online you can’t actually buy it at the store. If I’m buying something online, well – newegg.ca is as good as anywhere, and they not only had the G4400 cheaper, they also had a crazy clear out price on the SSD ($37.99).

The build went smoothly, I was able to re-use an old Dell PC case to house the new hardware temporarily. I had a 3.5″ adapter for the SSD kicking around, and the motherboard came with a couple of SATA cables.

Getting an OS installed proved to be a bit trickier. Something funky is wrong with my desktop Ubuntu, downloads with Chrome are often corrupted (md5sum fails). The 16.10 Ubuntu install even when it is a correct download, will not self check it’s files correctly AND while I could boot it from USB, I couldn’t get it to install on my new hardware.

I believe the problem is something to do with the newer kernel level, but given that 16.04 is the LTS version and what I’ll be running on the server anyways, it’s not worth banging my head on this problem further.

All in, I spent a bit more than $400 CAD and have a couple of rebates in the mail. Not bad as I’ll probably run this hardware for at least 5 years, and it’ll be a much needed upgrade.

Next up – I need to install the server version and start building out the software stack that will take over the current servers functionality. Once that is mostly ready, it’ll be time to do a hardware swap into the real server case that has all of the drives in it.

JavaScript and the Single Threaded Lie

JavaScript is single threaded

Yes, but.. it is also heavily asynchronous. Since my experience porting Node.js to new platforms, it’s turned into one of my go to languages for hacking web apps. Unfortunately I still fall into the async trap.

Let’s look at some code:

And here is the output of the code if we run it:

Now, in this example – it’s pretty clear what is causing the issue. The setTimeout() is doing a delay of 2 seconds. This is an async call, so the for loop has completed it’s entire cycle before any of the callbacks get a chance to run. Timing issues also make things more confusing if things sometimes work since you can’t guarantee the order of asynchronous functions.

The trap for me, is when the code is more complex and it isn’t obvious to see that there is an async call in the way. Also, my brain keeps telling me that for each iteration through the loop, I (think I’m) creating a new variable (item) and that should provide correct isolation for the state.

There are two simple solutions to this problem.

Solution 1 – use the call stack:

Move the async call myFunction into a helper and pass the value to it. This moves it from being a local variable to one on the stack (as a parameter to helper).

Solution 2 – have the callback give the value back:

To be honest, solution 2 is just another call stack approach – but it’s a different enough pattern to be a second solution.

The output of both good solutions looks like:

 

Bosch Error 43

It’s happened more than once, the over full pot of boiling water on the stove – you add whatever it is that you’re going to boil and splash. Boil over and water on the stove top. With a gas stove sometimes the burner will go out, others you’re lucky and you just get some really hot water on the hot top of your stove.

Not a big deal.. until you have too much water as we did the other day. It ran down the front of the stove a little, some even made it to the floor. Clean up the mess and forget about it.

Except this one time recently, the stove display started blinking the lock icon.

Searching found stuff like: remove the stove from power for 5 minutes, then plug it back in to reset.

When I tried that solution, you could hear the oven doing a reset cycle and trying to lock/unlock the door several times. Sometimes it would stay locked, and I’d do another power cycle and then it’d stay unlocked. Things did not improve. Still the flashy lock.

I found a service manual that was close, but the removal of the front panel was different than shown there. I needed to remove some obvious screws from just under the lip – then pull the stove out to get to a pair (on each side) of screws that held the front panel on.

After disassembling the panel, it was clear we had some water down there – but not much. I cleaned up the board verified things were dry and re-assembled. Still the lock problem.

Two days later, the oven light started to go on by itself. You could turn it off — and shortly after it’d turn itself back on. The following morning, a power cycle resolved the Error 43. I was able to cook some bacon in the oven. During this, the oven got a bit funky. The light wasn’t coming on when you opened the door — then it would intermittently come on and off when you opened the door.

My theory is that the heat of the oven was helping dry out the moisture from wherever it got to. After finishing with the bacon, the flashing lock was back.

One more power cycle the next day – and the oven seems to have started to work “like normal” again. I’m fairly confident at this point that the issue was some water got into one of the switches (probably the locking mechanism) and was shorting out a sensor there. However, as the door light was also affected, I suspect there was multiple sensors affected.

Thankfully it was ‘clean’ water (vs. a mucky sauce) and seems to have dried up removing any issues.

Lesson learned: don’t let water accumulate on the cook top of your Bosch stove/oven. If you do get Error 43 – be patient and dry it out. A power cycle will help once things are dry enough.