use of org.commonjava.indy.model.core.ArtifactStore in project indy by Commonjava.
the class ScheduleManager method rescheduleDisableTimeout.
public synchronized void rescheduleDisableTimeout(final StoreKey key) throws IndySchedulerException {
if (!schedulerConfig.isEnabled()) {
logger.debug("Scheduler disabled.");
return;
}
ArtifactStore store = null;
try {
store = dataManager.getArtifactStore(key);
} catch (final IndyDataException e) {
logger.error(String.format("Failed to retrieve store for: %s. Reason: %s", key, e.getMessage()), e);
}
if (store == null) {
return;
}
int timeout = store.getDisableTimeout();
if (timeout == TIMEOUT_USE_DEFAULT) {
// case TIMEOUT_USE_DEFAULT: will use default timeout configuration
timeout = config.getStoreDisableTimeoutSeconds();
}
if (timeout > TIMEOUT_USE_DEFAULT && store.isDisabled()) {
final StoreKey sk = store.getKey();
logger.debug("Set/Reschedule disable timeout for store:{}", sk);
scheduleForStore(sk, DISABLE_TIMEOUT, DISABLE_TIMEOUT, sk, timeout);
}
// Will never consider the TIMEOUT_NEVER_DISABLE case here, will consider this in the calling object(StoreEnablementManager)
}
use of org.commonjava.indy.model.core.ArtifactStore in project indy by Commonjava.
the class StoreContentListener method onStoreUpdate.
public void onStoreUpdate(@Observes final ArtifactStorePreUpdateEvent event) {
Logger logger = LoggerFactory.getLogger(getClass());
logger.trace("Got store-update event: {}", event);
// we're only interested in existing stores, since new stores cannot have indexed keys
if (ArtifactStoreUpdateType.UPDATE == event.getType()) {
for (ArtifactStore store : event) {
removeAllSupercededMemberContent(store, event.getChangeMap());
}
}
}
use of org.commonjava.indy.model.core.ArtifactStore in project indy by Commonjava.
the class StoreContentListener method removeAllSupercededMemberContent.
// TODO: If we find points where a new HostedRepository is added, we should be using its comprehensive index to minimize the index damage to the group.
private void removeAllSupercededMemberContent(final ArtifactStore store, final Map<ArtifactStore, ArtifactStore> changeMap) {
Logger logger = LoggerFactory.getLogger(getClass());
StoreKey key = store.getKey();
// we're only interested in groups, since only adjustments to group memberships can invalidate indexed content.
if (StoreType.group == key.getType()) {
List<StoreKey> newMembers = ((Group) store).getConstituents();
logger.debug("New members of: {} are: {}", store, newMembers);
Group group = (Group) changeMap.get(store);
List<StoreKey> oldMembers = group.getConstituents();
logger.debug("Old members of: {} are: {}", group, oldMembers);
int commonSize = Math.min(newMembers.size(), oldMembers.size());
int divergencePoint;
// look in the members that overlap in new/old groups and see if there are changes that would
// indicate member reordering. If so, it might lead previously suppressed results to be prioritized,
// which would invalidate part of the content index for the group.
boolean foundDivergence = false;
for (divergencePoint = 0; divergencePoint < commonSize; divergencePoint++) {
logger.debug("Checking for common member at index: {}", divergencePoint);
if (!oldMembers.get(divergencePoint).equals(newMembers.get(divergencePoint))) {
foundDivergence = true;
break;
}
}
// that include the one we're affecting directly here...using clearIndexedPathFrom() to do this.
if (!foundDivergence) {
if (newMembers.size() < oldMembers.size()) {
divergencePoint = commonSize;
} else {
divergencePoint = newMembers.size();
}
}
logger.debug("group membership divergence point: {}", divergencePoint);
Set<StoreKey> affectedMembers = new HashSet<>();
boolean removeMergableOnly = divergencePoint >= oldMembers.size();
// group content index entries for those.
if (divergencePoint < oldMembers.size()) {
for (int i = divergencePoint; i < oldMembers.size(); i++) {
affectedMembers.add(oldMembers.get(i));
}
} else {
// See [NOS-128]
for (int i = divergencePoint - 1; i >= commonSize; i--) {
affectedMembers.add(newMembers.get(i));
}
}
logger.debug("Got members affected by membership divergence: {}", affectedMembers);
if (!affectedMembers.isEmpty()) {
Set<Group> groups = new HashSet<>();
groups.add(group);
try {
groups.addAll(storeDataManager.query().packageType(group.getPackageType()).getGroupsAffectedBy(group.getKey()));
} catch (IndyDataException e) {
logger.error(String.format("Cannot retrieve groups affected by: %s. Reason: %s", group.getKey(), e.getMessage()), e);
}
logger.debug("Got affected groups: {}", groups);
affectedMembers.parallelStream().forEach((memberKey) -> {
logger.debug("Listing all {}paths in: {}", (removeMergableOnly ? "mergeable " : ""), memberKey);
Set<String> paths = listPaths(memberKey, removeMergableOnly ? mergablePathStrings() : (p) -> true);
logger.debug("Got mergable transfers from diverged portion of membership: {}", paths);
clearPaths(paths, memberKey, groups, false);
});
}
}
}
use of org.commonjava.indy.model.core.ArtifactStore in project indy by Commonjava.
the class SetBackSettingsManagerTest method settingsForSingleRemoteRepository_GenerateDeleteAndProveNonExistent.
@Test
public void settingsForSingleRemoteRepository_GenerateDeleteAndProveNonExistent() throws Exception {
final RemoteRepository remote = new RemoteRepository(MAVEN_PKG_KEY, "test", "http://foo.bar/");
remote.setDescription("Test Repository");
store(remote);
final StoreKey key = remote.getKey();
final List<String> lines = generateSettings(key);
assertThat("No repository with id: " + remote.getName() + " found in settings.xml", lines.contains("<id>" + remote.getName() + "</id>"), equalTo(true));
final ArtifactStore store = storeManager.getArtifactStore(key);
manager.deleteStoreSettings(store);
assertThat("Settings.xml for: " + key + " should have been deleted!", manager.getSetBackSettings(key), nullValue());
}
use of org.commonjava.indy.model.core.ArtifactStore in project indy by Commonjava.
the class AutoProxDataManagerDecorator method getGroup.
private Group getGroup(final StoreKey key, final StoreKey impliedBy) throws IndyDataException {
logger.debug("DECORATED (getGroup: {})", key);
Group g = (Group) dataManager.getArtifactStore(key);
if (!catalog.isEnabled()) {
logger.debug("AutoProx decorator disabled; returning: {}", g);
return g;
}
logger.debug("AutoProx decorator active");
if (g == null) {
logger.debug("AutoProx: creating repository for: {}", key);
if (!checkValidity(key)) {
return null;
}
try {
g = catalog.createGroup(key);
} catch (final AutoProxRuleException e) {
throw new IndyDataException("[AUTOPROX] Failed to create new group from factory matching: '%s'. Reason: %s", e, key, e.getMessage());
}
if (g != null) {
logger.info("Validating group: {}", g);
for (final StoreKey memberKey : new ArrayList<>(g.getConstituents())) {
final ArtifactStore store = getArtifactStore(memberKey, impliedBy == null ? g.getKey() : impliedBy);
if (store == null) {
g.removeConstituent(memberKey);
}
}
if (g.getConstituents().isEmpty()) {
return null;
}
final EventMetadata eventMetadata = new EventMetadata().set(StoreDataManager.EVENT_ORIGIN, AutoProxConstants.STORE_ORIGIN).set(AutoProxConstants.ORIGINATING_STORE, impliedBy == null ? g.getKey() : impliedBy);
dataManager.storeArtifactStore(g, new ChangeSummary(ChangeSummary.SYSTEM_USER, "AUTOPROX: Creating group for: '" + key + "'"), false, true, eventMetadata);
}
}
return g;
}
Aggregations