~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/buildmaster/manager.py

  • Committer: j.c.sackett
  • Date: 2011-11-04 18:12:47 UTC
  • mfrom: (14253 devel)
  • mto: This revision was merged to the branch mainline in revision 14287.
  • Revision ID: jonathan.sackett@canonical.com-20111104181247-5p1rmwj734n4onis
Merged in devel.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
__metaclass__ = type
7
7
 
8
8
__all__ = [
9
 
    'BaseDispatchResult',
10
9
    'BuilddManager',
11
10
    'BUILDD_MANAGER_LOG_NAME',
12
 
    'FailDispatchResult',
13
 
    'ResetDispatchResult',
14
11
    ]
15
12
 
16
13
import logging
172
169
                    "job '%s' failure count: %s" % (
173
170
                        self.builder_name,
174
171
                        builder.failure_count,
175
 
                        build_farm_job.title, 
 
172
                        build_farm_job.title,
176
173
                        build_farm_job.failure_count))
177
174
            else:
178
175
                self.logger.info(
187
184
                exc_info=True)
188
185
            transaction.abort()
189
186
 
 
187
    def checkCancellation(self, builder):
 
188
        """See if there is a pending cancellation request.
 
189
 
 
190
        If the current build is in status CANCELLING then terminate it
 
191
        immediately.
 
192
 
 
193
        :return: A deferred whose value is True if we cancelled the build.
 
194
        """
 
195
        if not builder.virtualized:
 
196
            return defer.succeed(False)
 
197
        buildqueue = self.builder.getBuildQueue()
 
198
        if not buildqueue:
 
199
            return defer.succeed(False)
 
200
        build = buildqueue.specific_job.build
 
201
        if build.status != BuildStatus.CANCELLING:
 
202
            return defer.succeed(False)
 
203
 
 
204
        def resume_done(ignored):
 
205
            return defer.succeed(True)
 
206
 
 
207
        self.logger.info("Cancelling build '%s'" % build.title)
 
208
        buildqueue.cancel()
 
209
        transaction.commit()
 
210
        d = builder.resumeSlaveHost()
 
211
        d.addCallback(resume_done)
 
212
        return d
 
213
 
190
214
    def scan(self):
191
215
        """Probe the builder and update/dispatch/collect as appropriate.
192
216
 
215
239
 
216
240
        self.builder = get_builder(self.builder_name)
217
241
 
218
 
        if self.builder.builderok:
219
 
            d = self.builder.updateStatus(self.logger)
220
 
        else:
221
 
            d = defer.succeed(None)
222
 
 
223
242
        def status_updated(ignored):
224
243
            # Commit the changes done while possibly rescuing jobs, to
225
244
            # avoid holding table locks.
268
287
            # See if there is a job we can dispatch to the builder slave.
269
288
 
270
289
            d = self.builder.findAndStartJob()
 
290
 
271
291
            def job_started(candidate):
272
292
                if self.builder.currentjob is not None:
273
293
                    # After a successful dispatch we can reset the
279
299
                    return None
280
300
            return d.addCallback(job_started)
281
301
 
282
 
        d.addCallback(status_updated)
283
 
        d.addCallback(build_updated)
 
302
        def cancellation_checked(cancelled):
 
303
            if cancelled:
 
304
                return defer.succeed(None)
 
305
            d = self.builder.updateStatus(self.logger)
 
306
            d.addCallback(status_updated)
 
307
            d.addCallback(build_updated)
 
308
            return d
 
309
 
 
310
        if self.builder.builderok:
 
311
            d = self.checkCancellation(self.builder)
 
312
            d.addCallback(cancellation_checked)
 
313
        else:
 
314
            d = defer.succeed(None)
 
315
            d.addCallback(status_updated)
 
316
            d.addCallback(build_updated)
 
317
 
284
318
        return d
285
319
 
286
320