From 5e8fb13dbb357bdb0be4500f5e65217c5ba9b881 Mon Sep 17 00:00:00 2001 From: Ilya Tyaptin Date: Tue, 12 Aug 2014 15:01:19 +0400 Subject: [PATCH] [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 --- ceilometer/alarm/storage/impl_hbase.py | 5 +++-- ceilometer/storage/hbase/utils.py | 23 +++++++++++++++++++++++ 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 27311c661..8a50bcae7 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 4a2a0b080..1fe4a3a4e 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 3899f4825..4a3a4e6fc 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...'))