Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
*/
package org.commonjava.indy.service.repository.controller;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import org.apache.commons.lang3.StringUtils;
import org.commonjava.event.common.EventMetadata;
import org.commonjava.indy.service.repository.audit.ChangeSummary;
Expand All @@ -35,9 +38,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import java.util.ArrayList;
import java.util.List;

Expand Down Expand Up @@ -259,4 +259,19 @@ public List<ArtifactStore> getDisabledRemoteRepositories()
return disabledArtifactStores;
}

public boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
throws IndyWorkflowException
{
try
{
return storeManager.addConstituentToGroup( key, member );
}
catch ( final IndyDataException e )
{
throw new IndyWorkflowException( INTERNAL_SERVER_ERROR.getStatusCode(),
"Failed to add member {} into Group {}. Reason: {}", e, member, key,
e.getMessage() );
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package org.commonjava.indy.service.repository.data;

import jakarta.inject.Inject;
import org.commonjava.event.common.EventMetadata;
import org.commonjava.event.store.StoreUpdateType;
import org.commonjava.indy.service.repository.audit.ChangeSummary;
Expand All @@ -32,7 +33,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
Expand All @@ -48,9 +48,9 @@
import java.util.stream.Collectors;
import java.util.stream.Stream;

import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED;
import static java.util.Collections.emptySet;
import static java.util.Collections.singletonMap;
import static jakarta.ws.rs.core.Response.Status.METHOD_NOT_ALLOWED;
import static org.apache.commons.lang3.StringUtils.isBlank;
import static org.apache.commons.lang3.StringUtils.isNotBlank;
import static org.commonjava.indy.service.repository.data.StoreUpdateAction.DELETE;
Expand Down Expand Up @@ -617,4 +617,8 @@ protected CacheProducer getCacheProducer()
{
return null;
}

@Override
public abstract boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
throws IndyDataException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -165,4 +165,6 @@ Set<Group> affectedBy( Collection<StoreKey> keys )

Set<ArtifactStore> getArtifactStoresByPkgAndType( String packageType, StoreType storeType );

boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
throws IndyDataException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,16 @@

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.commonjava.indy.model.core.PathStyle;
import org.commonjava.indy.service.repository.audit.ChangeSummary;
import org.commonjava.indy.service.repository.change.event.StoreEventDispatcher;
import org.commonjava.indy.service.repository.data.AbstractStoreDataManager;
import org.commonjava.indy.service.repository.data.annotations.ClusterStoreDataManager;
import org.commonjava.indy.service.repository.data.infinispan.CacheHandle;
import org.commonjava.indy.service.repository.data.infinispan.CacheProducer;
import org.commonjava.indy.service.repository.exception.IndyDataException;
import org.commonjava.indy.service.repository.model.AbstractRepository;
import org.commonjava.indy.service.repository.model.ArtifactStore;
import org.commonjava.indy.service.repository.model.Group;
Expand All @@ -34,8 +37,6 @@
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
Expand All @@ -45,6 +46,7 @@
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer;
import java.util.stream.Collectors;
import java.util.stream.Stream;
Expand Down Expand Up @@ -673,4 +675,29 @@ protected CacheProducer getCacheProducer()
return cacheProducer;
}

@Override
public boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
throws IndyDataException
{
AtomicReference<IndyDataException> error = new AtomicReference<>();
Boolean res = opLocks.lockAnd( key, LOCK_TIMEOUT_SECONDS, k -> storeQuery.addConstituentToGroup( k, member ),
( k, lock ) -> {
error.set( new IndyDataException(
"Failed to lock: %s for Group member add after %d seconds.", k,
LOCK_TIMEOUT_SECONDS ) );
return false;
} );

if ( res == null )
{
throw new IndyDataException( "Add Group member failed due to tryLock timeout." );
}
IndyDataException ex = error.get();
if ( ex != null )
{
throw ex;
}
return res;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,24 @@
import com.datastax.driver.core.exceptions.NoHostAvailableException;
import com.datastax.driver.mapping.Mapper;
import com.datastax.driver.mapping.MappingManager;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.commonjava.indy.service.repository.model.StoreKey;
import org.commonjava.indy.service.repository.model.StoreType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.annotation.PostConstruct;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import static org.commonjava.indy.service.repository.data.cassandra.CassandraStoreUtil.CONSTITUENTS;
import static org.commonjava.indy.service.repository.data.cassandra.CassandraStoreUtil.TABLE_AFFECTED_STORE;
import static org.commonjava.indy.service.repository.data.cassandra.CassandraStoreUtil.TABLE_STORE;

Expand All @@ -50,6 +57,9 @@ public class CassandraStoreQuery
@Inject
CassandraConfiguration config;

@Inject
ObjectMapper objectMapper;

private Mapper<DtxArtifactStore> storeMapper;

private Session session;
Expand Down Expand Up @@ -143,6 +153,70 @@ public DtxArtifactStore getArtifactStore( String packageType, StoreType type, St
return toDtxArtifactStore( result.one() );
}

public boolean addConstituentToGroup( StoreKey key, StoreKey member )
{
DtxArtifactStore dtxArtifactStore = getArtifactStore( key.getPackageType(), key.getType(), key.getName() );
if ( dtxArtifactStore == null )
{
logger.warn( "No DtxArtifactStore was found to match the StoreKey {}.", key );
return false;
}

Map<String, String> extras = dtxArtifactStore.getExtras();
String members = extras.get( CONSTITUENTS );
if ( members == null || members.isEmpty() )
{
return saveExtraValue( member, extras, dtxArtifactStore );
}

List<String> memberStrList = readListValue( members );
if ( memberStrList == null )
{
return false;
}
List<StoreKey> memberList = memberStrList.stream().map( StoreKey::fromString ).collect( Collectors.toList() );

if ( memberList.contains( member ) )
{
logger.info( "StoreKey {} was already existed in Group {} members, skip.", member, key );
return true;
}
else
{
memberList.add( member );
return saveExtraValue( memberList, extras, dtxArtifactStore );
}
}

private List<String> readListValue( String value )
{
try
{
return objectMapper.readValue( value, List.class );
}
catch ( JsonProcessingException e )
{
logger.error( "Failed to read member list value, value: {}.", value, e );
return null;
}
}

private boolean saveExtraValue( Object value, Map<String, String> extras, DtxArtifactStore dtxArtifactStore )
{
try
{
extras.put( CONSTITUENTS, objectMapper.writeValueAsString( value ) );
dtxArtifactStore.setExtras( extras );
storeMapper.save( dtxArtifactStore );
return true;
}
catch ( JsonProcessingException e )
{
logger.error( "Failed to write value into extra, value: {}", value, e );
return false;
}
}

public Set<DtxArtifactStore> getArtifactStoresByPkgAndType( String packageType, StoreType type )
{

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,21 @@
*/
package org.commonjava.indy.service.repository.data.mem;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.commonjava.indy.service.repository.audit.ChangeSummary;
import org.commonjava.indy.service.repository.data.AbstractStoreDataManager;
import org.commonjava.indy.service.repository.data.annotations.MemStoreDataManager;
import org.commonjava.indy.service.repository.change.event.NoOpStoreEventDispatcher;
import org.commonjava.indy.service.repository.change.event.StoreEventDispatcher;
import org.commonjava.indy.service.repository.data.AbstractStoreDataManager;
import org.commonjava.indy.service.repository.data.annotations.MemStoreDataManager;
import org.commonjava.indy.service.repository.exception.IndyDataException;
import org.commonjava.indy.service.repository.model.ArtifactStore;
import org.commonjava.indy.service.repository.model.Group;
import org.commonjava.indy.service.repository.model.StoreKey;
import org.commonjava.indy.service.repository.model.StoreType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
Expand Down Expand Up @@ -171,4 +173,18 @@ protected ArtifactStore putArtifactStoreInternal( StoreKey storeKey, ArtifactSto
return stores.put( storeKey, store );
}

@Override
public boolean addConstituentToGroup( final StoreKey key, final StoreKey member )
throws IndyDataException
{
Group group = (Group) stores.get( key );
if ( group != null )
{
group.addConstituent( member );
stores.put( key, group );
return true;
}
return false;
}

}
Loading