blob: d4bade4551e319e218258aeb01df5a7a0a266b03 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.usergrid.corepersistence.index;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.usergrid.persistence.map.MapManager;
import org.apache.usergrid.utils.JsonUtils;
import com.google.common.base.Optional;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.google.inject.Singleton;
/**
* Cache the calls to update and get the map manager so we don't overload cassandra when we update
* after each call?
*/
@Singleton
public class IndexSchemaCacheImpl implements IndexSchemaCache {
private static final Logger logger = LoggerFactory.getLogger(IndexSchemaCacheImpl.class );
private final LoadingCache<String,Optional<Map>> indexSchemaCache;
private final MapManager mapManager;
public IndexSchemaCacheImpl(MapManager mapManager,IndexSchemaCacheFig indexSchemaCacheFig){
this.mapManager = mapManager;
indexSchemaCache = CacheBuilder.newBuilder()
.maximumSize( indexSchemaCacheFig.getCacheSize() )
.expireAfterWrite( indexSchemaCacheFig.getCacheTimeout(), TimeUnit.MILLISECONDS )
.build( new CacheLoader<String, Optional<Map>>() {
@Override
public Optional<Map> load( final String collectionName ) throws Exception {
return Optional.fromNullable( retrieveCollectionSchema( collectionName ) );
}
} );
}
private Map retrieveCollectionSchema( final String collectionName ){
String collectionIndexingSchema = mapManager.getString( collectionName );
Map parsedCollectionIndexingSchema = null;
if(collectionIndexingSchema!=null){
return (Map) JsonUtils.parse( collectionIndexingSchema );
}
return parsedCollectionIndexingSchema;
}
@Override
public Optional<Map> getCollectionSchema( final String collectionName ) {
try {
Optional<Map> optionalCollectionSchema = indexSchemaCache.get( collectionName );
if(!optionalCollectionSchema.isPresent()){
indexSchemaCache.invalidate( collectionName );
return Optional.absent();
}
return optionalCollectionSchema;
}catch(Exception e){
if(logger.isDebugEnabled()){
logger.debug( "Returning for collection name: {} "
+ "resulted in the following failure: {}",collectionName,e );
}
}
return null;
}
@Override
public void putCollectionSchema( final String collectionName, final String collectionSchema ){
mapManager.putString( collectionName, collectionSchema );
evictCollectionSchema( collectionName );
}
@Override
public void deleteCollectionSchema(final String collectionName){
mapManager.delete( collectionName );
evictCollectionSchema( collectionName );
}
@Override
public void evictCollectionSchema( final String collectionName ) {
indexSchemaCache.invalidate( collectionName );
if(logger.isDebugEnabled() ){
logger.debug( "Invalidated key {}",collectionName );
}
}
@Override
public void evictCache() {
indexSchemaCache.invalidateAll();
if(logger.isDebugEnabled()){
logger.debug( "Invalidated all keys" );
}
}
}