From 617e59bde660f919df0818611b911ae35f8b7247 Mon Sep 17 00:00:00 2001 From: Mitsuhiro Tanino Date: Tue, 8 Jul 2014 15:52:11 -0400 Subject: [PATCH] Configure write cache option of tgtd iscsi driver Cinder LVMiSCSI driver is using default value of write-cache parameter of tgtd iscsi driver. In this setting, write I/O from guest instance is cached on dirty cache of a host.(write-back mode) In this case, data lost may be occurred if the host crashes before flushing dirty cache. This may cause a lot of instances to lose their data. In order to avoid this issue, it is better to turn off the write cache. (write-through mode) This patch adds "iscsi_write_cache" parameter to configure a behavior of write cache. The default value is "iscsi_write_cache=on".(write-back mode) Closes-Bug: 1336568 DocImpact Change-Id: I7a495bc6118d4254576bdf1620a04ac537b3078d Signed-off-by: Mitsuhiro Tanino --- cinder/brick/iscsi/iscsi.py | 10 ++++++++-- cinder/tests/test_iscsi.py | 4 +++- cinder/volume/driver.py | 6 ++++++ cinder/volume/drivers/lvm.py | 3 ++- cinder/volume/iscsi.py | 13 ++++++++----- etc/cinder/cinder.conf.sample | 6 ++++++ 6 files changed, 33 insertions(+), 9 deletions(-) diff --git a/cinder/brick/iscsi/iscsi.py b/cinder/brick/iscsi/iscsi.py index 4ae78fee9..48e4dad08 100644 --- a/cinder/brick/iscsi/iscsi.py +++ b/cinder/brick/iscsi/iscsi.py @@ -83,6 +83,7 @@ class TgtAdm(TargetAdmin): backing-store %s lld iscsi + write-cache %s """ VOLUME_CONF_WITH_CHAP_AUTH = """ @@ -90,6 +91,7 @@ class TgtAdm(TargetAdmin): backing-store %s lld iscsi %s + write-cache %s """ @@ -165,11 +167,13 @@ class TgtAdm(TargetAdmin): fileutils.ensure_tree(self.volumes_dir) vol_id = name.split(':')[1] + write_cache = kwargs.get('write_cache', 'on') if chap_auth is None: - volume_conf = self.VOLUME_CONF % (name, path) + volume_conf = self.VOLUME_CONF % (name, path, write_cache) else: volume_conf = self.VOLUME_CONF_WITH_CHAP_AUTH % (name, - path, chap_auth) + path, chap_auth, + write_cache) LOG.info(_('Creating iscsi_target for: %s') % vol_id) volumes_dir = self.volumes_dir @@ -600,6 +604,7 @@ class ISERTgtAdm(TgtAdm): driver iser backing-store %s + write_cache %s """ VOLUME_CONF_WITH_CHAP_AUTH = """ @@ -607,6 +612,7 @@ class ISERTgtAdm(TgtAdm): driver iser backing-store %s %s + write_cache %s """ diff --git a/cinder/tests/test_iscsi.py b/cinder/tests/test_iscsi.py index d24989be2..74e40f13b 100644 --- a/cinder/tests/test_iscsi.py +++ b/cinder/tests/test_iscsi.py @@ -34,6 +34,7 @@ class TargetAdminTestCase(object): self.path = '/foo' self.vol_id = 'blaa' self.vol_name = 'volume-blaa' + self.write_cache = 'off' self.db = {} self.script_template = None @@ -93,7 +94,8 @@ class TargetAdminTestCase(object): target_helper = self.driver.get_target_helper(self.db) target_helper.set_execute(self.fake_execute) target_helper.create_iscsi_target(self.target_name, self.tid, - self.lun, self.path) + self.lun, self.path, + write_cache=self.write_cache) target_helper.show_target(self.tid, iqn=self.target_name) target_helper.remove_iscsi_target(self.tid, self.lun, self.vol_id, self.vol_name) diff --git a/cinder/volume/driver.py b/cinder/volume/driver.py index 87129dbfd..31a77b72f 100644 --- a/cinder/volume/driver.py +++ b/cinder/volume/driver.py @@ -111,6 +111,12 @@ volume_opts = [ default=0, help='The upper limit of bandwidth of volume copy. ' '0 => unlimited'), + cfg.StrOpt('iscsi_write_cache', + default='on', + help='Sets the behavior of the iSCSI target to either ' + 'perform write-back(on) or write-through(off). ' + 'This parameter is valid if iscsi_helper is set ' + 'to tgtadm or iseradm.'), ] # for backward compatibility diff --git a/cinder/volume/drivers/lvm.py b/cinder/volume/drivers/lvm.py index dc98a7870..5ca82862c 100644 --- a/cinder/volume/drivers/lvm.py +++ b/cinder/volume/drivers/lvm.py @@ -519,7 +519,8 @@ class LVMISCSIDriver(LVMVolumeDriver, driver.ISCSIDriver): context, volume, iscsi_name, volume_path, - self.configuration.volume_group) + self.configuration.volume_group, + self.configuration) if model_update: self.db.volume_update(context, volume['id'], model_update) diff --git a/cinder/volume/iscsi.py b/cinder/volume/iscsi.py index 22649324b..f13eebea1 100644 --- a/cinder/volume/iscsi.py +++ b/cinder/volume/iscsi.py @@ -52,7 +52,9 @@ class _ExportMixin(object): iscsi_target, 0, volume_path, - chap_auth) + chap_auth, + write_cache= + conf.iscsi_write_cache) data = {} data['location'] = self._iscsi_location( conf.iscsi_ip_address, tid, iscsi_name, conf.iscsi_port, lun) @@ -86,7 +88,7 @@ class _ExportMixin(object): self.remove_iscsi_target(iscsi_target, 0, volume['id'], volume['name']) def ensure_export(self, context, volume, iscsi_name, volume_path, - vg_name, old_name=None): + vg_name, conf, old_name=None): iscsi_target = self._get_target_for_ensure_export(context, volume['id']) if iscsi_target is None: @@ -106,7 +108,8 @@ class _ExportMixin(object): old_name = None self.create_iscsi_target(iscsi_name, iscsi_target, 0, volume_path, chap_auth, check_exit_code=False, - old_name=old_name) + old_name=old_name, + write_cache=conf.iscsi_write_cache) def _ensure_iscsi_targets(self, context, host, max_targets): """Ensure that target ids have been created in datastore.""" @@ -223,7 +226,7 @@ class FakeIscsiHelper(_ExportMixin, iscsi.FakeIscsiHelper): pass def ensure_export(self, context, volume, iscsi_name, volume_path, - vg_name, old_name=None): + vg_name, conf, old_name=None): pass @@ -241,7 +244,7 @@ class LioAdm(_ExportMixin, iscsi.LioAdm): self.remove_iscsi_target(iscsi_target, 0, volume['id'], volume['name']) def ensure_export(self, context, volume, iscsi_name, volume_path, - vg_name, old_name=None): + vg_name, conf, old_name=None): try: volume_info = self.db.volume_get(context, volume['id']) (auth_method, diff --git a/etc/cinder/cinder.conf.sample b/etc/cinder/cinder.conf.sample index 887547bd4..dc56ee2ad 100644 --- a/etc/cinder/cinder.conf.sample +++ b/etc/cinder/cinder.conf.sample @@ -1036,6 +1036,12 @@ # (integer value) #volume_copy_bps_limit=0 +# Sets the behavior of the iSCSI target to either perform +# write-back(on) or write-through(off). This parameter is +# valid if iscsi_helper is set to tgtadm or iseradm. (string +# value) +#iscsi_write_cache=on + # # Options defined in cinder.volume.drivers.block_device -- 2.45.2