Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add flux-pstree command #4026

Merged
merged 7 commits into from Jan 7, 2022
Merged

add flux-pstree command #4026

merged 7 commits into from Jan 7, 2022

Conversation

grondo
Copy link
Contributor

@grondo grondo commented Jan 5, 2022

This PR adds a flux-pstree(1) command which offers pstree(1) like output for Flux job hierarchies.

This is still a WIP because there isn't yet any documentation or tests. It seemed a good idea to get some early feedback before taking a pass at either, in case the interface needs to be changed. It is built on top of the two pending PRs #4024 and #4022.

Currently this command only targets jobs for the calling user, as it didn't seem too useful to attempt to list other user's jobs at this time. Perhaps in the future a -A, --user=all option could be added if necessary.

The commit that adds the command has a good overview, so I won't repeat that here. Mainly I'll just show some examples:

$ flux jobs
       JOBID USER     NAME       ST NTASKS NNODES  RUNTIME NODELIST
  ƒ7vazapGzs grondo   flux        R      2      2   1.807m asp,asp
$ flux pstree --help
usage: flux-pstree [-h] [-a] [-c N] [-f STATE|RESULT] [-x] [-l] [-L N] [-p]
                   [-n] [-X] [-o FORMAT] [--parent-label FORMAT]
                   [--detail-format FORMAT] [-d NAME] [-C] [--ascii]
                   [--no-skip-root]
                   [JOBID [JOBID ...]]

positional arguments:
  JOBID                       Limit output to specific jobids

optional arguments:
  -h, --help                  show this help message and exit
  -a, --all                   Include all jobs for current user in all states
  -c, --count=N               Limit to N jobs per instance (default 1000)
  -f, --filter=STATE|RESULT   list jobs with specific job state or result
  -x, --extended              print extended details before tree output
  -l, --long                  do not truncate long lines to terminal width
  -L, --level=N               only descend N levels
  -p, --parent-ids            include jobids in parent labels
  -n, --no-header             Suppress header with -x, --extended
  -X, --no-combine            disable combination of identical children
  -o, --label=FORMAT          change label format (default='{name}')
      --parent-label=FORMAT   change label format for parent only
      --detail-format=FORMAT  specify output format for extended details
                              (implies -x, --extended)
  -d, --details=NAME          Select a named extended details format
                              (default,resources,progress,stats)
  -C, --compact               Use compact tree connectors
      --ascii                 Use ASCII character tree connectors
      --no-skip-root          Include root in output

$ flux pstree
flux
├── flux
│   └── 2*[sleep]
├── flux
│   └── sleep
└── flux
    └── 4*[sleep]
$ flux pstree --no-combine
flux
├── flux
│   ├── sleep
│   └── sleep
├── flux
│   └── sleep
└── flux
    ├── sleep
    ├── sleep
    ├── sleep
    └── sleep
$ flux pstree -x
       JOBID USER     ST NTASKS NNODES  RUNTIME
  ƒ7vazapGzs grondo    R      2      2   2.313m flux
     ƒejEiwz grondo    R      1      1   2.275m ├── flux
    ƒ2QsbLdY grondo    R      1      1   0.790s │   ├── sleep
    ƒ2QsbLdX grondo    R      1      1   0.830s │   └── sleep
     ƒejEiwy grondo    R      1      1   2.275m ├── flux
    ƒ2UNheEj grondo    R      1      1   1.017s │   └── sleep
     ƒehkjfd grondo    R      1      1   2.275m └── flux
    ƒ2VJ5CPF grondo    R      1      1   0.454s     ├── sleep
    ƒ2VJ5CPE grondo    R      1      1   0.736s     ├── sleep
    ƒ2VJ5CPD grondo    R      1      1   0.784s     ├── sleep
    ƒ2VJ5CPC grondo    R      1      1   0.795s     └── sleep
