public void refreshTableColStats(List<ColumnStatisticsObj> colStatsForTable) { Map<String, ColumnStatisticsObj> newTableColStatsCache = new HashMap<String, ColumnStatisticsObj>(); try { tableLock.writeLock().lock(); for (ColumnStatisticsObj colStatObj : colStatsForTable) { if (isTableColStatsCacheDirty.compareAndSet(true, false)) { LOG.debug("Skipping table col stats cache update for table: " + getTable().getTableName() + "; the table col stats list we have is dirty."); return; } String key = colStatObj.getColName(); // TODO: get rid of deepCopy after making sure callers don't use references newTableColStatsCache.put(key, colStatObj.deepCopy()); } tableColStatsCache = newTableColStatsCache; } finally { tableLock.writeLock().unlock(); } }
public void cacheAggrPartitionColStats(AggrStats aggrStatsAllPartitions, AggrStats aggrStatsAllButDefaultPartition) { try { tableLock.writeLock().lock(); if (aggrStatsAllPartitions != null) { for (ColumnStatisticsObj statObj : aggrStatsAllPartitions.getColStats()) { if (statObj != null) { List<ColumnStatisticsObj> aggrStats = new ArrayList<ColumnStatisticsObj>(); aggrStats.add(StatsType.ALL.ordinal(), statObj.deepCopy()); aggrColStatsCache.put(statObj.getColName(), aggrStats); } } } if (aggrStatsAllButDefaultPartition != null) { for (ColumnStatisticsObj statObj : aggrStatsAllButDefaultPartition.getColStats()) { if (statObj != null) { List<ColumnStatisticsObj> aggrStats = aggrColStatsCache.get(statObj.getColName()); if (aggrStats == null) { aggrStats = new ArrayList<ColumnStatisticsObj>(); } aggrStats.add(StatsType.ALLBUTDEFAULT.ordinal(), statObj.deepCopy()); } } } isAggrPartitionColStatsCacheDirty.set(true); } finally { tableLock.writeLock().unlock(); } }
tableColStatsCache.put(key, colStatObj.deepCopy());
partitionColStatsCache.put(key, colStatObj.deepCopy());
newPartitionColStatsCache.put(key, colStatObj.deepCopy());