diff options
author | Ilya Tyaptin <ityaptin@mirantis.com> | 2014-08-12 15:01:19 +0400 |
---|---|---|
committer | Ilya Tyaptin <ityaptin@mirantis.com> | 2014-09-19 16:03:39 +0400 |
commit | 5e8fb13dbb357bdb0be4500f5e65217c5ba9b881 (patch) | |
tree | 58fe40d60510a7d9cbabf61f0b56a5967cdc720d | |
parent | 7b89798be3b81259a0440dec928cb11cccb7158d (diff) | |
download | ceilometer-5e8fb13dbb357bdb0be4500f5e65217c5ba9b881.tar.gz |
[HBase] Catch AlreadyExists error in Connection upgrade
Now in upstream, if HBase table exists when we upgrade
backend AlreadyExists exception is raised. Also
exception raising interrupts creating of other tables.
It is an incorrect behavior because we should create
all tables and migrate them if need or use existing
tables.
Change-Id: I8e8a8ae633351de8393b5103910510dd635245be
Closes: bug #1370508
-rw-r--r-- | ceilometer/alarm/storage/impl_hbase.py | 5 | ||||
-rw-r--r-- | ceilometer/storage/hbase/utils.py | 23 | ||||
-rw-r--r-- | ceilometer/storage/impl_hbase.py | 6 |
3 files changed, 29 insertions, 5 deletions
diff --git a/ceilometer/alarm/storage/impl_hbase.py b/ceilometer/alarm/storage/impl_hbase.py index 27311c66..8a50bcae 100644 --- a/ceilometer/alarm/storage/impl_hbase.py +++ b/ceilometer/alarm/storage/impl_hbase.py @@ -98,9 +98,10 @@ class Connection(base.Connection): self.conn_pool = self._get_connection_pool(opts) def upgrade(self): + tables = [self.ALARM_HISTORY_TABLE, self.ALARM_TABLE] + column_families = {'f': dict()} with self.conn_pool.connection() as conn: - conn.create_table(self.ALARM_TABLE, {'f': dict()}) - conn.create_table(self.ALARM_HISTORY_TABLE, {'f': dict()}) + hbase_utils.create_tables(conn, tables, column_families) def clear(self): LOG.debug(_('Dropping HBase schema...')) diff --git a/ceilometer/storage/hbase/utils.py b/ceilometer/storage/hbase/utils.py index 4a2a0b08..1fe4a3a4 100644 --- a/ceilometer/storage/hbase/utils.py +++ b/ceilometer/storage/hbase/utils.py @@ -17,9 +17,14 @@ import datetime import json import bson.json_util +from happybase.hbase import ttypes +from ceilometer.openstack.common.gettextutils import _ +from ceilometer.openstack.common import log from ceilometer import utils +LOG = log.getLogger(__name__) + EVENT_TRAIT_TYPES = {'none': 0, 'string': 1, 'integer': 2, 'float': 3, 'datetime': 4} OP_SIGN = {'eq': '=', 'lt': '<', 'le': '<=', 'ne': '!=', 'gt': '>', 'ge': '>='} @@ -416,3 +421,21 @@ def object_hook(dct): dt = bson.json_util.object_hook(dct) return dt.replace(tzinfo=None) return bson.json_util.object_hook(dct) + + +def create_tables(conn, tables, column_families): + for table in tables: + try: + conn.create_table(table, column_families) + except ttypes.AlreadyExists: + if conn.table_prefix: + table = ("%(table_prefix)s" + "%(separator)s" + "%(table_name)s" % + dict(table_prefix=conn.table_prefix, + separator=conn.table_prefix_separator, + table_name=table)) + + LOG.warn(_("Cannot create table %(table_name)s " + "it already exists. Ignoring error") + % {'table_name': table})
\ No newline at end of file diff --git a/ceilometer/storage/impl_hbase.py b/ceilometer/storage/impl_hbase.py index 3899f482..4a3a4e6f 100644 --- a/ceilometer/storage/impl_hbase.py +++ b/ceilometer/storage/impl_hbase.py @@ -161,10 +161,10 @@ class Connection(base.Connection): self.conn_pool = self._get_connection_pool(opts) def upgrade(self): + tables = [self.RESOURCE_TABLE, self.METER_TABLE, self.EVENT_TABLE] + column_families = {'f': dict(max_versions=1)} with self.conn_pool.connection() as conn: - conn.create_table(self.RESOURCE_TABLE, {'f': dict(max_versions=1)}) - conn.create_table(self.METER_TABLE, {'f': dict(max_versions=1)}) - conn.create_table(self.EVENT_TABLE, {'f': dict(max_versions=1)}) + hbase_utils.create_tables(conn, tables, column_families) def clear(self): LOG.debug(_('Dropping HBase schema...')) |