com.nhncorp.neptune.tabletserver
Class Tablet

java.lang.Object
  extended by com.nhncorp.neptune.tabletserver.Tablet
All Implemented Interfaces:
Constants

public class Tablet
extends java.lang.Object
implements Constants

commit: ChangeLogMerge를 하면 안됨 scanner opened: Major Compaction, Minor Compaction, Split or Merge 못함. drop, stop은 기다렸다가 close되면 시작 MinorCompaction: MajorCompaction, Split, Merge, ScanOpen 못하고, drop, stop은 기다렸다가 종료되면 시작 MajorCompaction: MinorCompaction, Split, Merge, ScanOpen 못하고, drop, stop은 기다렸다가 종료되면 시작 Split or Merge: Major Compaction, Minor Compaction, drop, stop, ScanOpen 못함. commit은 Split/Merge 작업중 MemTablet에 관련된 작업 진행중에만 못함 drop or stop: all stop

Author:
babokim

Field Summary
static java.lang.String DIR_TEMP_MAJOR
           
static java.lang.String DIR_TEMP_MINOR
           
static java.lang.String DIR_TEMP_SPLIT
           
static java.lang.String DIR_TEMP_UPLOAD
           
static org.apache.commons.logging.Log LOG
           
 
Fields inherited from interface com.nhncorp.neptune.common.Constants
BATCH_RECEIVER_SUCCESS, BATCH_UPLOAD, CHANGELOG_SERVER, COMPACTION, DELETEED, END_RECEIVE_ROW, GROUPS, INDEX_INTERVAL_LENGH, INSERTED, LOG_OP_ADD_COLUMN_VALUE, LOG_OP_CREATE_ROW, LOG_OP_DELETE_COLUMN_VALUE, LOG_OP_MODIFY_META, MAP_RECORD_COLUMN, MAP_RECORD_ROW, MASTER, MASTER_SERVER, MAX_KEY_LENGTH, MAX_VALUE, META_COLUMN_NAME_TABLETINFO, MIN_VALUE, NEPTUNE, OPEN_SCANNER, PATH_SCHEMA, PIPE_CL_FILE_NAME, PROCESS, ROOT_TABLET, SCANNER_END, SCANNER_OPEN_FAIL, SCANNER_OPEN_SUCCESS, SCHEMA_DESCRIPTION_FILE_NAME, SCHEMA_INFO_FILENAME, SERVER, SPLIT, SPLIT_INFO, SPLIT_STORE, SUPERGROUP, TABLE_DROP, TABLE_LOCK, TABLE_NAME_META, TABLE_NAME_ROOT, TABLET_ALIVE, TABLET_ASSIGN, TABLET_AVAIL, TABLET_CREATED, TABLET_DROP, TABLET_FAIL, TABLET_STOP_MARK, TABLETSERVER_SPLIT, TEST_MODE, UPLOAD_END, UPLOAD_FAIL, UPLOAD_START_ROW, UPLOADER, USERS
 
Constructor Summary
Tablet(NConfiguration conf, TableSchema table, TabletServer tabletServer, TabletInfo tabletInfo)
           
 
Method Summary
 void addColumn(java.lang.String addedColumnName)
           
 boolean apply(Row.Key rowKey, TxId txId, ChangeLog[] changeLogList, boolean saveLog)
           
 void closeScanner(java.lang.String scannerId)
          open되어 있는 scanner를 close한다.
 void commit(TxId txId)
           
 void commit(TxId txId, boolean saveLog)
           
 void commit(TxId txId, ChangeLog[] changeLogList, boolean saveLog)
          트렌젝션을 종료한다.
 void deleteChangeLog()
           
static void deleteChangeLog(ChangeLogFileSystemIF changeLogFileSystem, java.lang.String tableName, java.lang.String tabletName)
           
 boolean deleteColumnValue(TxId txId, java.lang.String columnName, Cell.Key columnKey, long timestamp)
          특정 Row의 컬럼 값을 삭제한다.
 void deleteSplitTempDir()
           
 void deleteTablet()
           
 void doMajorCompaction()
          하나의 Tablet에서 관리하고 있는 여러개의 MapFile을 merge하여 하나의 MapFile로 만든다.
 void doMinorCompaction()
          MemoryTablet이 일정 사이즈보다 커지게 되면 Memory의 내용을 Disk의 MapFile로 저장한다.
 void doTabletSplit()
           
 void drop()
           
static Row.Key generateMetaRowKey(java.lang.String tableName, Row.Key rowKey)
           