$ flux pstree --details=progress
       JOBID NTASKS  NJOBS PROG CPU% GPU%    RUNTIME
  ƒ7vazapGzs      2      3   0%  88%         0:02:34 flux
     ƒejEiwz      1   1000  26% 100%         0:02:32 ├── flux
    ƒ2R11H3F      1                          0:00:01 │   ├── sleep
    ƒ2R11H3E      1                          0:00:01 │   └── sleep
     ƒejEiwy      1   1000  13% 100%         0:02:32 ├── flux
    ƒ2VGbD6o      1                          0:00:01 │   └── sleep
     ƒehkjfd      1   1000  53% 100%         0:02:32 └── flux
    ƒ2WuUR8w      1                          0:00:01     ├── sleep
    ƒ2WuUR8v      1                          0:00:01     ├── sleep
    ƒ2WuUR8u      1                          0:00:01     ├── sleep
    ƒ2WuUR8t      1                          0:00:01     └── sleep
$ flux pstree --details=stats
       JOBID           STATS              RUNTIME
  ƒ7vazapGzs     PD:0 R:3 CD:0 F:0        0:02:53 flux
     ƒejEiwz   PD:702 R:2 CD:296 F:0      0:02:51 ├── flux
    ƒ2S2JnK1                              0:00:01 │   ├── sleep
    ƒ2R8RDSz                              0:00:01 │   └── sleep
     ƒejEiwy   PD:850 R:1 CD:149 F:0      0:02:51 ├── flux
    ƒ2WLrgwK                              0:00:01 │   └── sleep
     ƒehkjfd   PD:397 R:4 CD:599 F:0      0:02:51 └── flux
    ƒ2YA7owm                              0:00:01     ├── sleep
    ƒ2Y8dpfT                              0:00:01     ├── sleep
    ƒ2Y8dpfS                              0:00:01     ├── sleep
    ƒ2Y8dpfR                              0:00:01     └── sleep
$ flux pstree --details=resources
       JOBID NODES  USED CORES  USED  GPUS  USED
  ƒ7vazapGzs     2     2     8     7     0     0 flux
     ƒejEiwz     1     1     2     2     0     0 ├── flux
    ƒ2S3nmbQ                                     │   ├── sleep
    ƒ2S3nmbP                                     │   └── sleep
     ƒejEiwy     1     1     1     1     0     0 ├── flux
    ƒ2XAJHxK                                     │   └── sleep
     ƒehkjfd     1     1     4     4     0     0 └── flux
    ƒ2YTufKu                                         ├── sleep
    ƒ2YPThUv                                         ├── sleep
    ƒ2YPThUu                                         ├── sleep
    ƒ2YPThUt                                         └── sleep
$ flux pstree -a
flux
├── flux
│   ├── 676*[sleep:PD]
│   ├── 2*[sleep:R]
│   └── 322*[sleep:CD]
├── flux
│   ├── 836*[sleep:PD]
│   ├── sleep:R
│   └── 163*[sleep:CD]
└── flux
    ├── 341*[sleep:PD]
    ├── 4*[sleep:R]
    └── 655*[sleep:CD]
$ flux pstree -a --no-skip-root
.
├── flux
│   ├── flux
│   │   ├── 664*[sleep:PD]
│   │   ├── 2*[sleep:R]
│   │   └── 334*[sleep:CD]
│   ├── flux
│   │   ├── 829*[sleep:PD]
│   │   ├── sleep:R
│   │   └── 170*[sleep:CD]
│   └── flux
│       ├── 314*[sleep:PD]
│       ├── 3*[sleep:R]
│       └── 683*[sleep:CD]
├── 5*[flux:CA]
├── 6*[flux:F]
└── 4*[flux:CD]

