Merge lp:~salgado/launchpad/meliae-librarian into lp:launchpad

Proposed by Guilherme Salgado
Status: Merged
Approved by: Gary Poster
Approved revision: no longer in the source branch.
Merged at revision: not available
Proposed branch: lp:~salgado/launchpad/meliae-librarian
Merge into: lp:launchpad
Diff against target: 94 lines (+54/-0)
3 files modified
daemons/librarian.tac (+11/-0)
lib/canonical/librarian/interfaces.py (+6/-0)
lib/canonical/librarian/tests/test_sigdumpmem.py (+37/-0)
To merge this branch: bzr merge lp:~salgado/launchpad/meliae-librarian
Reviewer Review Type Date Requested Status
Gary Poster (community) Approve
Review via email: mp+23771@code.launchpad.net

Description of the change

Make the librarian dump its memory (using meliae) upon a 'kill -44'

This is to help debug bug 556245.

= Launchpad lint =

Checking for conflicts. and issues in doctests and templates.
Running jslint, xmllint, pyflakes, and pylint.
Using normal rules.

Linting changed files:
  lib/canonical/librarian/interfaces.py
  lib/canonical/librarian/tests/test_sigdumpmem.py
  daemons/librarian.tac

== Pylint notices ==

lib/canonical/librarian/tests/test_sigdumpmem.py
    11: [F0401] Unable to import 'canonical.librarian.interfaces'
    12: [F0401] Unable to import 'canonical.librarian.ftests.harness'
    13: [F0401] Unable to import 'canonical.testing.layers'
    14: [F0401] Unable to import 'lp.testing'

To post a comment you must log in.
Revision history for this message
Gary Poster (gary) wrote :

Thank you

Gary

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'daemons/librarian.tac'
--- daemons/librarian.tac 2009-06-24 20:55:31 +0000
+++ daemons/librarian.tac 2010-04-20 14:37:25 +0000
@@ -4,6 +4,10 @@
4# Twisted Application Configuration file.4# Twisted Application Configuration file.
5# Use with "twistd2.4 -y <file.tac>", e.g. "twistd -noy server.tac"5# Use with "twistd2.4 -y <file.tac>", e.g. "twistd -noy server.tac"
66
7import signal
8
9from meliae import scanner
10
7from twisted.application import service, strports11from twisted.application import service, strports
8from twisted.web import server12from twisted.web import server
913
@@ -11,6 +15,7 @@
11from canonical.launchpad.daemons import tachandler15from canonical.launchpad.daemons import tachandler
12from canonical.launchpad.scripts import execute_zcml_for_scripts16from canonical.launchpad.scripts import execute_zcml_for_scripts
1317
18from canonical.librarian.interfaces import DUMP_FILE, SIGDUMPMEM
14from canonical.librarian.libraryprotocol import FileUploadFactory19from canonical.librarian.libraryprotocol import FileUploadFactory
15from canonical.librarian import storage, db20from canonical.librarian import storage, db
16from canonical.librarian import web as fatweb21from canonical.librarian import web as fatweb
@@ -64,3 +69,9 @@
64webPort = config.librarian.restricted_download_port69webPort = config.librarian.restricted_download_port
65uploadPort = config.librarian.restricted_upload_port70uploadPort = config.librarian.restricted_upload_port
66setUpListener(uploadPort, webPort, restricted=True)71setUpListener(uploadPort, webPort, restricted=True)
72
73# Setup a signal handler to dump the process' memory upon 'kill -44'.
74def sigdumpmem_handler(signum, frame):
75 scanner.dump_all_objects(DUMP_FILE)
76
77signal.signal(SIGDUMPMEM, sigdumpmem_handler)
6778
=== modified file 'lib/canonical/librarian/interfaces.py'
--- lib/canonical/librarian/interfaces.py 2009-06-25 05:30:52 +0000
+++ lib/canonical/librarian/interfaces.py 2010-04-20 14:37:25 +0000
@@ -5,9 +5,15 @@
5# pylint: disable-msg=E02135# pylint: disable-msg=E0213
6__metaclass__ = type6__metaclass__ = type
77
8import signal
9
8from zope.interface import Interface10from zope.interface import Interface
911
1012
13SIGDUMPMEM = signal.SIGRTMIN + 10
14DUMP_FILE = '/tmp/librarian-memory.dump'
15
16
11class LibrarianFailure(Exception):17class LibrarianFailure(Exception):
12 """Base class for failures trying to use the libararian."""18 """Base class for failures trying to use the libararian."""
1319
1420
=== added file 'lib/canonical/librarian/tests/test_sigdumpmem.py'
--- lib/canonical/librarian/tests/test_sigdumpmem.py 1970-01-01 00:00:00 +0000
+++ lib/canonical/librarian/tests/test_sigdumpmem.py 2010-04-20 14:37:25 +0000
@@ -0,0 +1,37 @@
1# Copyright 2010 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).
3
4"""Test the SIGDUMPMEM signal handler."""
5
6__metaclass__ = type
7
8import os
9import time
10
11from canonical.librarian.interfaces import DUMP_FILE, SIGDUMPMEM
12from canonical.librarian.ftests.harness import TacLibrarianTestSetup
13from canonical.testing.layers import LibrarianLayer
14from lp.testing import TestCase
15
16
17class SIGDUMPMEMTestCase(TestCase):
18 layer = LibrarianLayer
19
20 def test_sigdumpmem(self):
21 # Remove the dump file, if one exists.
22 if os.path.exists(DUMP_FILE):
23 os.unlink(DUMP_FILE)
24 self.assertFalse(os.path.exists(DUMP_FILE))
25
26 # We rely on the fact that the librarian was started by the test
27 # runner here as we use the LibrarianLayer.
28 pid = int(open(TacLibrarianTestSetup().pidfile).read())
29
30 # Send the signal and ensure the dump file is created.
31 os.kill(pid, SIGDUMPMEM)
32 timeout = 5
33 start_time = time.time()
34 while time.time() < start_time + timeout:
35 if os.path.exists(DUMP_FILE):
36 break
37 self.assertTrue(os.path.exists(DUMP_FILE))