Github user ramkrish86 commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/8#discussion_r16698962
  
    --- Diff: 
phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
 ---
    @@ -664,14 +698,161 @@ private PTable getTable(RegionScanner scanner, long 
clientTimeStamp, long tableT
               } else {
                   addColumnToTable(results, colName, famName, colKeyValues, 
columns, saltBucketNum != null);
               }
    +        }        
    +        byte[] tenIdBytes = QueryConstants.EMPTY_BYTE_ARRAY;
    +        if (tenantId != null) {
    +            tenIdBytes = tenantId.getBytes();
             }
    -
    +        byte[] schNameInBytes = QueryConstants.EMPTY_BYTE_ARRAY;
    +        if (schemaName != null) {
    +            schNameInBytes = Bytes.toBytes(schemaName.getString());
    +        }
    +        PTableStats stats = updateStats(SchemaUtil.getTableKey(tenIdBytes, 
schNameInBytes, tableNameBytes));
             return PTableImpl.makePTable(tenantId, schemaName, tableName, 
tableType, indexState, timeStamp, 
                 tableSeqNum, pkName, saltBucketNum, columns, tableType == 
INDEX ? dataTableName : null, 
                 indexes, isImmutableRows, physicalTables, defaultFamilyName, 
viewStatement, disableWAL, 
    -            multiTenant, viewType, viewIndexId, indexType);
    +            multiTenant, viewType, viewIndexId, indexType, stats);
         }
     
    +    private PTableStats updateStats(final byte[] tableNameBytes) {
    +        lock.readLock().lock();
    +        try {
    +            PTableStats stats = 
tableStatsMap.get(Bytes.toString(tableNameBytes));
    +            return stats;
    +        } finally {
    +            lock.readLock().unlock();
    +        }
    +    }
    +    
    +    private void updateStatsInternal(byte[] tableNameBytes, 
RegionCoprocessorEnvironment env)
    --- End diff --
    
        Then an updateStats would just need to invalidate the cache entry for 
the table. Next time the table is accessed, the stats    table would be re-read.
        How about if we just read the stats anytime we re-load the PTable
    So you mean when ever getTable() is called collect the udpateStats in a 
seperate thread.  If the stats was really changed then we would be returning 
the new stats that was updated (after invalidation). Or you mean that when ever 
we reload the table and populate the cache we do a scan of the STATS table and 
get the updated stats info in the main thread only.  The invalidation is done 
only when the schema changes or index is removed/added which also means there 
is no need for periodic scanning of stats table. Am i right here? 



---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to