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