static java.lang.String generateTabletName(java.lang.String tableName)
           
 ColumnValue[][] get(Row.Key rowKey)
          특정 Row의 모든 컬럼의 데이터를 조회한다.
 ColumnValue[] get(Row.Key rowKey, java.lang.String columnName)
          데이터를 조회한다. !!!
 ColumnValue[][] get(Row.Key rowKey, java.lang.String[] columnNames)
          특정 Row의 지정된 컬럼들의 데이터를 조회한다.
 ColumnValue get(Row.Key rowKey, java.lang.String columnName, Cell.Key cellKey)
          데이터를 조회한다.
 RowColumnValues[] get(RowFilter filter)
           
 ActionChecker getActionChecker()
           
 java.lang.String[] getAllActions()
           
 ColumnValue getClosest(Row.Key rowKey, java.lang.String columnName)
          입력받은 rowKey와 가장 가까운 Row.Key중 가장 큰 Row.Key를 가지는 row의 값을 조회한다.
 NConfiguration getConf()
           
 DiskSSTableIF getDiskSSTable()
           
 Row.Key[] getLockedRowKey()
           
 int getMapFileCount()
           
 MemorySSTableIF getMemorySSTable()
           
 int getMemtableSize()
          MemTablet의 현재 메모리 사이즈를 반환한다.
 int getOpenedScannerCount()
           
static TabletInfo getRootTabletInfo(com.nhncorp.pleiades.client.LockService lockService)
           
 Row.Key[] getSplitedRowKeyRanges(int splitPerTablet)
           
 TableSchema getTable()
           
static java.lang.String getTableNameFromTabletName(java.lang.String tabletName)
           
 TabletReport getTabletDetailInfo()
           
 TabletInfo getTabletInfo()
           
static GPath getTabletLocalTempPath(NConfiguration conf, TabletInfo tabletInfo, java.lang.String actionId)
           
static GPath getTabletMajorCompactionTempPath(NConfiguration conf, java.lang.String tableName, java.lang.String tabletName)
           
static GPath getTabletMajorCompactionTempPath(NConfiguration conf, TabletInfo tabletInfo)
           
static GPath getTabletMinorCompactionTempPath(NConfiguration conf, java.lang.String tableName, java.lang.String tabletName)
           
static GPath getTabletMinorCompactionTempPath(NConfiguration conf, TabletInfo tabletInfo)
           
static GPath getTabletPath(NConfiguration conf, java.lang.String tableName, java.lang.String tabletName)
           
static GPath getTabletPath(NConfiguration conf, TabletInfo tabletInfo)
           
 TabletServerIF getTabletServer()
           
static GPath getTabletSplitTempPath(NConfiguration conf, java.lang.String tableName, java.lang.String tabletName)
           
static GPath getTabletSplitTempPath(NConfiguration conf, TabletInfo tabletInfo)
           
static GPath getTabletUploadTempPath(NConfiguration conf, TabletInfo tabletInfo, java.lang.String actionId)
           
 boolean hasValue(java.lang.String columnName, Row.Key rowKey)
           
 void insertColumnValue(TxId txId, java.lang.String columnName, ColumnValue[] columnValues)
          특정 row에 컬럼 데이터를 저장한다.
 boolean isDroped()
           
 boolean isEmpty()
           
 boolean isReady()
           
 boolean load()
          Tablet이 TabletServer에 할당되면 MapFile의 index 파일을 읽어 index를 구성하고 ChangeLog 파일을 읽어 MemoryTablet을 구성한다.
 boolean neededMajorCompaction()
           
 boolean neededSplit()
           
 java.lang.String openScanner(java.lang.String columnName, RowFilter scanFilter)
          get의 경우 호출될 때마다 매번 MapFile을 open한 후 seek 해야 하기 때문에 대량의 데이터를 sequential하게 read하는데에는 부적합하다.
 void print()
           
 void removeRow(TxId txId, long timestamp)
           
 Row.Key rollback(TxId txId)
          트렌젝션을 취소시킨다.
 void saveTabletSplitedInfo(TxId txId, TabletInfo targetTablet, TabletInfo[] splitedTablets)
          META/ROOT tablet에 split된 tablet 정보를 저장한다. 3개의 작업(1 delete, 2 insert)이 하나의 change log에 저장되도록한다.
 ColumnValue[] scanNext(java.lang.String scannerId)
          Client API에서는 ColumnRecord 하나만 반환하도록 하지만 네트워크 연결 횟수를 줄이기 위해 한번에 fetch하는 사이즈 만큼 전송한다.
 void setDiskSSTable(DiskSSTableIF diskSSTable)
           
 void setInChangeLogError(boolean flag)
           
 void setReady(boolean ready)
           
 TxId startTx(Row.Key rowKey)
          Row를 생성하거나 Row의 값을 변경하는 트렌젝션을 시작한다.timestamp의 값은 system 시간을 이용한다.
 TxId startTx(Row.Key rowKey, boolean systemTimestamp)
           
 long sumMapFileSize()
           
 void truncateColumn(java.lang.String columnName)
           
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DIR_TEMP_SPLIT

