Github user reductionista commented on a diff in the pull request: https://github.com/apache/madlib/pull/316#discussion_r215104112 --- Diff: src/ports/postgres/modules/utilities/control.py_in --- @@ -158,6 +159,61 @@ class MinWarning(ContextDecorator): format(oldMsgLevel=self.oldMsgLevel)) +class AOControl(ContextDecorator): + + """ + @brief: A wrapper that enables/disables the AO storage option + """ + + def __init__(self, enable=False): + self.to_enable = enable + self.was_ao_enabled = False + self.guc_exists = True + self.storage_options_dict = dict() + + def _parse_gp_default_storage_options(self, gp_default_storage_options_str): + """ Parse comma separated key=value pairs + + Example: + appendonly=false,blocksize=32768,compresstype=none,checksum=true,orientation=row + """ + self.storage_options_dict = extract_keyvalue_params(gp_default_storage_options_str) + self.storage_options_dict['appendonly'] = bool( + strtobool(self.storage_options_dict['appendonly'])) + + def _join_gp_defaut_storage_options(self): + return ','.join(['{0}={1}'.format(k, v) + for k, v in self.storage_options_dict.iteritems()]) + + def __enter__(self): + try: + _storage_options_str = plpy.execute( + "show gp_default_storage_options")[0]["gp_default_storage_options"] + self._parse_gp_default_storage_options(_storage_options_str) + + # Set APPENDONLY=False after backing up existing value + self.was_ao_enabled = self.storage_options_dict['appendonly'] + self.storage_options_dict['appendonly'] = self.to_enable + plpy.execute("set gp_default_storage_options={0}". + format(self._join_gp_defaut_storage_options())) + except plpy.SPIError: + self.guc_exists = False + finally: + return self + + def __exit__(self, *args): + if args and args[0]: + # an exception was raised in code. We return False so that any + # exception is re-raised after exit. The transaction will not + # commit leading to reset of parameter value. --- End diff -- Is it guaranteed that a raised exception will result in a reset of appendonly back to its original value? Seems like the "set gp_default_storage_options=" command executed in the __enter__ block may not get reverted when an exception is raised, even if the transaction that follows is reverted.
---