use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder in project genius by opendaylight.
the class IdUtils method createGlobalPool.
protected IdPool createGlobalPool(String poolName, long low, long high, long blockSize) {
AvailableIdsHolder availableIdsHolder = createAvailableIdsHolder(low, high, low - 1);
ReleasedIdsHolder releasedIdsHolder = createReleasedIdsHolder(DEFAULT_AVAILABLE_ID_COUNT, 0);
int size = (int) blockSize;
return new IdPoolBuilder().setKey(new IdPoolKey(poolName)).setBlockSize(size).setPoolName(poolName).setAvailableIdsHolder(availableIdsHolder).setReleasedIdsHolder(releasedIdsHolder).build();
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder in project genius by opendaylight.
the class CleanUpJob method cleanupExcessIds.
private void cleanupExcessIds() throws IdManagerException, ReadFailedException, TransactionCommitFailedException {
// We can update the availableCount here... and update it in DS using IdHolderSyncJob
long totalAvailableIdCount = idLocalPool.getAvailableIds().getAvailableIdCount() + idLocalPool.getReleasedIds().getAvailableIdCount();
if (totalAvailableIdCount > blockSize * 2) {
if (LOG.isDebugEnabled()) {
LOG.debug("Condition for cleanUp Satisfied for localPool {} - totalAvailableIdCount {}", idLocalPool, totalAvailableIdCount);
}
String parentPoolNameIntern = parentPoolName.intern();
InstanceIdentifier<ReleasedIdsHolder> releasedIdInstanceIdentifier = idUtils.getReleasedIdsHolderInstance(parentPoolNameIntern);
// cannot rely on DSJC because that is not cluster-aware
try {
idUtils.lock(lockManager, parentPoolNameIntern);
Optional<ReleasedIdsHolder> releasedIdsHolder = SingleTransactionDataBroker.syncReadOptional(broker, CONFIGURATION, releasedIdInstanceIdentifier);
if (!releasedIdsHolder.isPresent()) {
LOG.error("ReleasedIds not present in parent pool. Unable to cleanup excess ids");
return;
}
if (LOG.isDebugEnabled()) {
LOG.debug("Releasing excesss Ids from local pool");
}
ReleasedIdHolder releasedIds = (ReleasedIdHolder) idLocalPool.getReleasedIds();
ReleasedIdsHolderBuilder releasedIdsParent = new ReleasedIdsHolderBuilder(releasedIdsHolder.get());
idUtils.freeExcessAvailableIds(releasedIds, releasedIdsParent, totalAvailableIdCount - blockSize * 2);
IdHolderSyncJob job = new IdHolderSyncJob(idLocalPool.getPoolName(), releasedIds, txRunner, idUtils);
jobCoordinator.enqueueJob(idLocalPool.getPoolName(), job, IdUtils.RETRY_COUNT);
SingleTransactionDataBroker.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, releasedIdInstanceIdentifier, releasedIdsParent.build());
} finally {
idUtils.unlock(lockManager, parentPoolNameIntern);
}
}
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder in project genius by opendaylight.
the class IdManagerTest method getUpdatedActualChildPool.
private IdPool getUpdatedActualChildPool() throws ReadFailedException {
String localPoolName = idUtils.getLocalPoolName(ID_POOL_NAME);
IdPool idPoolChildFromDS = singleTxdataBroker.syncRead(LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.builder(IdPools.class).child(IdPool.class, new IdPoolKey(localPoolName)).build());
List<DelayedIdEntries> actualDelayedIdEntries = idPoolChildFromDS.getReleasedIdsHolder().getDelayedIdEntries();
IdPool actualIdPoolChild = idPoolChildFromDS;
if (actualDelayedIdEntries != null) {
List<DelayedIdEntries> updatedDelayedIdEntries = actualDelayedIdEntries.stream().map(delayedIdEntry -> new DelayedIdEntriesBuilder().setId(delayedIdEntry.getId()).setReadyTimeSec(0L).build()).collect(Collectors.toList());
ReleasedIdsHolder releasedId = new ReleasedIdsHolderBuilder(idPoolChildFromDS.getReleasedIdsHolder()).setDelayedIdEntries(updatedDelayedIdEntries).build();
actualIdPoolChild = new IdPoolBuilder(idPoolChildFromDS).setReleasedIdsHolder(releasedId).build();
}
return actualIdPoolChild;
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder in project genius by opendaylight.
the class ResourceManager method getResourcePool.
@Override
public Future<RpcResult<GetResourcePoolOutput>> getResourcePool(GetResourcePoolInput input) {
Objects.requireNonNull(input.getResourceType(), RESOURCE_TYPE_CANNOT_BE_NULL);
Objects.requireNonNull(resourcesCache.get(input.getResourceType()), RESOURCE_TYPE_CANNOT_BE_NULL);
long currentTimeSec = System.currentTimeMillis() / 1000;
List<AvailableIds> availableIdsList = new ArrayList<>();
List<DelayedResourceEntries> delayedIdEntriesList = new ArrayList<>();
InstanceIdentifier<IdPool> parentId = ResourceManagerUtils.getIdPoolInstance(resourcesCache.get(input.getResourceType()));
Optional<IdPool> optionalParentIdPool = MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, parentId, dataBroker);
if (optionalParentIdPool != null && optionalParentIdPool.isPresent()) {
IdPool parentIdPool = optionalParentIdPool.get();
AvailableIdsHolder availableParentIdsHolder = parentIdPool.getAvailableIdsHolder();
if (availableParentIdsHolder.getStart() < availableParentIdsHolder.getEnd()) {
availableIdsList.add(new AvailableIdsBuilder().setStart(availableParentIdsHolder.getStart()).setEnd(availableParentIdsHolder.getEnd()).build());
}
ReleasedIdsHolder releasedParentIdsHolder = parentIdPool.getReleasedIdsHolder();
if (releasedParentIdsHolder != null) {
List<DelayedIdEntries> delayedIdParentList = releasedParentIdsHolder.getDelayedIdEntries();
if (delayedIdParentList != null && !delayedIdParentList.isEmpty()) {
for (DelayedIdEntries delayedParentEntry : delayedIdParentList) {
delayedIdEntriesList.add(new DelayedResourceEntriesBuilder().setId(delayedParentEntry.getId()).setReadyTimeSec(delayedParentEntry.getReadyTimeSec()).build());
}
}
}
}
String localPool = ResourceManagerUtils.getLocalPoolName(resourcesCache.get(input.getResourceType()));
InstanceIdentifier<IdPool> localId = ResourceManagerUtils.getIdPoolInstance(localPool);
Optional<IdPool> optionalLocalId = MDSALUtil.read(LogicalDatastoreType.CONFIGURATION, localId, dataBroker);
if (optionalLocalId != null && optionalLocalId.isPresent()) {
IdPool localIdPool = optionalLocalId.get();
AvailableIdsHolder availableLocalIdsHolder = localIdPool.getAvailableIdsHolder();
if (availableLocalIdsHolder != null && availableLocalIdsHolder.getStart() < availableLocalIdsHolder.getEnd()) {
availableIdsList.add(new AvailableIdsBuilder().setStart(availableLocalIdsHolder.getStart()).setEnd(availableLocalIdsHolder.getEnd()).build());
}
ReleasedIdsHolder releasedLocalIdsHolder = localIdPool.getReleasedIdsHolder();
if (releasedLocalIdsHolder != null) {
List<DelayedIdEntries> delayedIdLocalList = releasedLocalIdsHolder.getDelayedIdEntries();
if (delayedIdLocalList != null && !delayedIdLocalList.isEmpty()) {
for (DelayedIdEntries delayedLocalEntry : delayedIdLocalList) {
if (delayedLocalEntry.getReadyTimeSec() > currentTimeSec) {
break;
}
delayedIdEntriesList.add(new DelayedResourceEntriesBuilder().setId(delayedLocalEntry.getId()).setReadyTimeSec(delayedLocalEntry.getReadyTimeSec()).build());
}
}
}
}
GetResourcePoolOutput output = new GetResourcePoolOutputBuilder().setAvailableIds(availableIdsList).setDelayedResourceEntries(delayedIdEntriesList).build();
return RpcResultBuilder.success(output).buildFuture();
}
use of org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.id.pools.id.pool.ReleasedIdsHolder in project genius by opendaylight.
the class IdManager method updateLocalIdPoolCache.
public boolean updateLocalIdPoolCache(IdPool idPool, String parentPoolName) {
AvailableIdsHolder availableIdsHolder = idPool.getAvailableIdsHolder();
AvailableIdHolder availableIdHolder = new AvailableIdHolder(idUtils, availableIdsHolder.getStart(), availableIdsHolder.getEnd());
availableIdHolder.setCur(availableIdsHolder.getCursor());
ReleasedIdsHolder releasedIdsHolder = idPool.getReleasedIdsHolder();
ReleasedIdHolder releasedIdHolder = new ReleasedIdHolder(idUtils, releasedIdsHolder.getDelayedTimeSec());
releasedIdHolder.setAvailableIdCount(releasedIdsHolder.getAvailableIdCount());
List<DelayedIdEntries> delayedEntries = releasedIdsHolder.getDelayedIdEntries();
List<DelayedIdEntry> delayedIdEntryInCache = delayedEntries.stream().map(delayedIdEntry -> new DelayedIdEntry(delayedIdEntry.getId(), delayedIdEntry.getReadyTimeSec())).sorted(comparing(DelayedIdEntry::getReadyTimeSec)).collect(toCollection(ArrayList::new));
releasedIdHolder.replaceDelayedEntries(delayedIdEntryInCache);
IdLocalPool idLocalPool = new IdLocalPool(idUtils, idPool.getPoolName());
idLocalPool.setAvailableIds(availableIdHolder);
idLocalPool.setReleasedIds(releasedIdHolder);
localPool.put(parentPoolName, idLocalPool);
if (LOG.isDebugEnabled()) {
LOG.debug("Populating cache for {} with {}", idLocalPool.getPoolName(), idLocalPool);
}
return true;
}
Aggregations