tree 9ea25bfa2acaf31f6533e3ee55f89ff31964b1fd
parent a7fa05bb014503609d1b6287fa08b0a296098088
author Yingyi Bu <yingyi@couchbase.com> 1498026899 -0700
committer Yingyi Bu <buyingyi@gmail.com> 1498058581 -0700

[ASTERIXDB-1945][STO] Cleanup Buffer Cache API

- user model changes: no
- storage format changes: no
- interface changes: yes
  INcApplicationContext
   - removed IFileMapProvider getFileMapManager();
     to hide FileMapManager from other components;
  IStorageManager
   - IFileMapProvider getFileMapProvider(INCServiceContext ctx);
     to hide FileMapManager from other components;
  IFileHandle
   - added FileReference getFileReference();
     to avoid unnecessary casts;
  IIOManager
   - public void deleteWorkspaceFiles() throws
                              HyracksDataException;
     added throws;
  ILSMIndexFileManager
   - void createDirs() throws HyracksDataException;
     added throws;
  IInvertedIndex
   - added void purge() throws HyracksDataException;
     a. InvertedIndexes don't implement the ITreeIndex interface.
     b. when we deactivate a disk component, we need to purge it so
        the buffer cache doesn't go through each page.
     c. this need to be revisited, ASTERIXDB-1944
  IFileMapManager
   - int registerFile(FileReference fileRef) throws
                                    HyracksDataException;
     return value added for future reference of the index file
     inside BufferCache or VirtualBufferCache;
   - FileReference unregisterFile(int fileId) throws
                                    HyracksDataException;
     return value added for future refernece of the file;
  IBufferCache
   - int createFile(FileReference fileRef) throws
                                      HyracksDataException;
     return value added for future reference of the index file
     inside BufferCache or VirtualBufferCache;
   - void deleteFile(int fileId) throws HyracksDataException;
     remove the dirty page flag since there's no dirty page;
   - int openFile(FileReference fileRef) throws
                                         HyracksDataException;
     return value added for future reference of the index file
     inside BufferCache or VirtualBufferCache;
   - added void deleteFile(FileReference file) throws
                                       HyracksDataException;
     we used to have this public methods in both BufferCache
     and VirtualBufferCache. Now we lifted it into the interface.
  AbstractLSMIndex
   - removed protected abstract void
             destroyMemoryComponent(ILSMMemoryComponent c)
             throws HyracksDataException;
     It is because turned out when we deactivate, we actually
     destroy them. However, because of the not well defined API,
     double destroy was okay and so we used to do double destroy.

Details:
This change fixes the buffer cache to follow the API such that:
1. createFile creates the file.
2. deleteFile deletes the file.
3. openFile opens the file.
4. closeFile closes the file.
5. creates existing file is not allowed.
6. deletes deleted file is not allowed.
7. open non existing file is not allowed.

In addition, we hide the file map from all other components.

Change-Id: I0a973c2adb2e7fdcbbf18c7b888af3de5f0acc74
Reviewed-on: https://asterix-gerrit.ics.uci.edu/1843
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
BAD: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
