Skip to content
This repository was archived by the owner on Jul 22, 2024. It is now read-only.
This repository was archived by the owner on Jul 22, 2024. It is now read-only.

elastic search returns total_hits as dict object not integer #991

Description

@thanh-lam

Describe the bug
A regression test on the CSM bigdata python command "findJobTimeRange.py" produced following message even though the allocation ID (1) in question did exist. That meant "total_hits" has the value 1.

[root@c650f99p06 python]# /opt/ibm/csm/bigdata/python/findJobTimeRange.py -a 1
# Found {'value': 1, 'relation': 'eq'} matches for specified the job.
# This implementation only supports queries where the hit count is equal to 1.

Adding a debug in the print statement in the script showed that total_hits has "value" as {'value': 1, 'relation': 'eq'} that also showed in message above.

[root@c685f4n07 python]# ./findJobTimeRange.py -j 114
# Found {'value': 1, 'relation': 'eq'} matches for specified the job.
# This implementation only supports queries where the hit count is equal to 1. Total hits=  {'value': 1, 'relation': 'eq'}

That led to the condition checking:

    if total_hits != 1:
        print("# This implementation only supports queries where the hit count is equal to 1.")
        return 3

Diagnosis: "total_hits" has "value" 1 but fell into the code path of "total_hits != 1". So total_hits was not in the format of an integer 1. The output `{'value': 1, 'relation': 'eq'} hinted that it is a "dict" object. Further debugging confirmed that.

Python doesn't require data type declaration. Therefore, the change of total_hits from an integer to a "dict" object went without notice. But, the script failed the if condition due to the different format.

To adapt to this change of data type, change total_hits to total_hits['value'].

To Reproduce
Steps to reproduce the behavior:

  1. Go to '/opt/ibm/csm/bigdata/python/'
  2. Run ./findJobTimeRange.py -a 1 (make sure allocation 1 existed)
  3. See message:
# Found {'value': 1, 'relation': 'eq'} matches for specified the job.
# This implementation only supports queries where the hit count is equal to 1.

Expected behavior
The command should display start and end time of the allocation. For example:

[root@c685f4n07 python]# ./findJobTimeRange.py -a 1
# Found {'value': 1, 'relation': 'eq'} matches for specified the job.allocation-id: 1
job-id: 526 - 0
user-name: root 
user-id: 0
begin-time: 2020-09-17.12:06:01:183 
end-time: 2020-09-17.12:06:58:382

Screenshots
If applicable, add screenshots to help explain your problem.

Environment (please complete the following information):

  • Machine [CSM or IST CORAL cluster]
  • Version [1.8.2-3577]

Additional context
This is probably due to the python scripts were written for elastic 6.8.1 that is now upgraded to 7.5.1. It's not clear when the change of "total_hits" format happened.

Issue Source:
All bigdata python scripts that do the following might fail "un-knowingly".

    total_hits = cast.deep_get(tr_res, "hits", "total")

Here's a list of those scripts:

[root@c685f4n07 python]# grep total_hits *.py
findJobKeys.py:    total_hits = cast.deep_get(tr_res, "hits","total")
findJobMetrics.py:    total_hits = cast.deep_get(tr_res, "hits","total")
findJobsInRange.py:    total_hits    = cast.deep_get(tr_res, "hits","total")
findUserJobs.py:    total_hits = cast.deep_get(resp, "hits","total")
findWeightedErrors.py:    total_hits = cast.deep_get(tr_res, "hits","total")

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions