Пример #1
0
  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());
    }
  }