SonarQube 使用不正确的(?)ElasticSearch 查询来获取 ScmAccountToUser
SonarQube uses incorrect (?) ElasticSearch query to get ScmAccountToUser
我 运行 SonarQube 5.3 在 Windows 上使用 MSSQL 后端。
创建新问题时,SonarQube 查询其 ElasticSearch 用户索引以获取作者登录以获取提出问题的行的 "git blame" 信息。
以下发生在 /server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueAssigner.java:
=> "git blame" 信息 returns 受影响行的作者,在我的示例中(匿名):
steve smith@ca5553f7-9c36-c34d-916b-b330600317e9
=> 该值在 ScmAccountToUser 中查找,它延迟查询 ElasticSearch 索引 "users"。我添加了一些调试输出来打印 ES 查询,即:
{
"size": 3,
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"term": {
"active": true
}
},
"should": [
{
"term": {
"login": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
},
{
"term": {
"email": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
},
{
"term": {
"scmAccounts": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
}
]
}
}
}
}
}
此查询 returns 0 个结果。
相比之下,当我枚举整个索引时,我得到的命中通常应该匹配这个用户:
{ -
"took": 4,
"timed_out": false,
"_shards": { -
"total": 5,
"successful": 5,
"failed": 0
},
"hits": { -
"total": 39,
"max_score": 1,
"hits": [ -
{ -
// snip
},
// snip
{ -
"_index": "users",
"_type": "user",
"_id": "steve.smith",
"_score": 1,
"_source": { -
"createdAt": 1442988141642,
"name": "Steve Smith",
"active": true,
"login": "steve.smith",
"scmAccounts": [ -
"
",
"steve smith@ca5553f7-9c36-c34d-916b-b330600317e9
",
"steve.smith@ca5553f7-9c36-c34d-916b-b330600317e9
"
],
"email": "steve.smith@globodex.ch",
"updatedAt": 1450088380632
}
},
// snip
]
}
}
这个问题目前正在阻止我的 SonarQube 实例自动分配很多问题。我正在弄清楚 when/how 这个问题,因为一些自动分配之前已经成功了。
这是查询错误还是数据错误?我能以某种方式解决这个问题吗?
事实证明,问题是由于 "scmAccounts" 字段条目中的换行符引起的。
通过在 SonarQube UI 中手动重新添加 SCM 帐户,这些字段已更新为
"scmAccounts":
[ -
"steve smith@ca5553f7-9c36-c34d-916b-b330600317e9",
"steve.smith@ca5553f7-9c36-c34d-916b-b330600317e9"
],
,之后查询成功,问题赋值成功。
换行符首先进入字段,因为我从备份 SQL INSERT 脚本手动恢复了 SQL 服务器上的 table "users"。
我 运行 SonarQube 5.3 在 Windows 上使用 MSSQL 后端。
创建新问题时,SonarQube 查询其 ElasticSearch 用户索引以获取作者登录以获取提出问题的行的 "git blame" 信息。
以下发生在 /server/sonar-server/src/main/java/org/sonar/server/computation/issue/IssueAssigner.java:
=> "git blame" 信息 returns 受影响行的作者,在我的示例中(匿名):
steve smith@ca5553f7-9c36-c34d-916b-b330600317e9
=> 该值在 ScmAccountToUser 中查找,它延迟查询 ElasticSearch 索引 "users"。我添加了一些调试输出来打印 ES 查询,即:
{
"size": 3,
"query": {
"filtered": {
"query": {
"match_all": {}
},
"filter": {
"bool": {
"must": {
"term": {
"active": true
}
},
"should": [
{
"term": {
"login": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
},
{
"term": {
"email": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
},
{
"term": {
"scmAccounts": "steve smith@ca5553f7-9c36-c34d-916b-b330600317e9"
}
}
]
}
}
}
}
}
此查询 returns 0 个结果。
相比之下,当我枚举整个索引时,我得到的命中通常应该匹配这个用户:
{ -
"took": 4,
"timed_out": false,
"_shards": { -
"total": 5,
"successful": 5,
"failed": 0
},
"hits": { -
"total": 39,
"max_score": 1,
"hits": [ -
{ -
// snip
},
// snip
{ -
"_index": "users",
"_type": "user",
"_id": "steve.smith",
"_score": 1,
"_source": { -
"createdAt": 1442988141642,
"name": "Steve Smith",
"active": true,
"login": "steve.smith",
"scmAccounts": [ -
"
",
"steve smith@ca5553f7-9c36-c34d-916b-b330600317e9
",
"steve.smith@ca5553f7-9c36-c34d-916b-b330600317e9
"
],
"email": "steve.smith@globodex.ch",
"updatedAt": 1450088380632
}
},
// snip
]
}
}
这个问题目前正在阻止我的 SonarQube 实例自动分配很多问题。我正在弄清楚 when/how 这个问题,因为一些自动分配之前已经成功了。
这是查询错误还是数据错误?我能以某种方式解决这个问题吗?
事实证明,问题是由于 "scmAccounts" 字段条目中的换行符引起的。
通过在 SonarQube UI 中手动重新添加 SCM 帐户,这些字段已更新为
"scmAccounts":
[ -
"steve smith@ca5553f7-9c36-c34d-916b-b330600317e9",
"steve.smith@ca5553f7-9c36-c34d-916b-b330600317e9"
],
,之后查询成功,问题赋值成功。
换行符首先进入字段,因为我从备份 SQL INSERT 脚本手动恢复了 SQL 服务器上的 table "users"。