Revision 013da361

b/lib/config.py
64 64
                                     constants.CONFIG_VERSION))
65 65

  
66 66

  
67
class TemporaryReservationManager:
68
  """A temporary resource reservation manager.
69

  
70
  This is used to reserve resources in a job, before using them, making sure
71
  other jobs cannot get them in the meantime.
72

  
73
  """
74
  def __init__(self):
75
    self._ec_reserved = {}
76

  
77
  def Reserved(self, resource):
78
    for holder_reserved in self._ec_reserved.items():
79
      if resource in holder_reserved:
80
        return True
81
    return False
82

  
83
  def Reserve(self, ec_id, resource):
84
    if self.Reserved(resource):
85
      raise errors.ReservationError("Duplicate reservation for resource: %s." %
86
                                    (resource))
87
    if ec_id not in self._ec_reserved:
88
      self._ec_reserved[ec_id] = set([resource])
89
    else:
90
      self._ec_reserved[ec_id].add(resource)
91

  
92
  def DropECReservations(self, ec_id):
93
    if ec_id in self._ec_reserved:
94
      del self._ec_reserved[ec_id]
95

  
96
  def GetReserved(self):
97
    all_reserved = set()
98
    for holder_reserved in self._ec_reserved.values():
99
      all_reserved.update(holder_reserved)
100
    return all_reserved
101

  
102
  def Generate(self, existing, generate_one_fn, ec_id):
103
    """Generate a new resource of this type
104

  
105
    """
106
    assert callable(generate_one_fn)
107

  
108
    all_elems = self.GetReserved()
109
    all_elems.update(existing)
110
    retries = 64
111
    while retries > 0:
112
      new_resource = generate_one_fn()
113
      if new_resource is not None and new_resource not in all_elems:
114
        break
115
    else:
116
      raise errors.ConfigurationError("Not able generate new resource"
117
                                      " (last tried: %s)" % new_resource)
118
    self.Reserve(ec_id, new_resource)
119
    return new_resource
120

  
121

  
67 122
class ConfigWriter:
68 123
  """The interface to the cluster configuration.
69 124

  

Also available in: Unified diff