# HG changeset patch # User Sascha L. Teichmann # Date 1585151505 -3600 # Node ID 90b0a14dd58b6ee936cf7d5b247cf18cefae6c3e # Parent 4dc2e6dc6c7df7e2a0401a612d69d0de7afa0cf8 Enable jobs to be removed by the import queue. diff -r 4dc2e6dc6c7d -r 90b0a14dd58b pkg/imports/queue.go --- a/pkg/imports/queue.go Wed Mar 25 15:33:11 2020 +0100 +++ b/pkg/imports/queue.go Wed Mar 25 16:51:45 2020 +0100 @@ -66,6 +66,11 @@ CleanUp() error } + FeedbackJob interface { + Job + CreateFeedback(int64) Feedback + } + // JobKind is the type of an import. // Choose a unique name for every import. JobKind string @@ -92,8 +97,9 @@ AutoAccept() bool } - FeedbackCreator interface { - CreateFeedback(int64) Feedback + JobRemover interface { + JobCreator + RemoveJob() bool } idJob struct { @@ -205,6 +211,9 @@ summary = $2 WHERE id = $3` + deleteJobSQL = ` +DELETE FROM import.imports WHERE id = $1` + logMessageSQL = ` INSERT INTO import.import_logs ( import_id, @@ -234,6 +243,10 @@ return true } +func (*reviewedJobCreator) RemoveJob() bool { + return true +} + func (rjc *reviewedJobCreator) Depends() [2][]string { return rjc.jobCreator.Depends() } @@ -821,6 +834,13 @@ }) } +func deleteJob(ctx context.Context, id int64) error { + return tryHardToStoreState(ctx, func(conn *sql.Conn) error { + _, err := conn.ExecContext(ctx, deleteJobSQL, id) + return err + }) +} + func errorAndFail(id int64, format string, args ...interface{}) error { ctx := context.Background() return tryHardToStoreState(ctx, func(conn *sql.Conn) error { @@ -898,7 +918,7 @@ } var feedback Feedback - if fc, ok := job.(FeedbackCreator); ok { + if fc, ok := job.(FeedbackJob); ok { feedback = fc.CreateFeedback(idj.id) } else { feedback = logFeedback(idj.id) @@ -935,6 +955,11 @@ } } + var remove bool + if remover, ok := jc.(JobRemover); ok { + remove = remover.RemoveJob() + } + var state string switch { case unchanged: @@ -946,15 +971,18 @@ default: state = "pending" } - if err := updateStateSummary(ctx, idj.id, state, summary); err != nil { - log.Printf("error: setting state of job %d failed: %v\n", idj.id, err) + if !remove { + if err := updateStateSummary(ctx, idj.id, state, summary); err != nil { + log.Printf("error: setting state of job %d failed: %v\n", idj.id, err) + } + log.Printf("info: import #%d finished: %s\n", idj.id, state) } - log.Printf("info: import #%d finished: %s\n", idj.id, state) if idj.sendEmail { go sendNotificationMail(idj.user, jc.Description(), state, idj.id) } - if retry { + switch { + case retry: nid, err := q.addJob( idj.kind, idj.nextDue(), @@ -967,6 +995,10 @@ } else { log.Printf("info: re-enqueued job with id %d\n", nid) } + case remove: + if err := deleteJob(ctx, idj.id); err != nil { + log.Printf("error: deleting job %d failed: %v\n", idj.id, err) + } } }(jc, idj) } diff -r 4dc2e6dc6c7d -r 90b0a14dd58b schema/auth.sql --- a/schema/auth.sql Wed Mar 25 15:33:11 2020 +0100 +++ b/schema/auth.sql Wed Mar 25 16:51:45 2020 +0100 @@ -61,6 +61,7 @@ GRANT INSERT, UPDATE ON sys_admin.system_config TO sys_admin; GRANT UPDATE ON sys_admin.published_services TO sys_admin; GRANT INSERT, DELETE, UPDATE ON sys_admin.password_reset_requests TO sys_admin; +GRANT DELETE ON import.imports, import.import_logs TO sys_admin; -- -- Privileges assigned directly to metamorph diff -r 4dc2e6dc6c7d -r 90b0a14dd58b schema/updates/1432/01.allow_job_delete_sys_admin.sql --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/schema/updates/1432/01.allow_job_delete_sys_admin.sql Wed Mar 25 16:51:45 2020 +0100 @@ -0,0 +1,1 @@ +GRANT DELETE ON import.imports, import.import_logs TO sys_admin; diff -r 4dc2e6dc6c7d -r 90b0a14dd58b schema/version.sql --- a/schema/version.sql Wed Mar 25 15:33:11 2020 +0100 +++ b/schema/version.sql Wed Mar 25 16:51:45 2020 +0100 @@ -1,1 +1,1 @@ -INSERT INTO gemma_schema_version(version) VALUES (1431); +INSERT INTO gemma_schema_version(version) VALUES (1432);