751a1f9fff1d6d77c2da690d1369dca64ba04fee braney Sat Sep 19 18:31:42 2026 -0700 sessionDirTester: pin how a saved session's data directory is named A saved session's custom tracks and region files are moved to a durable directory named from the user name and the session name. #10138 widened the session half of that name from 8 hex characters to 10: 8 characters of md5 is 4 billion values, and the birthday arithmetic over hundreds of thousands of sessions is not comfortable, since a collision puts one user's files in another user's session. Widening a name that is already on disk is the risky half. Directories written before the change carry the old width and their files are still in use, so the cleanup code has to be able to name both, which is why the width is a parameter rather than a constant in the middle of the function. The property pinned here is not the hash, it is that the short name is a PREFIX of the long one. That is what lets code holding the new name find a directory written under the old one, and it holds only because both come from the same md5 truncated to different lengths. Also pinned: the two-character spreading directory, the user name appearing as given, and the three calls that must abort rather than invent a path -- a relative sessionDataDir, and a width of 0 or 33. None of this is visible. A session whose directory is named differently does not report an error, it comes back without its custom track. Watched to fail and then pass: narrowing the width back to 8 turns it red on the width line. Recorded as sandbox-ab in utils/testRegistry. refs #10138, refs #38391 diff --git src/hg/lib/tests/makefile src/hg/lib/tests/makefile index 9351b8b41cd..92734650e16 100644 --- src/hg/lib/tests/makefile +++ src/hg/lib/tests/makefile @@ -1,149 +1,154 @@ kentSrc = ../../.. include ../../../inc/common.mk L += ${MYSQLLIBS} -lm MYLIBDIR = ../../../lib/${MACHTYPE} MYLIBS = ${MYLIBDIR}/jkhgap.a ${MYLIBDIR}/jkweb.a BIN_DIR = bin/${MACHTYPE} all: ${BIN_DIR}/genePredTester \ ${BIN_DIR}/trashDirTester \ ${BIN_DIR}/mallocTopPadTester \ ${BIN_DIR}/pslReaderTester \ ${BIN_DIR}/quickLiftTester \ ${BIN_DIR}/sessionDataTester \ ${BIN_DIR}/trashDirTester \ # ${BIN_DIR}/annoGratorTester \ ${BIN_DIR}/binTest \ ${BIN_DIR}/customTrackTester \ ${BIN_DIR}/hgvsTester \ ${BIN_DIR}/sqlCheck ${BIN_DIR}/%: %.c ${MYLIBS} @${MKDIR} ${BIN_DIR} ${CC} ${CC_PROG_OPTS} -o $@ $*.c ${MYLIBS} $L #test: binTest spDbTest hdbTest genePredTest pslReaderTest annoGratorTest customTrackTest hgvsTest test: binTest quickLiftTest sessionDataTest trashDirTest mallocTopPadTest bedItemRgbTest \ hVarSubstHtmlTest dataVersionPathTest genarkLiftOverTest \ - snapshotTypeTest spDbTest hdbTest genePredTest pslReaderTest customTrackTest hgvsTest + snapshotTypeTest sessionDirTest spDbTest hdbTest genePredTest pslReaderTest customTrackTest hgvsTest rm -r output echo tested all mkdirs: @${MKDIR} output ${BIN_DIR} loaders: ln -sf ${CGI_BIN}/loader . spDbTest: ${BIN_DIR}/spDbTest mkdirs ${BIN_DIR}/spDbTest sp121210 Q9FFH7 > output/spDbTest ${BIN_DIR}/spDbTest sp121210 P29312 >> output/spDbTest diff expected/spDbTest output/spDbTest hdbTest: ${BIN_DIR}/hdbTest mkdirs ${BIN_DIR}/hdbTest > output/hdbTest diff expected/hdbTest output/hdbTest genePredTest: ${BIN_DIR}/genePredTester mkdirs ${MAKE} -f genePredTests.mk test pslReaderTest: ${BIN_DIR}/pslReaderTester mkdirs ${MAKE} -f pslReaderTests.mk test #annoGratorTest: ${BIN_DIR}/annoGratorTester mkdirs # ${MAKE} -f annoGratorTests.mk test customTrackTest: ${BIN_DIR}/customTrackTester loaders mkdirs ${MAKE} -f customTrackTests.mk test BIN_DIR=${BIN_DIR} OUT_DIR=output hgvsTest: ${BIN_DIR}/hgvsTester mkdirs ${MAKE} -f hgvsTests.mk test binTest: mkdirs ${BIN_DIR}/binTest @./binTest.sh quickLiftTest: ${BIN_DIR}/quickLiftTester mkdirs ${BIN_DIR}/quickLiftTester > output/quickLiftTest diff expected/quickLiftTest output/quickLiftTest sessionDataTest: ${BIN_DIR}/sessionDataTester mkdirs ${BIN_DIR}/sessionDataTester output/sessionData > output/sessionDataTest diff expected/sessionDataTest output/sessionDataTest # Three runs, because hgConfig caches the config it read, so one process can only answer for # one spelling of sessionDataDir. The fixture is made here rather than in C: a directory, a # symlink to it, and three confs naming the same place three ways. Each conf includes the # developer's own so the database settings come along, and is mode 600 because hgConfig # refuses a group-readable file whose name begins with a dot -- these do not, but the habit is # worth keeping. trashDirTest: ${BIN_DIR}/trashDirTester mkdirs rm -rf output/sd ${MKDIR} output/sd/real/hgt ln -s real output/sd/link echo "include ${HOME}/.hg.conf" > output/sd/link.conf echo "sessionDataDir=`pwd`/output/sd/link" >> output/sd/link.conf echo "include ${HOME}/.hg.conf" > output/sd/real.conf echo "sessionDataDir=`pwd`/output/sd/real" >> output/sd/real.conf echo "include ${HOME}/.hg.conf" > output/sd/rel.conf echo "sessionDataDir=output/sd/link" >> output/sd/rel.conf HGDB_CONF=output/sd/link.conf ${BIN_DIR}/trashDirTester \ "the symlink, absolute" `pwd`/output/sd/link `pwd`/output/sd/real \ > output/trashDirTest HGDB_CONF=output/sd/real.conf ${BIN_DIR}/trashDirTester \ "the resolved directory, absolute" `pwd`/output/sd/link `pwd`/output/sd/real \ >> output/trashDirTest HGDB_CONF=output/sd/rel.conf ${BIN_DIR}/trashDirTester \ "the symlink, relative" `pwd`/output/sd/link `pwd`/output/sd/real \ >> output/trashDirTest diff expected/trashDirTest output/trashDirTest # Twice: once with the setting and once without, because the answer is the DIFFERENCE between # them. A single run could pass on a library whose own default happened to be large. mallocTopPadTest: ${BIN_DIR}/mallocTopPadTester mkdirs echo "include ${HOME}/.hg.conf" > output/topPadOff.conf echo "include ${HOME}/.hg.conf" > output/topPadOn.conf echo "mallocTopPad=33554432" >> output/topPadOn.conf HGDB_CONF=output/topPadOff.conf ${BIN_DIR}/mallocTopPadTester > output/mallocTopPadTest HGDB_CONF=output/topPadOn.conf ${BIN_DIR}/mallocTopPadTester >> output/mallocTopPadTest diff expected/mallocTopPadTest output/mallocTopPadTest # bedItemRgb lives in hg/cgilib, which has no tests directory, so this one test links # jkhgapcgi.a on top of the libraries the rest of this directory uses. Two runs, because the # last step of the rule reads hg.conf's alwaysItemRgb and a mirror may turn it off. bedItemRgbTest: mkdirs ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/bedItemRgbTester bedItemRgbTester.c \ ${MYLIBDIR}/jkhgapcgi.a ${MYLIBS} $L echo "include ${HOME}/.hg.conf" > output/rgbOn.conf echo "include ${HOME}/.hg.conf" > output/rgbOff.conf echo "alwaysItemRgb=off" >> output/rgbOff.conf HGDB_CONF=output/rgbOn.conf ${BIN_DIR}/bedItemRgbTester > output/bedItemRgbTest HGDB_CONF=output/rgbOff.conf ${BIN_DIR}/bedItemRgbTester >> output/bedItemRgbTest diff expected/bedItemRgbTest output/bedItemRgbTest hVarSubstHtmlTest: mkdirs ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/hVarSubstHtmlTester hVarSubstHtmlTester.c ${MYLIBS} $L ${BIN_DIR}/hVarSubstHtmlTester > output/hVarSubstHtmlTest diff expected/hVarSubstHtmlTest output/hVarSubstHtmlTest dataVersionPathTest: mkdirs ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/dataVersionPathTester dataVersionPathTester.c ${MYLIBS} $L ${BIN_DIR}/dataVersionPathTester > output/dataVersionPathTest diff expected/dataVersionPathTest output/dataVersionPathTest genarkLiftOverTest: mkdirs ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/genarkLiftOverTester genarkLiftOverTester.c ${MYLIBS} $L ${BIN_DIR}/genarkLiftOverTester > output/genarkLiftOverTest diff expected/genarkLiftOverTest output/genarkLiftOverTest snapshotTypeTest: mkdirs ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/snapshotTypeTester snapshotTypeTester.c ${MYLIBS} $L ${BIN_DIR}/snapshotTypeTester > output/snapshotTypeTest diff expected/snapshotTypeTest output/snapshotTypeTest +sessionDirTest: mkdirs + ${CC} ${CC_PROG_OPTS} -o ${BIN_DIR}/sessionDirTester sessionDirTester.c ${MYLIBS} $L + ${BIN_DIR}/sessionDirTester > output/sessionDirTest + diff expected/sessionDirTest output/sessionDirTest + sqlCheck: ${BIN_DIR}/sqlCheck mkdirs ${MAKE} -f sqlCheck.mk test BIN_DIR=${BIN_DIR} OUT_DIR=output clean: rm -rf *.o bin output *.tmp loader udcCache