Statistics
| Branch: | Tag: | Revision:

root / lib / jstore.py @ 04ab05ce

History | View | Annotate | Download (3.3 kB)

1 8b537bb0 Michael Hanselmann
#
2 8b537bb0 Michael Hanselmann
#
3 8b537bb0 Michael Hanselmann
4 8b537bb0 Michael Hanselmann
# Copyright (C) 2006, 2007 Google Inc.
5 8b537bb0 Michael Hanselmann
#
6 8b537bb0 Michael Hanselmann
# This program is free software; you can redistribute it and/or modify
7 8b537bb0 Michael Hanselmann
# it under the terms of the GNU General Public License as published by
8 8b537bb0 Michael Hanselmann
# the Free Software Foundation; either version 2 of the License, or
9 8b537bb0 Michael Hanselmann
# (at your option) any later version.
10 8b537bb0 Michael Hanselmann
#
11 8b537bb0 Michael Hanselmann
# This program is distributed in the hope that it will be useful, but
12 8b537bb0 Michael Hanselmann
# WITHOUT ANY WARRANTY; without even the implied warranty of
13 8b537bb0 Michael Hanselmann
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 8b537bb0 Michael Hanselmann
# General Public License for more details.
15 8b537bb0 Michael Hanselmann
#
16 8b537bb0 Michael Hanselmann
# You should have received a copy of the GNU General Public License
17 8b537bb0 Michael Hanselmann
# along with this program; if not, write to the Free Software
18 8b537bb0 Michael Hanselmann
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
19 8b537bb0 Michael Hanselmann
# 02110-1301, USA.
20 8b537bb0 Michael Hanselmann
21 8b537bb0 Michael Hanselmann
22 8b537bb0 Michael Hanselmann
"""Module implementing the job queue handling."""
23 8b537bb0 Michael Hanselmann
24 8b537bb0 Michael Hanselmann
import os
25 8b537bb0 Michael Hanselmann
import logging
26 8b537bb0 Michael Hanselmann
import errno
27 8b537bb0 Michael Hanselmann
import re
28 8b537bb0 Michael Hanselmann
29 8b537bb0 Michael Hanselmann
from ganeti import constants
30 8b537bb0 Michael Hanselmann
from ganeti import errors
31 8b537bb0 Michael Hanselmann
from ganeti import utils
32 8b537bb0 Michael Hanselmann
33 8b537bb0 Michael Hanselmann
34 8b537bb0 Michael Hanselmann
def _ReadNumericFile(file_name):
35 8b537bb0 Michael Hanselmann
  """Reads a file containing a number.
36 8b537bb0 Michael Hanselmann

37 8b537bb0 Michael Hanselmann
  @rtype: None or int
38 8b537bb0 Michael Hanselmann
  @return: None if file is not found, otherwise number
39 8b537bb0 Michael Hanselmann

40 8b537bb0 Michael Hanselmann
  """
41 8b537bb0 Michael Hanselmann
  try:
42 8b537bb0 Michael Hanselmann
    fd = open(file_name, "r")
43 8b537bb0 Michael Hanselmann
  except IOError, err:
44 8b537bb0 Michael Hanselmann
    if err.errno in (errno.ENOENT, ):
45 8b537bb0 Michael Hanselmann
      return None
46 8b537bb0 Michael Hanselmann
    raise
47 8b537bb0 Michael Hanselmann
48 8b537bb0 Michael Hanselmann
  try:
49 8b537bb0 Michael Hanselmann
    return int(fd.read(128))
50 8b537bb0 Michael Hanselmann
  finally:
51 8b537bb0 Michael Hanselmann
    fd.close()
52 8b537bb0 Michael Hanselmann
53 8b537bb0 Michael Hanselmann
54 8b537bb0 Michael Hanselmann
def ReadSerial():
55 8b537bb0 Michael Hanselmann
  """Read the serial file.
56 8b537bb0 Michael Hanselmann

57 8b537bb0 Michael Hanselmann
  The queue should be locked while this function is called.
58 8b537bb0 Michael Hanselmann

59 8b537bb0 Michael Hanselmann
  """
60 8b537bb0 Michael Hanselmann
  return _ReadNumericFile(constants.JOB_QUEUE_SERIAL_FILE)
61 8b537bb0 Michael Hanselmann
62 8b537bb0 Michael Hanselmann
63 8b537bb0 Michael Hanselmann
def ReadVersion():
64 8b537bb0 Michael Hanselmann
  """Read the queue version.
65 8b537bb0 Michael Hanselmann

66 8b537bb0 Michael Hanselmann
  The queue should be locked while this function is called.
67 8b537bb0 Michael Hanselmann

68 8b537bb0 Michael Hanselmann
  """
69 8b537bb0 Michael Hanselmann
  return _ReadNumericFile(constants.JOB_QUEUE_VERSION_FILE)
