Public bug reported:
Repeatedly writing changed values to one dconf key causes dconf-
service's private memory to grow without bound, even though the database
stays approximately the same size.
On my desktop, dconf-service accumulated about 8.6 GiB RSS plus 3.7 GiB
swap over 16 days. Smart Auto Move was writing a roughly 44 KiB saved-
window-state string about 10 times per second while a terminal title
spinner changed. During observation, RSS grew by about 25.7 MiB/minute.
The user database was only 113 KB.
The synthetic reproducer below demonstrates the leak without GNOME
Shell, Smart Auto Move, or my desktop configuration.
Environment:
- Ubuntu 26.04.1 LTS, x86_64.
- dconf-service 0.49.0-4.
- GLib 2.88.0-1ubuntu0.1.
- Also reproduced with unmodified upstream dconf 0.49.0 source, linked against
the same system runtime libraries.
Reproduction:
1. Save the Python reproducer below as reproduce.py.
2. Run `python3 reproduce.py`. It requires Python with PyGObject/GIO and
`dbus-run-session`.
3. Observe RSS after 1,500 identical writes and then 1,500 changed writes to
the same key. Values are synthetic strings of about 51,400 bytes.
The reproducer starts its own dconf-service in a private D-Bus session
with temporary configuration/runtime directories. It stops only that
test service and leaves the desktop's service and settings untouched. A
different service binary can be supplied with `python3 reproduce.py
/path/to/dconf-service`.
Expected: memory usage stays bounded when overwriting one fixed-size
value.
Actual: each changed write retains approximately another value's worth
of memory. Identical writes do not show comparable growth. Memory
remains high after writes stop, while the synthetic database stays about
51 KiB.
Results (RSS in KiB; full samples included below as results.json):
| Service binary | Initial write | After 1,500 identical writes | After 1,500
changed writes |
| --- | ---: | ---: | ---: |
| Ubuntu's installed 0.49.0-4 | 6,648 | 6,700 | 83,188 |
| Unmodified upstream 0.49.0 | 6,788 | 6,840 | 83,328 |
| Upstream 0.49.0 with the one-line patch below | 6,664 | 6,764 | 6,800 |
Likely cause:
In `service/dconf-writer.c`, `dconf_writer_real_change()` receives an
owned changeset from `dconf_changeset_filter_changes()`. It takes
another reference for the queued notification, but never releases the
initial reference. Notification processing releases the queue's
reference, leaving the initial reference and its values retained.
Adding `dconf_changeset_unref (effective_changeset);` after queuing the
notification and marking the write necessary prevents the observed
growth. The patch was tested in isolated service instances; it has not
been installed on the desktop.
The reproducer, patch, and full measurements are included inline below.
Upstream reporting: I could not log in to GNOME GitLab. Please forward
this report and patch to GNOME dconf, or link an existing upstream
report. The problem reproduces with unmodified upstream 0.49.0 source.
Patch (dconf-leak-fix.patch):
--- a/service/dconf-writer.c
+++ b/service/dconf-writer.c
@@ -148,6 +148,7 @@
}
writer->priv->need_write = TRUE;
+ dconf_changeset_unref (effective_changeset);
}
}
Reproducer (reproduce.py):
#!/usr/bin/env python3
"""Linux reproducer: private D-Bus session, synthetic values, no desktop
settings changed."""
import json
import os
from pathlib import Path
import subprocess
import sys
import tempfile
import time
def run_worker(binary, root):
from gi.repository import Gio, GLib
assert os.environ['XDG_CONFIG_HOME'] == str(Path(root, 'config'))
assert os.environ['XDG_RUNTIME_DIR'] == str(Path(root, 'runtime'))
assert Path(root).name.startswith('dconf-leak-repro-')
service = subprocess.Popen([binary], stdout=subprocess.DEVNULL)
try:
bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
deadline = time.monotonic() + 5
while True:
owner = bus.call_sync(
'org.freedesktop.DBus', '/org/freedesktop/DBus',
'org.freedesktop.DBus', 'NameHasOwner',
GLib.Variant('(s)', ('ca.desrt.dconf',)),
GLib.VariantType('(b)'), Gio.DBusCallFlags.NONE, 1000, None,
).unpack()[0]
if owner:
break
if time.monotonic() > deadline:
raise RuntimeError('Isolated service did not acquire its name')
time.sleep(0.02)
def write(value):
data = GLib.Variant('a{smv}', {'/investigation/value':
GLib.Variant('s', value)})
bus.call_sync(
'ca.desrt.dconf', '/ca/desrt/dconf/Writer/user',
'ca.desrt.dconf.Writer', 'Change',
GLib.Variant.new_tuple(GLib.Variant.new_from_bytes(
GLib.VariantType('ay'), data.get_data_as_bytes(), True)),
GLib.VariantType('(s)'), Gio.DBusCallFlags.NONE, 3000, None,
)
def sample(stage, writes):
fields = dict(line.split(':', 1) for line in
Path(f'/proc/{service.pid}/status').read_text().splitlines() if ':' in line)
result = {'stage': stage, 'writes': writes, 'rss_kib':
int(fields['VmRSS'].split()[0]),
'swap_kib': int(fields['VmSwap'].split()[0]),
'database_bytes': Path(os.environ['XDG_CONFIG_HOME'],
'dconf/user').stat().st_size}
print(json.dumps(result), flush=True)
payload = 'x' * 51400
write(payload)
sample('initial', 1)
for _ in range(1500):
write(payload)
sample('identical_values', 1500)
for i in range(1, 1501):
write(payload + str(i))
if i % 500 == 0:
sample('changed_values', i)
time.sleep(1)
sample('idle', 1500)
finally:
# Stop only the test instance created above, never the user's service.
service.terminate()
service.wait(timeout=5)
if len(sys.argv) > 1 and sys.argv[1] == 'worker':
run_worker(sys.argv[2], sys.argv[3])
else:
candidates = ['/usr/libexec/dconf-service', '/usr/lib/dconf/dconf-service']
binary = sys.argv[1] if len(sys.argv) > 1 else next((p for p in candidates
if Path(p).is_file()), None)
if binary is None:
sys.exit('Pass the path to dconf-service as the first argument')
binary = str(Path(binary).resolve())
with tempfile.TemporaryDirectory(prefix='dconf-leak-repro-') as root:
env = os.environ.copy()
for name, subdir in [('XDG_CONFIG_HOME', 'config'), ('XDG_RUNTIME_DIR',
'runtime')]:
location = Path(root, subdir)
location.mkdir(mode=0o700)
env[name] = str(location)
env.pop('DCONF_PROFILE', None)
env.pop('DBUS_STARTER_ADDRESS', None)
env.pop('DBUS_STARTER_BUS_TYPE', None)
env['GSETTINGS_BACKEND'] = 'dconf'
result = subprocess.run(['dbus-run-session', '--', sys.executable,
str(Path(__file__).resolve()), 'worker', binary, root], env=env)
sys.exit(result.returncode)
Full measurements (results.json):
{
"installed": [
{
"stage": "initial",
"writes": 1,
"rss_kib": 6648,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "identical_values",
"writes": 1500,
"rss_kib": 6700,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 500,
"rss_kib": 32176,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 1000,
"rss_kib": 57684,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "changed_values",
"writes": 1500,
"rss_kib": 83188,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "idle",
"writes": 1500,
"rss_kib": 83188,
"swap_kib": 0,
"database_bytes": 51564
}
],
"upstream": [
{
"stage": "initial",
"writes": 1,
"rss_kib": 6788,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "identical_values",
"writes": 1500,
"rss_kib": 6840,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 500,
"rss_kib": 32312,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 1000,
"rss_kib": 57820,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "changed_values",
"writes": 1500,
"rss_kib": 83328,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "idle",
"writes": 1500,
"rss_kib": 83328,
"swap_kib": 0,
"database_bytes": 51564
}
],
"fixed": [
{
"stage": "initial",
"writes": 1,
"rss_kib": 6664,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "identical_values",
"writes": 1500,
"rss_kib": 6764,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 500,
"rss_kib": 6796,
"swap_kib": 0,
"database_bytes": 51560
},
{
"stage": "changed_values",
"writes": 1000,
"rss_kib": 6800,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "changed_values",
"writes": 1500,
"rss_kib": 6800,
"swap_kib": 0,
"database_bytes": 51564
},
{
"stage": "idle",
"writes": 1500,
"rss_kib": 6800,
"swap_kib": 0,
"database_bytes": 51564
}
]
}
** Affects: dconf (Ubuntu)
Importance: Undecided
Status: New
** Tags: memory-leak resolute
** Description changed:
Repeatedly writing changed values to one dconf key causes dconf-
service's private memory to grow without bound, even though the database
stays approximately the same size.
On my desktop, dconf-service accumulated about 8.6 GiB RSS plus 3.7 GiB
swap over 16 days. Smart Auto Move was writing a roughly 44 KiB saved-
window-state string about 10 times per second while a terminal title
spinner changed. During observation, RSS grew by about 25.7 MiB/minute.
The user database was only 113 KB.
The synthetic reproducer below demonstrates the leak without GNOME
Shell, Smart Auto Move, or my desktop configuration.
Environment:
- Ubuntu 26.04.1 LTS, x86_64.
- dconf-service 0.49.0-4.
- GLib 2.88.0-1ubuntu0.1.
- Also reproduced with unmodified upstream dconf 0.49.0 source, linked
against the same system runtime libraries.
Reproduction:
1. Save the Python reproducer below as reproduce.py.
2. Run `python3 reproduce.py`. It requires Python with PyGObject/GIO and
`dbus-run-session`.
3. Observe RSS after 1,500 identical writes and then 1,500 changed writes to
the same key. Values are synthetic strings of about 51,400 bytes.
The reproducer starts its own dconf-service in a private D-Bus session
with temporary configuration/runtime directories. It stops only that
test service and leaves the desktop's service and settings untouched. A
different service binary can be supplied with `python3 reproduce.py
/path/to/dconf-service`.
Expected: memory usage stays bounded when overwriting one fixed-size
value.
Actual: each changed write retains approximately another value's worth
of memory. Identical writes do not show comparable growth. Memory
remains high after writes stop, while the synthetic database stays about
51 KiB.
Results (RSS in KiB; full samples included below as results.json):
| Service binary | Initial write | After 1,500 identical writes | After 1,500
changed writes |
| --- | ---: | ---: | ---: |
| Ubuntu's installed 0.49.0-4 | 6,648 | 6,700 | 83,188 |
| Unmodified upstream 0.49.0 | 6,788 | 6,840 | 83,328 |
| Upstream 0.49.0 with the one-line patch below | 6,664 | 6,764 | 6,800 |
Likely cause:
In `service/dconf-writer.c`, `dconf_writer_real_change()` receives an
owned changeset from `dconf_changeset_filter_changes()`. It takes
another reference for the queued notification, but never releases the
initial reference. Notification processing releases the queue's
reference, leaving the initial reference and its values retained.
Adding `dconf_changeset_unref (effective_changeset);` after queuing the
notification and marking the write necessary prevents the observed
growth. The patch was tested in isolated service instances; it has not
been installed on the desktop.
The reproducer, patch, and full measurements are included inline below.
Upstream reporting: I could not log in to GNOME GitLab. Please forward
this report and patch to GNOME dconf, or link an existing upstream
report. The problem reproduces with unmodified upstream 0.49.0 source.
Patch (dconf-leak-fix.patch):
- --- a/service/dconf-writer.c
- +++ b/service/dconf-writer.c
- @@ -148,6 +148,7 @@
- }
-
- writer->priv->need_write = TRUE;
- + dconf_changeset_unref (effective_changeset);
+ --- a/service/dconf-writer.c
+ +++ b/service/dconf-writer.c
+ @@ -148,6 +148,7 @@
}
+
+ writer->priv->need_write = TRUE;
+ + dconf_changeset_unref (effective_changeset);
}
+ }
Reproducer (reproduce.py):
- #!/usr/bin/env python3
- """Linux reproducer: private D-Bus session, synthetic values, no desktop
settings changed."""
- import json
- import os
- from pathlib import Path
- import subprocess
- import sys
- import tempfile
- import time
-
-
- def run_worker(binary, root):
- from gi.repository import Gio, GLib
-
- assert os.environ['XDG_CONFIG_HOME'] == str(Path(root, 'config'))
- assert os.environ['XDG_RUNTIME_DIR'] == str(Path(root, 'runtime'))
- assert Path(root).name.startswith('dconf-leak-repro-')
- service = subprocess.Popen([binary], stdout=subprocess.DEVNULL)
- try:
- bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
- deadline = time.monotonic() + 5
- while True:
- owner = bus.call_sync(
- 'org.freedesktop.DBus', '/org/freedesktop/DBus',
- 'org.freedesktop.DBus', 'NameHasOwner',
- GLib.Variant('(s)', ('ca.desrt.dconf',)),
- GLib.VariantType('(b)'), Gio.DBusCallFlags.NONE, 1000,
None,
- ).unpack()[0]
- if owner:
- break
- if time.monotonic() > deadline:
- raise RuntimeError('Isolated service did not acquire its
name')
- time.sleep(0.02)
-
- def write(value):
- data = GLib.Variant('a{smv}', {'/investigation/value':
GLib.Variant('s', value)})
- bus.call_sync(
- 'ca.desrt.dconf', '/ca/desrt/dconf/Writer/user',
- 'ca.desrt.dconf.Writer', 'Change',
- GLib.Variant.new_tuple(GLib.Variant.new_from_bytes(
- GLib.VariantType('ay'), data.get_data_as_bytes(),
True)),
- GLib.VariantType('(s)'), Gio.DBusCallFlags.NONE, 3000,
None,
- )
-
- def sample(stage, writes):
- fields = dict(line.split(':', 1) for line in
Path(f'/proc/{service.pid}/status').read_text().splitlines() if ':' in line)
- result = {'stage': stage, 'writes': writes, 'rss_kib':
int(fields['VmRSS'].split()[0]),
- 'swap_kib': int(fields['VmSwap'].split()[0]),
- 'database_bytes':
Path(os.environ['XDG_CONFIG_HOME'], 'dconf/user').stat().st_size}
- print(json.dumps(result), flush=True)
-
- payload = 'x' * 51400
+ #!/usr/bin/env python3
+ """Linux reproducer: private D-Bus session, synthetic values, no desktop
settings changed."""
+ import json
+ import os
+ from pathlib import Path
+ import subprocess
+ import sys
+ import tempfile
+ import time
+
+
+ def run_worker(binary, root):
+ from gi.repository import Gio, GLib
+
+ assert os.environ['XDG_CONFIG_HOME'] == str(Path(root, 'config'))
+ assert os.environ['XDG_RUNTIME_DIR'] == str(Path(root, 'runtime'))
+ assert Path(root).name.startswith('dconf-leak-repro-')
+ service = subprocess.Popen([binary], stdout=subprocess.DEVNULL)
+ try:
+ bus = Gio.bus_get_sync(Gio.BusType.SESSION, None)
+ deadline = time.monotonic() + 5
+ while True:
+ owner = bus.call_sync(
+ 'org.freedesktop.DBus', '/org/freedesktop/DBus',
+ 'org.freedesktop.DBus', 'NameHasOwner',
+ GLib.Variant('(s)', ('ca.desrt.dconf',)),
+ GLib.VariantType('(b)'), Gio.DBusCallFlags.NONE, 1000, None,
+ ).unpack()[0]
+ if owner:
+ break
+ if time.monotonic() > deadline:
+ raise RuntimeError('Isolated service did not acquire its
name')
+ time.sleep(0.02)
+
+ def write(value):
+ data = GLib.Variant('a{smv}', {'/investigation/value':
GLib.Variant('s', value)})
+ bus.call_sync(
+ 'ca.desrt.dconf', '/ca/desrt/dconf/Writer/user',
+ 'ca.desrt.dconf.Writer', 'Change',
+ GLib.Variant.new_tuple(GLib.Variant.new_from_bytes(
+ GLib.VariantType('ay'), data.get_data_as_bytes(), True)),
+ GLib.VariantType('(s)'), Gio.DBusCallFlags.NONE, 3000, None,
+ )
+
+ def sample(stage, writes):
+ fields = dict(line.split(':', 1) for line in
Path(f'/proc/{service.pid}/status').read_text().splitlines() if ':' in line)
+ result = {'stage': stage, 'writes': writes, 'rss_kib':
int(fields['VmRSS'].split()[0]),
+ 'swap_kib': int(fields['VmSwap'].split()[0]),
+ 'database_bytes': Path(os.environ['XDG_CONFIG_HOME'],
'dconf/user').stat().st_size}
+ print(json.dumps(result), flush=True)
+
+ payload = 'x' * 51400
+ write(payload)
+ sample('initial', 1)
+ for _ in range(1500):
write(payload)
- sample('initial', 1)
- for _ in range(1500):
- write(payload)
- sample('identical_values', 1500)
- for i in range(1, 1501):
- write(payload + str(i))
- if i % 500 == 0:
- sample('changed_values', i)
- time.sleep(1)
- sample('idle', 1500)
- finally:
- # Stop only the test instance created above, never the user's
service.
- service.terminate()
- service.wait(timeout=5)
-
-
- if len(sys.argv) > 1 and sys.argv[1] == 'worker':
- run_worker(sys.argv[2], sys.argv[3])
- else:
- candidates = ['/usr/libexec/dconf-service',
'/usr/lib/dconf/dconf-service']
- binary = sys.argv[1] if len(sys.argv) > 1 else next((p for p in
candidates if Path(p).is_file()), None)
- if binary is None:
- sys.exit('Pass the path to dconf-service as the first argument')
- binary = str(Path(binary).resolve())
- with tempfile.TemporaryDirectory(prefix='dconf-leak-repro-') as root:
- env = os.environ.copy()
- for name, subdir in [('XDG_CONFIG_HOME', 'config'),
('XDG_RUNTIME_DIR', 'runtime')]:
- location = Path(root, subdir)
- location.mkdir(mode=0o700)
- env[name] = str(location)
- env.pop('DCONF_PROFILE', None)
- env.pop('DBUS_STARTER_ADDRESS', None)
- env.pop('DBUS_STARTER_BUS_TYPE', None)
- env['GSETTINGS_BACKEND'] = 'dconf'
- result = subprocess.run(['dbus-run-session', '--',
sys.executable, str(Path(__file__).resolve()), 'worker', binary, root], env=env)
- sys.exit(result.returncode)
+ sample('identical_values', 1500)
+ for i in range(1, 1501):
+ write(payload + str(i))
+ if i % 500 == 0:
+ sample('changed_values', i)
+ time.sleep(1)
+ sample('idle', 1500)
+ finally:
+ # Stop only the test instance created above, never the user's service.
+ service.terminate()
+ service.wait(timeout=5)
+
+
+ if len(sys.argv) > 1 and sys.argv[1] == 'worker':
+ run_worker(sys.argv[2], sys.argv[3])
+ else:
+ candidates = ['/usr/libexec/dconf-service',
'/usr/lib/dconf/dconf-service']
+ binary = sys.argv[1] if len(sys.argv) > 1 else next((p for p in
candidates if Path(p).is_file()), None)
+ if binary is None:
+ sys.exit('Pass the path to dconf-service as the first argument')
+ binary = str(Path(binary).resolve())
+ with tempfile.TemporaryDirectory(prefix='dconf-leak-repro-') as root:
+ env = os.environ.copy()
+ for name, subdir in [('XDG_CONFIG_HOME', 'config'),
('XDG_RUNTIME_DIR', 'runtime')]:
+ location = Path(root, subdir)
+ location.mkdir(mode=0o700)
+ env[name] = str(location)
+ env.pop('DCONF_PROFILE', None)
+ env.pop('DBUS_STARTER_ADDRESS', None)
+ env.pop('DBUS_STARTER_BUS_TYPE', None)
+ env['GSETTINGS_BACKEND'] = 'dconf'
+ result = subprocess.run(['dbus-run-session', '--', sys.executable,
str(Path(__file__).resolve()), 'worker', binary, root], env=env)
+ sys.exit(result.returncode)
Full measurements (results.json):
- {
- "installed": [
- {
- "stage": "initial",
- "writes": 1,
- "rss_kib": 6648,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "identical_values",
- "writes": 1500,
- "rss_kib": 6700,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 500,
- "rss_kib": 32176,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 1000,
- "rss_kib": 57684,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "changed_values",
- "writes": 1500,
- "rss_kib": 83188,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "idle",
- "writes": 1500,
- "rss_kib": 83188,
- "swap_kib": 0,
- "database_bytes": 51564
- }
- ],
- "upstream": [
- {
- "stage": "initial",
- "writes": 1,
- "rss_kib": 6788,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "identical_values",
- "writes": 1500,
- "rss_kib": 6840,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 500,
- "rss_kib": 32312,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 1000,
- "rss_kib": 57820,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "changed_values",
- "writes": 1500,
- "rss_kib": 83328,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "idle",
- "writes": 1500,
- "rss_kib": 83328,
- "swap_kib": 0,
- "database_bytes": 51564
- }
- ],
- "fixed": [
- {
- "stage": "initial",
- "writes": 1,
- "rss_kib": 6664,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "identical_values",
- "writes": 1500,
- "rss_kib": 6764,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 500,
- "rss_kib": 6796,
- "swap_kib": 0,
- "database_bytes": 51560
- },
- {
- "stage": "changed_values",
- "writes": 1000,
- "rss_kib": 6800,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "changed_values",
- "writes": 1500,
- "rss_kib": 6800,
- "swap_kib": 0,
- "database_bytes": 51564
- },
- {
- "stage": "idle",
- "writes": 1500,
- "rss_kib": 6800,
- "swap_kib": 0,
- "database_bytes": 51564
- }
- ]
+ {
+ "installed": [
+ {
+ "stage": "initial",
+ "writes": 1,
+ "rss_kib": 6648,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "identical_values",
+ "writes": 1500,
+ "rss_kib": 6700,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 500,
+ "rss_kib": 32176,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1000,
+ "rss_kib": 57684,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1500,
+ "rss_kib": 83188,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "idle",
+ "writes": 1500,
+ "rss_kib": 83188,
+ "swap_kib": 0,
+ "database_bytes": 51564
}
+ ],
+ "upstream": [
+ {
+ "stage": "initial",
+ "writes": 1,
+ "rss_kib": 6788,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "identical_values",
+ "writes": 1500,
+ "rss_kib": 6840,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 500,
+ "rss_kib": 32312,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1000,
+ "rss_kib": 57820,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1500,
+ "rss_kib": 83328,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "idle",
+ "writes": 1500,
+ "rss_kib": 83328,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ }
+ ],
+ "fixed": [
+ {
+ "stage": "initial",
+ "writes": 1,
+ "rss_kib": 6664,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "identical_values",
+ "writes": 1500,
+ "rss_kib": 6764,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 500,
+ "rss_kib": 6796,
+ "swap_kib": 0,
+ "database_bytes": 51560
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1000,
+ "rss_kib": 6800,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "changed_values",
+ "writes": 1500,
+ "rss_kib": 6800,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ },
+ {
+ "stage": "idle",
+ "writes": 1500,
+ "rss_kib": 6800,
+ "swap_kib": 0,
+ "database_bytes": 51564
+ }
+ ]
+ }
--
You received this bug notification because you are a member of Ubuntu
Bugs, which is subscribed to Ubuntu.
https://bugs.launchpad.net/bugs/2169633
Title:
dconf-service leaks memory on every changed write (missing changeset
unref)
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/dconf/+bug/2169633/+subscriptions
--
ubuntu-bugs mailing list
[email protected]
https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs