tkalkirill commented on code in PR #4465: URL: https://github.com/apache/ignite-3/pull/4465#discussion_r1778555274
########## modules/metastorage/src/main/java/org/apache/ignite/internal/metastorage/server/persistence/RocksDbKeyValueStorage.java: ########## @@ -1026,104 +1027,41 @@ private boolean addToBatchForRemoval(WriteBatch batch, byte[] key, long curRev, } /** - * Compacts all entries by the given key, removing revision that are no longer needed. - * Last entry with a revision lesser or equal to the {@code minRevisionToKeep} and all consecutive entries will be preserved. - * If the first entry to keep is a tombstone, it will be removed. - * Example: - * <pre> - * Example 1: - * put entry1: revision 5 - * put entry2: revision 7 - * - * do compaction: revision 6 - * - * entry1: exists - * entry2: exists - * - * Example 2: - * put entry1: revision 5 - * put entry2: revision 7 - * - * do compaction: revision 7 - * - * entry1: doesn't exist - * entry2: exists - * </pre> + * Compacts the key, see the documentation of {@link KeyValueStorage#compact} for examples. * * @param batch Write batch. - * @param key Target key. - * @param revs Revisions. - * @param minRevisionToKeep Minimum revision that should be kept. - * @throws RocksDBException If failed. + * @param key Target key. + * @param revs Key revisions. + * @param compactionRevision Revision up to which the key will be compacted. + * @throws MetaStorageException If failed. */ - private void compactForKey(WriteBatch batch, byte[] key, long[] revs, long minRevisionToKeep) throws RocksDBException { - if (revs.length < 2) { - // If we have less than two revisions, there is no point in compaction. - return; - } - - // Index of the first revision we will be keeping in the array of revisions. - int idxToKeepFrom = 0; - - // Whether there is an entry with the minRevisionToKeep. - boolean hasMinRevision = false; + private void compactForKey(WriteBatch batch, byte[] key, long[] revs, long compactionRevision) { + try { + int indexToCompact = indexToCompact(revs, compactionRevision, revision -> isTombstoneForCompaction(key, revision)); - // Traverse revisions, looking for the first revision that needs to be kept. - for (long rev : revs) { - if (rev >= minRevisionToKeep) { - if (rev == minRevisionToKeep) { - hasMinRevision = true; - } - break; + if (NOTHING_TO_COMPACT_INDEX == indexToCompact) { + return; } - idxToKeepFrom++; - } - - if (!hasMinRevision) { - // Minimal revision was not encountered, that mean that we are between revisions of a key, so previous revision - // must be preserved. - idxToKeepFrom--; - } - - if (idxToKeepFrom <= 0) { - // All revisions are still in use. - return; - } - - for (int i = 0; i < idxToKeepFrom; i++) { - // This revision is not needed anymore, remove data. - data.delete(batch, keyToRocksKey(revs[i], key)); - } - - // Whether we only have last revision (even if it's lesser or equal to watermark). - boolean onlyLastRevisionLeft = idxToKeepFrom == (revs.length - 1); - - // Get the number of the first revision that will be kept. - long rev = onlyLastRevisionLeft ? lastRevision(revs) : revs[idxToKeepFrom]; - - byte[] rocksKey = keyToRocksKey(rev, key); - - Value value = bytesToValue(data.get(rocksKey)); - - if (value.tombstone()) { - // The first revision we are going to keep is a tombstone, we may delete it. - data.delete(batch, rocksKey); - - if (!onlyLastRevisionLeft) { - // First revision was a tombstone, but there are other revisions, that need to be kept, - // so advance index of the first revision we need to keep. - idxToKeepFrom++; + for (int revisionIndex = 0; revisionIndex <= indexToCompact; revisionIndex++) { + // This revision is not needed anymore, remove data. + data.delete(batch, keyToRocksKey(revs[revisionIndex], key)); } - } - if (onlyLastRevisionLeft && value.tombstone()) { - // We don't have any previous revisions for this entry and the single existing is a tombstone, - // so we can remove it from index. - index.delete(batch, key); - } else { - // Keeps revisions starting with idxToKeepFrom. - index.put(batch, key, longsToBytes(revs, idxToKeepFrom)); + if (indexToCompact == revs.length - 1) { + index.delete(batch, key); Review Comment: Fix it! -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org