70 8b537bb0 Michael Hanselmann
71 8b537bb0 Michael Hanselmann
72 8b537bb0 Michael Hanselmann
def InitAndVerifyQueue(exclusive):
73 8b537bb0 Michael Hanselmann
  """Open and lock job queue.
74 8b537bb0 Michael Hanselmann

75 8b537bb0 Michael Hanselmann
  If necessary, the queue is automatically initialized.
76 8b537bb0 Michael Hanselmann

77 8b537bb0 Michael Hanselmann
  @type exclusive: bool
78 8b537bb0 Michael Hanselmann
  @param exclusive: Whether to lock the queue in exclusive mode. Shared
79 8b537bb0 Michael Hanselmann
                    mode otherwise.
80 8b537bb0 Michael Hanselmann
  @rtype: utils.FileLock
81 8b537bb0 Michael Hanselmann
  @return: Lock object for the queue. This can be used to change the
82 8b537bb0 Michael Hanselmann
           locking mode.
83 8b537bb0 Michael Hanselmann

84 8b537bb0 Michael Hanselmann
  """
85 8b537bb0 Michael Hanselmann
  # Make sure our directories exists
86 8b537bb0 Michael Hanselmann
  for path in (constants.QUEUE_DIR, constants.JOB_QUEUE_ARCHIVE_DIR):
87 8b537bb0 Michael Hanselmann
    try:
88 8b537bb0 Michael Hanselmann
      os.mkdir(path, 0700)
89 8b537bb0 Michael Hanselmann
    except OSError, err:
90 8b537bb0 Michael Hanselmann
      if err.errno not in (errno.EEXIST, ):
91 8b537bb0 Michael Hanselmann
        raise
92 8b537bb0 Michael Hanselmann
93 8b537bb0 Michael Hanselmann
  # Lock queue
94 8b537bb0 Michael Hanselmann
  queue_lock = utils.FileLock(constants.JOB_QUEUE_LOCK_FILE)
95 8b537bb0 Michael Hanselmann
  try:
96 8b537bb0 Michael Hanselmann
    # Determine locking function and call it
97 8b537bb0 Michael Hanselmann
    if exclusive:
98 8b537bb0 Michael Hanselmann
      fn = queue_lock.Exclusive
99 8b537bb0 Michael Hanselmann
    else:
100 8b537bb0 Michael Hanselmann
      fn = queue_lock.Shared
101 8b537bb0 Michael Hanselmann
102 8b537bb0 Michael Hanselmann
    fn(blocking=False)
103 8b537bb0 Michael Hanselmann
104 8b537bb0 Michael Hanselmann
    # Verify version
105 8b537bb0 Michael Hanselmann
    version = ReadVersion()
106 8b537bb0 Michael Hanselmann
    if version is None:
107 8b537bb0 Michael Hanselmann
      # Write new version file
108 8b537bb0 Michael Hanselmann
      utils.WriteFile(constants.JOB_QUEUE_VERSION_FILE,
109 8b537bb0 Michael Hanselmann
                      data="%s\n" % constants.JOB_QUEUE_VERSION)
110 8b537bb0 Michael Hanselmann
111 8b537bb0 Michael Hanselmann
      # Read again
112 8b537bb0 Michael Hanselmann
      version = ReadVersion()
113 8b537bb0 Michael Hanselmann
114 8b537bb0 Michael Hanselmann
    if version != constants.JOB_QUEUE_VERSION:
115 8b537bb0 Michael Hanselmann
      raise errors.JobQueueError("Found job queue version %s, expected %s",
116 8b537bb0 Michael Hanselmann
                                 version, constants.JOB_QUEUE_VERSION)
117 8b537bb0 Michael Hanselmann
118 8b537bb0 Michael Hanselmann
    serial = ReadSerial()
119 8b537bb0 Michael Hanselmann
    if serial is None:
120 8b537bb0 Michael Hanselmann
      # Write new serial file
121 8b537bb0 Michael Hanselmann
      utils.WriteFile(constants.JOB_QUEUE_SERIAL_FILE,
122 8b537bb0 Michael Hanselmann
                      data="%s\n" % 0)
123 8b537bb0 Michael Hanselmann
124 8b537bb0 Michael Hanselmann
      # Read again
125 8b537bb0 Michael Hanselmann
      serial = ReadSerial()
126 8b537bb0 Michael Hanselmann
127 8b537bb0 Michael Hanselmann
    if serial is None:
128 8b537bb0 Michael Hanselmann
      # There must be a serious problem
129 8b537bb0 Michael Hanselmann
      raise errors.JobQueueError("Can't read/parse the job queue serial file")
130 8b537bb0 Michael Hanselmann
131 8b537bb0 Michael Hanselmann
  except:
132 8b537bb0 Michael Hanselmann
    queue_lock.Close()
133 8b537bb0 Michael Hanselmann
    raise
134 8b537bb0 Michael Hanselmann
135 8b537bb0 Michael Hanselmann
  return queue_lock