From a04ef2278ad64b6c1eac9508b2f38612c101a484 Mon Sep 17 00:00:00 2001 From: Nikesh Mahalka Date: Wed, 14 Sep 2016 05:37:12 -0400 Subject: [PATCH] Use IP in Kaminario locks and add/delete loggers If some K2 arrays are configured with same 'volume_backend_name' in cinder.conf, then 'self.k2_lock_name' will be same for attaching and detaching volumes for these arrays and it will block simultaneous attach and detach volumes for these K2 arrays. Use of K2 management IP in place of 'volume_backend_name' will keep 'self.k2_lock_name' different for attaching and detaching volumes and allow simultaneous attach and detach volumes for these K2 arrays. Also, Adding/Deleting loggers according to below thumb rules: 1. startup/shutdown functions should use the logging decorator 2. each function that creates objects should use the logging decorator 3. helper functions that do not create objects should NOT use the logging decorator 4. API functions should use the logging decorator Change-Id: I1b70bee41f6c42585d0df40a4ae59c33f038b58c Closes-Bug: #1623328 Co-Authored-By: Ido Benda --- .../drivers/kaminario/kaminario_common.py | 24 +++++++------------ .../volume/drivers/kaminario/kaminario_fc.py | 2 -- .../drivers/kaminario/kaminario_iscsi.py | 1 - 3 files changed, 9 insertions(+), 18 deletions(-) diff --git a/cinder/volume/drivers/kaminario/kaminario_common.py b/cinder/volume/drivers/kaminario/kaminario_common.py index 924a05c5c..405df0af4 100644 --- a/cinder/volume/drivers/kaminario/kaminario_common.py +++ b/cinder/volume/drivers/kaminario/kaminario_common.py @@ -87,7 +87,6 @@ if krest: retries=MAX_K2_RETRY) def _request(self, method, *args, **kwargs): try: - LOG.debug("running through the _request wrapper...") self.krestlock.acquire() return super(KrestWrap, self)._request(method, *args, **kwargs) @@ -142,9 +141,10 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): self.configuration.append_config_values(kaminario2_opts) self.replica = None self._protocol = None - k2_lock_sfx = self.configuration.safe_get('volume_backend_name') or '' + k2_lock_sfx = self.configuration.safe_get('san_ip') self.k2_lock_name = "%s-%s" % (K2_LOCK_PREFIX, k2_lock_sfx) + @kaminario_logger def check_for_setup_error(self): if krest is None: msg = _("Unable to import 'krest' python module.") @@ -177,7 +177,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): LOG.error(msg) raise exception.KaminarioCinderDriverException(reason=msg) - @kaminario_logger def _check_ops(self): """Ensure that the options we care about are set.""" required_ops = ['san_ip', 'san_login', 'san_password'] @@ -349,6 +348,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): raise exception.KaminarioCinderDriverException( reason=six.text_type(ex.message)) + @kaminario_logger def _delete_by_ref(self, device, url, name, msg): rs = device.search(url, name=name) for result in rs.hits: @@ -522,6 +522,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): back_end_ip = self.replica.backend_id return back_end_ip, volume_updates + @kaminario_logger def _create_volume_replica_user_snap(self, k2, sess): snap = k2.new("snapshots") snap.is_application_consistent = "False" @@ -743,7 +744,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): for s in rsnaps: s.delete() - @kaminario_logger def _check_for_status(self, obj, status): while obj.state != status: obj.refresh() @@ -819,7 +819,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): raise exception.KaminarioCinderDriverException( reason=six.text_type(ex.message)) - @kaminario_logger def update_volume_stats(self): conf = self.configuration LOG.debug("Searching system capacity in K2.") @@ -845,7 +844,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): 'replication_enabled': True, 'kaminario:replication': True} - @kaminario_logger def get_initiator_host_name(self, connector): """Return the initiator host name. @@ -855,32 +853,26 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): """ return re.sub('[^0-9a-zA-Z-_]', '_', connector.get('host', ''))[:32] - @kaminario_logger def get_volume_group_name(self, vid): """Return the volume group name.""" return "cvg-{0}".format(vid) - @kaminario_logger def get_volume_name(self, vid): """Return the volume name.""" return "cv-{0}".format(vid) - @kaminario_logger def get_session_name(self, vid): """Return the volume name.""" return "ssn-{0}".format(vid) - @kaminario_logger def get_snap_name(self, sid): """Return the snapshot name.""" return "cs-{0}".format(sid) - @kaminario_logger def get_view_name(self, vid): """Return the view name.""" return "cview-{0}".format(vid) - @kaminario_logger def get_rep_name(self, name): """Return the corresponding replication names.""" return "r{0}".format(name) @@ -893,7 +885,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): host = host_rs.hits[0] host.delete() - @kaminario_logger def get_policy(self): """Return the retention policy.""" try: @@ -905,7 +896,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): raise exception.KaminarioCinderDriverException( reason=six.text_type(ex.message)) - @kaminario_logger def _get_volume_object(self, volume): vol_name = self.get_volume_name(volume.id) if volume.replication_status == K2_REP_FAILED_OVER: @@ -918,7 +908,6 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): raise exception.KaminarioCinderDriverException(reason=msg) return vol_rs.hits[0] - @kaminario_logger def _get_lun_number(self, vol, host): volsnap = None LOG.debug("Searching volsnaps in K2.") @@ -964,6 +953,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): else: LOG.warning(_LW("Host: %s not found on K2."), host_name) + @kaminario_logger def k2_initialize_connection(self, volume, connector): # Get volume object. if type(volume).__name__ != 'RestObject': @@ -1029,6 +1019,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): return True return False + @kaminario_logger def manage_existing(self, volume, existing_ref): vol_name = existing_ref['source-name'] new_name = self.get_volume_name(volume.id) @@ -1068,6 +1059,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): existing_ref=existing_ref, reason=six.text_type(ex.message)) + @kaminario_logger def manage_existing_get_size(self, volume, existing_ref): vol_name = existing_ref['source-name'] v_rs = self.client.search("volumes", name=vol_name) @@ -1080,6 +1072,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): existing_ref=existing_ref, reason=_('Unable to get size of manage volume.')) + @kaminario_logger def after_volume_copy(self, ctxt, volume, new_volume, remote=None): self.delete_volume(volume) vg_name_old = self.get_volume_group_name(volume.id) @@ -1093,6 +1086,7 @@ class KaminarioCinderDriver(cinder.volume.driver.ISCSIDriver): vol_new.name = vol_name_old vol_new.save() + @kaminario_logger def retype(self, ctxt, volume, new_type, diff, host): old_type = volume.get('volume_type') vg_name = self.get_volume_group_name(volume.id) diff --git a/cinder/volume/drivers/kaminario/kaminario_fc.py b/cinder/volume/drivers/kaminario/kaminario_fc.py index 7b0389f0e..e845ddcc1 100644 --- a/cinder/volume/drivers/kaminario/kaminario_fc.py +++ b/cinder/volume/drivers/kaminario/kaminario_fc.py @@ -112,7 +112,6 @@ class KaminarioFCDriver(common.KaminarioCinderDriver): self.client = temp_client return properties - @kaminario_logger def get_target_info(self, volume): LOG.debug("Searching target wwpns in K2.") fc_ports_rs = self.client.search("system/fc_ports") @@ -168,7 +167,6 @@ class KaminarioFCDriver(common.KaminarioCinderDriver): reason=six.text_type(ex.message)) return host, host_rs, host_name - @kaminario_logger def _build_initiator_target_map(self, connector, all_target_wwns): """Build the target_wwns and the initiator target map.""" target_wwns = [] diff --git a/cinder/volume/drivers/kaminario/kaminario_iscsi.py b/cinder/volume/drivers/kaminario/kaminario_iscsi.py index 549a9e986..3e8ef298c 100644 --- a/cinder/volume/drivers/kaminario/kaminario_iscsi.py +++ b/cinder/volume/drivers/kaminario/kaminario_iscsi.py @@ -91,7 +91,6 @@ class KaminarioISCSIDriver(common.KaminarioCinderDriver): if temp_client: self.client = temp_client - @kaminario_logger def get_target_info(self, volume): LOG.debug("Searching first iscsi port ip without wan in K2.") iscsi_ip_rs = self.client.search("system/net_ips", wan_port="")