Trees | Indices | Help |
|
---|
|
1 # 2 # 3 4 # Copyright (C) 2006, 2007 Google Inc. 5 # 6 # This program is free software; you can redistribute it and/or modify 7 # it under the terms of the GNU General Public License as published by 8 # the Free Software Foundation; either version 2 of the License, or 9 # (at your option) any later version. 10 # 11 # This program is distributed in the hope that it will be useful, but 12 # WITHOUT ANY WARRANTY; without even the implied warranty of 13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 # General Public License for more details. 15 # 16 # You should have received a copy of the GNU General Public License 17 # along with this program; if not, write to the Free Software 18 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 19 # 02110-1301, USA. 20 21 22 """Module implementing the job queue handling.""" 23 24 import errno 25 26 from ganeti import constants 27 from ganeti import errors 28 from ganeti import utils 29 3032 """Reads a file containing a number. 33 34 @rtype: None or int 35 @return: None if file is not found, otherwise number 36 37 """ 38 try: 39 return int(utils.ReadFile(file_name)) 40 except EnvironmentError, err: 41 if err.errno in (errno.ENOENT, ): 42 return None 43 raise44 4547 """Read the serial file. 48 49 The queue should be locked while this function is called. 50 51 """ 52 return _ReadNumericFile(constants.JOB_QUEUE_SERIAL_FILE)53 5456 """Read the queue version. 57 58 The queue should be locked while this function is called. 59 60 """ 61 return _ReadNumericFile(constants.JOB_QUEUE_VERSION_FILE)62 6365 """Open and lock job queue. 66 67 If necessary, the queue is automatically initialized. 68 69 @type must_lock: bool 70 @param must_lock: Whether an exclusive lock must be held. 71 @rtype: utils.FileLock 72 @return: Lock object for the queue. This can be used to change the 73 locking mode. 74 75 """ 76 dirs = [(d, constants.JOB_QUEUE_DIRS_MODE) for d in constants.JOB_QUEUE_DIRS] 77 utils.EnsureDirs(dirs) 78 79 # Lock queue 80 queue_lock = utils.FileLock.Open(constants.JOB_QUEUE_LOCK_FILE) 81 try: 82 # The queue needs to be locked in exclusive mode to write to the serial and 83 # version files. 84 if must_lock: 85 queue_lock.Exclusive(blocking=True) 86 holding_lock = True 87 else: 88 try: 89 queue_lock.Exclusive(blocking=False) 90 holding_lock = True 91 except errors.LockError: 92 # Ignore errors and assume the process keeping the lock checked 93 # everything. 94 holding_lock = False 95 96 if holding_lock: 97 # Verify version 98 version = ReadVersion() 99 if version is None: 100 # Write new version file 101 utils.WriteFile(constants.JOB_QUEUE_VERSION_FILE, 102 data="%s\n" % constants.JOB_QUEUE_VERSION) 103 104 # Read again 105 version = ReadVersion() 106 107 if version != constants.JOB_QUEUE_VERSION: 108 raise errors.JobQueueError("Found job queue version %s, expected %s", 109 version, constants.JOB_QUEUE_VERSION) 110 111 serial = ReadSerial() 112 if serial is None: 113 # Write new serial file 114 utils.WriteFile(constants.JOB_QUEUE_SERIAL_FILE, 115 data="%s\n" % 0) 116 117 # Read again 118 serial = ReadSerial() 119 120 if serial is None: 121 # There must be a serious problem 122 raise errors.JobQueueError("Can't read/parse the job queue" 123 " serial file") 124 125 if not must_lock: 126 # There's no need for more error handling. Closing the lock 127 # file below in case of an error will unlock it anyway. 128 queue_lock.Unlock() 129 130 except: 131 queue_lock.Close() 132 raise 133 134 return queue_lock135
Trees | Indices | Help |
|
---|
Generated by Epydoc 3.0.1 on Thu Dec 9 15:56:12 2010 | http://epydoc.sourceforge.net |