You can watch a complex hierarchy form using watch -n1 flux pstree (here I've used the --ascii option since Unicode box connectors don't show up with asciicast2gif:

output

@lgtm-com
Copy link

lgtm-com bot commented Jan 5, 2022

This pull request introduces 1 alert when merging a701c17 into 412831f - view on LGTM.com

new alerts:

  • 1 for Module is imported with 'import' and 'import from'

@grondo grondo added this to the flux-core v0.33.0 milestone Jan 5, 2022
Copy link
Member

@chu11 chu11 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this looks awesome, just some initial few comments

):
if pstack is None:
pstack = []
if level and level < len(pstack):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should this be level > len(pstack)? just doesn't seem right to be <

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, we want to stop recursion when the actual depth (represented by the length of pstack) is greater than the requested level. Perhaps the variable names are confusing here, I'll fix that (level is the requested maximum depth to recurse, not the current level of the tree recursion)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ahhh, i think that was it, I was thinking current level not max level.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I renamed level to max_level in _render() in the most recent fixup command (and reversed the sense of the test, you were right it was pretty confusing)

label = f"{self.count}*[{self.label}]"
else:
label = self.label

Copy link
Member

@chu11 chu11 Jan 6, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

took me awhile to grok this recursion. I'm sure it was hard to write :-)

I think the pstack[:-1] sort of threw me for a loop b/c we're not using the last piece of the pstack, so it sort of doesn't make sense until you walk yourself through it a bit. Like one level of recursion down, the append to the pstack isn't used at all.

I'm sure some comments would help.

One random idea (possibly not good, but just brainstorming), since the last append of the pstack isn't used when you recurse only one level down, instead of appending to pstack, how about just pass a variable down. Like hypothetically:

def _render(
        self,
        pstack=None,
        next_in_pstack=None
        connector="",
        style="box",
        level=None,
        truncate=None,
    ):

So like if next_in_pstack != None then you append to pstack, then set next_in_pstack to the next recursive step?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Does it help if you think of the stack as the stack of characters required in before the tree connector if you need to recurse another level down? Your suggestion to pass the next character required as a separate argument seems good, but I don't see much difference between the current approach and that (except adding more parameters to the function). Perhaps some comments will help.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, some comments would help. The way I eventually thought about it is that you are passing a connector and an additional prefix into the next level of recursion. It just so happens that the additional prefix is never used in the next recursive level, but is only used 2 recursions later.

Another brainstorming idea (again, possibly not good), you could do something like:

if pstack[-1] == connectors.TEE
   pstack[-1] = connectors.PIPE
pstack.append(connects.TEE)

kinda thing in the recursive step so that the whole pstack is just output everytime you recurse. I'm not sure if it's a net win logic wise or not. Perhaps simplifying the output code but complicating the recursive step.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't know, it feels like we're getting into a matter of opinion and style here and I'd prefer to keep the code the way I wrote it since I understand that approach a little better. Let me push my fixup commit with additional comments and see what you think.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

acknowledged, its a style thing at this point. The comments you added definitely help.


self.duplicates = {}
self.children = []
self.count = 1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

would suggest combine_count or duplicate_count or something like that for this variable, as I thought we might be counting levels or something. Below

      if self.count > 1:
            label = f"{self.count}*[{self.label}]"

was initially confusing, I had no idea what was going on until I figured out "ohh this is the duplicate count label".

perhaps increment below would be renamed as well.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That seems like a valid suggestion.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fixed in most recent push

for child in self.children:
if child == self.children[-1]:
pstack.append(connectors.BLANK)
connector = connectors.ELBOW
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure if connector is the best variable since you have the connectors variable. Although unsure of a better variable name.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok, I'll try to think of something better.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Changed connectors to cstyle in latest fixup commit.

Comment on lines 314 to 364
parser.add_argument(
"--no-skip-root",
action="store_false",
dest="skip_root",
help="Include root in output",
)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

very first time I ran this I got:

flux
flux

and I thought something was broken. But running flux pstree --no-skip-root, I got what I thought I would see

.
├── flux
└── flux

dunno if default should be with root?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I struggled with this as well, and had it the way you suggest for awhile. The problem I ran into is that including root doesn't add much useful data, except when you catch a couple instances before they have run any jobs as you have here, and makes it more likely the tree will overflow the terminal.

