06e8572fc3c80c01b547e5616191347674d971cc braney Sat Sep 5 08:03:52 2026 -0700 hgConfCatalog: register excludeDbs and slow-db, the failover profile. hg/lib/jksql.c:1325 builds ".excludeDbs" with safef from a failover profile's name and reads it with cfgOption. So it is an hg.conf setting, and this catalog did not have it: not in the profile suffix list, not anywhere else. The harvester cannot see it, because the name never appears as a literal, which is the same blind spot login.oauth.. sits in. It is not obscure. product/ex.hg.conf:36 documents slow-db.excludeDbs and goldenPath/help/gbib.html explains it twice. It is a comma-separated list of databases that exist only on the local server, so the failover connection is never opened for them. It is the fifteenth profile suffix, and the only one that is not read through cfgOption2 and the only one that belongs to a failover profile rather than to any profile. The section text now says both, since the suffix list alone would claim central.excludeDbs works. slow-db joins knownProfiles while I am here. It is a real profile, named by failoverProfPrefix at jksql.c:106 as "slow-" plus the main profile's name, and ex.hg.conf documents slow-db.host, .user and .password. Where it came from: excludeDbs had been written down in the CART variable baseline, one registry over, as a name that is not a track-scoped cart variable. True, but it left the setting described nowhere and suppressed in the wrong place. The companion commit teaches harvestCartVars.py to tell the two apart, so it is no longer in that file either. refs #37925 diff --git src/hg/utils/hgConfCatalog/hgConfCatalog.py src/hg/utils/hgConfCatalog/hgConfCatalog.py index b923c0fc22b..4ba660b29be 100755 --- src/hg/utils/hgConfCatalog/hgConfCatalog.py +++ src/hg/utils/hgConfCatalog/hgConfCatalog.py @@ -188,38 +188,49 @@ "a URL can change it, which is exactly why it is the right place to gate " "a feature during a release. A mirror's copy is outside our control, so " "removing a variable has to be treated as an interface change, not a " "cleanup. Precedence for a value is: the environment (only for the " "cfgOptionEnv settings, and only where the CGI allows it), then hg.conf, " "then the compiled-in default." ) PROFILE_SUFFIXES = { "what": "A database profile is a set of hg.conf settings sharing one prefix, " "read through cfgOption2(profileName, suffix) where profileName is a " "runtime value. So these suffixes are legal under any profile prefix, " "and none of the resulting names appears as a literal anywhere in the " "tree. This is why product/ex.hg.conf documents " - "archivecentral.password while a search of the source finds nothing.", + "archivecentral.password while a search of the source finds nothing. " + "Any profile also has a failover profile, named with the \"slow-\" " + "prefix in front of the main profile's name (sqlProfileGetFailover at " + "jksql.c:409), which is where slow-db comes from. excludeDbs is the " + "one suffix that belongs only to a failover profile, and the one that " + "is not read through cfgOption2: jksql.c:1325 builds the whole name " + "with safef and reads it with cfgOption, which is why no harvest of " + "the tree finds it even though ex.hg.conf:36 documents " + "slow-db.excludeDbs and goldenPath/help/gbib.html explains it twice. " + "Its value is a comma-separated list of databases that exist only on " + "the local server, so the failover connection is never opened for " + "them.", "src": "hg/lib/jksql.c", "suffixes": ["host", "port", "socket", "user", "password", "db", "verifyServerCert", "ca", "caPath", "cert", "key", "cipher", - "crl", "crlPath"], - "knownProfiles": ["db", "central", "cart", "customTracks", "archivecentral", - "backupcentral", "myStuff", "myGenome", "rrcentral", "pq", - "rtdb", "cdw"], + "crl", "crlPath", "excludeDbs"], + "knownProfiles": ["db", "slow-db", "central", "cart", "customTracks", + "archivecentral", "backupcentral", "myStuff", "myGenome", + "rrcentral", "pq", "rtdb", "cdw"], } # --------------------------------------------------------------------------- # release gates: boolean flags that exist to hold a feature back # --------------------------------------------------------------------------- # These are the reason this catalog has a sunset mode. Each was added so a # user-visible change could sit on master without shipping. Ordered by age so # the backlog is visible at a glance. RELEASE_GATES = { "what": "Boolean flags introduced to ship a feature dark during a release. " "Temporary by intent: each should be deleted once the feature it " "guards is public and mirrors have had a cycle to object.", "vars": [