def freeze_safe()

in VMBackup/main/fsfreezer.py [0:0]


    def freeze_safe(self,timeout):
        self.root_seen = False
        error_msg=''
        timedout = False
        self.skip_freeze = True 
        mounts_to_skip = None
        try:
            mounts_to_skip = self.hutil.get_strvalue_from_configfile('MountsToSkip','')
            self.logger.log("skipped mount :" + str(mounts_to_skip), True)
            mounts_list_to_skip = mounts_to_skip.split(',')
        except Exception as e:
            errMsg='Failed to read from config, Exception %s, stack trace: %s' % (str(e), traceback.format_exc())
            self.logger.log(errMsg,True,'Warning')
        try:
            freeze_result = FreezeResult()
            freezebin=os.path.join(os.getcwd(),os.path.dirname(__file__),self.safeFreezeFolderPath)
            args=[freezebin,str(timeout)]
            no_mount_found = True
            for mount in self.mounts.mounts:
                self.logger.log("fsfreeze mount :" + str(mount.mount_point), True)
                if(mount.mount_point == '/'):
                    self.root_seen = True
                    self.root_mount = mount
                elif(mount.mount_point not in mounts_list_to_skip and not self.should_skip(mount)):
                    if(self.skip_freeze == True):
                        self.skip_freeze = False
                    args.append(str(mount.mount_point))
            if(self.root_seen and not self.should_skip(self.root_mount)):
                if(self.skip_freeze == True):
                    self.skip_freeze = False
                args.append('/')
            self.logger.log("skip freeze is : " + str(self.skip_freeze), True)
            if(self.skip_freeze == True):
                return freeze_result,timedout
            self.logger.log("arg : " + str(args),True)
            self.freeze_handler.reset_signals()
            self.freeze_handler.signal_receiver()
            self.logger.log("proceeded for accepting signals", True)
            if(mounts_to_skip == '/'): #for continue logging to avoid out of memory issue
                self.logger.enforce_local_flag(True)
            else:
                self.logger.enforce_local_flag(False) 

            start_time = datetime.datetime.utcnow()

            while self.getLockRetry < self.maxGetLockRetry:
                try:
                    if not os.path.isdir('/etc/azure'):
                        os.mkdir('/etc/azure')
                    if not os.path.isdir('/etc/azure/MicrosoftRecoverySvcsSafeFreezeLock'):
                        os.mkdir('/etc/azure/MicrosoftRecoverySvcsSafeFreezeLock')
                    self.safeFreezelockFile = open("/etc/azure/MicrosoftRecoverySvcsSafeFreezeLock/SafeFreezeLockFile","w")
                    self.logger.log("/etc/azure/MicrosoftRecoverySvcsSafeFreezeLock/SafeFreezeLockFile file opened Sucessfully",True)
                    try:
                        #isAquiredLockSucceeded lock will only be false if there is a issue in taking lock.
                        #For all other issue like faliure in creating file, not enough space in disk it will be true. so that we can proceed with the backup
                        self.isAquireLockSucceeded = False  
                        fcntl.lockf(self.safeFreezelockFile, fcntl.LOCK_EX | fcntl.LOCK_NB)
                        self.logger.log("Aquiring lock succeeded",True)
                        self.isAquireLockSucceeded = True
                        break
                    except Exception as ex:
                        self.safeFreezelockFile.close()
                        self.logger.log("Failed to aquire lock: %s, stack trace: %s" % (str(ex), traceback.format_exc()),True)
                        raise ex
                except Exception as e:
                    self.logger.log("Failed to open file or aquire lock: %s, stack trace: %s" % (str(e), traceback.format_exc()),True)
                    self.getLockRetry= self.getLockRetry + 1
                    time.sleep(1)
                    if(self.getLockRetry == self.maxGetLockRetry - 1):
                        time.sleep(30)
                self.logger.log("Retry to aquire lock count: "+ str(self.getLockRetry),True)

            end_time = datetime.datetime.utcnow()
            self.logger.log("Wait time to aquire lock "+ str(end_time - start_time),True)

            # sig_handle = None
            if (self.isAquireLockSucceeded == True):
                self.logger.log("Aquired Lock Successful")
            sig_handle=self.freeze_handler.startproc(args)

            self.logger.log("freeze_safe after returning from startproc : sig_handle="+str(sig_handle))
            if(sig_handle != 1):
                if (self.freeze_handler.child is not None):
                    self.log_binary_output()
                if (sig_handle == 0):
                    timedout = True
                    error_msg="freeze timed-out"
                    freeze_result.errors.append(error_msg)
                    self.logger.log(error_msg, True, 'Error')
                elif (self.mount_open_failed == True):
                    error_msg=CommonVariables.unable_to_open_err_string
                    freeze_result.errors.append(error_msg)
                    self.logger.log(error_msg, True, 'Error')
                elif (self.isAquireLockSucceeded == False):
                    error_msg="Mount Points already freezed by some other processor"
                    freeze_result.errors.append(error_msg)
                    self.logger.log(error_msg,True,'Error')
                else:
                    error_msg="freeze failed for some mount"
                    freeze_result.errors.append(error_msg)
                    self.logger.log(error_msg, True, 'Error')
        except Exception as e:
            self.logger.enforce_local_flag(True)
            error_msg='freeze failed for some mount with exception, Exception %s, stack trace: %s' % (str(e), traceback.format_exc())
            freeze_result.errors.append(error_msg)
            self.logger.log(error_msg, True, 'Error')
        return freeze_result,timedout