Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The LUCI Authors. | 1 // Copyright 2015 The LUCI Authors. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 326 // isEqual returns true iff 'e' is equal to 'other'. | 326 // isEqual returns true iff 'e' is equal to 'other'. |
| 327 func (e *Job) isEqual(other *Job) bool { | 327 func (e *Job) isEqual(other *Job) bool { |
| 328 return e == other || (e.JobID == other.JobID && | 328 return e == other || (e.JobID == other.JobID && |
| 329 e.ProjectID == other.ProjectID && | 329 e.ProjectID == other.ProjectID && |
| 330 e.Flavor == other.Flavor && | 330 e.Flavor == other.Flavor && |
| 331 e.Enabled == other.Enabled && | 331 e.Enabled == other.Enabled && |
| 332 e.Paused == other.Paused && | 332 e.Paused == other.Paused && |
| 333 e.Revision == other.Revision && | 333 e.Revision == other.Revision && |
| 334 e.RevisionURL == other.RevisionURL && | 334 e.RevisionURL == other.RevisionURL && |
| 335 e.Schedule == other.Schedule && | 335 e.Schedule == other.Schedule && |
| 336 e.Acls.Equal(&other.Acls) && | |
|
Vadim Sh.
2017/08/08 19:11:16
err... I remember reviewing this line. What happen
tandrii(chromium)
2017/08/08 19:20:02
you've reviewed very similar line below.
| |
| 336 bytes.Equal(e.Task, other.Task) && | 337 bytes.Equal(e.Task, other.Task) && |
| 337 e.State == other.State) | 338 e.State == other.State) |
| 338 } | 339 } |
| 339 | 340 |
| 340 // matches returns true if job definition in the entity matches the one | 341 // matches returns true if job definition in the entity matches the one |
| 341 // specified by catalog.Definition struct. UpdateProjectJobs skips updates for | 342 // specified by catalog.Definition struct. UpdateProjectJobs skips updates for |
| 342 // such jobs (assuming they are up-to-date). | 343 // such jobs (assuming they are up-to-date). |
| 343 func (e *Job) matches(def catalog.Definition) bool { | 344 func (e *Job) matches(def catalog.Definition) bool { |
| 344 return e.JobID == def.JobID && | 345 return e.JobID == def.JobID && |
| 345 e.Flavor == def.Flavor && | 346 e.Flavor == def.Flavor && |
| 346 e.Schedule == def.Schedule && | 347 e.Schedule == def.Schedule && |
| 347 e.Acls.Equal(&def.Acls) && | 348 e.Acls.Equal(&def.Acls) && |
|
tandrii(chromium)
2017/08/08 19:20:02
it was this line :)
| |
| 348 bytes.Equal(e.Task, def.Task) | 349 bytes.Equal(e.Task, def.Task) |
| 349 } | 350 } |
| 350 | 351 |
| 351 // Invocation entity stores single attempt to run a job. Its parent entity | 352 // Invocation entity stores single attempt to run a job. Its parent entity |
| 352 // is corresponding Job, its ID is generated based on time. | 353 // is corresponding Job, its ID is generated based on time. |
| 353 type Invocation struct { | 354 type Invocation struct { |
| 354 _kind string `gae:"$kind,Invocation"` | 355 _kind string `gae:"$kind,Invocation"` |
| 355 _extra ds.PropertyMap `gae:"-,extra"` | 356 _extra ds.PropertyMap `gae:"-,extra"` |
| 356 | 357 |
| 357 // ID is identifier of this particular attempt to run a job. Multiple at tempts | 358 // ID is identifier of this particular attempt to run a job. Multiple at tempts |
| (...skipping 936 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1294 } | 1295 } |
| 1295 | 1296 |
| 1296 // updateJob updates an existing job if its definition has changed, adds | 1297 // updateJob updates an existing job if its definition has changed, adds |
| 1297 // a completely new job or enables a previously disabled job. | 1298 // a completely new job or enables a previously disabled job. |
| 1298 func (e *engineImpl) updateJob(c context.Context, def catalog.Definition) error { | 1299 func (e *engineImpl) updateJob(c context.Context, def catalog.Definition) error { |
| 1299 return e.txn(c, def.JobID, func(c context.Context, job *Job, isNew bool) error { | 1300 return e.txn(c, def.JobID, func(c context.Context, job *Job, isNew bool) error { |
| 1300 if !isNew && job.Enabled && job.matches(def) { | 1301 if !isNew && job.Enabled && job.matches(def) { |
| 1301 return errSkipPut | 1302 return errSkipPut |
| 1302 } | 1303 } |
| 1303 if isNew { | 1304 if isNew { |
| 1304 » » » // JobID is <projectID>/<name>, it's ensure by Catalog. | 1305 » » » // JobID is <projectID>/<name>, it's ensured by Catalog. |
| 1305 chunks := strings.Split(def.JobID, "/") | 1306 chunks := strings.Split(def.JobID, "/") |
| 1306 if len(chunks) != 2 { | 1307 if len(chunks) != 2 { |
| 1307 return fmt.Errorf("unexpected jobID format: %s", def.JobID) | 1308 return fmt.Errorf("unexpected jobID format: %s", def.JobID) |
| 1308 } | 1309 } |
| 1309 *job = Job{ | 1310 *job = Job{ |
| 1310 JobID: def.JobID, | 1311 JobID: def.JobID, |
| 1311 ProjectID: chunks[0], | 1312 ProjectID: chunks[0], |
| 1312 Flavor: def.Flavor, | 1313 Flavor: def.Flavor, |
| 1313 Enabled: false, // to trigger 'if !oldEnabled' below | 1314 Enabled: false, // to trigger 'if !oldEnabled' below |
| 1314 Schedule: def.Schedule, | 1315 Schedule: def.Schedule, |
| 1315 Task: def.Task, | 1316 Task: def.Task, |
| 1316 State: JobState{State: JobStateDisabled}, | 1317 State: JobState{State: JobStateDisabled}, |
| 1317 } | 1318 } |
| 1318 } | 1319 } |
| 1319 oldEnabled := job.Enabled | 1320 oldEnabled := job.Enabled |
| 1320 oldEffectiveSchedule := job.effectiveSchedule() | 1321 oldEffectiveSchedule := job.effectiveSchedule() |
| 1321 | 1322 |
| 1322 // Update the job in full before running any state changes. | 1323 // Update the job in full before running any state changes. |
| 1323 job.Flavor = def.Flavor | 1324 job.Flavor = def.Flavor |
| 1324 job.Revision = def.Revision | 1325 job.Revision = def.Revision |
| 1325 job.RevisionURL = def.RevisionURL | 1326 job.RevisionURL = def.RevisionURL |
| 1327 job.Acls = def.Acls | |
| 1326 job.Enabled = true | 1328 job.Enabled = true |
| 1327 job.Schedule = def.Schedule | 1329 job.Schedule = def.Schedule |
| 1328 job.Task = def.Task | 1330 job.Task = def.Task |
| 1329 | 1331 |
| 1330 // Do state machine transitions. | 1332 // Do state machine transitions. |
| 1331 if !oldEnabled { | 1333 if !oldEnabled { |
| 1332 err := e.rollSM(c, job, func(sm *StateMachine) error { | 1334 err := e.rollSM(c, job, func(sm *StateMachine) error { |
| 1333 sm.OnJobEnabled() | 1335 sm.OnJobEnabled() |
| 1334 return nil | 1336 return nil |
| 1335 }) | 1337 }) |
| (...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2070 } | 2072 } |
| 2071 if hasFinished { | 2073 if hasFinished { |
| 2072 return ctl.eng.rollSM(c, job, func(sm *StateMachine) err or { | 2074 return ctl.eng.rollSM(c, job, func(sm *StateMachine) err or { |
| 2073 sm.OnInvocationDone(saving.ID) | 2075 sm.OnInvocationDone(saving.ID) |
| 2074 return nil | 2076 return nil |
| 2075 }) | 2077 }) |
| 2076 } | 2078 } |
| 2077 return nil | 2079 return nil |
| 2078 }) | 2080 }) |
| 2079 } | 2081 } |
| OLD | NEW |