@@ -2,8 +2,10 @@ package main
2
2
3
3
import (
4
4
"fmt"
5
+ "time"
5
6
6
7
"github.com/ipfs/go-datastore"
8
+ "github.com/samber/lo"
7
9
"github.com/urfave/cli/v2"
8
10
"golang.org/x/xerrors"
9
11
@@ -29,6 +31,7 @@ var sealCmd = &cli.Command{
29
31
Subcommands : []* cli.Command {
30
32
sealStartCmd ,
31
33
sealMigrateLMSectorsCmd ,
34
+ sealEventsCmd ,
32
35
},
33
36
}
34
37
@@ -253,3 +256,108 @@ var sealMigrateLMSectorsCmd = &cli.Command{
253
256
return nil
254
257
},
255
258
}
259
+
260
+ var sealEventsCmd = & cli.Command {
261
+ Name : "events" ,
262
+ Usage : "List pipeline events" ,
263
+ Flags : []cli.Flag {
264
+ & cli.StringFlag {
265
+ Name : "actor" ,
266
+ Usage : "Filter events by actor address; lists all if not specified" ,
267
+ },
268
+ & cli.IntFlag {
269
+ Name : "sector" ,
270
+ Usage : "Filter events by sector number; requires --actor to be specified" ,
271
+ },
272
+ & cli.UintFlag {
273
+ Name : "last" ,
274
+ Usage : "Limit output to the last N events" ,
275
+ Value : 100 ,
276
+ },
277
+ },
278
+ Action : func (cctx * cli.Context ) error {
279
+
280
+ var actorID uint64
281
+ var sector abi.SectorNumber
282
+ if cctx .IsSet ("actor" ) {
283
+ act , err := address .NewFromString (cctx .String ("actor" ))
284
+ if err != nil {
285
+ return fmt .Errorf ("parsing --actor: %w" , err )
286
+ }
287
+ mid , err := address .IDFromAddress (act )
288
+ if err != nil {
289
+ return fmt .Errorf ("getting miner id: %w" , err )
290
+ }
291
+ actorID = mid
292
+ }
293
+ if cctx .IsSet ("sector" ) {
294
+ sector = abi .SectorNumber (cctx .Int ("sector" ))
295
+ if ! cctx .IsSet ("actor" ) {
296
+ return fmt .Errorf ("the --actor flag is required when using --sector" )
297
+ }
298
+ }
299
+
300
+ ctx := reqcontext .ReqContext (cctx )
301
+ dep , err := deps .GetDepsCLI (ctx , cctx )
302
+ if err != nil {
303
+ return err
304
+ }
305
+
306
+ var events []struct {
307
+ ActorID int `db:"sp_id"`
308
+ Sector int `db:"sector_number"`
309
+ ID int `db:"id"`
310
+ TaskID int `db:"task_id"`
311
+ Name string `db:"name"`
312
+ Posted time.Time `db:"posted"`
313
+ WorkStart time.Time `db:"work_start"`
314
+ WorkEnd time.Time `db:"work_end"`
315
+ Result bool `db:"result"`
316
+ Err string `db:"err"`
317
+ ByHost string `db:"completed_by_host_and_port"`
318
+ }
319
+
320
+ if ! cctx .IsSet ("actor" ) {
321
+ // list for all actors
322
+ err = dep .DB .Select (ctx , & events , `SELECT s.sp_id, s.sector_number, h.*
323
+ FROM harmony_task_history h
324
+ JOIN sectors_pipeline_events s ON h.id = s.task_history_id
325
+ ORDER BY h.work_end DESC LIMIT $1;` , cctx .Int ("last" ))
326
+ } else if cctx .IsSet ("sector" ) {
327
+ // list for specific actor and sector
328
+ err = dep .DB .Select (ctx , & events , `SELECT s.sp_id, s.sector_number, h.*
329
+ FROM harmony_task_history h
330
+ JOIN sectors_pipeline_events s ON h.id = s.task_history_id
331
+ WHERE s.sp_id = $1 AND s.sector_number = $2 ORDER BY h.work_end DESC LIMIT $3;` , actorID , sector , cctx .Int ("last" ))
332
+ } else {
333
+ fmt .Println (cctx .IsSet ("actor" ), cctx .IsSet ("sector" ))
334
+ // list for specific actor
335
+ err = dep .DB .Select (ctx , & events , `SELECT s.sp_id, s.sector_number, h.*
336
+ FROM harmony_task_history h
337
+ JOIN sectors_pipeline_events s ON h.id = s.task_history_id
338
+ WHERE s.sp_id = $1 ORDER BY h.work_end DESC LIMIT $2;` , actorID , cctx .Int ("last" ))
339
+ }
340
+
341
+ if err != nil {
342
+ return fmt .Errorf ("getting events: %w" , err )
343
+ }
344
+ fmt .Printf ("Total Events: %d\n " , len (events ))
345
+
346
+ fmt .Printf ("%-10s %-10s %-18s %-10s %-28s %-28s %-20s %-20s %-10s %-20s \n " , "ActorID" , "Sector" , "Task" , "HistoryID" , "Posted" , "Start" , "Took" , "Machine" , "Status" , "Error" )
347
+ for _ , e := range events {
348
+ fmt .Printf ("%-10d %-10d %-18s %-10d %-28s %-28s %-20s %-20s %-10s %-20s \n " ,
349
+ e .ActorID ,
350
+ e .Sector ,
351
+ e .Name ,
352
+ e .TaskID ,
353
+ e .Posted .Format (time .RFC3339 ),
354
+ e .WorkStart .Format (time .RFC3339 ),
355
+ e .WorkEnd .Sub (e .WorkStart ),
356
+ e .ByHost ,
357
+ lo .Ternary (e .Result , "Success" , "Failure" ),
358
+ e .Err ,
359
+ )
360
+ }
361
+ return nil
362
+ },
363
+ }
0 commit comments