summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIlya Tyaptin <ityaptin@mirantis.com>2014-08-12 15:01:19 +0400
committerIlya Tyaptin <ityaptin@mirantis.com>2014-09-19 16:03:39 +0400
commit5e8fb13dbb357bdb0be4500f5e65217c5ba9b881 (patch)
tree58fe40d60510a7d9cbabf61f0b56a5967cdc720d
parent7b89798be3b81259a0440dec928cb11cccb7158d (diff)
downloadceilometer-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.py5
-rw-r--r--ceilometer/storage/hbase/utils.py23
-rw-r--r--ceilometer/storage/impl_hbase.py6
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...'))