blob: c64a091e11b25da7dea72db2c456d501ce0b68ca [file] [log] [blame]
Thomas Vachuska58de4162015-09-10 16:15:33 -07001/*
Sho SHIMIZUc032c832016-01-13 13:02:05 -08002 * Copyright 2015-2016 Open Networking Laboratory
Thomas Vachuska58de4162015-09-10 16:15:33 -07003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Brian O'Connor6de2e202015-05-21 14:30:41 -070016package org.onosproject.incubator.store.resource.impl;
jccde3e92e2015-03-28 01:40:44 -070017
18import static org.onlab.util.Tools.groupedThreads;
19import static org.slf4j.LoggerFactory.getLogger;
20
21import java.util.Collection;
22import java.util.Collections;
23import java.util.HashSet;
24import java.util.Iterator;
25import java.util.Map;
26import java.util.Set;
27import java.util.concurrent.ExecutionException;
28import java.util.concurrent.ExecutorService;
29import java.util.concurrent.Executors;
30import java.util.concurrent.Future;
31import java.util.concurrent.TimeUnit;
32import java.util.concurrent.TimeoutException;
jccde3e92e2015-03-28 01:40:44 -070033
34import org.apache.felix.scr.annotations.Activate;
35import org.apache.felix.scr.annotations.Component;
36import org.apache.felix.scr.annotations.Deactivate;
37import org.apache.felix.scr.annotations.Reference;
38import org.apache.felix.scr.annotations.ReferenceCardinality;
39import org.apache.felix.scr.annotations.Service;
40import org.onlab.util.KryoNamespace;
41import org.onosproject.cluster.ClusterService;
Madan Jampanic156dd02015-08-12 15:57:46 -070042import org.onosproject.cluster.NodeId;
Brian O'Connor6de2e202015-05-21 14:30:41 -070043import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
44import org.onosproject.incubator.net.resource.label.LabelResource;
45import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
46import org.onosproject.incubator.net.resource.label.LabelResourceEvent;
47import org.onosproject.incubator.net.resource.label.LabelResourceEvent.Type;
48import org.onosproject.incubator.net.resource.label.LabelResourceId;
49import org.onosproject.incubator.net.resource.label.LabelResourcePool;
50import org.onosproject.incubator.net.resource.label.LabelResourceRequest;
51import org.onosproject.incubator.net.resource.label.LabelResourceStore;
Madan Jampanic156dd02015-08-12 15:57:46 -070052import org.onosproject.mastership.MastershipService;
samuel7a5691a2015-05-23 00:36:32 +080053import org.onosproject.net.Device;
54import org.onosproject.net.DeviceId;
55import org.onosproject.net.device.DeviceService;
jccde3e92e2015-03-28 01:40:44 -070056import org.onosproject.store.AbstractStore;
57import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
jccde3e92e2015-03-28 01:40:44 -070058import org.onosproject.store.serializers.KryoNamespaces;
jccde3e92e2015-03-28 01:40:44 -070059import org.onosproject.store.service.ConsistentMap;
60import org.onosproject.store.service.Serializer;
61import org.onosproject.store.service.StorageService;
samuel7a5691a2015-05-23 00:36:32 +080062import org.onosproject.store.service.Versioned;
jccde3e92e2015-03-28 01:40:44 -070063import org.slf4j.Logger;
64
65import com.google.common.collect.ImmutableSet;
66import com.google.common.collect.Multimap;
67
68/**
69 * Manages label resources using copycat.
70 */
71@Component(immediate = true, enabled = true)
72@Service
73public class DistributedLabelResourceStore
74 extends AbstractStore<LabelResourceEvent, LabelResourceDelegate>
75 implements LabelResourceStore {
76 private final Logger log = getLogger(getClass());
77
78 private static final String POOL_MAP_NAME = "labelresourcepool";
79
80 private static final String GLOBAL_RESOURCE_POOL_DEVICE_ID = "global_resource_pool_device_id";
jccde3e92e2015-03-28 01:40:44 -070081
82 private ConsistentMap<DeviceId, LabelResourcePool> resourcePool = null;
83
84 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
85 protected StorageService storageService;
86
87 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
Madan Jampanic156dd02015-08-12 15:57:46 -070088 protected MastershipService mastershipService;
jccde3e92e2015-03-28 01:40:44 -070089
90 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
91 protected ClusterCommunicationService clusterCommunicator;
92
93 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
94 protected ClusterService clusterService;
95
96 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
97 protected DeviceService deviceService;
98
99 private ExecutorService messageHandlingExecutor;
100 private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 8;
101 private static final long PEER_REQUEST_TIMEOUT_MS = 5000;
102
samuel7a5691a2015-05-23 00:36:32 +0800103 private static final Serializer SERIALIZER = Serializer
104 .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
jccde3e92e2015-03-28 01:40:44 -0700105 .register(LabelResourceEvent.class)
106 .register(LabelResourcePool.class).register(DeviceId.class)
107 .register(LabelResourceRequest.class)
108 .register(LabelResourceRequest.Type.class)
109 .register(LabelResourceEvent.Type.class)
110 .register(DefaultLabelResource.class)
samuel7a5691a2015-05-23 00:36:32 +0800111 .register(LabelResourceId.class)
112 .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
jccde3e92e2015-03-28 01:40:44 -0700113
114 @Activate
115 public void activate() {
116
117 resourcePool = storageService
118 .<DeviceId, LabelResourcePool>consistentMapBuilder()
samuel7a5691a2015-05-23 00:36:32 +0800119 .withName(POOL_MAP_NAME).withSerializer(SERIALIZER)
120 .withPartitionsDisabled().build();
jccde3e92e2015-03-28 01:40:44 -0700121 messageHandlingExecutor = Executors
122 .newFixedThreadPool(MESSAGE_HANDLER_THREAD_POOL_SIZE,
123 groupedThreads("onos/store/flow",
124 "message-handlers"));
125 clusterCommunicator
126 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_CREATED,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800127 SERIALIZER::<LabelResourcePool>decode,
128 operation -> {
129 log.trace("received get flow entry request for {}", operation);
130 return internalCreate(operation);
131 },
132 SERIALIZER::<Boolean>encode,
133 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700134 clusterCommunicator
135 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_DESTROYED,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800136 SERIALIZER::<DeviceId>decode,
137 deviceId -> {
138 log.trace("received get flow entry request for {}", deviceId);
139 return internalDestroy(deviceId);
140 },
141 SERIALIZER::<Boolean>encode,
142 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700143 clusterCommunicator
144 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_APPLY,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800145 SERIALIZER::<LabelResourceRequest>decode,
146 request -> {
147 log.trace("received get flow entry request for {}", request);
148 return internalApply(request);
jccde3e92e2015-03-28 01:40:44 -0700149
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800150 },
151 SERIALIZER::<Collection<LabelResource>>encode,
152 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700153 clusterCommunicator
154 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_RELEASE,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800155 SERIALIZER::<LabelResourceRequest>decode,
156 request -> {
157 log.trace("received get flow entry request for {}",
158 request);
159 return internalRelease(request);
160 },
161 SERIALIZER::<Boolean>encode,
162 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700163 log.info("Started");
164 }
165
166 @Deactivate
167 public void deactivate() {
168 clusterCommunicator
169 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_CREATED);
170 clusterCommunicator
171 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_APPLY);
172 clusterCommunicator
173 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_DESTROYED);
174 clusterCommunicator
175 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_RELEASE);
176 messageHandlingExecutor.shutdown();
177 log.info("Stopped");
178 }
179
180 @Override
181 public boolean createDevicePool(DeviceId deviceId,
182 LabelResourceId beginLabel,
183 LabelResourceId endLabel) {
184 LabelResourcePool pool = new LabelResourcePool(deviceId.toString(),
185 beginLabel.labelId(),
186 endLabel.labelId());
187 return this.create(pool);
188 }
189
190 @Override
191 public boolean createGlobalPool(LabelResourceId beginLabel,
192 LabelResourceId endLabel) {
Satish K0de87612015-11-24 13:44:52 +0530193 LabelResourcePool pool = new LabelResourcePool(GLOBAL_RESOURCE_POOL_DEVICE_ID,
jccde3e92e2015-03-28 01:40:44 -0700194 beginLabel.labelId(),
195 endLabel.labelId());
196 return this.internalCreate(pool);
197 }
198
199 private boolean create(LabelResourcePool pool) {
200 Device device = (Device) deviceService.getDevice(pool.deviceId());
201 if (device == null) {
202 return false;
203 }
204
Madan Jampanic156dd02015-08-12 15:57:46 -0700205 NodeId master = mastershipService.getMasterFor(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700206
Madan Jampanic156dd02015-08-12 15:57:46 -0700207 if (master == null) {
208 log.warn("Failed to create label resource pool: No master for {}", pool);
jccde3e92e2015-03-28 01:40:44 -0700209 return false;
210 }
211
Madan Jampanic156dd02015-08-12 15:57:46 -0700212 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700213 return internalCreate(pool);
214 }
215
216 log.trace("Forwarding getFlowEntries to {}, which is the primary (master) for device {}",
Madan Jampanic156dd02015-08-12 15:57:46 -0700217 master, pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700218
219 return complete(clusterCommunicator
220 .sendAndReceive(pool,
221 LabelResourceMessageSubjects.LABEL_POOL_CREATED,
222 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700223 master));
jccde3e92e2015-03-28 01:40:44 -0700224 }
225
226 private boolean internalCreate(LabelResourcePool pool) {
samuel7a5691a2015-05-23 00:36:32 +0800227 Versioned<LabelResourcePool> poolOld = resourcePool
228 .get(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700229 if (poolOld == null) {
230 resourcePool.put(pool.deviceId(), pool);
Satish K0de87612015-11-24 13:44:52 +0530231 LabelResourceEvent event = new LabelResourceEvent(Type.POOL_CREATED,
jccde3e92e2015-03-28 01:40:44 -0700232 pool);
233 notifyDelegate(event);
234 return true;
235 }
jccde3e92e2015-03-28 01:40:44 -0700236 return false;
237 }
238
239 @Override
240 public boolean destroyDevicePool(DeviceId deviceId) {
241 Device device = (Device) deviceService.getDevice(deviceId);
242 if (device == null) {
243 return false;
244 }
jccde3e92e2015-03-28 01:40:44 -0700245
Madan Jampanic156dd02015-08-12 15:57:46 -0700246 NodeId master = mastershipService.getMasterFor(deviceId);
247
248 if (master == null) {
249 log.warn("Failed to destroyDevicePool. No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700250 return false;
251 }
252
Madan Jampanic156dd02015-08-12 15:57:46 -0700253 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700254 return internalDestroy(deviceId);
255 }
256
Madan Jampanic156dd02015-08-12 15:57:46 -0700257 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
258 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700259
260 return complete(clusterCommunicator
261 .sendAndReceive(deviceId,
262 LabelResourceMessageSubjects.LABEL_POOL_DESTROYED,
263 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700264 master));
jccde3e92e2015-03-28 01:40:44 -0700265 }
266
267 private boolean internalDestroy(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800268 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700269 if (poolOld != null) {
270 resourcePool.remove(deviceId);
Satish K0de87612015-11-24 13:44:52 +0530271 LabelResourceEvent event = new LabelResourceEvent(Type.POOL_DESTROYED,
samuel7a5691a2015-05-23 00:36:32 +0800272 poolOld.value());
jccde3e92e2015-03-28 01:40:44 -0700273 notifyDelegate(event);
274 }
275 log.info("success to destroy the label resource pool of device id {}",
276 deviceId);
277 return true;
278 }
279
280 @Override
281 public Collection<LabelResource> applyFromDevicePool(DeviceId deviceId,
282 long applyNum) {
283 Device device = (Device) deviceService.getDevice(deviceId);
284 if (device == null) {
285 return Collections.emptyList();
286 }
Satish K0de87612015-11-24 13:44:52 +0530287 LabelResourceRequest request = new LabelResourceRequest(deviceId,
jccde3e92e2015-03-28 01:40:44 -0700288 LabelResourceRequest.Type.APPLY,
289 applyNum, null);
Madan Jampanic156dd02015-08-12 15:57:46 -0700290 NodeId master = mastershipService.getMasterFor(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700291
Madan Jampanic156dd02015-08-12 15:57:46 -0700292 if (master == null) {
293 log.warn("Failed to applyFromDevicePool: No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700294 return Collections.emptyList();
295 }
296
Madan Jampanic156dd02015-08-12 15:57:46 -0700297 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700298 return internalApply(request);
299 }
300
Madan Jampanic156dd02015-08-12 15:57:46 -0700301 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
302 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700303
304 return complete(clusterCommunicator
305 .sendAndReceive(request,
306 LabelResourceMessageSubjects.LABEL_POOL_APPLY,
307 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700308 master));
jccde3e92e2015-03-28 01:40:44 -0700309 }
310
311 private Collection<LabelResource> internalApply(LabelResourceRequest request) {
jccde3e92e2015-03-28 01:40:44 -0700312 DeviceId deviceId = request.deviceId();
313 long applyNum = request.applyNum();
samuel7a5691a2015-05-23 00:36:32 +0800314 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
315 LabelResourcePool pool = poolOld.value();
jccde3e92e2015-03-28 01:40:44 -0700316 Collection<LabelResource> result = new HashSet<LabelResource>();
317 long freeNum = this.getFreeNumOfDevicePool(deviceId);
318 if (applyNum > freeNum) {
319 log.info("the free number of the label resource pool of deviceId {} is not enough.");
jccde3e92e2015-03-28 01:40:44 -0700320 return Collections.emptyList();
321 }
Satish K0de87612015-11-24 13:44:52 +0530322 Set<LabelResource> releaseLabels = new HashSet<LabelResource>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700323 long tmp = releaseLabels.size() > applyNum ? applyNum : releaseLabels
324 .size();
325 LabelResource resource = null;
326 for (int i = 0; i < tmp; i++) {
327 Iterator<LabelResource> it = releaseLabels.iterator();
328 if (it.hasNext()) {
329 resource = it.next();
330 releaseLabels.remove(resource);
331 }
332 result.add(resource);
333 }
334 for (long j = pool.currentUsedMaxLabelId().labelId(); j < pool
335 .currentUsedMaxLabelId().labelId() + applyNum - tmp; j++) {
336 resource = new DefaultLabelResource(deviceId,
337 LabelResourceId
338 .labelResourceId(j));
339 result.add(resource);
340 }
341 long beginLabel = pool.beginLabel().labelId();
342 long endLabel = pool.endLabel().labelId();
343 long totalNum = pool.totalNum();
344 long current = pool.currentUsedMaxLabelId().labelId() + applyNum - tmp;
345 long usedNum = pool.usedNum() + applyNum;
346 ImmutableSet<LabelResource> freeLabel = ImmutableSet
347 .copyOf(releaseLabels);
348 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
349 beginLabel, endLabel,
350 totalNum, usedNum,
351 current, freeLabel);
352 resourcePool.put(deviceId, newPool);
353 log.info("success to apply label resource");
jccde3e92e2015-03-28 01:40:44 -0700354 return result;
355 }
356
357 @Override
358 public boolean releaseToDevicePool(Multimap<DeviceId, LabelResource> release) {
359 Map<DeviceId, Collection<LabelResource>> maps = release.asMap();
360 Set<DeviceId> deviceIdSet = maps.keySet();
361 LabelResourceRequest request = null;
362 for (Iterator<DeviceId> it = deviceIdSet.iterator(); it.hasNext();) {
363 DeviceId deviceId = (DeviceId) it.next();
364 Device device = (Device) deviceService.getDevice(deviceId);
365 if (device == null) {
366 continue;
367 }
368 ImmutableSet<LabelResource> collection = ImmutableSet.copyOf(maps
369 .get(deviceId));
Satish K0de87612015-11-24 13:44:52 +0530370 request = new LabelResourceRequest(deviceId,
jccde3e92e2015-03-28 01:40:44 -0700371 LabelResourceRequest.Type.RELEASE,
372 0, collection);
Madan Jampanic156dd02015-08-12 15:57:46 -0700373 NodeId master = mastershipService.getMasterFor(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700374
Madan Jampanic156dd02015-08-12 15:57:46 -0700375 if (master == null) {
376 log.warn("Failed to releaseToDevicePool: No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700377 return false;
378 }
379
Madan Jampanic156dd02015-08-12 15:57:46 -0700380 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700381 return internalRelease(request);
382 }
383
Madan Jampanic156dd02015-08-12 15:57:46 -0700384 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
385 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700386
387 return complete(clusterCommunicator
388 .sendAndReceive(request,
389 LabelResourceMessageSubjects.LABEL_POOL_RELEASE,
390 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700391 master));
jccde3e92e2015-03-28 01:40:44 -0700392 }
393 return false;
394 }
395
396 private boolean internalRelease(LabelResourceRequest request) {
jccde3e92e2015-03-28 01:40:44 -0700397 DeviceId deviceId = request.deviceId();
398 Collection<LabelResource> release = request.releaseCollection();
samuel7a5691a2015-05-23 00:36:32 +0800399 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
400 LabelResourcePool pool = poolOld.value();
jccde3e92e2015-03-28 01:40:44 -0700401 if (pool == null) {
jccde3e92e2015-03-28 01:40:44 -0700402 log.info("the label resource pool of device id {} does not exist");
403 return false;
404 }
Satish K0de87612015-11-24 13:44:52 +0530405 Set<LabelResource> storeSet = new HashSet<LabelResource>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700406 LabelResource labelResource = null;
407 long realReleasedNum = 0;
408 for (Iterator<LabelResource> it = release.iterator(); it.hasNext();) {
409 labelResource = it.next();
410 if (labelResource.labelResourceId().labelId() < pool.beginLabel()
411 .labelId()
412 || labelResource.labelResourceId().labelId() > pool
413 .endLabel().labelId()) {
414 continue;
415 }
416 if (pool.currentUsedMaxLabelId().labelId() > labelResource
417 .labelResourceId().labelId()
418 || !storeSet.contains(labelResource)) {
419 storeSet.add(labelResource);
420 realReleasedNum++;
421 }
422 }
423 long beginNum = pool.beginLabel().labelId();
424 long endNum = pool.endLabel().labelId();
425 long totalNum = pool.totalNum();
426 long usedNum = pool.usedNum() - realReleasedNum;
427 long current = pool.currentUsedMaxLabelId().labelId();
428 ImmutableSet<LabelResource> s = ImmutableSet.copyOf(storeSet);
429 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
430 beginNum, endNum,
431 totalNum, usedNum,
432 current, s);
433 resourcePool.put(deviceId, newPool);
434 log.info("success to release label resource");
jccde3e92e2015-03-28 01:40:44 -0700435 return true;
436 }
437
438 @Override
439 public boolean isDevicePoolFull(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800440 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700441 if (pool == null) {
442 return true;
443 }
samuel7a5691a2015-05-23 00:36:32 +0800444 return pool.value().currentUsedMaxLabelId() == pool.value().endLabel()
445 && pool.value().releaseLabelId().size() == 0 ? true : false;
jccde3e92e2015-03-28 01:40:44 -0700446 }
447
448 @Override
449 public long getFreeNumOfDevicePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800450 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700451 if (pool == null) {
452 return 0;
453 }
samuel7a5691a2015-05-23 00:36:32 +0800454 return pool.value().endLabel().labelId()
455 - pool.value().currentUsedMaxLabelId().labelId()
456 + pool.value().releaseLabelId().size();
jccde3e92e2015-03-28 01:40:44 -0700457 }
458
459 @Override
460 public LabelResourcePool getDeviceLabelResourcePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800461 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
462 return pool == null ? null : pool.value();
jccde3e92e2015-03-28 01:40:44 -0700463 }
464
465 @Override
466 public boolean destroyGlobalPool() {
467 return this.internalDestroy(DeviceId
468 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
469 }
470
471 @Override
472 public Collection<LabelResource> applyFromGlobalPool(long applyNum) {
Satish K0de87612015-11-24 13:44:52 +0530473 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700474 LabelResourceRequest.Type.APPLY,
475 applyNum, null);
476 return this.internalApply(request);
477 }
478
479 @Override
480 public boolean releaseToGlobalPool(Set<LabelResourceId> release) {
481 Set<LabelResource> set = new HashSet<LabelResource>();
482 DefaultLabelResource resource = null;
483 for (LabelResourceId labelResource : release) {
Satish K0de87612015-11-24 13:44:52 +0530484 resource = new DefaultLabelResource(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700485 labelResource);
486 set.add(resource);
487 }
Satish K0de87612015-11-24 13:44:52 +0530488 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700489 LabelResourceRequest.Type.APPLY,
490 0,
Satish K0de87612015-11-24 13:44:52 +0530491 ImmutableSet.copyOf(set));
jccde3e92e2015-03-28 01:40:44 -0700492 return this.internalRelease(request);
493 }
494
495 @Override
496 public boolean isGlobalPoolFull() {
497 return this.isDevicePoolFull(DeviceId
498 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
499 }
500
501 @Override
502 public long getFreeNumOfGlobalPool() {
503 return this.getFreeNumOfDevicePool(DeviceId
504 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
505 }
506
507 @Override
508 public LabelResourcePool getGlobalLabelResourcePool() {
509 return this.getDeviceLabelResourcePool(DeviceId
510 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
511 }
512
513 private <T> T complete(Future<T> future) {
514 try {
samuel7a5691a2015-05-23 00:36:32 +0800515 return future.get(PEER_REQUEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
jccde3e92e2015-03-28 01:40:44 -0700516 } catch (InterruptedException e) {
517 Thread.currentThread().interrupt();
518 log.error("Interrupted while waiting for operation to complete.", e);
519 return null;
520 } catch (TimeoutException | ExecutionException e) {
521 log.error("Failed remote operation", e);
522 return null;
523 }
524 }
525}