/** * Used when the cache is growing past its max size to clone in a single pass. * Removes least recently used tables to get size of cache below its max size by * the overage amount. */ public PMetaDataCache cloneMinusOverage(long overage) { assert(overage > 0); int nToRemove = Math.max(MIN_REMOVAL_SIZE, (int)Math.ceil((currentByteSize-maxByteSize) / ((double)currentByteSize / size())) + 1); MinMaxPriorityQueue<PTableRef> toRemove = BUILDER.expectedSize(nToRemove).create(); PMetaDataCache newCache = new PMetaDataCache(this.size(), this.maxByteSize, this.timeKeeper, this.tableRefFactory); long toRemoveBytes = 0; // Add to new cache, but track references to remove when done // to bring cache at least overage amount below it's max size. for (PTableRef tableRef : this.tables.values()) { newCache.put(tableRef.getTable().getKey(), tableRefFactory.makePTableRef(tableRef)); toRemove.add(tableRef); toRemoveBytes += tableRef.getEstimatedSize(); while (toRemoveBytes - toRemove.peekLast().getEstimatedSize() >= overage) { PTableRef removedRef = toRemove.removeLast(); toRemoveBytes -= removedRef.getEstimatedSize(); } } for (PTableRef toRemoveRef : toRemove) { newCache.remove(toRemoveRef.getTable().getKey()); } return newCache; }
PMetaDataCache(PMetaDataCache toClone) { this.tableRefFactory = toClone.tableRefFactory; this.timeKeeper = toClone.timeKeeper; this.maxByteSize = toClone.maxByteSize; this.currentByteSize = toClone.currentByteSize; this.expectedCapacity = toClone.expectedCapacity; this.tables = cloneMap(toClone.tables, expectedCapacity); this.functions = cloneFunctionsMap(toClone.functions, expectedCapacity); this.schemas = cloneSchemaMap(toClone.schemas, expectedCapacity); }
@Override public PTableRef getTableRef(PTableKey key) throws TableNotFoundException { PTableRef ref = metaData.get(key); if (ref == null) { throw new TableNotFoundException(key.getName()); } return ref; }
int netGain = 0; PTableKey key = table.getKey(); PTableRef oldTableRef = metaData.get(key); if (oldTableRef != null) { netGain -= oldTableRef.getEstimatedSize(); if (table.getType() == PTableType.INDEX) { // Upsert new index table into parent data table list String parentName = table.getParentName().getString(); PTableRef oldParentRef = metaData.get(new PTableKey(table.getTenantId(), parentName)); netGain += tableRef.getEstimatedSize(); long overage = metaData.getCurrentSize() + netGain - metaData.getMaxSize(); metaData = overage <= 0 ? metaData : metaData.cloneMinusOverage(overage); metaData.put(newParentTable.getKey(), newParentTableRef); metaData.put(table.getKey(), tableRef); } else { metaData.put(table.getKey(), tableRef); metaData.put(index.getKey(), tableRefFactory.makePTableRef(index, this.timeKeeper.getCurrentTime(), resolvedTime));
PTableRef parentTableRef = null; PTableKey key = new PTableKey(tenantId, tableName); if (metaData.get(key) == null) { if (parentTableName != null) { parentTableRef = metaData.get(new PTableKey(tenantId, parentTableName)); PTable table = metaData.remove(key); for (PTable index : table.getIndexes()) { metaData.remove(index.getKey()); parentTableRef = metaData.get(new PTableKey(tenantId, table.getParentName().getString())); metaData.put(parentTable.getKey(), tableRefFactory.makePTableRef(parentTable, this.timeKeeper.getCurrentTime(), parentTableRef.getResolvedTimeStamp())); break;
@Override public void removeColumn(PName tenantId, String tableName, List<PColumn> columnsToRemove, long tableTimeStamp, long tableSeqNum, long resolvedTime) throws SQLException { PTableRef tableRef = metaData.get(new PTableKey(tenantId, tableName)); if (tableRef == null) { return; .build(); tables.put(table.getKey(), tableRefFactory.makePTableRef(table, this.timeKeeper.getCurrentTime(), resolvedTime));
@Override public PMetaDataCache clone() { return new PMetaDataCache(this); }
@Override public long getAge(PTableRef ref) { return this.metaData.getAge(ref); }
@Override public Iterator<PTable> iterator() { return metaData.iterator(); }
int netGain = 0; PTableKey key = table.getKey(); PTableRef oldTableRef = metaData.get(key); if (oldTableRef != null) { netGain -= oldTableRef.getEstimatedSize(); if (table.getType() == PTableType.INDEX) { // Upsert new index table into parent data table list String parentName = table.getParentName().getString(); PTableRef oldParentRef = metaData.get(new PTableKey(table.getTenantId(), parentName)); netGain += tableRef.getEstimatedSize(); long overage = metaData.getCurrentSize() + netGain - metaData.getMaxSize(); metaData = overage <= 0 ? metaData : metaData.cloneMinusOverage(overage); metaData.put(newParentTable.getKey(), newParentTableRef); metaData.put(table.getKey(), tableRef); } else { metaData.put(table.getKey(), tableRef); metaData.put(index.getKey(), tableRefFactory.makePTableRef(index, this.timeKeeper.getCurrentTime(), resolvedTime));
PTableRef parentTableRef = null; PTableKey key = new PTableKey(tenantId, tableName); if (metaData.get(key) == null) { if (parentTableName != null) { parentTableRef = metaData.get(new PTableKey(tenantId, parentTableName)); PTable table = metaData.remove(key); for (PTable index : table.getIndexes()) { metaData.remove(index.getKey()); parentTableRef = metaData.get(new PTableKey(tenantId, table.getParentName().getString())); tableTimeStamp == HConstants.LATEST_TIMESTAMP ? parentTableRef.getTable().getTimeStamp() : tableTimeStamp, newIndexes); metaData.put(parentTable.getKey(), tableRefFactory.makePTableRef(parentTable, this.timeKeeper.getCurrentTime(), parentTableRef.getResolvedTimeStamp())); break;
@Override public void removeColumn(PName tenantId, String tableName, List<PColumn> columnsToRemove, long tableTimeStamp, long tableSeqNum, long resolvedTime) throws SQLException { PTableRef tableRef = metaData.get(new PTableKey(tenantId, tableName)); if (tableRef == null) { return; tables.put(table.getKey(), tableRefFactory.makePTableRef(table, this.timeKeeper.getCurrentTime(), resolvedTime));
@Override public PMetaDataImpl clone() { return new PMetaDataImpl(new PMetaDataCache(this.metaData), this.timeKeeper, this.tableRefFactory); }
@Override public long getAge(PTableRef ref) { return this.metaData.getAge(ref); }
@Override public Iterator<PTable> iterator() { return metaData.iterator(); }
int netGain = 0; PTableKey key = table.getKey(); PTableRef oldTableRef = metaData.get(key); if (oldTableRef != null) { netGain -= oldTableRef.getEstimatedSize(); if (table.getType() == PTableType.INDEX) { // Upsert new index table into parent data table list String parentName = table.getParentName().getString(); PTableRef oldParentRef = metaData.get(new PTableKey(table.getTenantId(), parentName)); netGain += tableRef.getEstimatedSize(); long overage = metaData.getCurrentSize() + netGain - metaData.getMaxSize(); metaData = overage <= 0 ? metaData : metaData.cloneMinusOverage(overage); metaData.put(newParentTable.getKey(), newParentTableRef); metaData.put(table.getKey(), tableRef); } else { metaData.put(table.getKey(), tableRef); metaData.put(index.getKey(), tableRefFactory.makePTableRef(index, this.timeKeeper.getCurrentTime(), resolvedTime));
/** * Used when the cache is growing past its max size to clone in a single pass. * Removes least recently used tables to get size of cache below its max size by * the overage amount. */ public PMetaDataCache cloneMinusOverage(long overage) { assert(overage > 0); int nToRemove = Math.max(MIN_REMOVAL_SIZE, (int)Math.ceil((currentByteSize-maxByteSize) / ((double)currentByteSize / size())) + 1); MinMaxPriorityQueue<PTableRef> toRemove = BUILDER.expectedSize(nToRemove).create(); PMetaDataCache newCache = new PMetaDataCache(this.size(), this.maxByteSize, this.timeKeeper, this.tableRefFactory); long toRemoveBytes = 0; // Add to new cache, but track references to remove when done // to bring cache at least overage amount below it's max size. for (PTableRef tableRef : this.tables.values()) { newCache.put(tableRef.getTable().getKey(), tableRefFactory.makePTableRef(tableRef)); toRemove.add(tableRef); toRemoveBytes += tableRef.getEstimatedSize(); while (toRemoveBytes - toRemove.peekLast().getEstimatedSize() >= overage) { PTableRef removedRef = toRemove.removeLast(); toRemoveBytes -= removedRef.getEstimatedSize(); } } for (PTableRef toRemoveRef : toRemove) { newCache.remove(toRemoveRef.getTable().getKey()); } return newCache; }
PMetaDataCache(PMetaDataCache toClone) { this.tableRefFactory = toClone.tableRefFactory; this.timeKeeper = toClone.timeKeeper; this.maxByteSize = toClone.maxByteSize; this.currentByteSize = toClone.currentByteSize; this.expectedCapacity = toClone.expectedCapacity; this.tables = cloneMap(toClone.tables, expectedCapacity); this.functions = cloneFunctionsMap(toClone.functions, expectedCapacity); this.schemas = cloneSchemaMap(toClone.schemas, expectedCapacity); }
PTableRef parentTableRef = null; PTableKey key = new PTableKey(tenantId, tableName); if (metaData.get(key) == null) { if (parentTableName != null) { parentTableRef = metaData.get(new PTableKey(tenantId, parentTableName)); PTable table = metaData.remove(key); for (PTable index : table.getIndexes()) { metaData.remove(index.getKey()); parentTableRef = metaData.get(new PTableKey(tenantId, table.getParentName().getString())); metaData.put(parentTable.getKey(), tableRefFactory.makePTableRef(parentTable, this.timeKeeper.getCurrentTime(), parentTableRef.getResolvedTimeStamp())); break;
@Override public void removeColumn(PName tenantId, String tableName, List<PColumn> columnsToRemove, long tableTimeStamp, long tableSeqNum, long resolvedTime) throws SQLException { PTableRef tableRef = metaData.get(new PTableKey(tenantId, tableName)); if (tableRef == null) { return; .build(); tables.put(table.getKey(), tableRefFactory.makePTableRef(table, this.timeKeeper.getCurrentTime(), resolvedTime));