blob: ef3e228278ba78638cda52348778639665845774 [file] [log] [blame]
Thomas Vachuska58de4162015-09-10 16:15:33 -07001/*
Brian O'Connor5ab426f2016-04-09 01:19:45 -07002 * Copyright 2015-present 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
Jon Halldbe4c532016-10-04 11:45:52 -070078 private static final String POOL_MAP_NAME = "onos-label-resource-pool";
jccde3e92e2015-03-28 01:40:44 -070079
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)
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700106 .register(LabelResourcePool.class)
jccde3e92e2015-03-28 01:40:44 -0700107 .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()
Madan Jampani54c5e232016-07-11 15:35:25 -0700119 .withName(POOL_MAP_NAME).withSerializer(SERIALIZER).build();
jccde3e92e2015-03-28 01:40:44 -0700120 messageHandlingExecutor = Executors
121 .newFixedThreadPool(MESSAGE_HANDLER_THREAD_POOL_SIZE,
122 groupedThreads("onos/store/flow",
Yuta HIGUCHI1624df12016-07-21 16:54:33 -0700123 "message-handlers",
124 log));
jccde3e92e2015-03-28 01:40:44 -0700125 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) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700200 Device device = deviceService.getDevice(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700201 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) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700241 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700242 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) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700283 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700284 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);
Satish Kf8ba8f02016-02-17 13:18:35 +0530315 if (poolOld == null) {
316 log.info("label resource pool not allocated for deviceId {}.", deviceId);
317 return Collections.emptyList();
318 }
samuel7a5691a2015-05-23 00:36:32 +0800319 LabelResourcePool pool = poolOld.value();
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700320 Collection<LabelResource> result = new HashSet<>();
jccde3e92e2015-03-28 01:40:44 -0700321 long freeNum = this.getFreeNumOfDevicePool(deviceId);
322 if (applyNum > freeNum) {
323 log.info("the free number of the label resource pool of deviceId {} is not enough.");
jccde3e92e2015-03-28 01:40:44 -0700324 return Collections.emptyList();
325 }
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700326 Set<LabelResource> releaseLabels = new HashSet<>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700327 long tmp = releaseLabels.size() > applyNum ? applyNum : releaseLabels
328 .size();
329 LabelResource resource = null;
330 for (int i = 0; i < tmp; i++) {
331 Iterator<LabelResource> it = releaseLabels.iterator();
332 if (it.hasNext()) {
333 resource = it.next();
334 releaseLabels.remove(resource);
335 }
336 result.add(resource);
337 }
338 for (long j = pool.currentUsedMaxLabelId().labelId(); j < pool
339 .currentUsedMaxLabelId().labelId() + applyNum - tmp; j++) {
340 resource = new DefaultLabelResource(deviceId,
341 LabelResourceId
342 .labelResourceId(j));
343 result.add(resource);
344 }
345 long beginLabel = pool.beginLabel().labelId();
346 long endLabel = pool.endLabel().labelId();
347 long totalNum = pool.totalNum();
348 long current = pool.currentUsedMaxLabelId().labelId() + applyNum - tmp;
349 long usedNum = pool.usedNum() + applyNum;
350 ImmutableSet<LabelResource> freeLabel = ImmutableSet
351 .copyOf(releaseLabels);
352 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
353 beginLabel, endLabel,
354 totalNum, usedNum,
355 current, freeLabel);
356 resourcePool.put(deviceId, newPool);
357 log.info("success to apply label resource");
jccde3e92e2015-03-28 01:40:44 -0700358 return result;
359 }
360
361 @Override
362 public boolean releaseToDevicePool(Multimap<DeviceId, LabelResource> release) {
363 Map<DeviceId, Collection<LabelResource>> maps = release.asMap();
364 Set<DeviceId> deviceIdSet = maps.keySet();
365 LabelResourceRequest request = null;
366 for (Iterator<DeviceId> it = deviceIdSet.iterator(); it.hasNext();) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700367 DeviceId deviceId = it.next();
368 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700369 if (device == null) {
370 continue;
371 }
372 ImmutableSet<LabelResource> collection = ImmutableSet.copyOf(maps
373 .get(deviceId));
Satish K0de87612015-11-24 13:44:52 +0530374 request = new LabelResourceRequest(deviceId,
jccde3e92e2015-03-28 01:40:44 -0700375 LabelResourceRequest.Type.RELEASE,
376 0, collection);
Madan Jampanic156dd02015-08-12 15:57:46 -0700377 NodeId master = mastershipService.getMasterFor(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700378
Madan Jampanic156dd02015-08-12 15:57:46 -0700379 if (master == null) {
380 log.warn("Failed to releaseToDevicePool: No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700381 return false;
382 }
383
Madan Jampanic156dd02015-08-12 15:57:46 -0700384 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700385 return internalRelease(request);
386 }
387
Madan Jampanic156dd02015-08-12 15:57:46 -0700388 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
389 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700390
391 return complete(clusterCommunicator
392 .sendAndReceive(request,
393 LabelResourceMessageSubjects.LABEL_POOL_RELEASE,
394 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700395 master));
jccde3e92e2015-03-28 01:40:44 -0700396 }
397 return false;
398 }
399
400 private boolean internalRelease(LabelResourceRequest request) {
jccde3e92e2015-03-28 01:40:44 -0700401 DeviceId deviceId = request.deviceId();
402 Collection<LabelResource> release = request.releaseCollection();
samuel7a5691a2015-05-23 00:36:32 +0800403 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
Satish Kf8ba8f02016-02-17 13:18:35 +0530404 if (poolOld == null) {
405 log.info("the label resource pool of device id {} not allocated");
406 return false;
407 }
samuel7a5691a2015-05-23 00:36:32 +0800408 LabelResourcePool pool = poolOld.value();
jccde3e92e2015-03-28 01:40:44 -0700409 if (pool == null) {
jccde3e92e2015-03-28 01:40:44 -0700410 log.info("the label resource pool of device id {} does not exist");
411 return false;
412 }
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700413 Set<LabelResource> storeSet = new HashSet<>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700414 LabelResource labelResource = null;
415 long realReleasedNum = 0;
416 for (Iterator<LabelResource> it = release.iterator(); it.hasNext();) {
417 labelResource = it.next();
418 if (labelResource.labelResourceId().labelId() < pool.beginLabel()
419 .labelId()
420 || labelResource.labelResourceId().labelId() > pool
421 .endLabel().labelId()) {
422 continue;
423 }
424 if (pool.currentUsedMaxLabelId().labelId() > labelResource
425 .labelResourceId().labelId()
426 || !storeSet.contains(labelResource)) {
427 storeSet.add(labelResource);
428 realReleasedNum++;
429 }
430 }
431 long beginNum = pool.beginLabel().labelId();
432 long endNum = pool.endLabel().labelId();
433 long totalNum = pool.totalNum();
434 long usedNum = pool.usedNum() - realReleasedNum;
435 long current = pool.currentUsedMaxLabelId().labelId();
436 ImmutableSet<LabelResource> s = ImmutableSet.copyOf(storeSet);
437 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
438 beginNum, endNum,
439 totalNum, usedNum,
440 current, s);
441 resourcePool.put(deviceId, newPool);
442 log.info("success to release label resource");
jccde3e92e2015-03-28 01:40:44 -0700443 return true;
444 }
445
446 @Override
447 public boolean isDevicePoolFull(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800448 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700449 if (pool == null) {
450 return true;
451 }
samuel7a5691a2015-05-23 00:36:32 +0800452 return pool.value().currentUsedMaxLabelId() == pool.value().endLabel()
453 && pool.value().releaseLabelId().size() == 0 ? true : false;
jccde3e92e2015-03-28 01:40:44 -0700454 }
455
456 @Override
457 public long getFreeNumOfDevicePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800458 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700459 if (pool == null) {
460 return 0;
461 }
samuel7a5691a2015-05-23 00:36:32 +0800462 return pool.value().endLabel().labelId()
463 - pool.value().currentUsedMaxLabelId().labelId()
464 + pool.value().releaseLabelId().size();
jccde3e92e2015-03-28 01:40:44 -0700465 }
466
467 @Override
468 public LabelResourcePool getDeviceLabelResourcePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800469 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
470 return pool == null ? null : pool.value();
jccde3e92e2015-03-28 01:40:44 -0700471 }
472
473 @Override
474 public boolean destroyGlobalPool() {
475 return this.internalDestroy(DeviceId
476 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
477 }
478
479 @Override
480 public Collection<LabelResource> applyFromGlobalPool(long applyNum) {
Satish K0de87612015-11-24 13:44:52 +0530481 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700482 LabelResourceRequest.Type.APPLY,
483 applyNum, null);
484 return this.internalApply(request);
485 }
486
487 @Override
488 public boolean releaseToGlobalPool(Set<LabelResourceId> release) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700489 Set<LabelResource> set = new HashSet<>();
jccde3e92e2015-03-28 01:40:44 -0700490 DefaultLabelResource resource = null;
491 for (LabelResourceId labelResource : release) {
Satish K0de87612015-11-24 13:44:52 +0530492 resource = new DefaultLabelResource(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700493 labelResource);
494 set.add(resource);
495 }
Satish K0de87612015-11-24 13:44:52 +0530496 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
Priyanka Ba6364052016-02-01 10:25:42 +0530497 LabelResourceRequest.Type.RELEASE,
jccde3e92e2015-03-28 01:40:44 -0700498 0,
Satish K0de87612015-11-24 13:44:52 +0530499 ImmutableSet.copyOf(set));
jccde3e92e2015-03-28 01:40:44 -0700500 return this.internalRelease(request);
501 }
502
503 @Override
504 public boolean isGlobalPoolFull() {
505 return this.isDevicePoolFull(DeviceId
506 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
507 }
508
509 @Override
510 public long getFreeNumOfGlobalPool() {
511 return this.getFreeNumOfDevicePool(DeviceId
512 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
513 }
514
515 @Override
516 public LabelResourcePool getGlobalLabelResourcePool() {
517 return this.getDeviceLabelResourcePool(DeviceId
518 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
519 }
520
521 private <T> T complete(Future<T> future) {
522 try {
samuel7a5691a2015-05-23 00:36:32 +0800523 return future.get(PEER_REQUEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
jccde3e92e2015-03-28 01:40:44 -0700524 } catch (InterruptedException e) {
525 Thread.currentThread().interrupt();
526 log.error("Interrupted while waiting for operation to complete.", e);
527 return null;
528 } catch (TimeoutException | ExecutionException e) {
529 log.error("Failed remote operation", e);
530 return null;
531 }
532 }
533}