protected synchronized void split() throws Exception { // Ensure address capacity _addrArray.expandCapacity(_split + _levelCapacity); // Read data from the _split index byte[] data = _dataArray.get(_split); // Process read data if (data != null && data.length > 0) { // Get split tier Tier tier = getTier(_split); // Wrap data in byte buffer ByteBuffer bb = ByteBuffer.wrap(data); int cnt = bb.getInt(); if (tier.isColliding()) { while (cnt > 0) { // Read key int len = bb.getInt(); byte[] key = new byte[len]; bb.get(key); int newIndex = tier.getSplitIndex(hash(key), _level, _split); if (newIndex == _split) /* No need to split */ { // Pass value len = bb.getInt(); bb.position(bb.position() + len); } else { // Read value len = bb.getInt(); byte[] value = new byte[len]; bb.get(value); // Remove at the old index deleteInternal(_split, key); // Update at the new index putInternal(newIndex, key, value); } cnt--; } } else { // Read key int len = bb.getInt(); byte[] key = new byte[len]; bb.get(key); int newIndex = tier.getSplitIndex(hash(key), _level, _split); if (newIndex != _split) { long scn = nextScn(); _addrArray.set(newIndex, _addrArray.get(_split), scn); _addrArray.set(_split, 0, scn); } } } _split++; if (_split % _unitCapacity == 0) { _log.info("split " + getStatus()); } if (_split == _levelCapacity) { _split = 0; _level++; _levelCapacity = getUnitCapacity() * (1 << _level); _levelThreshold = (int) (_levelCapacity * _loadThreshold); _log.info(getStatus()); } }