public static final java.lang.String DIR_TEMP_SPLIT
See Also:
Constant Field Values

DIR_TEMP_MINOR

public static final java.lang.String DIR_TEMP_MINOR
See Also:
Constant Field Values

DIR_TEMP_MAJOR

public static final java.lang.String DIR_TEMP_MAJOR
See Also:
Constant Field Values

DIR_TEMP_UPLOAD

public static final java.lang.String DIR_TEMP_UPLOAD
See Also:
Constant Field Values

LOG

public static final org.apache.commons.logging.Log LOG
Constructor Detail

Tablet

public Tablet(NConfiguration conf,
              TableSchema table,
              TabletServer tabletServer,
              TabletInfo tabletInfo)
       throws java.io.IOException
Throws:
java.io.IOException
Method Detail

getTable

public TableSchema getTable()

getConf

public NConfiguration getConf()

setDiskSSTable

public void setDiskSSTable(DiskSSTableIF diskSSTable)

print

public void print()
           throws java.io.IOException
Throws:
java.io.IOException

getLockedRowKey

public Row.Key[] getLockedRowKey()
                          throws java.io.IOException
Returns:
Throws:
java.io.IOException

load

public boolean load()
             throws java.io.IOException
Tablet이 TabletServer에 할당되면 MapFile의 index 파일을 읽어 index를 구성하고 ChangeLog 파일을 읽어 MemoryTablet을 구성한다.

Throws:
java.io.IOException

get

public ColumnValue get(Row.Key rowKey,
                       java.lang.String columnName,
                       Cell.Key cellKey)
                throws java.io.IOException
데이터를 조회한다.

Parameters:
rowKey -
columnName -
columnKey -
Returns:
Throws:
java.io.IOException

get

public RowColumnValues[] get(RowFilter filter)
                      throws java.io.IOException
Throws:
java.io.IOException

get

public ColumnValue[] get(Row.Key rowKey,
                         java.lang.String columnName)
                  throws java.io.IOException
데이터를 조회한다. !!!주의사항!!!! return되는 ColumnValue 값의 rowKey에는 값이 없다. 이것은 실시간 처리의 경우 데이터 전송량이 많아지는 것을 방지하기 위해서이다.

Parameters:
rowKey -
columnName -
Returns:
Throws:
java.io.IOException

get

public ColumnValue[][] get(Row.Key rowKey,
                           java.lang.String[] columnNames)
                    throws java.io.IOException
특정 Row의 지정된 컬럼들의 데이터를 조회한다. row에 저장된 컬럼의 데이터가 정해진 사이즈보다 많은 경우 Exception이 발생한다.

Parameters:
rowKey -
columnNames -
Returns:
Throws:
java.io.IOException

get

public ColumnValue[][] get(Row.Key rowKey)
                    throws java.io.IOException
특정 Row의 모든 컬럼의 데이터를 조회한다.

Parameters:
rowKey -
Returns:
Throws:
java.io.IOException

getClosest

public ColumnValue getClosest(Row.Key rowKey,
                              java.lang.String columnName)
                       throws java.io.IOException
입력받은 rowKey와 가장 가까운 Row.Key중 가장 큰 Row.Key를 가지는 row의 값을 조회한다. 주로 Root, Meta 테이블의 데이터를 이용하여 TabletInfo를 조회할 때 사용된다.

Parameters:
rowKey -
columnNames -
Returns:
Throws:
java.io.IOException

getMemtableSize

public int getMemtableSize()
MemTablet의 현재 메모리 사이즈를 반환한다.

Returns:

startTx

public TxId startTx(Row.Key rowKey)
             throws java.io.IOException
Row를 생성하거나 Row의 값을 변경하는 트렌젝션을 시작한다.timestamp의 값은 system 시간을 이용한다.

Parameters:
rowKey -
Returns:
Throws:
java.io.IOException

startTx

public TxId startTx(Row.Key rowKey,
                    boolean systemTimestamp)
             throws java.io.IOException
Parameters:
rowKey -
systemTimestamp -
Returns:
Throws:
java.io.IOException

removeRow

public void removeRow(TxId txId,
                      long timestamp)
               throws java.io.IOException
Throws:
java.io.IOException

insertColumnValue

public void insertColumnValue(TxId txId,
                              java.lang.String columnName,
                              ColumnValue[] columnValues)
                       throws java.io.IOException
특정 row에 컬럼 데이터를 저장한다.

Parameters:
txId -
columnName -
columnValues -
Throws:
java.io.IOException

deleteColumnValue

public boolean deleteColumnValue(TxId txId,
                                 java.lang.String columnName,
                                 Cell.Key columnKey,
                                 long timestamp)
                          throws java.io.IOException
특정 Row의 컬럼 값을 삭제한다.

Parameters:
txId -
columnName -
columnKey -
timestamp -
Throws:
java.io.IOException

rollback

public Row.Key rollback(TxId txId)
                 throws java.io.IOException
트렌젝션을 취소시킨다. 트렌젝션 시작 후 입력된 값은 반영되지 않는다.

Parameters:
txId -
Throws:
java.io.IOException

commit

public void commit(TxId txId)
            throws java.io.IOException
Throws:
java.io.IOException

commit

public void commit(TxId txId,
                   boolean saveLog)
            throws java.io.IOException
Throws:
java.io.IOException

commit

public void commit(TxId txId,
                   ChangeLog[] changeLogList,
                   boolean saveLog)
            throws java.io.IOException
트렌젝션을 종료한다.

Parameters:
txId -
Throws:
java.io.IOException

apply

public boolean apply(Row.Key rowKey,
                     TxId txId,
                     ChangeLog[] changeLogList,
                     boolean saveLog)
              throws java.io.IOException
Throws:
java.io.IOException

setInChangeLogError

public void setInChangeLogError(boolean flag)

saveTabletSplitedInfo

public void saveTabletSplitedInfo(TxId txId,
                                  TabletInfo targetTablet,
                                  TabletInfo[] splitedTablets)
                           throws java.io.IOException
META/ROOT tablet에 split된 tablet 정보를 저장한다. 3개의 작업(1 delete, 2 insert)이 하나의 change log에 저장되도록한다.

Parameters:
txId -
splitedTablets -
Throws:
java.io.IOException

doMinorCompaction

public void doMinorCompaction()
                       throws java.io.IOException
MemoryTablet이 일정 사이즈보다 커지게 되면 Memory의 내용을 Disk의 MapFile로 저장한다.

Throws:
java.io.IOException

neededMajorCompaction

public boolean neededMajorCompaction()

isDroped

public boolean isDroped()

drop

public void drop()
          throws java.io.IOException
Throws:
java.io.IOException

doMajorCompaction

public void doMajorCompaction()
                       throws java.io.IOException
하나의 Tablet에서 관리하고 있는 여러개의 MapFile을 merge하여 하나의 MapFile로 만든다.

Throws:
java.io.IOException

doTabletSplit

public void doTabletSplit()
                   throws java.io.IOException
Throws:
java.io.IOException

neededSplit

public boolean neededSplit()
                    throws java.io.IOException
Throws:
java.io.IOException

getMapFileCount

public int getMapFileCount()

sumMapFileSize

public long sumMapFileSize()
                    throws java.io.IOException
Throws:
java.io.IOException

scanNext

public ColumnValue[] scanNext(java.lang.String scannerId)
                       throws java.io.IOException
Client API에서는 ColumnRecord 하나만 반환하도록 하지만 네트워크 연결 횟수를 줄이기 위해 한번에 fetch하는 사이즈 만큼 전송한다.

Parameters:
scannerId -
Returns:
Throws:
java.io.IOException

openScanner

public java.lang.String openScanner(java.lang.String columnName,
                                    RowFilter scanFilter)
                             throws java.io.IOException
get의 경우 호출될 때마다 매번 MapFile을 open한 후 seek 해야 하기 때문에 대량의 데이터를 sequential하게 read하는데에는 부적합하다. Scanner의 경우 scanner를 open할 때 MapFile을 열어 seek 한 후 next() 호출에 의해 파일 포인터를 이동시키면서 데이터를 조회한다. Scanner는 Minor, Major compaction, tablet split, merge 중인 경우에는 open할 수 없다. 이 경우 바로 null을 반환하고 클라이언트 모듈(NeptuneClient)에서 여러번 retry하도록 한다. 이유는 Split 되는 경우 Spilit 종료 후에는 해당 Row Range에 대한 Tablet Server가 변경되어 있기 때문이다.

Parameters:
startRowKey -
endRowKey -
columnNames -
Returns:
Throws:
java.io.IOException

closeScanner

public void closeScanner(java.lang.String scannerId)
                  throws java.io.IOException
open되어 있는 scanner를 close한다.

Parameters:
scannerId -
Throws:
java.io.IOException

getTabletInfo

public TabletInfo getTabletInfo()

getOpenedScannerCount

public int getOpenedScannerCount()
Returns:

getTabletDetailInfo

public TabletReport getTabletDetailInfo()
                                 throws java.io.IOException
Returns:
Throws:
java.io.IOException

deleteTablet

public void deleteTablet()
                  throws java.io.IOException
Throws:
java.io.IOException

deleteChangeLog

public void deleteChangeLog()
                     throws java.io.IOException
Throws:
java.io.IOException

deleteChangeLog

public static void deleteChangeLog(ChangeLogFileSystemIF changeLogFileSystem,
                                   java.lang.String tableName,
                                   java.lang.String tabletName)
                            throws java.io.IOException
Throws:
java.io.IOException

setReady

public void setReady(boolean ready)

isReady

public boolean isReady()
Returns:

deleteSplitTempDir

public void deleteSplitTempDir()
                        throws java.io.IOException
Throws:
java.io.IOException

truncateColumn

public void truncateColumn(java.lang.String columnName)
                    throws java.io.IOException
Throws:
java.io.IOException

addColumn

public void addColumn(java.lang.String addedColumnName)
               throws java.io.IOException
Throws:
java.io.IOException

getDiskSSTable

public DiskSSTableIF getDiskSSTable()

getMemorySSTable

public MemorySSTableIF getMemorySSTable()

getActionChecker

public ActionChecker getActionChecker()

getAllActions

public java.lang.String[] getAllActions()

isEmpty

public boolean isEmpty()

hasValue

public boolean hasValue(java.lang.String columnName,
                        Row.Key rowKey)
                 throws java.io.IOException
Throws:
java.io.IOException

generateMetaRowKey

public static Row.Key generateMetaRowKey(java.lang.String tableName,
                                         Row.Key rowKey)

getRootTabletInfo

public static TabletInfo getRootTabletInfo(com.nhncorp.pleiades.client.LockService lockService)
                                    throws java.io.IOException
Throws:
java.io.IOException

getTabletPath

public static GPath getTabletPath(NConfiguration conf,
                                  TabletInfo tabletInfo)

getTabletPath

public static GPath getTabletPath(NConfiguration conf,
                                  java.lang.String tableName,
                                  java.lang.String tabletName)

generateTabletName

public static java.lang.String generateTabletName(java.lang.String tableName)

getTabletSplitTempPath

public static GPath getTabletSplitTempPath(NConfiguration conf,
                                           java.lang.String tableName,
                                           java.lang.String tabletName)

getTabletSplitTempPath

public static GPath getTabletSplitTempPath(NConfiguration conf,
                                           TabletInfo tabletInfo)

getTabletMajorCompactionTempPath

public static GPath getTabletMajorCompactionTempPath(NConfiguration conf,
                                                     java.lang.String tableName,
                                                     java.lang.String tabletName)

getTabletMajorCompactionTempPath

public static GPath getTabletMajorCompactionTempPath(NConfiguration conf,
                                                     TabletInfo tabletInfo)

getTabletMinorCompactionTempPath

public static GPath getTabletMinorCompactionTempPath(NConfiguration conf,
                                                     java.lang.String tableName,
                                                     java.lang.String tabletName)

getTabletMinorCompactionTempPath

public static GPath getTabletMinorCompactionTempPath(NConfiguration conf,
                                                     TabletInfo tabletInfo)

getTabletLocalTempPath

public static GPath getTabletLocalTempPath(NConfiguration conf,
                                           TabletInfo tabletInfo,
                                           java.lang.String actionId)

getTabletUploadTempPath

public static GPath getTabletUploadTempPath(NConfiguration conf,
                                            TabletInfo tabletInfo,
                                            java.lang.String actionId)

getTableNameFromTabletName

public static java.lang.String getTableNameFromTabletName(java.lang.String tabletName)

getTabletServer

public TabletServerIF getTabletServer()

getSplitedRowKeyRanges

public Row.Key[] getSplitedRowKeyRanges(int splitPerTablet)
                                 throws java.io.IOException
Throws:
java.io.IOException