Ejemplo n.º 1
0
 @Override
 public PMetaData addTable(PTable table) throws SQLException {
   Map<String, PTable> tables = Maps.newHashMap(metaData);
   PTable oldTable = tables.put(table.getName().getString(), table);
   if (table.getParentName() != null) { // Upsert new index table into parent data table list
     String parentName = table.getParentName().getString();
     PTable parentTable = tables.get(parentName);
     // If parentTable isn't cached, that's ok we can skip this
     if (parentTable != null) {
       List<PTable> oldIndexes = parentTable.getIndexes();
       List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size() + 1);
       newIndexes.addAll(oldIndexes);
       if (oldTable != null) {
         newIndexes.remove(oldTable);
       }
       newIndexes.add(table);
       tables.put(
           parentName, PTableImpl.makePTable(parentTable, table.getTimeStamp(), newIndexes));
     }
   }
   for (PTable index : table.getIndexes()) {
     tables.put(index.getName().getString(), index);
   }
   return new PMetaDataImpl(tables);
 }
Ejemplo n.º 2
0
 @Override
 public PMetaData removeTable(
     PName tenantId, String tableName, String parentTableName, long tableTimeStamp)
     throws SQLException {
   PMetaDataCache tables = null;
   PTableRef parentTableRef = null;
   PTableKey key = new PTableKey(tenantId, tableName);
   if (metaData.get(key) == null) {
     if (parentTableName != null) {
       parentTableRef = metaData.get(new PTableKey(tenantId, parentTableName));
     }
     if (parentTableRef == null) {
       return this;
     }
   } else {
     tables = metaData.clone();
     PTable table = tables.remove(key);
     for (PTable index : table.getIndexes()) {
       tables.remove(index.getKey());
     }
     if (table.getParentName() != null) {
       parentTableRef = tables.get(new PTableKey(tenantId, table.getParentName().getString()));
     }
   }
   // also remove its reference from parent table
   if (parentTableRef != null) {
     List<PTable> oldIndexes = parentTableRef.getTable().getIndexes();
     if (oldIndexes != null && !oldIndexes.isEmpty()) {
       List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size());
       newIndexes.addAll(oldIndexes);
       for (int i = 0; i < newIndexes.size(); i++) {
         PTable index = newIndexes.get(i);
         if (index.getName().getString().equals(tableName)) {
           newIndexes.remove(i);
           PTable parentTable =
               PTableImpl.makePTable(
                   parentTableRef.getTable(),
                   tableTimeStamp == HConstants.LATEST_TIMESTAMP
                       ? parentTableRef.getTable().getTimeStamp()
                       : tableTimeStamp,
                   newIndexes);
           if (tables == null) {
             tables = metaData.clone();
           }
           tables.put(parentTable.getKey(), parentTable, parentTableRef.getResolvedTimeStamp());
           break;
         }
       }
     }
   }
   return tables == null ? this : new PMetaDataImpl(tables);
 }
Ejemplo n.º 3
0
  @Override
  public PMetaData addTable(PTable table, long resolvedTime) throws SQLException {
    int netGain = 0;
    PTableKey key = table.getKey();
    PTableRef oldTableRef = metaData.get(key);
    if (oldTableRef != null) {
      netGain -= oldTableRef.getEstSize();
    }
    PTable newParentTable = null;
    long parentResolvedTimestamp = resolvedTime;
    if (table.getParentName() != null) { // Upsert new index table into parent data table list
      String parentName = table.getParentName().getString();
      PTableRef oldParentRef = metaData.get(new PTableKey(table.getTenantId(), parentName));
      // If parentTable isn't cached, that's ok we can skip this
      if (oldParentRef != null) {
        List<PTable> oldIndexes = oldParentRef.getTable().getIndexes();
        List<PTable> newIndexes = Lists.newArrayListWithExpectedSize(oldIndexes.size() + 1);
        newIndexes.addAll(oldIndexes);
        for (int i = 0; i < newIndexes.size(); i++) {
          PTable index = newIndexes.get(i);
          if (index.getName().equals(table.getName())) {
            newIndexes.remove(i);
            break;
          }
        }
        newIndexes.add(table);
        netGain -= oldParentRef.getEstSize();
        newParentTable =
            PTableImpl.makePTable(oldParentRef.getTable(), table.getTimeStamp(), newIndexes);
        netGain += newParentTable.getEstimatedSize();
      }
    }
    if (newParentTable
        == null) { // Don't count in gain if we found a parent table, as its accounted for in
                   // newParentTable
      netGain += table.getEstimatedSize();
    }
    long overage = metaData.getCurrentSize() + netGain - metaData.getMaxSize();
    PMetaDataCache newMetaData =
        overage <= 0 ? metaData.clone() : metaData.cloneMinusOverage(overage);

    if (newParentTable != null) { // Upsert new index table into parent data table list
      newMetaData.put(newParentTable.getKey(), newParentTable, parentResolvedTimestamp);
      newMetaData.putDuplicate(table.getKey(), table, resolvedTime);
    } else {
      newMetaData.put(table.getKey(), table, resolvedTime);
    }
    for (PTable index : table.getIndexes()) {
      newMetaData.putDuplicate(index.getKey(), index, resolvedTime);
    }
    return new PMetaDataImpl(newMetaData);
  }