Fixed issue with lookup

This commit is contained in:
2026-07-10 00:35:50 -04:00
parent 1295d4f5ce
commit 99cdbe6586
2 changed files with 20 additions and 5 deletions
+12 -5
View File
@@ -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){
+8
View File
@@ -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