Initializing a longer resource id in DB2 nosql backend

Longer resource id is reqpured by compute node's resource as their
id is '<hostname>_<nodename>'. DB2 creates a VARCHAR(70) for
resource id when its length < 70. But DB2 can create a VARCHAR(n)
for the resource id which has n(n>70) characters. This patch adds
an option 'db2nosql_resource_id_maxlen'(default is 512) to allow
user to adjust the value for their ENV.

@DocImpact

Change-Id: Ib58cfffb238d3b818831f0ccfe4659cfcf9c3c8a
Closes-Bug: #1387532
This commit is contained in:
Zhi Kun Liu 2014-10-30 15:05:39 +08:00 committed by Kennan
parent ee18cdef99
commit 6737e0b088
3 changed files with 35 additions and 1 deletions

View File

@ -63,6 +63,11 @@ OPTS = [
help='The name of the replica set which is used to connect to ' help='The name of the replica set which is used to connect to '
'MongoDB database. If it is set, MongoReplicaSetClient ' 'MongoDB database. If it is set, MongoReplicaSetClient '
'will be used instead of MongoClient.'), 'will be used instead of MongoClient.'),
cfg.IntOpt('db2nosql_resource_id_maxlen',
default=512,
help="The max length of resources id in DB2 nosql, "
"the value should be larger than len(hostname) * 2 "
"as compute node's resource id is <hostname>_<nodename>."),
] ]
cfg.CONF.register_opts(OPTS, group='database') cfg.CONF.register_opts(OPTS, group='database')

View File

@ -28,6 +28,7 @@ import sys
import bson.code import bson.code
import bson.objectid import bson.objectid
from oslo.config import cfg
from oslo.utils import timeutils from oslo.utils import timeutils
import pymongo import pymongo
import six import six
@ -159,7 +160,14 @@ class Connection(pymongo_base.Connection):
# queries, so the database won't take advantage of an index # queries, so the database won't take advantage of an index
# including both. # including both.
if self.db.resource.index_information() == {}: if self.db.resource.index_information() == {}:
resource_id = str(bson.objectid.ObjectId()) # Initializing a longer resource id to workaround DB2 nosql issue.
# Longer resource id is required by compute node's resource as
# their id is '<hostname>_<nodename>'. DB2 creates a VARCHAR(70)
# for resource id when its length < 70. But DB2 can create a
# VARCHAR(n) for the resource id which has n(n>70) characters.
# Users can adjust 'db2nosql_resource_id_maxlen'(default is 512)
# for their ENV.
resource_id = 'x' * cfg.CONF.database.db2nosql_resource_id_maxlen
self.db.resource.insert({'_id': resource_id, self.db.resource.insert({'_id': resource_id,
'no_key': resource_id}) 'no_key': resource_id})
meter_id = str(bson.objectid.ObjectId()) meter_id = str(bson.objectid.ObjectId())

View File

@ -26,8 +26,12 @@
from ceilometer.alarm.storage import impl_db2 as impl_db2_alarm from ceilometer.alarm.storage import impl_db2 as impl_db2_alarm
from ceilometer.event.storage import impl_db2 as impl_db2_event from ceilometer.event.storage import impl_db2 as impl_db2_event
from ceilometer.storage import impl_db2 from ceilometer.storage import impl_db2
from ceilometer.storage.mongo import utils as pymongo_utils
from ceilometer.tests import base as test_base from ceilometer.tests import base as test_base
import mock
from oslo.config import cfg
class CapabilitiesTest(test_base.BaseTestCase): class CapabilitiesTest(test_base.BaseTestCase):
# Check the returned capabilities list, which is specific to each DB # Check the returned capabilities list, which is specific to each DB
@ -92,3 +96,20 @@ class CapabilitiesTest(test_base.BaseTestCase):
} }
actual_capabilities = impl_db2.Connection.get_storage_capabilities() actual_capabilities = impl_db2.Connection.get_storage_capabilities()
self.assertEqual(expected_capabilities, actual_capabilities) self.assertEqual(expected_capabilities, actual_capabilities)
class ConnectionTest(test_base.BaseTestCase):
@mock.patch.object(pymongo_utils.ConnectionPool, 'connect')
def test_upgrade(self, mongo_connect):
conn_mock = mock.MagicMock()
conn_mock.server_info.return_value = {}
conn_mock.ceilodb2.resource.index_information.return_value = {}
mongo_connect.return_value = conn_mock
cfg.CONF.set_override('db2nosql_resource_id_maxlen',
256,
group='database')
impl_db2.Connection('db2://user:pwd@localhost:27017/ceilodb2')
resource_id = 'x' * 256
conn_mock.ceilodb2.resource.insert.assert_called_with(
{'_id': resource_id,
'no_key': resource_id})