blob: 98ae01254d53132d42485606eab5dd647e9e9c3d [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.carbondata.core.cache.dictionary;
import java.io.IOException;
import java.util.List;
import org.apache.carbondata.common.logging.LogServiceFactory;
import org.apache.carbondata.core.cache.Cache;
import org.apache.carbondata.core.cache.CacheProvider;
import org.apache.carbondata.core.cache.CacheType;
import org.apache.carbondata.core.datastore.filesystem.CarbonFile;
import org.apache.carbondata.core.datastore.filesystem.CarbonFileFilter;
import org.apache.carbondata.core.datastore.impl.FileFactory;
import org.apache.carbondata.core.metadata.AbsoluteTableIdentifier;
import org.apache.carbondata.core.metadata.ColumnIdentifier;
import org.apache.carbondata.core.metadata.schema.table.CarbonTable;
import org.apache.carbondata.core.metadata.schema.table.column.CarbonDimension;
import org.apache.carbondata.core.metadata.schema.table.column.ColumnSchema;
import org.apache.carbondata.core.util.path.CarbonTablePath;
import org.apache.log4j.Logger;
/**
* This class is aimed at managing dictionary files for any new addition and deletion
* and calling of clear cache for BTree and dictionary instances from LRU cache
*/
public class ManageDictionaryAndBTree {
/**
* Attribute for Carbon LOGGER
*/
private static final Logger LOGGER =
LogServiceFactory.getLogService(ManageDictionaryAndBTree.class.getName());
/**
* This method will delete the dictionary files for the given column IDs and
* clear the dictionary cache
*
* @param columnSchema
* @param identifier
*/
public static void deleteDictionaryFileAndCache(final ColumnSchema columnSchema,
AbsoluteTableIdentifier identifier) {
String metadataDirectoryPath = CarbonTablePath.getMetadataPath(identifier.getTablePath());
CarbonFile metadataDir = FileFactory.getCarbonFile(metadataDirectoryPath);
if (metadataDir.exists()) {
// sort index file is created with dictionary size appended to it. So all the files
// with a given column ID need to be listed
CarbonFile[] listFiles = metadataDir.listFiles(new CarbonFileFilter() {
@Override
public boolean accept(CarbonFile path) {
if (path.getName().startsWith(columnSchema.getColumnUniqueId())) {
return true;
}
return false;
}
});
for (CarbonFile file : listFiles) {
// try catch is inside for loop because even if one deletion fails, other files
// still need to be deleted
try {
FileFactory.deleteFile(file.getCanonicalPath());
} catch (IOException e) {
LOGGER.error("Failed to delete dictionary or sortIndex file for column "
+ columnSchema.getColumnName() + "with column ID "
+ columnSchema.getColumnUniqueId());
}
}
}
// remove dictionary cache
removeDictionaryColumnFromCache(identifier, columnSchema.getColumnUniqueId());
}
/**
* This mwthod will invalidate both BTree and dictionary instances from LRU cache
*
* @param carbonTable
*/
public static void clearBTreeAndDictionaryLRUCache(CarbonTable carbonTable) {
// clear dictionary cache from LRU cache
List<CarbonDimension> dimensions = carbonTable.getVisibleDimensions();
for (CarbonDimension dimension : dimensions) {
removeDictionaryColumnFromCache(carbonTable.getAbsoluteTableIdentifier(),
dimension.getColumnId());
}
}
/**
* This method will remove dictionary cache from driver for both reverse and forward dictionary
*
* @param carbonTableIdentifier
* @param columnId
*/
public static void removeDictionaryColumnFromCache(AbsoluteTableIdentifier carbonTableIdentifier,
String columnId) {
Cache<DictionaryColumnUniqueIdentifier, Dictionary> dictCache =
CacheProvider.getInstance().createCache(CacheType.REVERSE_DICTIONARY);
DictionaryColumnUniqueIdentifier dictionaryColumnUniqueIdentifier =
new DictionaryColumnUniqueIdentifier(carbonTableIdentifier,
new ColumnIdentifier(columnId, null, null));
dictCache.invalidate(dictionaryColumnUniqueIdentifier);
dictCache = CacheProvider.getInstance().createCache(CacheType.FORWARD_DICTIONARY);
dictCache.invalidate(dictionaryColumnUniqueIdentifier);
}
}