3022: API requests create a ton of entries in the 'sessions' table.
- New
- Review Board
ee**@plaxi***** (Google Code) (Is this you? Claim this profile.) | |
What's the URL of the page containing the problem? http://www.reviewboard.org/docs/manual/dev/admin/sites/management-commands/#search-indexing Describe the problem and any recommendations below. I would like to build an index for my site. However, the 'index' command seems to be invalid. Please provide any additional information below. I get the following error message: /usr/local/lib/python2.6/dist-packages/Django-1.4.5-py2.6.egg/django/conf/__init__.py:110: DeprecationWarning: The SECRET_KEY setting must not be empty. warnings.warn("The SECRET_KEY setting must not be empty.", DeprecationWarning) Unknown command: 'index' Type 'rbsite.pyc help' for usage. I have ReviewBoard version 1.7.9 installed (upgraded from 1.6.13) and Django version 1.4.5.
The command I'm using is (copied from search-cron.conf): sudo "/usr/bin/python" "/usr/local/bin/rb-site" manage "<site-name>" index -- --full
I think this is an error in the command you used: where you have "<site-name>", it should be the path to the site installation files on the filesystem.
-
+ UserError
Where I have "<site-name>", I put the full path to my site: /var/www/test-site However, this seems to be not working as I get the DeprecationWarning regarding the empty SECRET_KEY.
SECRET_KEY was already defined in my settings_local.py at /var/www/test-site/conf. So I don't understand why I got this warning in the first place. But I think this is unrelated to the actual problem I'm having: not being able to update/create the index (because of the error: 'Unknown command: 'index').
And if I do 'rb-site help' I get the following (in which I don't see the 'index'-command): Usage: rb-site command [options] path Options: --version show program's version number and exit -h, --help show this help message and exit --console force the console UI -d, --debug display debug output 'install' command: Installs a new Review Board site tree and generates web server configuration files. This will ask several questions about the site before performing the installation. --copy-media copy media files instead of symlinking --noinput run non-interactively using configuration provided in command-line options --domain-name=DOMAIN_NAME fully-qualified host name of the site, excluding the http://, port or path --site-root=SITE_ROOT path to the site relative to the domain name --static-url=STATIC_URL the URL containing the static (shipped) media files --media-url=MEDIA_URL the URL containing the uploaded media files --db-type=DB_TYPE database type (mysql, postgresql or sqlite3) --db-name=DB_NAME database name (not for sqlite3) --db-host=DB_HOST database host (not for sqlite3) --db-user=DB_USER database user (not for sqlite3) --db-pass=DB_PASS password for the database user (not for sqlite3) --cache-type=CACHE_TYPE cache server type (memcached or file) --cache-info=CACHE_INFO cache identifier (memcached connection string or file cache directory) --web-server-type=WEB_SERVER_TYPE web server (apache or lighttpd) --web-server-port=WEB_SERVER_PORT port that the web server should listen on --python-loader=PYTHON_LOADER python loader for apache (modpython, fastcgi or wsgi) --admin-user=ADMIN_USER the site administrator's username --admin-password=ADMIN_PASSWORD the site administrator's password --admin-email=ADMIN_EMAIL the site administrator's e-mail address 'upgrade' command: Upgrades an existing site installation, synchronizing media trees and upgrading the database, unless otherwise specified. --no-db-upgrade don't upgrade the database
The 'manage' command just doesn't have help defined, it's still there. It sounds like something's going wrong with the path to the site, so it's not finding the django management commands, and not finding your settings_local.py file.
Is there something I could check in my installation that might be causing this problem?
This is an error we've never seen before, and frankly, it doesn't make any sense. That is, unless you either have a stray settings_local.py or settings_local.pyc file somewhere on your filesystem. Does the 'shell' management command work? If so, can you do that and then: from django.conf import settings print settings.__file__ print settings.SECRET_KEY Don't actually show us the SECRET_KEY, but do show the file path, and let us know if the SECRET_KEY matches what is in your settings_local.py file.
-
- New + NeedInfo
When I issued: sudo "/usr/bin/python" "/usr/local/bin/rb-site" manage <path/to/site> shell I got the following deprecation warning: /usr/local/lib/python2.6/dist-packages/Django-1.4.5-py2.6.egg/django/conf/__init__.py:110: DeprecationWarning: The SECRET_KEY setting must not be empty. warnings.warn("The SECRET_KEY setting must not be empty.", DeprecationWarning) Although, the shell did start. However, when I issue following commands: from django.conf import settings print settings.__file__ I got: /usr/local/lib/python2.6/dist-packages/Django-1.4.5-py2.6.egg/django/utils/functional.pyc in inner(self, *args) 183 if self._wrapped is empty: 184 self._setup() --> 185 return func(self._wrapped, *args) 186 return inner 187 AttributeError: 'Settings' object has no attribute '__file__'
I think I have solved part of the problem :D In our company, we have a 'commit-reader'-script running on the codereview server, which monitors any svn-commits. For each such commit, a draft review-request (or update review, depending on the commit-message) is created. During initialization of this script, it tries to synchronize svn and Review Board, by issuing many webapi-requests onto the Review Board server in order to find out which svn-revisions have already been added to Review Board. However, each webapi http-request creates a new record in the django_sessions-table. This gave problems, as the hard-disk quickly ran out of memory. In order to fix this, I 'patched' the Sessions-middleware, by creating the following file (about 2 years ago): # settings_local_sessionmiddleware.py ========================== from django.contrib.sessions.middleware import SessionMiddleware def dontsave(must_create=True): pass class PatchedSessionMiddleware(SessionMiddleware): def process_request(self, request): super(PatchedSessionMiddleware, self).process_request(request) # Because the commit_reader performs lots of requests to /api/... urls, # for each request a session-id would be stored in the database. # This would grow the database in size very quickly. # # This check prevents that. if request.path_info[0:5] == '/api/': request.session.save = dontsave # First import the original MIDDLEWARE_CLASSES-list from reviewboard.settings import MIDDLEWARE_CLASSES # Now overwrite the SessionMiddleware-class with our patched version cls = SessionMiddleware.__module__ + '.' + SessionMiddleware.__name__ idx = MIDDLEWARE_CLASSES.index(cls) MIDDLEWARE_CLASSES[idx] = __name__ + '.' + PatchedSessionMiddleware.__name__ #============================================================================ And finally I added the following line to the settings_local.py file: from settings_local_sessionmiddleware import MIDDLEWARE_CLASSES Apparently, importing this file was the cause of the current problem (perhaps due to a circular dependency?). By removing this line, it looks like everything works again. Indexing now works fine, as well as the 'rb-site manage shell' (although issuing 'print settings.__file__' still complains about the 'Settings' object not having this attribute). The only issue that remains is the Sessions-middleware. If I inspect my database, I see: relation | size -----------------------------------------------------+--------- public.django_session_pkey | 1785 MB public.django_session_expire_date | 1030 MB public.django_session | 699 MB pg_toast.pg_toast_16671 | 203 MB public.diffviewer_filediff | 70 MB pg_toast.pg_toast_119386 | 51 MB public.diffviewer_filediffdata | 19 MB public.reviews_reviewrequest | 3776 kB public.diffviewer_filediff_diff_hash_id | 3040 kB public.diffviewer_filediff_diff_hash_id_like | 3040 kB public.reviews_comment | 2752 kB pg_toast.pg_toast_16671_index | 2600 kB public.diffviewer_filediff_diffset_id | 2088 kB public.changedescs_changedescription | 1912 kB public.diffviewer_filediff_parent_diff_hash_id_like | 1848 kB public.diffviewer_filediff_parent_diff_hash_id | 1840 kB public.diffviewer_filediffdata_pkey | 1776 kB public.diffviewer_filediff_pkey | 1728 kB public.reviews_review | 1424 kB public.diffviewer_diffset | 1136 kB As can be seen, the session-data uses quite some space. Furthermore, I believe I already emptied the django_session table back then, when I created the patched middleware-class. Is this a known problem and is there a better way to solve this?
There is a 'clearsessions' management command that you can hook up to a cron job to clear out expired sessions. I'm going to repurpose this bug to see if we can disable session saving for API requests generally.
-
- NeedInfo + New -
+ Component-API -
+ API requests create a ton of entries in the 'sessions' table.
The 'clearsessions' command is not available in rbtools 0.5.1, is that right?
It's a management command to be run on the server. So you'd use something like this: $ rb-site manage /path/to/site clearsessions
My bad, it's part of reviewboard and not rbtools. However, in our version (1.7.9) the command 'clearsessions' is not available. What exactly does the command do? Perhaps I can do it manually for the time being, until we upgrade to a newer version.