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