]> git.ipfire.org Git - pbs.git/commitdiff
jobs: Drop new and dependency_error states
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 30 Oct 2017 10:56:37 +0000 (10:56 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 30 Oct 2017 10:56:37 +0000 (10:56 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/buildservice/builds.py
src/buildservice/jobqueue.py
src/buildservice/jobs.py
src/database.sql
src/static/css/build-table.css
src/static/images/icons/build-dependency_error.png [deleted file]
src/templates/docs-build.html
src/templates/modules/jobs-table.html
src/templates/modules/jobs/list.html
src/web/ui_modules.py

index 6cd91481a12781c95d867bc209f5923e34a206de..bc5cd946890770914f3f44544ec1838a9c23d9b2 100644 (file)
@@ -364,7 +364,6 @@ dist_static_font_DATA = \
 static_fontdir = $(staticdir)/font
 
 dist_static_images_DATA = \
-       src/static/images/icons/build-dependency_error.png \
        src/static/images/icons/build-dispatching.png \
        src/static/images/icons/build-failed.png \
        src/static/images/icons/build-finished.png \
index 704579fadf20cca2c7ad276cc8e63b816a655aef..0fce4deb1cf0ef46317030ee08f5c22a2fddada0 100644 (file)
@@ -543,7 +543,7 @@ class Build(base.DataObject):
                        remove = True
 
                        for job in self.jobs:
-                               if job.state in ("new", "pending", "running", "dependency_error"):
+                               if job.state in ("pending", "running"):
                                        job.state = "aborted"
 
                # If this build is in a repository, it will leave it.
index 5259ca111c43d52664f0cab7e680a44db8c57392..743f5f9f169256ef1640b6bf0d6d0363ca9464c8 100644 (file)
@@ -79,12 +79,20 @@ class JobQueue(base.Object):
                                                break
 
        def check_build_dependencies(self):
-               jobs = self.backend.jobs._get_jobs("SELECT * FROM jobs \
-                       WHERE state = 'new' OR \
-                               (state = 'dependency_error' AND time_finished < NOW() - '5 minutes'::interval) \
-                       ORDER BY time_finished LIMIT 50")
+               # Check all jobs that have never being checked before
+               self._check_build_dependencies("SELECT * FROM jobs \
+                       WHERE state = %s AND dependency_check_succeeded IS NULL \
+                       ORDER BY time_created", "pending")
+
+               # Redo the check for all jobs that have recently failed
+               self._check_build_dependencies("SELECT * FROM jobs \
+                       WHERE state = %s AND dependency_check_succeeeded IS FALSE \
+                       AND dependency_check_at < NOW() - '5 minutes'::interval \
+                       ORDER BY dependency_check_at", "pending")
+
+       def _check_build_dependencies(self, query, *args):
+               jobs = self.backend.jobs._get_jobs(query, *args)
 
                for job in jobs:
                        with self.db.transaction():
-                               # Resolve the dependencies
-                               job.resolvdep()
\ No newline at end of file
+                               job.resolvdep()
index 8ee698014941884f9d664cc2860d7dcf4e746d2f..b0fb12ebf9e9704afd4c3607b81d74b9e74a5b59 100644 (file)
@@ -286,7 +286,7 @@ class Job(base.DataObject):
                        self._set_attribute("state", state)
 
                        # Log the event.
-                       if log and not state == "new":
+                       if log:
                                self.log("state_change", state=state, user=user)
 
                # Always clear the message when the status is changed.
@@ -297,7 +297,7 @@ class Job(base.DataObject):
                        # Set start time.
                        self._set_attribute("time_started", datetime.datetime.utcnow())
 
-               elif state in ("aborted", "dependency_error", "finished", "failed"):
+               elif state in ("aborted", "finished", "failed"):
                        self._set_attribute("time_finished", datetime.datetime.utcnow())
 
                        # Send messages to the user.
@@ -313,12 +313,14 @@ class Job(base.DataObject):
 
        state = property(get_state, set_state)
 
-       @property
-       def message(self):
-               return self.data.message
+       def set_message(self, message):
+               self._set_attribute("message", "%s" % message)
+
+       message = property(lambda s: s.data.message, set_message)
 
+       # XXX DEPRECATED
        def update_message(self, message):
-               self._set_attribute("message", message)
+               self.message = message
 
        def get_builder(self):
                if self.data.builder_id:
@@ -627,6 +629,18 @@ class Job(base.DataObject):
 
                return "\n\n".join(confs)
 
+       def set_dependency_check_succeeded(self, value):
+               self._set_attribute("dependency_check_succeeded", value)
+               self._set_attribute("dependency_check_at", datetime.datetime.utcnow())
+
+               # Reset the message
+               if value is True:
+                       self.message = None
+
+       dependency_check_succeeded = property(
+               lambda s: s.data.dependency_check_succeeded,
+               set_dependency_check_succeeded)
+
        def resolvdep(self):
                config = pakfire.config.Config(files=["general.conf"])
                config.parse(self.get_config(local=True))
@@ -645,14 +659,9 @@ class Job(base.DataObject):
 
                # Catch dependency errors and log the problem string.
                except DependencyError, e:
-                       self.state = "dependency_error"
+                       self.dependency_check_succeeded = False
                        self.update_message("%s" % e)
 
+               # The dependency check has succeeded
                else:
-                       # If the build dependencies can be resolved, we set the build in
-                       # pending state.
-                       if solver.status is True:
-                               if self.state in ("failed",):
-                                       return
-
-                               self.state = "pending"
+                       self.dependency_check_succeeded = True
index a0c6ebfc490d18e3c3aaf7ed9ed492fa7ea8335b..41b3733403cd9f53ffbfa3d7c91f8283003317f1 100644 (file)
@@ -587,7 +587,7 @@ CREATE TABLE jobs (
     id integer NOT NULL,
     uuid text NOT NULL,
     build_id integer NOT NULL,
-    state text DEFAULT 'new'::text NOT NULL,
+    state text DEFAULT 'pending'::text NOT NULL,
     arch text NOT NULL,
     time_created timestamp without time zone DEFAULT now() NOT NULL,
     time_started timestamp without time zone,
@@ -597,7 +597,10 @@ CREATE TABLE jobs (
     aborted_state integer DEFAULT 0 NOT NULL,
     message text,
     test boolean DEFAULT true NOT NULL,
-    superseeded_by integer
+    superseeded_by integer,
+    dependency_check_succeeded boolean,
+    dependency_check_at timestamp without time zone,
+    CONSTRAINT jobs_states CHECK ((state = ANY (ARRAY['pending'::text, 'running'::text, 'finished'::text, 'aborted'::text, 'download_error'::text, 'failed'::text])))
 );
 
 
@@ -874,7 +877,7 @@ CREATE VIEW jobs_queue AS
             rank() OVER (ORDER BY (NOT jobs.test), builds.priority DESC, jobs.time_created) AS rank
            FROM (jobs
              LEFT JOIN builds ON ((jobs.build_id = builds.id)))
-          WHERE (jobs.state = 'pending'::text)
+          WHERE ((jobs.state = 'new'::text) AND (jobs.dependency_check_succeeded IS TRUE))
         )
  SELECT queue.id AS job_id,
     queue.rank
@@ -2551,6 +2554,13 @@ ALTER TABLE jobs_buildroots CLUSTER ON jobs_buildroots_job_id;
 CREATE INDEX jobs_buildroots_pkg_uuid ON jobs_buildroots USING btree (pkg_uuid);
 
 
+--
+-- Name: jobs_queue_ready; Type: INDEX; Schema: public; Owner: pakfire; Tablespace: 
+--
+
+CREATE INDEX jobs_queue_ready ON jobs USING btree (id) WHERE ((state = 'new'::text) AND (dependency_check_succeeded IS TRUE));
+
+
 --
 -- Name: jobs_time_finished; Type: INDEX; Schema: public; Owner: pakfire; Tablespace: 
 --
index 0e730717e9bed9ff03d5e29032cedfab61e6acdd..cc9aea49e4ea63f845bb9d56126c079aee2a5724 100644 (file)
@@ -49,10 +49,6 @@ table.builds tr.build td.jobs a.running {
        color: yellow;
 }
 
-table.builds tr.build td.jobs a.dependency_error {
-       color: blue;
-}
-
 table.builds tr.build td.jobs a.failed {
        color: red;
 }
diff --git a/src/static/images/icons/build-dependency_error.png b/src/static/images/icons/build-dependency_error.png
deleted file mode 100644 (file)
index 2230c05..0000000
Binary files a/src/static/images/icons/build-dependency_error.png and /dev/null differ
index 63e29e73b2fb6a998583a0547cd5eaf2837d8662..31001d23db64190971d156104142e58b151833c7 100644 (file)
@@ -36,7 +36,6 @@
                <li><a class="build running" name="#">{{ _("Build is running") }}</a></li>
                <li><a class="build failed" name="#">{{ _("Build has failed") }}</a></li>
                <li><a class="build pending" name="#">{{ _("Build is waiting to be processed") }}</a></li>
-               <li><a class="build dependency_error" name="#">{{ _("There was a dependency error when the package was built") }}</a></li>
                <li><a class="build waiting" name="#">{{ _("Build is waiting for source to go to pending state") }}</a></li>
                <li><a class="build dispatching" name="#">{{ _("Files of this build are transferred to the build server") }}</a></li>
                <li><a class="build uploading" name="#">{{ _("Files are being uploaded to the service") }}</a></li>
index 2453071864be25baa46d7b09ec05d960ad04f3c9..7170e5fc3b512b9f48f46ed94f52ac3da38f7be6 100644 (file)
@@ -15,9 +15,7 @@
                                                <a href="/job/{{ job.uuid }}">{{ job.arch }}</a>
                                        </td>
                                        <td>
-                                               {% if job.state == "new" %}
-                                                       {{ _("New") }}
-                                               {% elif job.state == "pending" %}
+                                               {% if job.state == "pending" %}
                                                        {{ _("Pending") }}
                                                {% elif job.state == "failed" %}
                                                        {{ _("Failed") }}
@@ -29,8 +27,6 @@
                                                        {{ _("Running") }}
                                                {% elif job.state == "aborted" %}
                                                        {{ _("Aborted") }}
-                                               {% elif job.state == "dependency_error" %}
-                                                       {{ _("Dependency error") }}
                                                {% else %}
                                                        {{ job.state }}
                                                {% end %}
index cdb33f17cd528551728e5e60af57eac6413062d5..4f5bfed1a1255a7ef8d4ff0ca53f06f1cb19f28b 100644 (file)
@@ -14,7 +14,7 @@
                                <tr class="success">
                        {% elif job.state in ("dispatching", "uploading") %}
                                <tr class="info">
-                       {% elif job.state in ("aborted", "dependency_error", "failed") %}
+                       {% elif job.state in ("aborted", "failed") %}
                                <tr class="error">
                        {% else %}
                                <tr>
index 5a609c9b437f1690cc41af9944373823e0f03b91..f4be0ff07c528d6599d0eff3c8cd9cf61d05d268 100644 (file)
@@ -245,11 +245,6 @@ class JobStateModule(UIModule):
                        classes.append("muted")
                        icon = "icon-warning-sign"
 
-               elif state == "dependency_error":
-                       text = _("Dependency problem")
-                       classes.append("text-warning")
-                       icon = "icon-random"
-
                elif state == "dispatching":
                        text = _("Dispatching")
                        classes.append("text-info")
@@ -265,11 +260,6 @@ class JobStateModule(UIModule):
                        classes.append("text-success")
                        icon = "icon-ok"
 
-               elif state == "new":
-                       text = _("New")
-                       classes.append("muted")
-                       icon = "icon-asterisk"
-
                elif state == "pending":
                        text = _("Pending")
                        classes.append("muted")