Time and time again, the Echo engine's behavior has fallen out of sync with the behavior of other engines. This undermines its usefulness as a testing engine. With the recent rearchitecturing, we've introduced yet another difference: Now the builds in the machine engine are queued by a database listener, but in Echo, they are not. This forced us to make a temporary hacky solution to avoid state inconsistency problems in Echo. We should make Echo a true engine type and move the implementation into Serval.Machine or even machine.py as appropriate. This way, Echo will use more of the same code paths as the other engines. We'll of course have to balance this with making sure that Echo builds are very fast.
Time and time again, the Echo engine's behavior has fallen out of sync with the behavior of other engines. This undermines its usefulness as a testing engine. With the recent rearchitecturing, we've introduced yet another difference: Now the builds in the machine engine are queued by a database listener, but in Echo, they are not. This forced us to make a temporary hacky solution to avoid state inconsistency problems in Echo. We should make Echo a true engine type and move the implementation into Serval.Machine or even machine.py as appropriate. This way, Echo will use more of the same code paths as the other engines. We'll of course have to balance this with making sure that Echo builds are very fast.