From: Ian Jackson <ian.jackson@eu.citrix.com>
To: xen-devel@lists.xenproject.org
Cc: Ian Jackson <Ian.Jackson@eu.citrix.com>
Subject: [OSSTEST PATCH 33/33] tcl daemons: Use with-db
Date: Fri, 8 Jul 2016 19:26:25 +0100 [thread overview]
Message-ID: <1468002385-4407-34-git-send-email-ian.jackson@eu.citrix.com> (raw)
In-Reply-To: <1468002385-4407-1-git-send-email-ian.jackson@eu.citrix.com>
Fixes a number of latent bugs where the jobdb refcount might get out
of step.
Signed-off-by: Ian Jackson <Ian.Jackson@eu.citrix.com>
---
sg-execute-flight | 82 ++++++++++++++++++-------------------
tcl/JobDB-Executive.tcl | 106 ++++++++++++++++++++++++------------------------
2 files changed, 93 insertions(+), 95 deletions(-)
diff --git a/sg-execute-flight b/sg-execute-flight
index 14c8cda..7932c29 100755
--- a/sg-execute-flight
+++ b/sg-execute-flight
@@ -28,48 +28,48 @@ proc check {} {
if {$stopping} return
- jobdb::db-open
-
- set nqueued [jobdb::db-execute-array dummy "
- SELECT job FROM jobs j
- WHERE j.flight = $flight
- AND j.status = 'queued'
- LIMIT 1
- "]
-
- set nrunning [llength $running]
- log "flight $flight nqueued=$nqueued nrunning=$nrunning"
-
- if {!$nqueued && !$nrunning} {
- prequit finished
- exec ./cs-flight-bless $flight $blessing running 2>@ stderr
- exit 0
- }
+ jobdb::with-db {
+
+ set nqueued [jobdb::db-execute-array dummy "
+ SELECT job FROM jobs j
+ WHERE j.flight = $flight
+ AND j.status = 'queued'
+ LIMIT 1
+ "]
+
+ set nrunning [llength $running]
+ log "flight $flight nqueued=$nqueued nrunning=$nrunning"
+
+ if {!$nqueued && !$nrunning} {
+ prequit finished
+ exec ./cs-flight-bless $flight $blessing running 2>@ stderr
+ exit 0
+ }
+
+ jobdb::db-execute-array jobinfo "
+ SELECT * FROM jobs j
+ WHERE j.flight = $flight
+ AND j.status = 'queued'
+ AND 0 = (SELECT count(*) FROM jobs d
+ WHERE d.flight = $flight
+ AND ( d.status = 'queued'
+ OR d.status = 'preparing'
+ OR d.status = 'running'
+ OR d.status = 'retriable' )
+ AND (d.job IN (SELECT val FROM runvars r
+ WHERE r.flight = $flight
+ AND r.job = j.job
+ AND r.name LIKE '%job')
+ OR (d.flight || '.' || d.job) IN
+ (SELECT val FROM runvars r
+ WHERE r.flight = $flight
+ AND r.job = j.job
+ AND r.name LIKE '%job'))
+ )
+ ORDER BY job
+ " maybe-spawn-job
- jobdb::db-execute-array jobinfo "
- SELECT * FROM jobs j
- WHERE j.flight = $flight
- AND j.status = 'queued'
- AND 0 = (SELECT count(*) FROM jobs d
- WHERE d.flight = $flight
- AND ( d.status = 'queued'
- OR d.status = 'preparing'
- OR d.status = 'running'
- OR d.status = 'retriable' )
- AND (d.job IN (SELECT val FROM runvars r
- WHERE r.flight = $flight
- AND r.job = j.job
- AND r.name LIKE '%job')
- OR (d.flight || '.' || d.job) IN
- (SELECT val FROM runvars r
- WHERE r.flight = $flight
- AND r.job = j.job
- AND r.name LIKE '%job'))
- )
- ORDER BY job
- " maybe-spawn-job
-
- jobdb::db-close
+ }
}
proc prequit {why} {
diff --git a/tcl/JobDB-Executive.tcl b/tcl/JobDB-Executive.tcl
index 07a0438..0f450c1 100644
--- a/tcl/JobDB-Executive.tcl
+++ b/tcl/JobDB-Executive.tcl
@@ -28,36 +28,36 @@ proc logputs {f m} {
proc prepare {job} {
global flight jobinfo
- db-open
- set found 0
- db-execute-array jobinfo "
- SELECT job, status, recipe FROM jobs
- WHERE flight = [pg_quote $flight]
- AND job = [pg_quote $job]
- " {
- switch -exact -- $jobinfo(status) {
- queued - preparing - retriable - play { incr found }
- default {
- error "job $flight.$job status $jobinfo(status)"
+ with-db {
+ set found 0
+ db-execute-array jobinfo "
+ SELECT job, status, recipe FROM jobs
+ WHERE flight = [pg_quote $flight]
+ AND job = [pg_quote $job]
+ " {
+ switch -exact -- $jobinfo(status) {
+ queued - preparing - retriable - play { incr found }
+ default {
+ error "job $flight.$job status $jobinfo(status)"
+ }
}
}
- }
- if {!$found} {
- error "job $flight.$job not found"
- }
+ if {!$found} {
+ error "job $flight.$job not found"
+ }
- setstatus preparing
- db-close
+ setstatus preparing
+ }
}
proc job-set-status-unlocked {flight job st} {
- db-open
- db-execute "
- UPDATE jobs SET status='$st'
- WHERE flight=$flight AND job='$job'
- AND status<>'aborted' AND status<>'broken'
- "
- db-close
+ with-db {
+ db-execute "
+ UPDATE jobs SET status='$st'
+ WHERE flight=$flight AND job='$job'
+ AND status<>'aborted' AND status<>'broken'
+ "
+ }
}
proc job-set-status {flight job st} {
@@ -221,38 +221,36 @@ proc lock-tables {tables} {
proc spawn-step-begin {flight job ts stepnovar} {
upvar 1 $stepnovar stepno
- db-open
-
- db-execute BEGIN
- db-execute "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"
- if {[catch {
- lock-tables flights
- db-execute-array stepinfo "
- SELECT max(stepno) AS maxstep FROM steps
- WHERE flight=[pg_quote $flight] AND job=[pg_quote $job]
- "
- set stepno $stepinfo(maxstep)
- if {[string length $stepno]} {
- incr stepno
- } else {
- set stepno 1
+ with-db {
+ db-execute BEGIN
+ db-execute "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"
+ if {[catch {
+ lock-tables flights
+ db-execute-array stepinfo "
+ SELECT max(stepno) AS maxstep FROM steps
+ WHERE flight=[pg_quote $flight] AND job=[pg_quote $job]
+ "
+ set stepno $stepinfo(maxstep)
+ if {[string length $stepno]} {
+ incr stepno
+ } else {
+ set stepno 1
+ }
+ db-execute "
+ INSERT INTO steps
+ VALUES ([pg_quote $flight], [pg_quote $job], $stepno,
+ [pg_quote $ts], 'running',
+ 'STARTING')
+ "
+ db-execute COMMIT
+ } emsg]} {
+ global errorInfo errorCode
+ set ei $errorInfo
+ set ec $errorCode
+ catch { db-execute ROLLBACK }
+ error $emsg $ei $ec
}
- db-execute "
- INSERT INTO steps
- VALUES ([pg_quote $flight], [pg_quote $job], $stepno,
- [pg_quote $ts], 'running',
- 'STARTING')
- "
- db-execute COMMIT
- } emsg]} {
- global errorInfo errorCode
- set ei $errorInfo
- set ec $errorCode
- catch { db-execute ROLLBACK }
- db-close
- error $emsg $ei $ec
}
- db-close
}
proc spawn-step-commit {flight job stepno testid} {
--
2.1.4
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
prev parent reply other threads:[~2016-07-08 18:26 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-08 18:25 [OSSTEST PATCH 00/33] Database locking and retry Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 01/33] mg-allocate: Fix "issteallable" call Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 02/33] mg-allocate: Do not treat already-allocated resources as satisfactory Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 03/33] mg-schema-test-database: Direct logs to local directory Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 04/33] mg-schema-test-database: Prepare for `daemons' to be cleverer Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 05/33] mg-schema-test-database: Make `daemons' " Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 06/33] mg-schema-test-database: Change default minflight to -100 Ian Jackson
2016-07-08 18:25 ` [OSSTEST PATCH 07/33] invoke-daemon: Honour OSSTEST_DAEMON_TCLSH Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 08/33] Tcl: Use tclsh8.5 Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 09/33] ms-flights-summary: Remove spurious \ in keys \%{ something } Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 10/33] ms-planner: Support ClientNotes Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 11/33] Tcl database debugging: Actually work Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 12/33] Database locking: Tcl: Use db-execute-array Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 13/33] Database locking: Tcl: Use db-execute Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 14/33] Database locking: Tcl: Always use db-execute-array for SELECT Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 15/33] Database locking: Tcl: for errorCode, use pg_exec, not pg_execute Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 16/33] Database locking: Tcl: Retry only on DEADLOCK DETECTED Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 17/33] ms-ownerdaemon: Cope with db restart. Retry recording dead tasks Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 18/33] ms-ownerdaemon: Break out db-reopen, and move it to JobDB-Executive Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 19/33] tcl daemons: Move BEGIN within scope of transaction error trapping Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 20/33] tcl daemons: jobdb::transaction: Improve two message generation sites Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 21/33] tcl daemons: Remove obsolete `global g' Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 22/33] tcl daemons: Break out db-ensure-open and db-ensure-closed Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 23/33] tcl daemons: db-ensure-open, -close: Make idempotent Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 24/33] tcl daemons: make db-reopen actually work Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 25/33] tcl daemons: More info in db--exec-check error Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 26/33] tcl daemons: Recognise `SSL SYSCALL' errors with their own errorCode Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 27/33] tcl daemons: transaction: Properly match db-open and db-close Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 28/33] tcl daemons: if error occurs, ensure db is closed afterwards Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 29/33] tcl daemons: transaction: Only try ROLLBACK when necessary Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 30/33] tcl daemons: transaction: Support db autoreconnect Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 31/33] tcl-daemons: ms-ownerdaemon: Use autoreconnect Ian Jackson
2016-07-08 18:26 ` [OSSTEST PATCH 32/33] tcl daemons: Provide with-db Ian Jackson
2016-07-08 18:26 ` Ian Jackson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1468002385-4407-34-git-send-email-ian.jackson@eu.citrix.com \
--to=ian.jackson@eu.citrix.com \
--cc=xen-devel@lists.xenproject.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).