mirror of
https://github.com/facebook/sapling.git
synced 2024-10-11 09:17:30 +03:00
5a3842e136
Summary: This happens if during prepushrebase hook, a hgsql repo sync (db -> local) is completed by another process. `repo.manifestlog` does not get invalidated correctly if it's treeonly. The issue was partially detected by a C program modified from fanotify (2) manpage example monitoring `00manifesttree.i` changes: [00:32:35.780] pid 7734 opens 00manifesttree.i (size 1000264) # First open. [00:32:35.930] pid 7734 reads closes (no write) 00manifesttree.i (size 1000264) [00:32:38.685] pid 9175 opens 00manifesttree.i (size 1000264) [00:32:38.885] pid 9175 reads 00manifesttree.i (size 1000264) [00:32:38.886] pid 9175 closes (no write) 00manifesttree.i (size 1000264) [00:32:39.235] pid 9175 opens 00manifesttree.i (size 1000264) [00:32:39.235] pid 9175 closes (no write) 00manifesttree.i (size 1000264) [00:32:39.236] pid 9175 opens 00manifesttree.i (size 1000264) [00:32:39.236] pid 9175 modifies closes 00manifesttree.i (size 1000328) # Appended by another process. [00:32:41.169] pid 10759 opens 00manifesttree.i (size 1000328) [00:32:41.355] pid 10759 reads 00manifesttree.i (size 1000328) [00:32:41.355] pid 10759 closes (no write) 00manifesttree.i (size 1000328) [00:32:41.537] pid 10759 opens closes (no write) 00manifesttree.i (size 1000328) [00:32:41.537] pid 10759 opens 00manifesttree.i (size 1000392) [00:32:41.537] pid 10759 modifies closes 00manifesttree.i (size 1000392) # Appended by another process. [00:32:44.930] pid 7734 opens closes (no write) 00manifesttree.i (size 1000392) # Main process picked up changes. [00:32:44.930] pid 7734 opens 00manifesttree.i (size 1000392) [00:32:44.930] pid 7734 reads 00manifesttree.i (size 1000392) [00:32:44.930] pid 7734 modifies closes 00manifesttree.i (size 1000456) # Main process wrote data. [00:32:45.275] pid 7734 opens 00manifesttree.i (size 1000456) [00:32:45.459] pid 7734 reads 00manifesttree.i (size 1000456) [00:32:45.459] pid 7734 closes (no write) 00manifesttree.i (size 1000456) [00:32:45.550] pid 7734 opens closes (no write) 00manifesttree.i (size 1000456) [00:32:45.550] pid 7734 opens 00manifesttree.i (size 1000264) [00:32:45.550] pid 7734 closes 00manifesttree.i (size 1000264) # Main process truncated to the wrong position. Pid 7734 had "IntegrityError: 1062 (23000): Duplicate entry" error. The fanotify log showed it truncated the revlog to a wrong location, indicating an outdated revlog was kept in memory. The C program was sent as D10418991. Reviewed By: DurhamG Differential Revision: D10417797 fbshipit-source-id: 7ccc0a976d05efbca5b3ed6fb5ff7886766d06d2
91 lines
2.0 KiB
Bash
91 lines
2.0 KiB
Bash
# This file will be sourced by all .t tests. Put general purposed functions
|
|
# here.
|
|
|
|
_repocount=0
|
|
|
|
# Create a new repo
|
|
newrepo() {
|
|
reponame="$1"
|
|
if [ -z "$reponame" ]; then
|
|
_repocount=$((_repocount+1))
|
|
reponame=repo$_repocount
|
|
fi
|
|
mkdir "$TESTTMP/$reponame"
|
|
cd "$TESTTMP/$reponame"
|
|
hg init
|
|
}
|
|
|
|
switchrepo() {
|
|
reponame="$1"
|
|
cd $TESTTMP/$reponame
|
|
}
|
|
|
|
# Enable extensions or features
|
|
enable() {
|
|
local rcpath
|
|
if [ -f .hg/hgrc ]; then
|
|
rcpath=.hg/hgrc
|
|
else
|
|
rcpath="$HGRCPATH"
|
|
fi
|
|
for name in "$@"; do
|
|
if [ "$name" = obsstore ]; then
|
|
cat >> $rcpath << EOF
|
|
[experimental]
|
|
evolution = createmarkers, allowunstable
|
|
EOF
|
|
else
|
|
cat >> $rcpath << EOF
|
|
[extensions]
|
|
$name=
|
|
EOF
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Like "hg debugdrawdag", but do not leave local tags in the repo and define
|
|
# nodes as environment variables.
|
|
# This is useful if the test wants to hide those commits because tags would
|
|
# make commits visible. The function will set environment variables so
|
|
# commits can still be referred as $TAGNAME.
|
|
drawdag() {
|
|
hg debugdrawdag "$@"
|
|
eval `hg tags -T '{tag}={node}\n'`
|
|
rm -f .hg/localtags
|
|
}
|
|
|
|
# Simplify error reporting so crash does not show a traceback.
|
|
# This is useful to match error messages without the traceback.
|
|
shorttraceback() {
|
|
enable errorredirect
|
|
setconfig errorredirect.script='printf "%s" "$TRACE" | tail -1 1>&2'
|
|
}
|
|
|
|
# Set config items like --config way, instead of using cat >> $HGRCPATH
|
|
setconfig() {
|
|
python "$RUNTESTDIR/setconfig.py" "$@"
|
|
}
|
|
|
|
# Create a new extension
|
|
newext() {
|
|
extname="$1"
|
|
if [ -z "$extname" ]; then
|
|
_extcount=$((_extcount+1))
|
|
extname=ext$_extcount
|
|
fi
|
|
cat > "$TESTTMP/$extname.py"
|
|
setconfig "extensions.$extname=$TESTTMP/$extname.py"
|
|
}
|
|
|
|
showgraph() {
|
|
hg log --graph -T "{rev} {node|short} {desc|firstline}" | sed \$d
|
|
}
|
|
|
|
tglog() {
|
|
hg log -G -T "{rev}: {node|short} '{desc}' {bookmarks} {branches}" "$@"
|
|
}
|
|
|
|
tglogp() {
|
|
hg log -G -T "{rev}: {node|short} {phase} '{desc}' {bookmarks} {branches}" "$@"
|
|
}
|