[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

[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: