Skip to content
Snippets Groups Projects
Commit 4c2468c2 authored by Marko Kuder's avatar Marko Kuder
Browse files

fix _table_metadata being recreated on each restart, because it causes deadlocks

- https://github.com/ckan/ckan/commit/a09c11bd7d61f2940b2c6430a9c1835e914c5def
- https://github.com/ckan/ckan/issues/2345
parent 9cdefda3
No related branches found
Tags OPSIv2.16.4
No related merge requests found
......@@ -120,7 +120,6 @@ class DatastorePlugin(p.SingletonPlugin):
'of _table_metadata are skipped.')
else:
self._check_urls_and_permissions()
self._create_alias_table()
def update_config(self, config):
p.toolkit.add_template_directory(config, 'templates')
......@@ -224,34 +223,6 @@ class DatastorePlugin(p.SingletonPlugin):
write_connection.close()
return True
def _create_alias_table(self):
mapping_sql = '''
SELECT DISTINCT
substr(md5(dependee.relname || COALESCE(dependent.relname, '')), 0, 17) AS "_id",
dependee.relname AS name,
dependee.oid AS oid,
dependent.relname AS alias_of
-- dependent.oid AS oid
FROM
pg_class AS dependee
LEFT OUTER JOIN pg_rewrite AS r ON r.ev_class = dependee.oid
LEFT OUTER JOIN pg_depend AS d ON d.objid = r.oid
LEFT OUTER JOIN pg_class AS dependent ON d.refobjid = dependent.oid
WHERE
(dependee.oid != dependent.oid OR dependent.oid IS NULL) AND
(dependee.relname IN (SELECT tablename FROM pg_catalog.pg_tables)
OR dependee.relname IN (SELECT viewname FROM pg_catalog.pg_views)) AND
dependee.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public')
ORDER BY dependee.oid DESC;
'''
create_alias_table_sql = u'CREATE OR REPLACE VIEW "_table_metadata" AS {0}'.format(mapping_sql)
try:
connection = db._get_engine(
{'connection_url': self.write_url}).connect()
connection.execute(create_alias_table_sql)
finally:
connection.close()
def get_actions(self):
actions = {'datastore_create': action.datastore_create,
'datastore_upsert': action.datastore_upsert,
......
......@@ -48,3 +48,24 @@ GRANT SELECT ON ALL TABLES IN SCHEMA public TO "{readuser}";
-- grant access to new tables and views by default
ALTER DEFAULT PRIVILEGES FOR USER "{writeuser}" IN SCHEMA public
GRANT SELECT ON TABLES TO "{readuser}";
CREATE OR REPLACE VIEW "_table_metadata" AS
SELECT DISTINCT
substr(md5(dependee.relname || COALESCE(dependent.relname, '')), 0, 17) AS "_id",
dependee.relname AS name,
dependee.oid AS oid,
dependent.relname AS alias_of
-- dependent.oid AS oid
FROM
pg_class AS dependee
LEFT OUTER JOIN pg_rewrite AS r ON r.ev_class = dependee.oid
LEFT OUTER JOIN pg_depend AS d ON d.objid = r.oid
LEFT OUTER JOIN pg_class AS dependent ON d.refobjid = dependent.oid
WHERE
(dependee.oid != dependent.oid OR dependent.oid IS NULL) AND
(dependee.relname IN (SELECT tablename FROM pg_catalog.pg_tables)
OR dependee.relname IN (SELECT viewname FROM pg_catalog.pg_views)) AND
dependee.relnamespace = (SELECT oid FROM pg_namespace WHERE nspname='public')
ORDER BY dependee.oid DESC;
ALTER VIEW "_table_metadata" OWNER TO "{writeuser}";
GRANT SELECT ON "_table_metadata" TO "{readuser}";
\ No newline at end of file
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment