fix(service): register D-Bus object before service name to close race - #487
Conversation
Reviewer's guide (collapsed on small PRs)Reviewer's GuideThis PR fixes a D-Bus race by registering the log viewer service’s object path before claiming the well-known service name, ensuring the object tree is ready once the name becomes visible on the system bus. Sequence diagram for revised D-Bus service and object registration ordersequenceDiagram
participant Service as LogViewerService
participant SystemBus as QDBusConnection_systemBus
actor Client as D-Bus_client
Service->>SystemBus: registerObject(LogViewrPath,&service,QDBusConnection::ExportAllSlots)
SystemBus-->>Service: registerObject success
Service->>SystemBus: registerService(LogViewrServiceName)
SystemBus-->>Service: registerService success (name visible)
Client->>SystemBus: org.freedesktop.DBus.Introspectable.Introspect
SystemBus-->>Client: returns complete object tree for /com/deepin/logviewer
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
|
Warning
详情 {
"export": {
"application/assets/com.deepin.pkexec.logViewerAuth.policy": {
"a": [
"\t\t<message xml:lang=\"fr\">L'authentification est requise pour exporter les journaux</message>",
"\t\t<message xml:lang=\"es\">Se requiere autenticaci\u00f3n para exportar registros</message>",
"\t\t<message xml:lang=\"pt\">\u00c9 necess\u00e1ria autentica\u00e7\u00e3o para exportar registos</message>",
"\t\t<message xml:lang=\"fr\">L'authentification est requise pour exporter les journaux</message>",
"\t\t<message xml:lang=\"es\">Se requiere autenticaci\u00f3n para exportar registros</message>",
"\t\t<message xml:lang=\"pt\">\u00c9 necess\u00e1ria autentica\u00e7\u00e3o para exportar registos</message>"
],
"b": [
"\t\t<message xml:lang=\"ast\">La autenticaci\u00f3n ye necesaria pa exportar llogs</message>",
"\t\t<message xml:lang=\"br\">\u00c9 necess\u00e1rio autentica\u00e7\u00e3o para exportar logs</message>",
"\t\t<message xml:lang=\"cs\">Pro exportov\u00e1n\u00ed z\u00e1znam\u016f je vy\u017eadov\u00e1no ov\u011b\u0159en\u00ed</message>",
"\t\t<message xml:lang=\"en_AU\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"en_CA\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"en_GB\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"es\">Se requiere autenticaci\u00f3n para exportar registros</message>",
"\t\t<message xml:lang=\"fil\">Kailangan ang pag-authenticate upang i-export ang mga log</message>",
"\t\t<message xml:lang=\"fr\">L'authentification est requise pour exporter les journaux</message>",
"\t\t<message xml:lang=\"gl_ES\">\u00c9 necesario a autenticaci\u00f3n para exportar os rexistros</message>",
"\t\t<message xml:lang=\"ia\">Autentificacion necesaria por exportar le logs</message>",
"\t\t<message xml:lang=\"la\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"pam\">Kin kinahanglan ang pag-authentication para mag-export hin logs</message>",
"\t\t<message xml:lang=\"pt\">\u00c9 necess\u00e1ria autentica\u00e7\u00e3o para exportar registos</message>",
"\t\t<message xml:lang=\"pt_BR\">A autentica\u00e7\u00e3o \u00e9 necess\u00e1ria para exportar os logs</message>",
"\t\t<message xml:lang=\"ro\">Autentificarea este necesar\u0103 pentru a exporta jurnalul</message>",
"\t\t<message xml:lang=\"sk\">Prihl\u00e1senie je vy\u017eadovan\u00e9 na export logov</message>",
"\t\t<message xml:lang=\"sv\">Autentisering kr\u00e4vs f\u00f6r att exportera loggar</message>",
"\t\t<message xml:lang=\"ast\">La autenticaci\u00f3n ye necesaria pa exportar llogs</message>",
"\t\t<message xml:lang=\"br\">\u00c9 necess\u00e1rio autentica\u00e7\u00e3o para exportar logs</message>",
"\t\t<message xml:lang=\"cs\">Pro exportov\u00e1n\u00ed z\u00e1znam\u016f je vy\u017eadov\u00e1no ov\u011b\u0159en\u00ed</message>",
"\t\t<message xml:lang=\"en_AU\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"en_CA\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"en_GB\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"es\">Se requiere autenticaci\u00f3n para exportar registros</message>",
"\t\t<message xml:lang=\"fil\">Kailangan ang pag-authenticate upang i-export ang mga log</message>",
"\t\t<message xml:lang=\"fr\">L'authentification est requise pour exporter les journaux</message>",
"\t\t<message xml:lang=\"gl_ES\">\u00c9 necesario a autenticaci\u00f3n para exportar os rexistros</message>",
"\t\t<message xml:lang=\"ia\">Autentificacion necesaria por exportar le logs</message>",
"\t\t<message xml:lang=\"la\">Authentication is required to export logs</message>",
"\t\t<message xml:lang=\"pam\">Kin kinahanglan ang pag-authentication para mag-export hin logs</message>",
"\t\t<message xml:lang=\"pt\">\u00c9 necess\u00e1ria autentica\u00e7\u00e3o para exportar registos</message>",
"\t\t<message xml:lang=\"pt_BR\">A autentica\u00e7\u00e3o \u00e9 necess\u00e1ria para exportar os logs</message>",
"\t\t<message xml:lang=\"ro\">Autentificarea este necesar\u0103 pentru a exporta jurnalul</message>",
"\t\t<message xml:lang=\"sk\">Prihl\u00e1senie je vy\u017eadovan\u00e9 na export logov</message>",
"\t\t<message xml:lang=\"sv\">Autentisering kr\u00e4vs f\u00f6r att exportera loggar</message>"
]
}
}
} |
Register the /com/deepin/logviewer object before requesting the well-known name, so the object tree is ready once the name is visible. 先注册对象再注册服务名,消除名称已注册但对象未注册的竞态窗口, 避免 busctl tree 间歇性报 "No such object path '/'"。 Log: 修复服务列表获取间歇性失败的问题 Influence: D-Bus 按需激活后,客户端首次 introspect 不再因竞态丢失对象树, busctl tree 获取服务对象列表稳定可用。
deepin pr auto review★ 总体评分:95分■ 【总体评价】
■ 【详细分析】
■ 【改进建议代码示例】 // SPDX-FileCopyrightText: 2019 - 2026 UnionTech Software Technology Co., Ltd.
//
// SPDX-License-Identifier: GPL-3.0-or-later
// ... 其他代码 ...
QDBusConnection systemBus = QDBusConnection::systemBus();
// 先注册对象再注册服务名:well-known name 一旦对外可见,/com/deepin/logviewer
// 对象必然已就绪,消除名称已注册但对象尚未注册的竞态窗口
// (表现为 busctl tree 间歇性 "No such object path '/'")。
LogViewerService service;
if (!systemBus.registerObject(LogViewrPath,
&service,
QDBusConnection::ExportAllSlots | QDBusConnection::ExportAllSignals)) {
qCCritical(logService) << "registerObject failed:" << systemBus.lastError();
exit(0x0002);
}
if (!systemBus.registerService(LogViewrServiceName)) {
qCCritical(logService) << "registerService failed:" << systemBus.lastError();
exit(0x0001);
}
return a.exec(); |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: lzwind, wyu71 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Register the /com/deepin/logviewer object before requesting the well-known name, so the object tree is ready once the name is visible.
先注册对象再注册服务名,消除名称已注册但对象未注册的竞态窗口,
避免 busctl tree 间歇性报 "No such object path '/'"。
Log: 修复服务列表获取间歇性失败的问题
Influence: D-Bus 按需激活后,客户端首次 introspect 不再因竞态丢失对象树, busctl tree 获取服务对象列表稳定可用。
Summary by Sourcery
Bug Fixes: