Description
On the client-side, Phoenix pings the server when a query is compiled to confirm that the client has the most up-to-date metadata for the table being queried. For some tables that are known to not change, this RPC is wasteful.
We can allow a property such as UPDATE_CACHE_FREQUENCY to be specified a time to wait before checking with the server to see if the metadata has changed. This could be specified in the CREATE TABLE call and stored in the SYSTEM.CATALOG table header row. By default the value could be 0 which would keep the current behavior. Tables that never change could use Long.MAX_VALUE. Potentially we could allow 'ALWAYS' and 'NEVER' values for convenience.
Proposed implementation:
- add public long getAge() method to PTableRef.
- when setting lastAccessTime, also store System.currentMillis() to new setAccessTime private member variable
- the getAge() would return System.currentMillis() - setAccessTime
- code in MetaDataClient would prevent call to server if age < UPDATE_CACHE_FREQUENCY