Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
| 2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
| 3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
| 4 | 4 |
| 5 syntax = "proto3"; | 5 syntax = "proto3"; |
| 6 | 6 |
| 7 import "google/protobuf/timestamp.proto"; | 7 import "google/protobuf/timestamp.proto"; |
| 8 import "google/protobuf/duration.proto"; | |
| 8 | 9 |
| 9 import "github.com/luci/luci-go/common/api/template/template.proto"; | 10 import "github.com/luci/luci-go/common/api/template/template.proto"; |
| 10 | 11 |
| 11 import "types.proto"; | 12 import "types.proto"; |
| 12 | 13 |
| 13 package dm; | 14 package dm; |
| 14 | 15 |
| 16 message AbnormalFinish { | |
|
iannucci
2016/06/08 02:54:24
Here are all the abnormal finish status types. The
| |
| 17 enum Status { | |
| 18 // This entity has a failed result. | |
| 19 // | |
| 20 // Executions: the distributor reported that the task executed and failed, O R | |
| 21 // the distributor reports success while the Execution is in the RUNNING | |
| 22 // state. | |
| 23 // | |
| 24 // Attempts: the last Execution had a FAILED Status. | |
| 25 // | |
| 26 // Retryable. | |
| 27 FAILED = 0; | |
|
iannucci
2016/06/08 02:54:24
I'm not super sure how to deal with this one: this
dnj (Google)
2016/06/09 18:00:57
I think things pre-recipe-engine can fail (e.g., b
iannucci
2016/06/15 00:46:02
Yeah I think this makes sense. For recipe quests w
| |
| 28 | |
| 29 // This entity failed in a bad way. | |
| 30 // | |
| 31 // Executions: The distributor told us that the job died violently while in | |
| 32 // the SCHEDULING, RUNNING or STOPPING state. | |
| 33 // | |
| 34 // Attempts: the last Execution had a CRASHED Status. | |
| 35 // | |
| 36 // Retryable. | |
| 37 CRASHED = 1; | |
| 38 | |
| 39 // Waited too long for the job to start. | |
| 40 // | |
| 41 // Executions: the distributor couldn't start the job in time, OR DM failed | |
| 42 // to get a status update from the distributor in time (e.g. the state was | |
| 43 // SCHEDULING for too long). | |
| 44 // | |
| 45 // Attempts: the last Execution had an EXPIRED Status. | |
| 46 // | |
| 47 // Retryable. | |
| 48 EXPIRED = 2; | |
| 49 | |
| 50 // The job started, but took too long. | |
| 51 // | |
| 52 // Executions: the distributor started the job, but it couldn't complete in | |
| 53 // time, OR DM failed to get a status update from the distributor in time | |
| 54 // (e.g. the state was RUNNING for too long). | |
| 55 // | |
| 56 // Attempts: the last Execution had an TIMED_OUT Status. | |
| 57 // | |
| 58 // Retryable. | |
| 59 TIMED_OUT = 3; | |
| 60 | |
| 61 // The job was cancelled by an external entity (human, automated system). | |
| 62 // | |
| 63 // Executions: the distributor informing DM that the job was preemptively | |
| 64 // cancelled. | |
| 65 // | |
| 66 // Attempts: the last Execution had a CANCELLED Status, or this Attempt | |
| 67 // was cancelled via DM. | |
| 68 CANCELLED = 4; | |
|
iannucci
2016/06/08 02:54:24
later when DM supports cancellation directly, this
dnj (Google)
2016/06/09 18:00:57
nit:
In American English, the verb cancel is usual
iannucci
2016/06/15 00:46:01
Who said protos were American? THEY LIVE IN CYBERS
dnj (Google)
2016/06/16 16:57:22
I'ma tell Obama.
| |
| 69 | |
| 70 // The job was prevented from running by the distributor (quota, permissions , | |
| 71 // etc.) | |
| 72 // | |
| 73 // Executions: the distributor refused to run this job. | |
| 74 // | |
| 75 // Attempts: the last Execution had a REJECTED Status. | |
|
dnj (Google)
2016/06/09 18:00:57
Is this not retryable? If we're out of quota, we m
iannucci
2016/06/15 00:46:02
I think this should definitely be retried at a hig
| |
| 76 REJECTED = 5; | |
| 77 | |
| 78 // The job is unrecognized. | |
| 79 // | |
| 80 // Executions: the distributor doesn't know about this job, or has forgotten | |
| 81 // about it. | |
| 82 // | |
| 83 // Attempts: the last Execution had a REJECTED Status. | |
|
dnj (Google)
2016/06/09 18:00:57
MISSING Status?
iannucci
2016/06/15 00:46:01
oops
| |
| 84 MISSING = 6; | |
| 85 } | |
| 86 | |
| 87 Status status = 1; | |
| 88 string reason = 2; | |
| 89 } | |
| 90 | |
| 15 message Quest { | 91 message Quest { |
| 16 message ID { | 92 message ID { |
| 17 string id = 1; | 93 string id = 1; |
| 18 } | 94 } |
| 19 ID id = 1; | 95 ID id = 1; |
| 20 | 96 |
| 21 // DNE is set to true if this Quest does not exist. None of the following | 97 // DNE is set to true if this Quest does not exist. None of the following |
| 22 // fields are valid if this is set to true. | 98 // fields are valid if this is set to true. |
| 23 bool DNE = 2; | 99 bool DNE = 2; |
| 24 | 100 |
| 25 message Desc { | 101 message Desc { |
| 102 // TODO(iannucci): have a 'simple_idempotent' quest mode which: | |
| 103 // * isn't allowed/expected to call any API methods (ActivateExecution, | |
| 104 // EnsureGraphData, or WalkGraph) | |
| 105 // * only provides data back through the distributor-specific 'state' | |
| 106 // field. | |
| 107 // | |
| 108 // Examples of use for this would be: | |
| 109 // * simple test binaries that run/output to an ISOLATED_OUTDIR | |
| 110 // * testing / ad-hoc bash scripts | |
| 111 | |
| 26 string distributor_config_name = 1; | 112 string distributor_config_name = 1; |
| 27 string json_payload = 2; | 113 string json_payload = 2; |
| 114 | |
| 115 message Meta { | |
| 116 // This names the user/service account for all Attempts on this quest. You | |
| 117 // must have permission to use this account when creating the Quest and/or | |
| 118 // Attempts. | |
| 119 string as_account = 1; | |
| 120 | |
| 121 message Retry { | |
| 122 // The number of times in a row to retry Executions which have an | |
| 123 // ABNORMAL_FINISHED status of FAILED. | |
| 124 uint32 failed = 1; | |
| 125 | |
| 126 // The number of times in a row to retry Executions which have an | |
| 127 // ABNORMAL_FINISHED status of EXPIRED. | |
| 128 uint32 expired = 2; | |
| 129 | |
| 130 // The number of times in a row to retry Executions which have an | |
| 131 // ABNORMAL_FINISHED status of TIMED_OUT. | |
| 132 uint32 timed_out = 3; | |
| 133 | |
| 134 // The number of times in a row to retry Executions which have an | |
| 135 // ABNORMAL_FINISHED status of CRASHED. | |
| 136 uint32 crashed = 4; | |
| 137 } | |
| 138 | |
| 139 // This affects how DM will retry the job payload in various exceptional | |
| 140 // circumstances. | |
| 141 Retry retry = 2; | |
| 142 } | |
| 143 | |
| 144 // This is metadata which doesn't affect the functionality of the payload, | |
| 145 // but does affect how DM and/or the distributor run/schedule that payload. | |
| 146 Meta meta = 3; | |
| 28 } | 147 } |
| 29 | 148 |
| 30 message TemplateSpec { | 149 message TemplateSpec { |
| 31 string project = 1; | 150 string project = 1; |
| 32 string ref = 2; | 151 string ref = 2; |
| 33 string version = 3; | 152 string version = 3; |
| 34 string name = 4; | 153 string name = 4; |
| 35 } | 154 } |
| 36 | 155 |
| 37 message Data { | 156 message Data { |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 54 string quest = 1; | 173 string quest = 1; |
| 55 uint32 id = 2; | 174 uint32 id = 2; |
| 56 } | 175 } |
| 57 ID id = 1; | 176 ID id = 1; |
| 58 | 177 |
| 59 // DNE is set to true if this Attempt does not exist. None of the following | 178 // DNE is set to true if this Attempt does not exist. None of the following |
| 60 // fields are valid if this is set to true. | 179 // fields are valid if this is set to true. |
| 61 bool DNE = 2; | 180 bool DNE = 2; |
| 62 | 181 |
| 63 enum State { | 182 enum State { |
| 64 NEEDS_EXECUTION = 0; | 183 // The Attempt is waiting to be Executed |
|
dnj (Google)
2016/06/09 18:00:57
nit: period at end.
iannucci
2016/06/15 00:46:02
Done.
| |
| 184 SCHEDULING = 0; | |
| 185 | |
| 186 // The Attempt is currently waiting for the current Execution to finish. | |
| 65 EXECUTING = 1; | 187 EXECUTING = 1; |
|
dnj (Google)
2016/06/09 18:00:57
IMO: s/the current/its current/
iannucci
2016/06/15 00:46:02
Done.
| |
| 66 ADDING_DEPS = 2; | 188 |
| 67 BLOCKED = 3; | 189 // The Attempt is waiting for dependent Attempts to be resolved. |
| 68 AWAITING_EXECUTION_STATE = 4; | 190 WAITING = 2; |
| 69 FINISHED = 5; | 191 |
| 192 // The Attempt is in its final state. | |
| 193 FINISHED = 3; | |
| 194 | |
| 195 // The Attempt is in an abnormal final state | |
|
dnj (Google)
2016/06/09 18:00:57
nit: period at end.
iannucci
2016/06/15 00:46:02
Done.
| |
| 196 ABNORMAL_FINISHED = 4; | |
| 70 } | 197 } |
| 71 | 198 |
| 72 message Data { | 199 message Data { |
| 73 google.protobuf.Timestamp created = 1; | 200 google.protobuf.Timestamp created = 1; |
| 74 google.protobuf.Timestamp modified = 2; | 201 google.protobuf.Timestamp modified = 2; |
| 75 uint32 num_executions = 3; | 202 uint32 num_executions = 3; |
| 76 | 203 |
| 77 message NeedsExecution { | 204 // This attempt is ready to be Executed, but hasn't been sent to the |
| 78 google.protobuf.Timestamp pending = 1; | 205 // distributor yet. |
| 79 } | 206 message Scheduling {} |
| 80 | 207 |
| 208 // This attempt has a live Execution (with the specified ID). Check the | |
| 209 // Execution state for more information. | |
| 81 message Executing { | 210 message Executing { |
| 82 uint32 cur_execution_id = 1; | 211 uint32 cur_execution_id = 1; |
| 83 } | 212 } |
| 84 | 213 |
| 85 message AddingDeps { | 214 // This attempt's last Execution stopped by adding dependencies. |
| 86 uint32 num_adding = 1; | 215 message Waiting { |
| 87 uint32 num_waiting = 2; | |
| 88 } | |
| 89 | |
| 90 message Blocked { | |
| 91 uint32 num_waiting = 1; | 216 uint32 num_waiting = 1; |
| 92 } | 217 } |
| 93 | 218 |
| 219 // This attempt is complete. | |
| 94 message Finished { | 220 message Finished { |
| 95 google.protobuf.Timestamp expiration = 1; | 221 google.protobuf.Timestamp expiration = 1; |
| 96 uint32 json_result_size = 2; | 222 uint32 json_result_size = 2; |
| 97 string json_result = 3; | 223 string json_result = 3; |
| 224 | |
| 225 // This is the distributor-specific state of the final Execution. | |
| 226 string persistent_state_result = 4; | |
|
dnj (Google)
2016/06/09 18:00:57
Is "bytes" more appropriate? "string" implies UTF8
iannucci
2016/06/15 00:46:02
but string is the only map-key/immutable thing in
dnj (Google)
2016/06/16 16:57:22
Yeah I hear 'ya. But I think you did the right thi
| |
| 98 } | 227 } |
| 99 | 228 |
| 100 oneof attempt_type { | 229 oneof attempt_type { |
| 101 NeedsExecution needs_execution = 4; | 230 Scheduling scheduling = 5; |
| 102 Executing executing = 5; | 231 Executing executing = 6; |
| 103 AddingDeps adding_deps = 6; | 232 Waiting waiting = 7; |
| 104 Blocked blocked = 7; | |
| 105 Finished finished = 8; | 233 Finished finished = 8; |
| 234 AbnormalFinish abnormal_finish = 9; | |
| 106 } | 235 } |
| 107 } | 236 } |
| 108 Data data = 3; | 237 Data data = 3; |
| 109 | 238 |
| 110 // key is the `id` field of the Execution.ID | 239 // key is the `id` field of the Execution.ID |
| 111 map<uint32, Execution> executions = 4; | 240 map<uint32, Execution> executions = 4; |
| 112 | 241 |
| 113 dm.AttemptList fwd_deps = 5; | 242 dm.AttemptList fwd_deps = 5; |
| 114 dm.AttemptList back_deps = 6; | 243 dm.AttemptList back_deps = 6; |
| 115 | 244 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 } | 292 } |
| 164 | 293 |
| 165 message ID { | 294 message ID { |
| 166 string quest = 1; | 295 string quest = 1; |
| 167 uint32 attempt = 2; | 296 uint32 attempt = 2; |
| 168 uint32 id = 3; | 297 uint32 id = 3; |
| 169 } | 298 } |
| 170 ID id = 1; | 299 ID id = 1; |
| 171 | 300 |
| 172 enum State { | 301 enum State { |
| 173 // The execution has been accepted by the distributor, but is not running ye t | 302 // The execution has been accepted by the distributor, but is not running |
| 174 SCHEDULED = 0; | 303 // yet. |
| 304 SCHEDULING = 0; | |
| 175 | 305 |
| 176 // The execution is running | 306 // The execution is running (has activated with DM). |
| 177 RUNNING = 1; | 307 RUNNING = 1; |
| 178 | 308 |
| 179 // The execution was unable to be accepted by the distributor | 309 // The execution has been told to stop by DM, but we haven't heard from |
| 180 REJECTED = 2; | 310 // the distributor yet. |
| 311 STOPPING = 2; | |
| 181 | 312 |
| 182 // The execution was accepted by the distributor, but couldn't run in time. | 313 // The execution is in its final state. |
| 183 TIMED_OUT = 3; | 314 FINISHED = 3; |
| 184 | 315 |
| 185 // The execution ran and completed | 316 // The execution is in an abnormal final state |
| 186 FINISHED = 4; | 317 ABNORMAL_FINISHED = 4; |
| 187 | |
| 188 // The execution ran, but the distributor claims it did not complete | |
| 189 FAILED = 5; | |
| 190 | |
| 191 // The distributor claims to not know anything about this execution | |
| 192 MISSING = 6; | |
| 193 | |
| 194 // Some entity (DM, Human, Distributor) requested that this execution not ru n. | |
| 195 CANCELLED = 7; | |
| 196 } | 318 } |
| 197 | 319 |
| 198 message Data { | 320 message Data { |
| 199 State state = 1; | 321 google.protobuf.Timestamp created = 1; |
| 200 string state_reason = 2; | 322 google.protobuf.Timestamp modified = 2; |
| 201 | 323 |
| 202 google.protobuf.Timestamp created = 3; | 324 message DistributorInfo { |
| 325 string config_name = 1; | |
| 326 string config_version = 2; | |
| 327 string token = 3; | |
| 328 string url = 4; | |
| 329 } | |
| 330 DistributorInfo distributor_info = 3; | |
| 203 | 331 |
| 204 string distributor_token = 4; | 332 message Scheduling {} |
| 205 string distributor_info_url = 5; | 333 |
| 334 message Running {} | |
| 335 | |
| 336 message Stopping {} | |
| 337 | |
| 338 message Finished { | |
| 339 string persistent_state = 1; | |
| 340 } | |
| 341 | |
| 342 oneof execution_type { | |
| 343 Scheduling scheduling = 4; | |
| 344 Running running = 5; | |
| 345 Stopping stopping = 6; | |
| 346 Finished finished = 7; | |
| 347 AbnormalFinish abnormal_finish = 8; | |
| 348 } | |
| 206 } | 349 } |
| 207 Data data = 2; | 350 Data data = 2; |
| 208 | 351 |
| 209 // Partial is true iff the request asked for Executions, but wasn't able to | 352 // Partial is true iff the request asked for Executions, but wasn't able to |
| 210 // completely fill them. | 353 // completely fill them. |
| 211 bool partial = 16; | 354 bool partial = 16; |
| 212 } | 355 } |
| 213 | 356 |
| 214 // GraphData defines all of the DM graph data that may be returned from DM. | 357 // GraphData defines all of the DM graph data that may be returned from DM. |
| 215 // | 358 // |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 238 // * max response size limit | 381 // * max response size limit |
| 239 // * max time limit (e.g. WalkGraphReq.MaxTime) being hit | 382 // * max time limit (e.g. WalkGraphReq.MaxTime) being hit |
| 240 // * non-terminal errors encountered during the request (HadErrors will also | 383 // * non-terminal errors encountered during the request (HadErrors will also |
| 241 // be true in this case). | 384 // be true in this case). |
| 242 // | 385 // |
| 243 // Note that this is different than the Partial booleans: This refers | 386 // Note that this is different than the Partial booleans: This refers |
| 244 // specifically to situations when Queries do not run to completion. | 387 // specifically to situations when Queries do not run to completion. |
| 245 bool had_more = 3; | 388 bool had_more = 3; |
| 246 } | 389 } |
| 247 | 390 |
| OLD | NEW |