xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
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

      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).