[PATCH] Give unused DB connections back to the pool.
Pooling is only able to work if unused connections are given back asap.
While this patch is only a quick fix, it should fix the
too-many-open-connections error (assuming that DBUtil works as
expected).
Signed-off-by: Bernd Zeimetz <bernd@bzed.de>
---
web/app/snapshot/controllers/archive.py | 10 ++++++-
web/app/snapshot/controllers/package.py | 39 ++++++++++++++++--------------
web/app/snapshot/controllers/root.py | 3 +-
3 files changed, 31 insertions(+), 21 deletions(-)
diff --git a/web/app/snapshot/controllers/archive.py b/web/app/snapshot/controllers/archive.py
index c54df2b..45a918f 100644
--- a/web/app/snapshot/controllers/archive.py
+++ b/web/app/snapshot/controllers/archive.py
@@ -74,15 +74,17 @@ class ArchiveController(BaseController):
yearmonths = g.shm.mirrorruns_get_yearmonths_from_archive(self._db(), archive)
if yearmonths is None:
+ self._db_close()
abort(404, 'Archive "%s" does not exist'%(archive))
c.yearmonths = yearmonths
c.archive = archive
c.breadcrumbs = self._build_crumbs(archive)
c.title = archive
- return render('/archive.mako')
+ ret =render('/archive.mako')
finally:
self._db_close()
+ return ret
def _archive_ym(self, archive, year, month):
try:
@@ -93,8 +95,10 @@ class ArchiveController(BaseController):
runs = g.shm.mirrorruns_get_runs_from_archive_ym(self._db(), archive, year, month)
if runs is None:
+ self._db_close()
abort(404, 'Archive "%s" does not exist'%(archive))
if len(runs) == 0:
+ self._db_close()
abort(404, 'Found no mirrorruns for archive %s in %s-%s.'%(archive, year, month))
c.archive = archive
@@ -107,14 +111,16 @@ class ArchiveController(BaseController):
'run_mr': rfc3339_timestamp(r['run'])
}, runs)
c.title = '%s:%s-%02d'%(archive, year, int(month))
- return render('/archive-runs.mako')
+ ret = render('/archive-runs.mako')
finally:
self._db_close()
+ return ret
def _regular_file(self, digest, visiblepath=None):
try:
realpath = g.shm.get_filepath(self._db(), digest)
fa = SnapshotFileApp(realpath, digest, visiblepath)
+ self._db_close()
return fa(request.environ, self.start_response)
except OSError, error:
if (error.errno == errno.ENOENT):
diff --git a/web/app/snapshot/controllers/package.py b/web/app/snapshot/controllers/package.py
index c3240ea..a950200 100644
--- a/web/app/snapshot/controllers/package.py
+++ b/web/app/snapshot/controllers/package.py
@@ -69,9 +69,11 @@ class PackageController(BaseController):
c.packages = link_quote_array(pkgs)
c.breadcrumbs = self._build_crumbs(start=start)
c.title = '%s*'%(start)
- return render('/package-list-packages.mako')
+ ret = render('/package-list-packages.mako')
finally:
self._db_close()
+ return ret
+
else:
return redirect_to("../")
@@ -89,9 +91,10 @@ class PackageController(BaseController):
c.sourceversions = link_quote_array(sourceversions)
c.breadcrumbs = self._build_crumbs(source)
c.title = source
- return render('/package-source.mako')
+ ret = render('/package-source.mako')
finally:
self._db_close()
+ return ret
def _attribute_escape(self, a):
return re.sub('[^a-zA-Z0-9_.-]', lambda m: ':%x:'%(ord(m.group())), a)
@@ -106,6 +109,7 @@ class PackageController(BaseController):
# we may have binaries without sources.
if len(sourcefiles) == 0 and len(binpkgs) == 0:
+ self._db_close()
abort(404, 'No source or binary packages found')
binpkgs = map(lambda b: dict(b), binpkgs)
@@ -134,9 +138,10 @@ class PackageController(BaseController):
c.fileinfo = fileinfo
c.breadcrumbs = self._build_crumbs(source, version)
c.title = '%s (%s)'%(source, version)
- return render('/package-source-one.mako')
+ ret = render('/package-source-one.mako')
finally:
self._db_close()
+ return ret
@@ -146,6 +151,7 @@ class PackageController(BaseController):
fileinfo = map(lambda x: dict(x), g.shm.packages_get_file_info(self._db(), hash))
for fi in fileinfo:
fi['run'] = rfc3339_timestamp(fi['run'])
+ self._db_close()
return fileinfo
def _get_fileinfo_for_mr(self, hashes):
r = {}
@@ -158,10 +164,11 @@ class PackageController(BaseController):
try:
set_expires(int(config['app_conf']['expires.package.mr.list']))
pkgs = g.shm.packages_get_all(self._db())
- return { '_comment': "foo",
+ ret = { '_comment': "foo",
'result': map(lambda x: { 'package': x }, pkgs) }
finally:
self._db_close()
+ return ret
@jsonify
def mr_source(self, source):
@@ -169,11 +176,12 @@ class PackageController(BaseController):
set_expires(int(config['app_conf']['expires.package.mr.source']))
sourceversions = g.shm.packages_get_source_versions(self._db(), source)
if len(sourceversions) == 0: abort(404, 'No such source package')
- return { '_comment': "foo",
+ ret = { '_comment': "foo",
'package': source,
'result': map(lambda x: { 'version': x }, sourceversions) }
finally:
self._db_close()
+ return ret
@jsonify
def mr_source_version_srcfiles(self, source, version):
@@ -187,9 +195,9 @@ class PackageController(BaseController):
'result': map(lambda x: { 'hash': x }, sourcefiles) }
if ('fileinfo' in request.params) and (request.params['fileinfo'] == '1'):
r['fileinfo'] = self._get_fileinfo_for_mr(sourcefiles)
- return r
finally:
self._db_close()
+ return r
@jsonify
def mr_source_version_binpackages(self, source, version):
@@ -199,12 +207,13 @@ class PackageController(BaseController):
if len(binpkgs) == 0: abort(404, 'No such source package or no binary packages found')
binpkgs = map(lambda b: { 'name': b['name'],
'version': b['version'] }, binpkgs)
- return { '_comment': "foo",
+ ret = { '_comment': "foo",
'package': source,
'version': version,
'result': binpkgs }
finally:
self._db_close()
+ return ret
@jsonify
def mr_source_version_binfiles(self, source, version, binary, binary_version):
@@ -221,9 +230,9 @@ class PackageController(BaseController):
'result': binfiles }
if ('fileinfo' in request.params) and (request.params['fileinfo'] == '1'):
r['fileinfo'] = self._get_fileinfo_for_mr(map(lambda x: x['hash'], binfiles))
- return r
finally:
self._db_close()
+ return r
@jsonify
def mr_source_version_allfiles(self, source, version):
@@ -249,24 +258,18 @@ class PackageController(BaseController):
}
if ('fileinfo' in request.params) and (request.params['fileinfo'] == '1'):
r['fileinfo'] = self._get_fileinfo_for_mr(sourcefiles + binhashes)
- return r
finally:
self._db_close()
+ return r
@jsonify
def mr_fileinfo(self, hash):
if not re.match('[0-9a-f]{40}$', hash): # match matches only at start of string
abort(404, 'Invalid hash format.')
- try:
- return { '_comment': "foo",
- 'hash': hash,
- 'result': self._get_fileinfo_for_mr_one(hash) }
- return r
- finally:
- self._db_close()
-
-
+ return { '_comment': "foo",
+ 'hash': hash,
+ 'result': self._get_fileinfo_for_mr_one(hash) }
# vim:set et:
# vim:set ts=4:
diff --git a/web/app/snapshot/controllers/root.py b/web/app/snapshot/controllers/root.py
index b2b3165..cc3a139 100644
--- a/web/app/snapshot/controllers/root.py
+++ b/web/app/snapshot/controllers/root.py
@@ -17,9 +17,10 @@ class RootController(BaseController):
c.names = link_quote_array(g.shm.archives_get_list(db))
c.srcstarts = link_quote_array(g.shm.packages_get_name_starts(db))
set_expires(int(config['app_conf']['expires.root']))
- return render('/root.mako')
+ ret = render('/root.mako')
finally:
db.close()
+ return ret
# vim:set et:
# vim:set ts=4:
--
1.7.0.3
Reply to: