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

Reply via email to