Fixed issue with lookup
This commit is contained in:
+12
-5
@@ -290,9 +290,15 @@ class Host extends Table{
|
|||||||
complex looks with wildcards.
|
complex looks with wildcards.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Hold lookUp ready while the look up object is being built.
|
// Build into a fresh, local tree instead of mutating the live one.
|
||||||
this.__lookUpIsReady = false;
|
// buildLookUpObj is async (it awaits a redis get() per host) and runs on
|
||||||
this.lookUpObj = {};
|
// every host create/update/remove. If we wiped and repopulated the live
|
||||||
|
// this.lookUpObj in place, any concurrent lookUp() — which is called
|
||||||
|
// synchronously by the host_lookup service and never waits for readiness —
|
||||||
|
// would resolve against a half-built tree and randomly miss defined hosts.
|
||||||
|
// We only swap the completed tree in at the very end, so lookUp() always
|
||||||
|
// sees a complete tree (either the previous one or the new one).
|
||||||
|
let lookUpObj = {};
|
||||||
|
|
||||||
try{
|
try{
|
||||||
|
|
||||||
@@ -303,7 +309,7 @@ class Host extends Table{
|
|||||||
let fragments = host.split('.');
|
let fragments = host.split('.');
|
||||||
|
|
||||||
// Hold a pointer to the root of the lookup tree.
|
// Hold a pointer to the root of the lookup tree.
|
||||||
let pointer = this.lookUpObj;
|
let pointer = lookUpObj;
|
||||||
|
|
||||||
// Walk over each fragment, popping from right to left.
|
// Walk over each fragment, popping from right to left.
|
||||||
while(fragments.length){
|
while(fragments.length){
|
||||||
@@ -325,7 +331,8 @@ class Host extends Table{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// When the look up tree is finished, remove the ready hold.
|
// Atomically publish the completed tree and mark lookUp ready.
|
||||||
|
this.lookUpObj = lookUpObj;
|
||||||
this.__lookUpIsReady = true;
|
this.__lookUpIsReady = true;
|
||||||
|
|
||||||
}catch(error){
|
}catch(error){
|
||||||
|
|||||||
@@ -35,6 +35,14 @@ const socket = new SocketServerJson({
|
|||||||
// If we don't have a match, return empty object
|
// If we don't have a match, return empty object
|
||||||
if(!parentHost) return clientSocket.write(JSON.stringify({}));
|
if(!parentHost) return clientSocket.write(JSON.stringify({}));
|
||||||
|
|
||||||
|
// lookUp returns the live #record object stored inside the shared
|
||||||
|
// lookup tree. Everything below mutates parentHost (sets
|
||||||
|
// wildcard_parent, stringifies every value), so work on a shallow
|
||||||
|
// copy — mutating the shared node would corrupt the tree, e.g. turn
|
||||||
|
// wildcard_matchAny into the string "false" (truthy) and break the
|
||||||
|
// matchAny guard on subsequent lookups.
|
||||||
|
parentHost = {...parentHost};
|
||||||
|
|
||||||
// A wildcard host with matchAny disabled only serves subdomains that
|
// A wildcard host with matchAny disabled only serves subdomains that
|
||||||
// are explicitly defined in redis. Reaching this service means redis
|
// are explicitly defined in redis. Reaching this service means redis
|
||||||
// had no direct entry for the requested domain, so an inexact match
|
// had no direct entry for the requested domain, so an inexact match
|
||||||
|
|||||||
Reference in New Issue
Block a user