However, maybe my contrived examples were deeper than in the common case, so possibly it won't be a problem in reality.

Another idea would be to include the "root" in the normal case, but exclude in when printing "detailed" information, in which case the output would be less likely to be confusing and we'd be more likely to exceed the current terminal width.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Another idea would be to include the "root" in the normal case, but exclude in when printing "detailed" information, in which case the output would be less likely to be confusing and we'd be more likely to exceed the current terminal width.

I like this idea.

In time perhaps a jobid input would go along with flux pstree? In that case I could see skip-root being normal (sort of like when you do pstree PID). But for the general listing of all jobs of a user, listing root seems right? Sort of like the default output of pstree?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

flux pstree can already take a list of JOBIDs.

The real problem with "root" is that we can't easily create a JobInfo object for it, and for test instances or root instances run under a foreign RM there isn't even a jobid, so the comparison to pstree falls flat there. However, since the root is handled specially anyway and the label is always forced to ., maybe all that is fine.

I can also try to make a "fake" JobInfo object for the enclosing instance and see how that goes.

@lgtm-com
Copy link

lgtm-com bot commented Jan 6, 2022

This pull request introduces 1 alert when merging b6efea6 into 0bc2092 - view on LGTM.com

new alerts:

  • 1 for Module is imported with 'import' and 'import from'

truncate=None,
):

# `pstack` is a stack of prfix characters used during
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo prfx

#
# Note: the connector at the top of the stack is always
# the connector required for the _next_ level down in the
# tree. This is because we know what the prefx connector
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

typo prefx

label = f"{self.count}*[{self.label}]"
else:
label = self.label

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

acknowledged, its a style thing at this point. The comments you added definitely help.

@grondo
Copy link
Contributor Author

grondo commented Jan 6, 2022

@chu11: The most recent fixup commit here does the following

  • Replace --no-skip-root with --skip-root=yes|no option. The default is --skip-root=no unless -d, --details=NAME or -x, --extended are used
  • If we're not skipping the root of the tree, then the program attempts to create a sensible JobInfo object for the enclosing instance, either by determining the current jobid and using job-list in the parent, or by mocking up some information. Either way "instance info" fields will be available for the "root", so this is probably a net improvement, even though the approach is a little kludgy.

Let me know what you think.

@grondo
Copy link
Contributor Author

grondo commented Jan 6, 2022

After testing on fluke I found that flux pstree was really slow when it has to connect to jobs with the ssh connector (instead of forcing all URIs to local:// like I do on my home test machine)

To remedy, I added support for using a ThreadPoolExecutor to flux-pstree as was done for flux jobs. This greatly speeds up operation of the tool, since jobs are gathered in separate threads simultaneously at each level. However, the current solution is just a stopgap for now, as it creates a ThreadPoolExecutor at each level of the recursive search, which means we've got ThreadPools being created from threads. There is probably a nice way to create a global ThreadPool for the pstree process and use that, but I don' t know it. There is a comment in the code that this should be fixed someday.

@chu11
Copy link
Member

chu11 commented Jan 7, 2022

Let me know what you think.

It's lookin pretty good!

One high level comment. Do you imagine the Tree class you added to Python util to be needed in other places? It seems sort of specific to pstree, especially with all the rendering code in there.

Second high level comment (now that I read the above), Tree seems sort of generically named. Potential collision in the future? Granted this is Python and not C, but still.

@grondo
Copy link
Contributor Author

grondo commented Jan 7, 2022

One high level comment. Do you imagine the Tree class you added to Python util to be needed in other places? It seems sort of specific to pstree, especially with all the rendering code in there.

My first thought was to redo flux overlay in Python and reuse the Tree class there for flux overlay status, but it ended up being easier to modify the command in C than rewrite in Python. However, there are many things in Flux that can be displayed with a hierarchical representation besides the TBON and job hierarchies. For instance, job dependencies, compute resources, jobspec etc. It could perhaps also be useful in flux-accounting when displaying a fairshare hierarchy (actually that last one is a stretch, I don't really know if it would be useful there)

Additionally, having the class in the bindings allows easier unit testing.

Second high level comment (now that I read the above), Tree seems sort of generically named. Potential collision in the future? Granted this is Python and not C, but still.

That's a good question. Since Python namespaces everything, the class is actually flux.util.Tree not just Tree, so I didn't feel too bad about the naming. However, I'm not really a Python expert. Honestly, I was following the naming example from the Python rich project (which I wish was ubiquitous enough to use here)

Problem: There is currently no way to display tree-like information
in the Python bindings.

Add flux.util.Tree, a simple helper class for the display of tree-like
data, with optional support for combining identical leaf nodes, as in
pstree(1).
Problem: Flux doesn't have a tool to effectively display and list
information for job hierarchies.

Add a `flux pstree` command, which by default displays a tree of
running jobs by job name, similar to the pstree(1) system command.

Like pstree(1), identical leaves of the tree are combined, which
should result in condensed output when many jobs share the same name.

The flux-pstree(1) command supports custom node labels, which accept
any `JobInfo` format fields (i.e. anything supported by flux-jobs(1)),
and "parent" nodes (i.e. Flux instances) may be labeled separately
from simple jobs.

The command only lists actively running jobs by default, but similar
to flux-jobs(1) supports an `-a, --all` option to query jobs in all
states for the current user. In the case `-a` is used, then the label
will automatically include the job state, unless separately overridden
on the commandline.

flux-pstree(1) additionally supports listing of extended information
before the tree display with the `-x, --extended` and `-d,
--details=NAME` options, e.g.:

 $ flux pstree -x
       JOBID USER     ST NTASKS NNODES  RUNTIME
    ƒ3KrufpK grondo    R      1      1   13.61s flux
     ƒUXhfWP grondo    R      1      1   11.77s └── flux
     ƒUAwqZZ grondo    R      1      1   10.03s     └── flux
    ƒ2DrcgAs grondo    R      1      1   6.400s         └── sleep

Several builtin detail formats are available via the `-d, --details`
option, e.g. progress, resources, and stats.

 $ flux pstree --details=stats
       JOBID           STATS              RUNTIME
    ƒ3KrufpK     PD:2 R:1 CD:0 F:0        0:01:24 flux
     ƒUXhfWP     PD:0 R:1 CD:0 F:0        0:01:22 └── flux
     ƒUAwqZZ   PD:934 R:1 CD:65 F:0       0:01:20     └── flux
    ƒ2LrqHPN                              0:00:01         └── sleep

A custom details format can be supplied with the `--detail-format=FORMAT`
option.

Trees are truncated if they exceed the current value of the COLUMNS
environment variable, or the terminal size if COLUMNS is not set. To
disable this behavior, a `-l, --long` option is provided.

By default, the enclosing instance, or root of the tree, is skipped
when -x, --extended and/or -d, --details=NAME options are used, but
the root is displayed when flux-pstree(1) is run without these options.
This behavior can be changed with `--skip-root=[yes|no]`.

See `flux pstree --help` for other available options.
Problem: The limit of 4 characters for !P conversion spec causes
issues in boundary conditions such as 0.05% and 99.9%.

Update the conversion to allow one digit more precision. This causes
the field to now take 5 characters instead of 4. As a side benefit,
CORE% can now be used as the default heading instead of CPU%, which
could be seen as slightly misleading.

Update documentation.

Update tests.
@grondo grondo force-pushed the tree branch 3 times, most recently from acc31be to 8029f61 Compare January 7, 2022 18:05
@grondo grondo changed the title WIP: add flux-pstree add flux-pstree command Jan 7, 2022
Problem: The flux.util.Tree class doesn't have any unit tests.

Add python/t0026-tree.py to test basic functionality of the Tree class.
@grondo
Copy link
Contributor Author

grondo commented Jan 7, 2022

I've added some tests and a flux-pstree(1) manpage, and removed WIP label.

Copy link
Member

@chu11 chu11 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

overall LGTM, just a few comments below

@@ -0,0 +1,231 @@
==============
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this manpage worthy of being added to flux help output? I would think so?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wasn't sure at this point if it rose to that level?

Copy link
Member

@chu11 chu11 Jan 7, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Its certainly a "user tool", so not in the same class as lets say flux keygen. But it's clearly a more advanced user tool. I dunno, I would have leaned yes, but it's definitely borderline.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I went ahead and added it. Thanks for the suggestion!

SEE ALSO
========

:man1:`flux-jobs`
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should add pstree to flux jobs?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good idea. Will do.

Comment on lines 140 to 169
test_expect_success 'flux-pstree truncates at COLUMNS' '
name="truncated" &&
COLUMNS=16 flux pstree -a > ${name}.output &&
test_debug "cat ${name}.output" &&
cat <<-EOF >${name}.expected &&
.
├── flux
│ ├── flux
│ │ └── sle+
│ └── flux
│ └── sle+
└── flux:CD
EOF
test_cmp ${name}.expected ${name}.output
'
test_expect_success 'flux-pstree truncates at COLUMNS' '
name="truncated" &&
COLUMNS=16 flux pstree -a > ${name}.output &&
test_debug "cat ${name}.output" &&
cat <<-EOF >${name}.expected &&
.
├── flux
│ ├── flux
│ │ └── sle+
│ └── flux
│ └── sle+
└── flux:CD
EOF
test_cmp ${name}.expected ${name}.output
'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

duplicated test? (or if its different and i'm missing the difference, the title of the test is the same atleast)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch. Accidental cut-and-paste. Will fix.

Problem: The flux-pstree command is not tested in the testsuite.

Add t2803-flux-pstree.t with a suite of tests for flux-pstree(1).
Problem: No documentation for flux-pstree exists.

Add a first-cut flux-pstree(1) man page.
Problem: The flux-pstree(1) command offers a different way to view
Flux jobs recursively, but is not referenced in flux-jobs(1).

Add a reference to flux-pstree(1) in the SEE ALSO section of flux-jobs(1).
@grondo
Copy link
Contributor Author

grondo commented Jan 7, 2022

Ok, I've addressed @chu11's comments and will now set MWP.

@codecov
Copy link

codecov bot commented Jan 7, 2022

Codecov Report

Merging #4026 (c077ff1) into master (a2dcbdd) will increase coverage by 0.05%.
The diff coverage is 96.62%.

@@            Coverage Diff             @@
##           master    #4026      +/-   ##
==========================================
+ Coverage   83.35%   83.40%   +0.05%     
==========================================
  Files         373      374       +1     
  Lines       61122    61356     +234     
==========================================
+ Hits        50948    51177     +229     
- Misses      10174    10179       +5     
Impacted Files Coverage Δ
src/bindings/python/flux/job/info.py 89.49% <66.66%> (ø)
src/cmd/flux-pstree.py 95.73% <95.73%> (ø)
src/bindings/python/flux/util.py 94.02% <100.00%> (+2.61%) ⬆️
src/cmd/top/summary_pane.c 79.14% <0.00%> (-4.28%) ⬇️
src/cmd/top/top.c 76.71% <0.00%> (-3.43%) ⬇️
src/common/libsubprocess/server.c 75.57% <0.00%> (-1.03%) ⬇️
src/common/libpmi/simple_server.c 86.13% <0.00%> (-0.50%) ⬇️
src/broker/overlay.c 87.21% <0.00%> (-0.48%) ⬇️
src/modules/cron/cron.c 82.47% <0.00%> (-0.45%) ⬇️
src/broker/state_machine.c 82.51% <0.00%> (+0.23%) ⬆️
... and 10 more

@mergify mergify bot merged commit a386eef into flux-framework:master Jan 7, 2022
@grondo grondo deleted the tree branch January 30, 2022 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants