Phillippko commented on code in PR #3615:
URL: https://github.com/apache/ignite-3/pull/3615#discussion_r1587173153


##########
modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/freelist/FreeListImpl.java:
##########
@@ -84,300 +86,59 @@ public abstract class AbstractFreeList<T extends Storable> 
extends PagesList imp
     protected final PageEvictionTracker evictionTracker;
 
     /** Write a single row on a single page. */
-    private final WriteRowHandler writeRowHnd = new WriteRowHandler();
+    private final WriteRowHandler writeRowHnd = new WriteRowHandler(this);
 
     /** Write multiple rows on a single page. */
-    private final WriteRowsHandler writeRowsHnd = new WriteRowsHandler();
+    private final WriteRowsHandler writeRowsHnd = new WriteRowsHandler(this);
 
     private final PageHandler<ReuseBag, Long> rmvRow;
 
-    private class WriteRowHandler implements PageHandler<T, Integer> {
-        /** {@inheritDoc} */
-        @Override
-        public Integer run(
-                int cacheId,
-                long pageId,
-                long page,
-                long pageAddr,
-                PageIo iox,
-                T row,
-                int written,
-                IoStatisticsHolder statHolder
-        ) throws IgniteInternalCheckedException {
-            written = addRow(pageId, pageAddr, iox, row, written);
-
-            putPage(((AbstractDataPageIo<Storable>) 
iox).getFreeSpace(pageAddr), pageId, pageAddr, statHolder);
-
-            return written;
-        }
-
-        /**
-         * Writes row to data page.
-         *
-         * @param pageId Page ID.
-         * @param pageAddr Page address.
-         * @param iox IO.
-         * @param row Row to write.
-         * @param written Written size.
-         * @return Number of bytes written, {@link #COMPLETE} if the row was 
fully written.
-         * @throws IgniteInternalCheckedException If failed.
-         */
-        protected Integer addRow(
-                long pageId,
-                long pageAddr,
-                PageIo iox,
-                T row,
-                int written
-        ) throws IgniteInternalCheckedException {
-            AbstractDataPageIo<T> io = (AbstractDataPageIo<T>) iox;
-
-            int rowSize = row.size();
-            int oldFreeSpace = io.getFreeSpace(pageAddr);
-
-            assert oldFreeSpace > 0 : oldFreeSpace;
-
-            // If the full row does not fit into this page write only a 
fragment.
-            written = (written == 0 && oldFreeSpace >= rowSize) ? 
addRowFull(pageId, pageAddr, io, row, rowSize) :
-                    addRowFragment(pageId, pageAddr, io, row, written, 
rowSize);
-
-            if (written == rowSize) {
-                evictionTracker.touchPage(pageId);
-            }
-
-            // Avoid boxing with garbage generation for usual case.
-            return written == rowSize ? COMPLETE : written;
-        }
-
-        /**
-         * Adds row to this data page and sets respective link to the given 
row object.
-         *
-         * @param pageId Page ID.
-         * @param pageAddr Page address.
-         * @param io IO.
-         * @param row Row.
-         * @param rowSize Row size.
-         * @return Written size which is always equal to row size here.
-         * @throws IgniteInternalCheckedException If failed.
-         */
-        protected int addRowFull(
-                long pageId,
-                long pageAddr,
-                AbstractDataPageIo<T> io,
-                T row,
-                int rowSize
-        ) throws IgniteInternalCheckedException {
-            io.addRow(pageId, pageAddr, row, rowSize, pageSize());
-
-            return rowSize;
-        }
-
-        /**
-         * Adds maximum possible fragment of the given row to this data page 
and sets respective link to the row.
-         *
-         * @param pageId Page ID.
-         * @param pageAddr Page address.
-         * @param io IO.
-         * @param row Row.
-         * @param written Written size.
-         * @param rowSize Row size.
-         * @return Updated written size.
-         * @throws IgniteInternalCheckedException If failed.
-         */
-        protected int addRowFragment(
-                long pageId,
-                long pageAddr,
-                AbstractDataPageIo<T> io,
-                T row,
-                int written,
-                int rowSize
-        ) throws IgniteInternalCheckedException {
-            int payloadSize = io.addRowFragment(pageMem, pageId, pageAddr, 
row, written, rowSize, pageSize());
-
-            assert payloadSize > 0 : payloadSize;
-
-            return written + payloadSize;
-        }
-
-        /**
-         * Put page into the free list if needed.
-         *
-         * @param freeSpace Page free space.
-         * @param pageId Page ID.
-         * @param pageAddr Page address.
-         * @param statHolder Statistics holder to track IO operations.
-         */
-        protected void putPage(
-                int freeSpace,
-                long pageId,
-                long pageAddr,
-                IoStatisticsHolder statHolder
-        ) throws IgniteInternalCheckedException {
-            if (freeSpace > MIN_PAGE_FREE_SPACE) {
-                int bucket = bucket(freeSpace, false);
-
-                put(null, pageId, pageAddr, bucket, statHolder);
-            }
-        }
-    }
-
-    private final class WriteRowsHandler implements 
PageHandler<CachedIterator<T>, Integer> {
-        /** {@inheritDoc} */
-        @Override
-        public Integer run(
-                int cacheId,
-                long pageId,
-                long page,
-                long pageAddr,
-                PageIo iox,
-                CachedIterator<T> it,
-                int written,
-                IoStatisticsHolder statHolder
-        ) throws IgniteInternalCheckedException {
-            AbstractDataPageIo<T> io = (AbstractDataPageIo<T>) iox;
-
-            // Fill the page up to the end.
-            while (written != COMPLETE || (!evictionTracker.evictionRequired() 
&& it.hasNext())) {
-                T row = it.get();
-
-                if (written == COMPLETE) {
-                    row = it.next();
-
-                    // If the data row was completely written without 
remainder, proceed to the next.
-                    if ((written = writeWholePages(row, statHolder)) == 
COMPLETE) {
-                        continue;
-                    }
-
-                    if (io.getFreeSpace(pageAddr) < row.size() - written) {
-                        break;
-                    }
-                }
-
-                written = writeRowHnd.addRow(pageId, pageAddr, io, row, 
written);
-
-                assert written == COMPLETE;
-
-                evictionTracker.touchPage(pageId);
-            }
-
-            writeRowHnd.putPage(io.getFreeSpace(pageAddr), pageId, pageAddr, 
statHolder);
-
-            return written;
-        }
-    }
-
-    private final class RemoveRowHandler implements PageHandler<ReuseBag, 
Long> {
-        /** Indicates whether partition ID should be masked from page ID. */
-        private final boolean maskPartId;
-
-        /**
-         * Constructor.
-         *
-         * @param maskPartId Indicates whether partition ID should be masked 
from page ID.
-         */
-        RemoveRowHandler(boolean maskPartId) {
-            this.maskPartId = maskPartId;
-        }
-
-        /** {@inheritDoc} */
-        @Override
-        public Long run(
-                int cacheId,
-                long pageId,
-                long page,
-                long pageAddr,
-                PageIo iox,
-                ReuseBag reuseBag,
-                int itemId,
-                IoStatisticsHolder statHolder
-        ) throws IgniteInternalCheckedException {
-            AbstractDataPageIo<T> io = (AbstractDataPageIo<T>) iox;
-
-            int oldFreeSpace = io.getFreeSpace(pageAddr);
-
-            assert oldFreeSpace >= 0 : oldFreeSpace;
-
-            long nextLink = io.removeRow(pageAddr, itemId, pageSize());
-
-            int newFreeSpace = io.getFreeSpace(pageAddr);
-
-            if (newFreeSpace > MIN_PAGE_FREE_SPACE) {
-                int newBucket = bucket(newFreeSpace, false);
-
-                boolean putIsNeeded = oldFreeSpace <= MIN_PAGE_FREE_SPACE;
-
-                if (!putIsNeeded) {
-                    int oldBucket = bucket(oldFreeSpace, false);
-
-                    if (oldBucket != newBucket) {
-                        // It is possible that page was concurrently taken for 
put, in this case put will handle bucket change.
-                        pageId = maskPartId ? 
PageIdUtils.maskPartitionId(pageId) : pageId;
-
-                        putIsNeeded = removeDataPage(pageId, pageAddr, io, 
oldBucket, statHolder);
-                    }
-                }
-
-                if (io.isEmpty(pageAddr)) {
-                    evictionTracker.forgetPage(pageId);
-
-                    if (putIsNeeded) {
-                        reuseBag.addFreePage(recyclePage(pageId, pageAddr));
-                    }
-                } else if (putIsNeeded) {
-                    put(null, pageId, pageAddr, newBucket, statHolder);
-                }
-            }
-
-            // For common case boxed 0L will be cached inside of Long, so no 
garbage will be produced.
-            return nextLink;
-        }
-    }
+    private final IoStatisticsHolder statHolder;
 
     /**
      * Constructor.
      *
      * @param grpId Group ID.
      * @param partId Partition ID.
-     * @param name Structure name (for debug purpose).
      * @param pageMem Page memory.
      * @param reuseList Reuse list or {@code null} if this free list will be a 
reuse list for itself.
      * @param lockLsnr Page lock listener.
-     * @param log Logger.
      * @param metaPageId Metadata page ID.
      * @param initNew {@code True} if new metadata should be initialized.
      * @param pageListCacheLimit Page list cache limit.
      * @param evictionTracker Page eviction tracker.
      * @throws IgniteInternalCheckedException If failed.
      */
-    public AbstractFreeList(
+    public FreeListImpl(
             int grpId,
             int partId,
-            String name,
             PageMemory pageMem,
             @Nullable ReuseList reuseList,
             PageLockListener lockLsnr,
-            IgniteLogger log,
             long metaPageId,
             boolean initNew,
             @Nullable AtomicLong pageListCacheLimit,
-            PageEvictionTracker evictionTracker
+            PageEvictionTracker evictionTracker,
+            IoStatisticsHolder statHolder
     ) throws IgniteInternalCheckedException {
         super(
-                name,
+                "FreeList_" + grpId,

Review Comment:
   Actually it had the same name for partitions before my changes. Made name a 
parameter, names will have format `VolatileFreeList_grpId_partId `and 
`PersistentFreeList_grpId_partId` 



-- 
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: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to