blob: 7a26b7633733ca27ca7363c9990d12fb564180c2 [file] [log] [blame]
Thomas Vachuska58de4162015-09-10 16:15:33 -07001/*
Brian O'Connora09fe5b2017-08-03 21:12:30 -07002 * Copyright 2015-present Open Networking Foundation
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
Ray Milkeyd84f89b2018-08-17 14:54:17 -070018import com.google.common.collect.ImmutableSet;
19import com.google.common.collect.Multimap;
jccde3e92e2015-03-28 01:40:44 -070020import org.onlab.util.KryoNamespace;
21import org.onosproject.cluster.ClusterService;
Madan Jampanic156dd02015-08-12 15:57:46 -070022import org.onosproject.cluster.NodeId;
Brian O'Connor6de2e202015-05-21 14:30:41 -070023import org.onosproject.incubator.net.resource.label.DefaultLabelResource;
24import org.onosproject.incubator.net.resource.label.LabelResource;
25import org.onosproject.incubator.net.resource.label.LabelResourceDelegate;
26import org.onosproject.incubator.net.resource.label.LabelResourceEvent;
27import org.onosproject.incubator.net.resource.label.LabelResourceEvent.Type;
28import org.onosproject.incubator.net.resource.label.LabelResourceId;
29import org.onosproject.incubator.net.resource.label.LabelResourcePool;
30import org.onosproject.incubator.net.resource.label.LabelResourceRequest;
31import org.onosproject.incubator.net.resource.label.LabelResourceStore;
Madan Jampanic156dd02015-08-12 15:57:46 -070032import org.onosproject.mastership.MastershipService;
samuel7a5691a2015-05-23 00:36:32 +080033import org.onosproject.net.Device;
34import org.onosproject.net.DeviceId;
35import org.onosproject.net.device.DeviceService;
jccde3e92e2015-03-28 01:40:44 -070036import org.onosproject.store.AbstractStore;
37import org.onosproject.store.cluster.messaging.ClusterCommunicationService;
jccde3e92e2015-03-28 01:40:44 -070038import org.onosproject.store.serializers.KryoNamespaces;
jccde3e92e2015-03-28 01:40:44 -070039import org.onosproject.store.service.ConsistentMap;
40import org.onosproject.store.service.Serializer;
41import org.onosproject.store.service.StorageService;
samuel7a5691a2015-05-23 00:36:32 +080042import org.onosproject.store.service.Versioned;
Ray Milkeyd84f89b2018-08-17 14:54:17 -070043import org.osgi.service.component.annotations.Activate;
44import org.osgi.service.component.annotations.Component;
45import org.osgi.service.component.annotations.Deactivate;
46import org.osgi.service.component.annotations.Reference;
47import org.osgi.service.component.annotations.ReferenceCardinality;
jccde3e92e2015-03-28 01:40:44 -070048import org.slf4j.Logger;
49
Ray Milkeyd84f89b2018-08-17 14:54:17 -070050import java.util.Collection;
51import java.util.Collections;
52import java.util.HashSet;
53import java.util.Iterator;
54import java.util.Map;
55import java.util.Set;
56import java.util.concurrent.ExecutionException;
57import java.util.concurrent.ExecutorService;
58import java.util.concurrent.Executors;
59import java.util.concurrent.Future;
60import java.util.concurrent.TimeUnit;
61import java.util.concurrent.TimeoutException;
62
63import static org.onlab.util.Tools.groupedThreads;
64import static org.slf4j.LoggerFactory.getLogger;
jccde3e92e2015-03-28 01:40:44 -070065
66/**
67 * Manages label resources using copycat.
68 */
Ray Milkeyd84f89b2018-08-17 14:54:17 -070069@Component(immediate = true, service = LabelResourceStore.class)
jccde3e92e2015-03-28 01:40:44 -070070public class DistributedLabelResourceStore
71 extends AbstractStore<LabelResourceEvent, LabelResourceDelegate>
72 implements LabelResourceStore {
73 private final Logger log = getLogger(getClass());
74
Jon Halldbe4c532016-10-04 11:45:52 -070075 private static final String POOL_MAP_NAME = "onos-label-resource-pool";
jccde3e92e2015-03-28 01:40:44 -070076
77 private static final String GLOBAL_RESOURCE_POOL_DEVICE_ID = "global_resource_pool_device_id";
jccde3e92e2015-03-28 01:40:44 -070078
79 private ConsistentMap<DeviceId, LabelResourcePool> resourcePool = null;
80
Ray Milkeyd84f89b2018-08-17 14:54:17 -070081 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jccde3e92e2015-03-28 01:40:44 -070082 protected StorageService storageService;
83
Ray Milkeyd84f89b2018-08-17 14:54:17 -070084 @Reference(cardinality = ReferenceCardinality.MANDATORY)
Madan Jampanic156dd02015-08-12 15:57:46 -070085 protected MastershipService mastershipService;
jccde3e92e2015-03-28 01:40:44 -070086
Ray Milkeyd84f89b2018-08-17 14:54:17 -070087 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jccde3e92e2015-03-28 01:40:44 -070088 protected ClusterCommunicationService clusterCommunicator;
89
Ray Milkeyd84f89b2018-08-17 14:54:17 -070090 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jccde3e92e2015-03-28 01:40:44 -070091 protected ClusterService clusterService;
92
Ray Milkeyd84f89b2018-08-17 14:54:17 -070093 @Reference(cardinality = ReferenceCardinality.MANDATORY)
jccde3e92e2015-03-28 01:40:44 -070094 protected DeviceService deviceService;
95
96 private ExecutorService messageHandlingExecutor;
97 private static final int MESSAGE_HANDLER_THREAD_POOL_SIZE = 8;
98 private static final long PEER_REQUEST_TIMEOUT_MS = 5000;
99
samuel7a5691a2015-05-23 00:36:32 +0800100 private static final Serializer SERIALIZER = Serializer
101 .using(new KryoNamespace.Builder().register(KryoNamespaces.API)
jccde3e92e2015-03-28 01:40:44 -0700102 .register(LabelResourceEvent.class)
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700103 .register(LabelResourcePool.class)
jccde3e92e2015-03-28 01:40:44 -0700104 .register(LabelResourceRequest.class)
105 .register(LabelResourceRequest.Type.class)
106 .register(LabelResourceEvent.Type.class)
107 .register(DefaultLabelResource.class)
samuel7a5691a2015-05-23 00:36:32 +0800108 .register(LabelResourceId.class)
109 .nextId(KryoNamespaces.BEGIN_USER_CUSTOM_ID).build());
jccde3e92e2015-03-28 01:40:44 -0700110
111 @Activate
112 public void activate() {
113
114 resourcePool = storageService
115 .<DeviceId, LabelResourcePool>consistentMapBuilder()
Madan Jampani54c5e232016-07-11 15:35:25 -0700116 .withName(POOL_MAP_NAME).withSerializer(SERIALIZER).build();
jccde3e92e2015-03-28 01:40:44 -0700117 messageHandlingExecutor = Executors
118 .newFixedThreadPool(MESSAGE_HANDLER_THREAD_POOL_SIZE,
119 groupedThreads("onos/store/flow",
Yuta HIGUCHI1624df12016-07-21 16:54:33 -0700120 "message-handlers",
121 log));
jccde3e92e2015-03-28 01:40:44 -0700122 clusterCommunicator
123 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_CREATED,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800124 SERIALIZER::<LabelResourcePool>decode,
125 operation -> {
126 log.trace("received get flow entry request for {}", operation);
127 return internalCreate(operation);
128 },
129 SERIALIZER::<Boolean>encode,
130 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700131 clusterCommunicator
132 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_DESTROYED,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800133 SERIALIZER::<DeviceId>decode,
134 deviceId -> {
135 log.trace("received get flow entry request for {}", deviceId);
136 return internalDestroy(deviceId);
137 },
138 SERIALIZER::<Boolean>encode,
139 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700140 clusterCommunicator
141 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_APPLY,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800142 SERIALIZER::<LabelResourceRequest>decode,
143 request -> {
144 log.trace("received get flow entry request for {}", request);
145 return internalApply(request);
jccde3e92e2015-03-28 01:40:44 -0700146
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800147 },
148 SERIALIZER::<Collection<LabelResource>>encode,
149 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700150 clusterCommunicator
151 .addSubscriber(LabelResourceMessageSubjects.LABEL_POOL_RELEASE,
Sho SHIMIZUc032c832016-01-13 13:02:05 -0800152 SERIALIZER::<LabelResourceRequest>decode,
153 request -> {
154 log.trace("received get flow entry request for {}",
155 request);
156 return internalRelease(request);
157 },
158 SERIALIZER::<Boolean>encode,
159 messageHandlingExecutor);
jccde3e92e2015-03-28 01:40:44 -0700160 log.info("Started");
161 }
162
163 @Deactivate
164 public void deactivate() {
165 clusterCommunicator
166 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_CREATED);
167 clusterCommunicator
168 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_APPLY);
169 clusterCommunicator
170 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_DESTROYED);
171 clusterCommunicator
172 .removeSubscriber(LabelResourceMessageSubjects.LABEL_POOL_RELEASE);
173 messageHandlingExecutor.shutdown();
174 log.info("Stopped");
175 }
176
177 @Override
178 public boolean createDevicePool(DeviceId deviceId,
179 LabelResourceId beginLabel,
180 LabelResourceId endLabel) {
181 LabelResourcePool pool = new LabelResourcePool(deviceId.toString(),
182 beginLabel.labelId(),
183 endLabel.labelId());
184 return this.create(pool);
185 }
186
187 @Override
188 public boolean createGlobalPool(LabelResourceId beginLabel,
189 LabelResourceId endLabel) {
Satish K0de87612015-11-24 13:44:52 +0530190 LabelResourcePool pool = new LabelResourcePool(GLOBAL_RESOURCE_POOL_DEVICE_ID,
jccde3e92e2015-03-28 01:40:44 -0700191 beginLabel.labelId(),
192 endLabel.labelId());
193 return this.internalCreate(pool);
194 }
195
196 private boolean create(LabelResourcePool pool) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700197 Device device = deviceService.getDevice(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700198 if (device == null) {
199 return false;
200 }
201
Madan Jampanic156dd02015-08-12 15:57:46 -0700202 NodeId master = mastershipService.getMasterFor(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700203
Madan Jampanic156dd02015-08-12 15:57:46 -0700204 if (master == null) {
205 log.warn("Failed to create label resource pool: No master for {}", pool);
jccde3e92e2015-03-28 01:40:44 -0700206 return false;
207 }
208
Madan Jampanic156dd02015-08-12 15:57:46 -0700209 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700210 return internalCreate(pool);
211 }
212
213 log.trace("Forwarding getFlowEntries to {}, which is the primary (master) for device {}",
Madan Jampanic156dd02015-08-12 15:57:46 -0700214 master, pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700215
216 return complete(clusterCommunicator
217 .sendAndReceive(pool,
218 LabelResourceMessageSubjects.LABEL_POOL_CREATED,
219 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700220 master));
jccde3e92e2015-03-28 01:40:44 -0700221 }
222
223 private boolean internalCreate(LabelResourcePool pool) {
samuel7a5691a2015-05-23 00:36:32 +0800224 Versioned<LabelResourcePool> poolOld = resourcePool
225 .get(pool.deviceId());
jccde3e92e2015-03-28 01:40:44 -0700226 if (poolOld == null) {
227 resourcePool.put(pool.deviceId(), pool);
Satish K0de87612015-11-24 13:44:52 +0530228 LabelResourceEvent event = new LabelResourceEvent(Type.POOL_CREATED,
jccde3e92e2015-03-28 01:40:44 -0700229 pool);
230 notifyDelegate(event);
231 return true;
232 }
jccde3e92e2015-03-28 01:40:44 -0700233 return false;
234 }
235
236 @Override
237 public boolean destroyDevicePool(DeviceId deviceId) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700238 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700239 if (device == null) {
240 return false;
241 }
jccde3e92e2015-03-28 01:40:44 -0700242
Madan Jampanic156dd02015-08-12 15:57:46 -0700243 NodeId master = mastershipService.getMasterFor(deviceId);
244
245 if (master == null) {
246 log.warn("Failed to destroyDevicePool. No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700247 return false;
248 }
249
Madan Jampanic156dd02015-08-12 15:57:46 -0700250 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700251 return internalDestroy(deviceId);
252 }
253
Madan Jampanic156dd02015-08-12 15:57:46 -0700254 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
255 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700256
257 return complete(clusterCommunicator
258 .sendAndReceive(deviceId,
259 LabelResourceMessageSubjects.LABEL_POOL_DESTROYED,
260 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700261 master));
jccde3e92e2015-03-28 01:40:44 -0700262 }
263
264 private boolean internalDestroy(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800265 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700266 if (poolOld != null) {
267 resourcePool.remove(deviceId);
Satish K0de87612015-11-24 13:44:52 +0530268 LabelResourceEvent event = new LabelResourceEvent(Type.POOL_DESTROYED,
samuel7a5691a2015-05-23 00:36:32 +0800269 poolOld.value());
jccde3e92e2015-03-28 01:40:44 -0700270 notifyDelegate(event);
271 }
272 log.info("success to destroy the label resource pool of device id {}",
273 deviceId);
274 return true;
275 }
276
277 @Override
278 public Collection<LabelResource> applyFromDevicePool(DeviceId deviceId,
279 long applyNum) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700280 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700281 if (device == null) {
282 return Collections.emptyList();
283 }
Satish K0de87612015-11-24 13:44:52 +0530284 LabelResourceRequest request = new LabelResourceRequest(deviceId,
jccde3e92e2015-03-28 01:40:44 -0700285 LabelResourceRequest.Type.APPLY,
286 applyNum, null);
Madan Jampanic156dd02015-08-12 15:57:46 -0700287 NodeId master = mastershipService.getMasterFor(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700288
Madan Jampanic156dd02015-08-12 15:57:46 -0700289 if (master == null) {
290 log.warn("Failed to applyFromDevicePool: No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700291 return Collections.emptyList();
292 }
293
Madan Jampanic156dd02015-08-12 15:57:46 -0700294 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700295 return internalApply(request);
296 }
297
Madan Jampanic156dd02015-08-12 15:57:46 -0700298 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
299 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700300
301 return complete(clusterCommunicator
302 .sendAndReceive(request,
303 LabelResourceMessageSubjects.LABEL_POOL_APPLY,
304 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700305 master));
jccde3e92e2015-03-28 01:40:44 -0700306 }
307
308 private Collection<LabelResource> internalApply(LabelResourceRequest request) {
jccde3e92e2015-03-28 01:40:44 -0700309 DeviceId deviceId = request.deviceId();
310 long applyNum = request.applyNum();
samuel7a5691a2015-05-23 00:36:32 +0800311 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
Satish Kf8ba8f02016-02-17 13:18:35 +0530312 if (poolOld == null) {
313 log.info("label resource pool not allocated for deviceId {}.", deviceId);
314 return Collections.emptyList();
315 }
samuel7a5691a2015-05-23 00:36:32 +0800316 LabelResourcePool pool = poolOld.value();
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700317 Collection<LabelResource> result = new HashSet<>();
jccde3e92e2015-03-28 01:40:44 -0700318 long freeNum = this.getFreeNumOfDevicePool(deviceId);
319 if (applyNum > freeNum) {
320 log.info("the free number of the label resource pool of deviceId {} is not enough.");
jccde3e92e2015-03-28 01:40:44 -0700321 return Collections.emptyList();
322 }
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700323 Set<LabelResource> releaseLabels = new HashSet<>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700324 long tmp = releaseLabels.size() > applyNum ? applyNum : releaseLabels
325 .size();
326 LabelResource resource = null;
327 for (int i = 0; i < tmp; i++) {
328 Iterator<LabelResource> it = releaseLabels.iterator();
329 if (it.hasNext()) {
330 resource = it.next();
331 releaseLabels.remove(resource);
332 }
333 result.add(resource);
334 }
335 for (long j = pool.currentUsedMaxLabelId().labelId(); j < pool
336 .currentUsedMaxLabelId().labelId() + applyNum - tmp; j++) {
337 resource = new DefaultLabelResource(deviceId,
338 LabelResourceId
339 .labelResourceId(j));
340 result.add(resource);
341 }
342 long beginLabel = pool.beginLabel().labelId();
343 long endLabel = pool.endLabel().labelId();
344 long totalNum = pool.totalNum();
345 long current = pool.currentUsedMaxLabelId().labelId() + applyNum - tmp;
346 long usedNum = pool.usedNum() + applyNum;
347 ImmutableSet<LabelResource> freeLabel = ImmutableSet
348 .copyOf(releaseLabels);
349 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
350 beginLabel, endLabel,
351 totalNum, usedNum,
352 current, freeLabel);
353 resourcePool.put(deviceId, newPool);
354 log.info("success to apply label resource");
jccde3e92e2015-03-28 01:40:44 -0700355 return result;
356 }
357
358 @Override
359 public boolean releaseToDevicePool(Multimap<DeviceId, LabelResource> release) {
360 Map<DeviceId, Collection<LabelResource>> maps = release.asMap();
361 Set<DeviceId> deviceIdSet = maps.keySet();
362 LabelResourceRequest request = null;
363 for (Iterator<DeviceId> it = deviceIdSet.iterator(); it.hasNext();) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700364 DeviceId deviceId = it.next();
365 Device device = deviceService.getDevice(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700366 if (device == null) {
367 continue;
368 }
369 ImmutableSet<LabelResource> collection = ImmutableSet.copyOf(maps
370 .get(deviceId));
Satish K0de87612015-11-24 13:44:52 +0530371 request = new LabelResourceRequest(deviceId,
jccde3e92e2015-03-28 01:40:44 -0700372 LabelResourceRequest.Type.RELEASE,
373 0, collection);
Madan Jampanic156dd02015-08-12 15:57:46 -0700374 NodeId master = mastershipService.getMasterFor(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700375
Madan Jampanic156dd02015-08-12 15:57:46 -0700376 if (master == null) {
377 log.warn("Failed to releaseToDevicePool: No master for {}", deviceId);
jccde3e92e2015-03-28 01:40:44 -0700378 return false;
379 }
380
Madan Jampanic156dd02015-08-12 15:57:46 -0700381 if (master.equals(clusterService.getLocalNode().id())) {
jccde3e92e2015-03-28 01:40:44 -0700382 return internalRelease(request);
383 }
384
Madan Jampanic156dd02015-08-12 15:57:46 -0700385 log.trace("Forwarding request to {}, which is the primary (master) for device {}",
386 master, deviceId);
jccde3e92e2015-03-28 01:40:44 -0700387
388 return complete(clusterCommunicator
389 .sendAndReceive(request,
390 LabelResourceMessageSubjects.LABEL_POOL_RELEASE,
391 SERIALIZER::encode, SERIALIZER::decode,
Madan Jampanic156dd02015-08-12 15:57:46 -0700392 master));
jccde3e92e2015-03-28 01:40:44 -0700393 }
394 return false;
395 }
396
397 private boolean internalRelease(LabelResourceRequest request) {
jccde3e92e2015-03-28 01:40:44 -0700398 DeviceId deviceId = request.deviceId();
399 Collection<LabelResource> release = request.releaseCollection();
samuel7a5691a2015-05-23 00:36:32 +0800400 Versioned<LabelResourcePool> poolOld = resourcePool.get(deviceId);
Satish Kf8ba8f02016-02-17 13:18:35 +0530401 if (poolOld == null) {
402 log.info("the label resource pool of device id {} not allocated");
403 return false;
404 }
samuel7a5691a2015-05-23 00:36:32 +0800405 LabelResourcePool pool = poolOld.value();
jccde3e92e2015-03-28 01:40:44 -0700406 if (pool == null) {
jccde3e92e2015-03-28 01:40:44 -0700407 log.info("the label resource pool of device id {} does not exist");
408 return false;
409 }
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700410 Set<LabelResource> storeSet = new HashSet<>(pool.releaseLabelId());
jccde3e92e2015-03-28 01:40:44 -0700411 LabelResource labelResource = null;
412 long realReleasedNum = 0;
413 for (Iterator<LabelResource> it = release.iterator(); it.hasNext();) {
414 labelResource = it.next();
415 if (labelResource.labelResourceId().labelId() < pool.beginLabel()
416 .labelId()
417 || labelResource.labelResourceId().labelId() > pool
418 .endLabel().labelId()) {
419 continue;
420 }
421 if (pool.currentUsedMaxLabelId().labelId() > labelResource
422 .labelResourceId().labelId()
423 || !storeSet.contains(labelResource)) {
424 storeSet.add(labelResource);
425 realReleasedNum++;
426 }
427 }
428 long beginNum = pool.beginLabel().labelId();
429 long endNum = pool.endLabel().labelId();
430 long totalNum = pool.totalNum();
431 long usedNum = pool.usedNum() - realReleasedNum;
432 long current = pool.currentUsedMaxLabelId().labelId();
433 ImmutableSet<LabelResource> s = ImmutableSet.copyOf(storeSet);
434 LabelResourcePool newPool = new LabelResourcePool(deviceId.toString(),
435 beginNum, endNum,
436 totalNum, usedNum,
437 current, s);
438 resourcePool.put(deviceId, newPool);
439 log.info("success to release label resource");
jccde3e92e2015-03-28 01:40:44 -0700440 return true;
441 }
442
443 @Override
444 public boolean isDevicePoolFull(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800445 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700446 if (pool == null) {
447 return true;
448 }
samuel7a5691a2015-05-23 00:36:32 +0800449 return pool.value().currentUsedMaxLabelId() == pool.value().endLabel()
450 && pool.value().releaseLabelId().size() == 0 ? true : false;
jccde3e92e2015-03-28 01:40:44 -0700451 }
452
453 @Override
454 public long getFreeNumOfDevicePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800455 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
jccde3e92e2015-03-28 01:40:44 -0700456 if (pool == null) {
457 return 0;
458 }
samuel7a5691a2015-05-23 00:36:32 +0800459 return pool.value().endLabel().labelId()
460 - pool.value().currentUsedMaxLabelId().labelId()
461 + pool.value().releaseLabelId().size();
jccde3e92e2015-03-28 01:40:44 -0700462 }
463
464 @Override
465 public LabelResourcePool getDeviceLabelResourcePool(DeviceId deviceId) {
samuel7a5691a2015-05-23 00:36:32 +0800466 Versioned<LabelResourcePool> pool = resourcePool.get(deviceId);
467 return pool == null ? null : pool.value();
jccde3e92e2015-03-28 01:40:44 -0700468 }
469
470 @Override
471 public boolean destroyGlobalPool() {
472 return this.internalDestroy(DeviceId
473 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
474 }
475
476 @Override
477 public Collection<LabelResource> applyFromGlobalPool(long applyNum) {
Satish K0de87612015-11-24 13:44:52 +0530478 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700479 LabelResourceRequest.Type.APPLY,
480 applyNum, null);
481 return this.internalApply(request);
482 }
483
484 @Override
485 public boolean releaseToGlobalPool(Set<LabelResourceId> release) {
HIGUCHI Yutac0f50452016-05-13 19:26:05 -0700486 Set<LabelResource> set = new HashSet<>();
jccde3e92e2015-03-28 01:40:44 -0700487 DefaultLabelResource resource = null;
488 for (LabelResourceId labelResource : release) {
Satish K0de87612015-11-24 13:44:52 +0530489 resource = new DefaultLabelResource(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
jccde3e92e2015-03-28 01:40:44 -0700490 labelResource);
491 set.add(resource);
492 }
Satish K0de87612015-11-24 13:44:52 +0530493 LabelResourceRequest request = new LabelResourceRequest(DeviceId.deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID),
Priyanka Ba6364052016-02-01 10:25:42 +0530494 LabelResourceRequest.Type.RELEASE,
jccde3e92e2015-03-28 01:40:44 -0700495 0,
Satish K0de87612015-11-24 13:44:52 +0530496 ImmutableSet.copyOf(set));
jccde3e92e2015-03-28 01:40:44 -0700497 return this.internalRelease(request);
498 }
499
500 @Override
501 public boolean isGlobalPoolFull() {
502 return this.isDevicePoolFull(DeviceId
503 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
504 }
505
506 @Override
507 public long getFreeNumOfGlobalPool() {
508 return this.getFreeNumOfDevicePool(DeviceId
509 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
510 }
511
512 @Override
513 public LabelResourcePool getGlobalLabelResourcePool() {
514 return this.getDeviceLabelResourcePool(DeviceId
515 .deviceId(GLOBAL_RESOURCE_POOL_DEVICE_ID));
516 }
517
518 private <T> T complete(Future<T> future) {
519 try {
samuel7a5691a2015-05-23 00:36:32 +0800520 return future.get(PEER_REQUEST_TIMEOUT_MS, TimeUnit.MILLISECONDS);
jccde3e92e2015-03-28 01:40:44 -0700521 } catch (InterruptedException e) {
522 Thread.currentThread().interrupt();
523 log.error("Interrupted while waiting for operation to complete.", e);
524 return null;
525 } catch (TimeoutException | ExecutionException e) {
526 log.error("Failed remote operation", e);
527 return null;
528 }
529 }
530}