Skip to content

Conversation

@echohlne
Copy link
Contributor

@echohlne echohlne commented Oct 29, 2020

What changes were proposed in this pull request?

In the old version of spark in the storage UI page, the sorting function is normal, but sorting in the new version will cause the header content to be lost, So I try to fix the bug.

Why are the changes needed?

The header field of the table on the page is similar to the following, note that each th contains the span attribute:

<thead>
    <tr>
        ....
        <th width="" class="">
              <span data-toggle="tooltip" title="" data-original-title="StorageLevel displays where the persisted RDD is stored, format of the persisted RDD (serialized or de-serialized) andreplication factor of the persisted RDD">
                Storage Level
              </span>
        </th>
       .....
    </tr>
</thead>

Since PR#26136, if the th in the table itself contains the span attribute, the span will be deleted directly after clicking the sort, and the original header content will be lost.

There are three problems in sorttable.js:

  1. sortrevind.class = "sorttable_sortrevind" in sorttab.js#107 and sortfwdind.class = "sorttable_sortfwdind" in sorttab.js#125
    sorttable_xx attribute should be assigned toclassName instead of class, as javascript uses rowlists[j].className.search rather than rowlists[j].class.search to determine whether the component has a sorting flag or not.
  2. rowlists[j].className.search(/\sorttable_sortrevind\b/) in sorttab.js#120 was wrong. The original intention is to search whether className contains the word sorttable_sortrevind , but the expression is wrong, it should be \bsorttable_sortrevind\b instead of \sorttable_sortrevind\b
  3. The if check statement in the following code snippet (sorttab.js#141) was wrong. If the search function does not find the target, it will return -1, but Boolean(-1) is actually equals true. This statement will cause span to be deleted even if it does not contain sorttable_sortfwdind or sorttable_sortrevind.
rowlists = this.parentNode.getElementsByTagName("span");
for (var j=0; j < rowlists.length; j++) {
              if (rowlists[j].className.search(/\bsorttable_sortfwdind\b/)
                  || rowlists[j].className.search(/\sorttable_sortrevind\b/) ) {
                  rowlists[j].parentNode.removeChild(rowlists[j]);
              }
          }

Does this PR introduce any user-facing change?

NO.

How was this patch tested?

The manual test result of the ui page is as below:

fix sorted

@echohlne
Copy link
Contributor Author

cc @srowen @gengliangwang @sarutak , hi, please help me to review this pr, thanks a lot.

@srowen
Copy link
Member

srowen commented Oct 29, 2020

I don't know the code well, but seems reasonable, if you've verified it fixes the issue.

@srowen
Copy link
Member

srowen commented Oct 29, 2020

Jenkins test this please

@SparkQA
Copy link

SparkQA commented Oct 29, 2020

Kubernetes integration test starting
URL: https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/35014/

@SparkQA
Copy link

SparkQA commented Oct 29, 2020

Kubernetes integration test status failure
URL: https://amplab.cs.berkeley.edu/jenkins/job/SparkPullRequestBuilder-K8s/35014/

@SparkQA
Copy link

SparkQA commented Oct 29, 2020

Test build #130410 has finished for PR 30182 at commit 49c7074.

  • This patch passes all tests.
  • This patch merges cleanly.
  • This patch adds no public classes.

@echohlne
Copy link
Contributor Author

@srowen thanks, I verified the changed code and it is currently works well.
Is anyone else familiar with this part of the code?

@srowen
Copy link
Member

srowen commented Oct 30, 2020

@cjn082030 does it look reasonable to you?

@echohlne
Copy link
Contributor Author

echohlne commented Nov 3, 2020

Jenkins test this please

@srowen srowen closed this in 56c623e Nov 3, 2020
@srowen
Copy link
Member

srowen commented Nov 3, 2020

Merged to master/3.0

srowen pushed a commit that referenced this pull request Nov 3, 2020
…ort the table will cause the header content to be lost

### What changes were proposed in this pull request?
In the old version of spark in the storage UI page, the sorting function is normal, but sorting in the new version will cause the header content to be lost, So I try to fix the bug.

### Why are the changes needed?

The header field of the table on the page is similar to the following, **note that each th contains the span attribute**:

```html
<thead>
    <tr>
        ....
        <th width="" class="">
              <span data-toggle="tooltip" title="" data-original-title="StorageLevel displays where the persisted RDD is stored, format of the persisted RDD (serialized or de-serialized) andreplication factor of the persisted RDD">
                Storage Level
              </span>
        </th>
       .....
    </tr>
</thead>
```

Since  [PR#26136](#26136), if the `th` in the table itself contains the `span` attribute, the `span` will be deleted directly after clicking the sort, and the original header content will be lost.

There are three problems  in `sorttable.js`:

1. `sortrevind.class = "sorttable_sortrevind"` in  [sorttab.js#107](https://github.com/apache/spark/blob/9d5e48ea95d1c3017a51ff69584f32a18901b2b5/core/src/main/resources/org/apache/spark/ui/static/sorttable.js#L107) and  `sortfwdind.class = "sorttable_sortfwdind"` in  [sorttab.js#125](https://github.com/apache/spark/blob/9d5e48ea95d1c3017a51ff69584f32a18901b2b5/core/src/main/resources/org/apache/spark/ui/static/sorttable.js#L125)
sorttable_xx attribute should be assigned to`className` instead of `class`, as javascript uses `rowlists[j].className.search` rather than `rowlists[j].class.search` to determine whether the component has a sorting flag or not.
2.  `rowlists[j].className.search(/\sorttable_sortrevind\b/)` in  [sorttab.js#120](https://github.com/apache/spark/blob/9d5e48ea95d1c3017a51ff69584f32a18901b2b5/core/src/main/resources/org/apache/spark/ui/static/sorttable.js#L120) was wrong. The original intention is to search whether `className` contains  the word `sorttable_sortrevind` , but the expression is wrong,  it should be `\bsorttable_sortrevind\b` instead of `\sorttable_sortrevind\b`
3. The if check statement in the following code snippet ([sorttab.js#141](https://github.com/apache/spark/blob/9d5e48ea95d1c3017a51ff69584f32a18901b2b5/core/src/main/resources/org/apache/spark/ui/static/sorttable.js#L141)) was wrong. **If the `search` function does not find the target, it will return -1, but Boolean(-1) is actually equals true**. This statement will cause span to be deleted even if it does not contain `sorttable_sortfwdind` or `sorttable_sortrevind`.
```javascript
rowlists = this.parentNode.getElementsByTagName("span");
for (var j=0; j < rowlists.length; j++) {
              if (rowlists[j].className.search(/\bsorttable_sortfwdind\b/)
                  || rowlists[j].className.search(/\sorttable_sortrevind\b/) ) {
                  rowlists[j].parentNode.removeChild(rowlists[j]);
              }
          }
```

### Does this PR introduce _any_ user-facing change?
NO.

### How was this patch tested?
The manual test result of the ui page is as below:

![fix sorted](https://user-images.githubusercontent.com/52202080/97543194-daeaa680-1a02-11eb-8b11-8109c3e4e9a3.gif)

Closes #30182 from akiyamaneko/ui_storage_sort_error.

Authored-by: neko <[email protected]>
Signed-off-by: Sean Owen <[email protected]>
(cherry picked from commit 56c623e)
Signed-off-by: Sean Owen <[email protected]>
@dongjoon-hyun
Copy link
Member

Thank you, @akiyamaneko and @srowen !

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants