1
1
package api
2
2
3
3
import (
4
+ "bytes"
4
5
"encoding/json"
5
6
"fmt"
6
7
"net/http"
@@ -292,7 +293,7 @@ type statics struct {
292
293
293
294
type latest struct {
294
295
Completed completedCheckpointsStatics `json:"completed"`
295
- Savepoint completedCheckpointsStatics `json:"savepoint"`
296
+ Savepoint savepointsStatics `json:"savepoint"`
296
297
Failed failedCheckpointsStatics `json:"failed"`
297
298
Restored restoredCheckpointsStatics `json:"restored"`
298
299
}
@@ -313,6 +314,21 @@ type completedCheckpointsStatics struct {
313
314
Discarded bool `json:"discarded"`
314
315
}
315
316
317
+ type savepointsStatics struct {
318
+ ID int `json:"id"`
319
+ Status string `json:"status"`
320
+ IsSavepoint bool `json:"is_savepoint"`
321
+ TriggerTimestamp int64 `json:"trigger_timestamp"`
322
+ LatestAckTimestamp int64 `json:"latest_ack_timestamp"`
323
+ StateSize int64 `json:"state_size"`
324
+ End2EndDuration int64 `json:"end_to_end_duration"`
325
+ AlignmentBuffered int64 `json:"alignment_buffered"`
326
+ NumSubtasks int64 `json:"num_subtasks"`
327
+ NumAcknowledgedSubtasks int64 `json:"num_acknowledged_subtasks"`
328
+ tasks taskCheckpointsStatics `json:"tasks"`
329
+ ExternalPath string `json:"external_path"`
330
+ Discarded bool `json:"discarded"`
331
+ }
316
332
type taskCheckpointsStatics struct {
317
333
ID string `json:"id"`
318
334
Status string `json:"status"`
@@ -369,3 +385,79 @@ func (c *Client) Checkpoints(jobID string) (checkpointsResp, error) {
369
385
err = json .Unmarshal (b , & r )
370
386
return r , err
371
387
}
388
+
389
+ type savePointsResp struct {
390
+ RequestID string `json:"request-id"`
391
+ }
392
+
393
+ // SavePoints triggers a savepoint, and optionally cancels the
394
+ // job afterwards. This async operation would return a
395
+ // 'triggerid' for further query identifier.
396
+ func (c * Client ) SavePoints (jobID string , saveDir string , cancleJob bool ) (savePointsResp , error ) {
397
+ var r savePointsResp
398
+
399
+ type savePointsReq struct {
400
+ SaveDir string `json:"target-directory"`
401
+ CancleJob bool `json:"cancel-job"`
402
+ }
403
+
404
+ d := savePointsReq {
405
+ SaveDir : saveDir ,
406
+ CancleJob : cancleJob ,
407
+ }
408
+ data := new (bytes.Buffer )
409
+ json .NewEncoder (data ).Encode (d )
410
+ uri := fmt .Sprintf ("/jobs/%s/savepoints" , jobID )
411
+ req , err := http .NewRequest (
412
+ "POST" ,
413
+ c .url (uri ),
414
+ data ,
415
+ )
416
+ if err != nil {
417
+ return r , err
418
+ }
419
+ b , err := c .client .Do (req )
420
+ if err != nil {
421
+ return r , err
422
+ }
423
+ err = json .Unmarshal (b , & r )
424
+ return r , err
425
+ }
426
+
427
+ type stopJobResp struct {
428
+ RequestID string `json:"request-id"`
429
+ }
430
+
431
+ // StopJob stops a job with a savepoint. Optionally, it can also
432
+ // emit a MAX_WATERMARK before taking the savepoint to flush out
433
+ // any state waiting for timers to fire. This async operation
434
+ // would return a 'triggerid' for further query identifier.
435
+ func (c * Client ) StopJobWithSavepoint (jobID string , saveDir string , drain bool ) (stopJobResp , error ) {
436
+ var r stopJobResp
437
+ type stopJobReq struct {
438
+ SaveDir string `json:"targetDirectory"`
439
+ Drain bool `json:"drain"`
440
+ }
441
+
442
+ d := stopJobReq {
443
+ SaveDir : saveDir ,
444
+ Drain : drain ,
445
+ }
446
+ data := new (bytes.Buffer )
447
+ json .NewEncoder (data ).Encode (d )
448
+ uri := fmt .Sprintf ("/jobs/%s/stop" , jobID )
449
+ req , err := http .NewRequest (
450
+ "POST" ,
451
+ c .url (uri ),
452
+ data ,
453
+ )
454
+ if err != nil {
455
+ return r , err
456
+ }
457
+ b , err := c .client .Do (req )
458
+ if err != nil {
459
+ return r , err
460
+ }
461
+ err = json .Unmarshal (b , & r )
462
+ return r , err
463
+ }
0 commit comments