http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheCountDownLatch.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheCountDownLatch.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheCountDownLatch.java deleted file mode 100644 index 4739c13..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheCountDownLatch.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.gridgain.grid.*; - -import java.util.concurrent.*; - -/** - * This interface provides a rich API for working with distributed count down latch. - * <p> - * <h1 class="header">Functionality</h1> - * Distributed count down latch provides functionality similar to {@code java.util.CountDownLatch}. - * Note that you cannot remove count down latch having count greater that zero. It should be - * counted down to zero first. - * <h1 class="header">Creating Distributed Count Down Latch</h1> - * Instance of cache count down latch can be created by calling the following method: - * {@link GridCacheDataStructures#countDownLatch(String, int, boolean, boolean)}. - * @see GridCacheDataStructures#countDownLatch(String, int, boolean, boolean) - * @see GridCacheDataStructures#removeCountDownLatch(String) - */ -public interface GridCacheCountDownLatch { - /** - * Gets name of the latch. - * - * @return Name of the latch. - */ - public String name(); - - /** - * Gets current count value of the latch. - * - * @return Current count. - */ - public int count(); - - /** - * Gets initial count value of the latch. - * - * @return Initial count. - */ - public int initialCount(); - - /** - * Gets {@code autoDelete} flag. If this flag is {@code true} latch is removed - * from cache when it has been counted down to 0. - * - * @return Value of {@code autoDelete} flag. - */ - public boolean autoDelete(); - - /** - * Causes the current thread to wait until the latch has counted down to - * zero, unless current thread is interrupted. - * <p> - * If the current count of the latch is zero then this method returns immediately. - * <p> - * If the current count is greater than zero then the current - * thread becomes disabled for thread scheduling purposes and lies - * dormant until one of two things happen: - * <ul> - * <li>The count reaches zero due to invocations of the - * {@link #countDown} method on any node; or - * <li>Some other thread interrupts the current thread. - * </ul> - * <p> - * If the current thread: - * <ul> - * <li>has its interrupted status set on entry to this method; or - * <li>is interrupted while waiting, - * </ul> - * then {@link GridInterruptedException} is thrown and the current thread's - * interrupted status is cleared. - * - * @throws IgniteCheckedException If operation failed. - * @throws GridInterruptedException if the current thread is interrupted - * while waiting - */ - public void await() throws IgniteCheckedException; - - /** - * Causes the current thread to wait until the latch has counted down to - * zero, unless the thread is interrupted, or the specified waiting time elapses. - * <p> - * If the current count is zero then this method returns immediately - * with the value {@code true}. - * <p> - * If the current count is greater than zero then the current - * thread becomes disabled for thread scheduling purposes and lies - * dormant until one of three things happen: - * <ul> - * <li>The count reaches zero due to invocations of the - * {@link #countDown} method on any node; or - * <li>Some other thread interrupts the current thread; or - * <li>The specified waiting time elapses. - * </ul> - * <p> - * If the count reaches zero then the method returns with the - * value {@code true}. - * <p> - * If the current thread: - * <ul> - * <li>has its interrupted status set on entry to this method; or - * <li>is interrupted while waiting, - * </ul> - * then {@link GridInterruptedException} is thrown and the current thread's - * interrupted status is cleared. - * <p> - * If the specified waiting time elapses then the value {@code false} - * is returned. If the time is less than or equal to zero, the method - * will not wait at all. - * - * @param timeout The maximum time to wait in milliseconds. - * @return {@code True} if the count reached zero and {@code false} - * if the waiting time elapsed before the count reached zero. - * @throws GridInterruptedException If the current thread is interrupted - * while waiting. - * @throws IgniteCheckedException If operation failed. - */ - public boolean await(long timeout) throws IgniteCheckedException; - - /** - * Causes the current thread to wait until the latch has counted down to - * zero, unless the thread is interrupted, or the specified waiting time elapses. - * <p> - * If the current count is zero then this method returns immediately - * with the value {@code true}. - * <p> - * If the current count is greater than zero then the current - * thread becomes disabled for thread scheduling purposes and lies - * dormant until one of three things happen: - * <ul> - * <li>The count reaches zero due to invocations of the - * {@link #countDown} method on any node; or - * <li>Some other thread interrupts the current thread; or - * <li>The specified waiting time elapses. - * </ul> - * <p> - * If the count reaches zero then the method returns with the - * value {@code true}. - * <p> - * If the current thread: - * <ul> - * <li>has its interrupted status set on entry to this method; or - * <li>is interrupted while waiting, - * </ul> - * then {@link GridInterruptedException} is thrown and the current thread's - * interrupted status is cleared. - * <p> - * If the specified waiting time elapses then the value {@code false} - * is returned. If the time is less than or equal to zero, the method - * will not wait at all. - * - * - * @param timeout The maximum time to wait. - * @param unit The time unit of the {@code timeout} argument. - * @return {@code True} if the count reached zero and {@code false} - * if the waiting time elapsed before the count reached zero. - * @throws GridInterruptedException If the current thread is interrupted - * while waiting. - * @throws IgniteCheckedException If operation failed. - */ - public boolean await(long timeout, TimeUnit unit) throws IgniteCheckedException; - - /** - * Decrements the count of the latch, releasing all waiting threads - * on all nodes if the count reaches zero. - * <p> - * If the current count is greater than zero then it is decremented. - * If the new count is zero then all waiting threads are re-enabled for - * thread scheduling purposes. - * <p> - * If the current count equals zero then nothing happens. - * - * @return Count after decrement. - * @throws IgniteCheckedException If operation failed. - */ - public int countDown() throws IgniteCheckedException; - - /** - * Decreases the count of the latch using passed in value, - * releasing all waiting threads on all nodes if the count reaches zero. - * <p> - * If the current count is greater than zero then it is decreased. - * If the new count is zero then all waiting threads are re-enabled for - * thread scheduling purposes. - * <p> - * If the current count equals zero then nothing happens. - * - * @param val Value to decrease counter on. - * @return Count after decreasing. - * @throws IgniteCheckedException If operation failed. - */ - public int countDown(int val) throws IgniteCheckedException; - - /** - * Counts down this latch to zero, releasing all waiting threads on all nodes. - * <p> - * If the current count equals zero then nothing happens. - * - * @throws IgniteCheckedException If operation failed. - */ - public void countDownAll() throws IgniteCheckedException; - - /** - * Gets {@code removed} status of the latch. - * - * @return {@code True} if latch was removed from cache, {@code false} otherwise. - */ - public boolean removed(); -}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidException.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidException.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidException.java deleted file mode 100644 index 05047ff..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidException.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.jetbrains.annotations.*; - -/** - * This checked exception gets thrown if attempt to access an invalid data structure has been made. - * Data structure may become invalid if communication with remote nodes has been lost or - * any other error condition happened that prevented from insuring consistent state. - * <p> - * The best way to handle this error is to discard the invalid data structure instance and try - * getting the underlying data structure from cache again. - * <p> - * Note that data structures throw runtime exceptions out of methods that don't have - * checked exceptions in the signature. - */ -public class GridCacheDataStructureInvalidException extends IgniteCheckedException { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Creates new exception with given error message. - * - * @param msg Error message. - */ - public GridCacheDataStructureInvalidException(String msg) { - super(msg); - } - - /** - * Creates new exception with given throwable as a nested cause and - * source of error message. - * - * @param cause Non-null throwable cause. - */ - public GridCacheDataStructureInvalidException(Throwable cause) { - this(cause.getMessage(), cause); - } - - /** - * Creates a new exception with given error message and optional nested cause exception. - * - * @param msg Error message. - * @param cause Optional nested exception (can be {@code null}). - */ - public GridCacheDataStructureInvalidException(String msg, @Nullable Throwable cause) { - super(msg, cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidRuntimeException.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidRuntimeException.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidRuntimeException.java deleted file mode 100644 index fe15e9c..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureInvalidRuntimeException.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.jetbrains.annotations.*; - -/** - * This runtime exception gets thrown if attempt to access an invalid data structure has been made. - * Data structure may become invalid if communication with remote nodes has been lost or - * any other error condition happened that prevented from insuring consistent state. - * <p> - * The best way to handle this error is to discard the invalid data structure instance and try - * getting the underlying data structure from cache again. - * <p> - * Note that data structures throw runtime exceptions out of methods that don't have - * checked exceptions in the signature. - */ -public class GridCacheDataStructureInvalidRuntimeException extends IgniteException { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Creates new exception with given error message. - * - * @param msg Error message. - */ - public GridCacheDataStructureInvalidRuntimeException(String msg) { - super(msg); - } - - /** - * Creates new exception with given throwable as a nested cause and - * source of error message. - * - * @param cause Non-null throwable cause. - */ - public GridCacheDataStructureInvalidRuntimeException(Throwable cause) { - this(cause.getMessage(), cause); - } - - /** - * Creates a new exception with given error message and optional nested cause exception. - * - * @param msg Error message. - * @param cause Optional nested exception (can be {@code null}). - */ - public GridCacheDataStructureInvalidRuntimeException(String msg, @Nullable Throwable cause) { - super(msg, cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedException.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedException.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedException.java deleted file mode 100644 index b571032..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedException.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.jetbrains.annotations.*; - -/** - * This checked exception gets thrown if attempt to access a removed data structure has been made. - * <p> - * Note that data structures throw runtime exceptions out of methods that don't have - * checked exceptions in the signature. - */ -public class GridCacheDataStructureRemovedException extends IgniteCheckedException { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Creates new exception with given error message. - * - * @param msg Error message. - */ - public GridCacheDataStructureRemovedException(String msg) { - super(msg); - } - - /** - * Creates new exception with given throwable as a nested cause and - * source of error message. - * - * @param cause Non-null throwable cause. - */ - public GridCacheDataStructureRemovedException(Throwable cause) { - this(cause.getMessage(), cause); - } - - /** - * Creates a new exception with given error message and optional nested cause exception. - * - * @param msg Error message. - * @param cause Optional nested exception (can be {@code null}). - */ - public GridCacheDataStructureRemovedException(String msg, @Nullable Throwable cause) { - super(msg, cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedRuntimeException.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedRuntimeException.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedRuntimeException.java deleted file mode 100644 index 06a0ad4..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructureRemovedRuntimeException.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.jetbrains.annotations.*; - -/** - * This runtime exception gets thrown if attempt to access a removed data structure has been made. - * <p> - * Note that data structures throw runtime exceptions out of methods that don't have - * checked exceptions in the signature. - */ -public class GridCacheDataStructureRemovedRuntimeException extends IgniteException { - /** */ - private static final long serialVersionUID = 0L; - - /** - * Creates new exception with given error message. - * - * @param msg Error message. - */ - public GridCacheDataStructureRemovedRuntimeException(String msg) { - super(msg); - } - - /** - * Creates new exception with given throwable as a nested cause and - * source of error message. - * - * @param cause Non-null throwable cause. - */ - public GridCacheDataStructureRemovedRuntimeException(Throwable cause) { - this(cause.getMessage(), cause); - } - - /** - * Creates a new exception with given error message and optional nested cause exception. - * - * @param msg Error message. - * @param cause Optional nested exception (can be {@code null}). - */ - public GridCacheDataStructureRemovedRuntimeException(String msg, @Nullable Throwable cause) { - super(msg, cause); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructures.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructures.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructures.java deleted file mode 100644 index bf3e987..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheDataStructures.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.gridgain.grid.cache.*; -import org.jetbrains.annotations.*; - -/** - * Facade for working with distributed cache data structures. All cache data structures are similar - * in APIs to {@code 'java.util.concurrent'} package, but all operations on them are grid-aware. - * For example, if you increment {@link GridCacheAtomicLong} on one node, another node will - * know about the change. Or if you add an element to {@link GridCacheQueue} on one node, - * you can poll it on another node. - * <p> - * You can get data structures facade by calling {@link GridCache#dataStructures()} method. - */ -public interface GridCacheDataStructures { - /** - * Will get an atomic sequence from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * - * @param name Sequence name. - * @param initVal Initial value for sequence. If sequence already cached, {@code initVal} will be ignored. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Sequence for the given name. - * @throws IgniteCheckedException If sequence could not be fetched or created. - */ - @Nullable public GridCacheAtomicSequence atomicSequence(String name, long initVal, boolean create) - throws IgniteCheckedException; - - /** - * Remove sequence from cache. - * - * @param name Sequence name. - * @return {@code True} if sequence has been removed, {@code false} otherwise. - * @throws IgniteCheckedException If remove failed. - */ - public boolean removeAtomicSequence(String name) throws IgniteCheckedException; - - /** - * Will get a atomic long from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * - * @param name Name of atomic long. - * @param initVal Initial value for atomic long. If atomic long already cached, {@code initVal} - * will be ignored. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Atomic long. - * @throws IgniteCheckedException If atomic long could not be fetched or created. - */ - @Nullable public GridCacheAtomicLong atomicLong(String name, long initVal, boolean create) throws IgniteCheckedException; - - /** - * Remove atomic long from cache. - * - * @param name Name of atomic long. - * @return {@code True} if atomic long has been removed, {@code false} otherwise. - * @throws IgniteCheckedException If removing failed. - */ - public boolean removeAtomicLong(String name) throws IgniteCheckedException; - - /** - * Will get a named queue from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * If queue is present in cache already, queue properties will not be changed. Use - * collocation for {@link GridCacheMode#PARTITIONED} caches if you have lots of relatively - * small queues as it will make fetching, querying, and iteration a lot faster. If you have - * few very large queues, then you should consider turning off collocation as they simply - * may not fit in a single node's memory. However note that in this case - * to get a single element off the queue all nodes may have to be queried. - * - * @param name Name of queue. - * @param cap Capacity of queue, {@code 0} for unbounded queue. - * @param collocated If {@code true} then all items within the same queue will be collocated on the same node. - * Otherwise elements of the same queue maybe be cached on different nodes. If you have lots of relatively - * small queues, then you should use collocation. If you have few large queues, then you should turn off - * collocation. This parameter works only for {@link GridCacheMode#PARTITIONED} cache. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Queue with given properties. - * @throws IgniteCheckedException If remove failed. - */ - @Nullable public <T> GridCacheQueue<T> queue(String name, int cap, boolean collocated, - boolean create) throws IgniteCheckedException; - - /** - * Remove queue from cache. Internally one transaction will be created for all elements - * in the queue. If you anticipate that queue may be large, then it's better to use - * {@link #removeQueue(String, int)} which allows to specify batch size. In that case - * transaction will be split into multiple transactions which will have upto {@code batchSize} - * elements in it. - * - * @param name Name queue. - * @return {@code True} if queue has been removed and false if it's not cached. - * @throws IgniteCheckedException If remove failed. - */ - public boolean removeQueue(String name) throws IgniteCheckedException; - - /** - * Remove queue from cache. Internally multiple transactions will be created - * with no more than {@code batchSize} elements in them. For larger queues, this - * method is preferrable over {@link #removeQueue(String)} which will create only - * one transaction for the whole operation. - * - * @param name Name queue. - * @param batchSize Batch size. - * @return {@code True} if queue has been removed and false if it's not cached. - * @throws IgniteCheckedException If remove failed. - */ - public boolean removeQueue(String name, int batchSize) throws IgniteCheckedException; - - /** - * Will get a named set from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * - * @param name Set name. - * @param collocated If {@code true} then all items within the same set will be collocated on the same node. - * Otherwise elements of the same set maybe be cached on different nodes. This parameter works only - * for {@link GridCacheMode#PARTITIONED} cache. - * @param create Flag indicating whether set should be created if does not exist. - * @return Set with given properties. - * @throws IgniteCheckedException If failed. - */ - @Nullable public <T> GridCacheSet<T> set(String name, boolean collocated, boolean create) throws IgniteCheckedException; - - /** - * Removes set from cache. - * - * @param name Set name. - * @return {@code True} if set has been removed and false if it's not cached. - * @throws IgniteCheckedException If failed. - */ - public boolean removeSet(String name) throws IgniteCheckedException; - - /** - * Will get a atomic reference from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * - * @param name Atomic reference name. - * @param initVal Initial value for atomic reference. If atomic reference already cached, - * {@code initVal} will be ignored. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Atomic reference for the given name. - * @throws IgniteCheckedException If atomic reference could not be fetched or created. - */ - @Nullable public <T> GridCacheAtomicReference<T> atomicReference(String name, @Nullable T initVal, boolean create) - throws IgniteCheckedException; - - /** - * Remove atomic reference from cache. - * - * @param name Atomic reference name. - * @return {@code True} if atomic reference has been removed, {@code false} otherwise. - * @throws IgniteCheckedException If remove failed. - */ - public boolean removeAtomicReference(String name) throws IgniteCheckedException; - - /** - * Will get a atomic stamped from cache and create one if it has not been created yet and {@code create} flag - * is {@code true}. - * - * @param name Atomic stamped name. - * @param initVal Initial value for atomic stamped. If atomic stamped already cached, - * {@code initVal} will be ignored. - * @param initStamp Initial stamp for atomic stamped. If atomic stamped already cached, - * {@code initStamp} will be ignored. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Atomic stamped for the given name. - * @throws IgniteCheckedException If atomic stamped could not be fetched or created. - */ - @Nullable public <T, S> GridCacheAtomicStamped<T, S> atomicStamped(String name, @Nullable T initVal, - @Nullable S initStamp, boolean create) throws IgniteCheckedException; - - /** - * Remove atomic stamped from cache. - * - * @param name Atomic stamped name. - * @return {@code True} if atomic stamped has been removed, {@code false} otherwise. - * @throws IgniteCheckedException If remove failed. - */ - public boolean removeAtomicStamped(String name) throws IgniteCheckedException; - - /** - * Gets or creates count down latch. If count down latch is not found in cache and {@code create} flag - * is {@code true}, it is created using provided name and count parameter. - * - * @param name Name of the latch. - * @param cnt Count for new latch creation. - * @param autoDel {@code True} to automatically delete latch from cache - * when its count reaches zero. - * @param create Boolean flag indicating whether data structure should be created if does not exist. - * @return Count down latch for the given name. - * @throws IgniteCheckedException If operation failed. - */ - @Nullable public GridCacheCountDownLatch countDownLatch(String name, int cnt, boolean autoDel, boolean create) - throws IgniteCheckedException; - - /** - * Removes count down latch from cache. - * - * @param name Name of the latch. - * @return Count down latch for the given name. - * @throws IgniteCheckedException If operation failed. - */ - public boolean removeCountDownLatch(String name) throws IgniteCheckedException; -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheQueue.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheQueue.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheQueue.java deleted file mode 100644 index 85511df..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheQueue.java +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; -import org.jetbrains.annotations.*; - -import java.util.*; -import java.util.concurrent.*; - -/** - * This interface provides a rich API for working with distributed queues based on In-Memory Data Grid. - * <p> - * <h1 class="header">Overview</h1> - * Cache queue provides an access to cache elements using typical queue API. Cache queue also implements - * {@link Collection} interface and provides all methods from collections including - * {@link Collection#addAll(Collection)}, {@link Collection#removeAll(Collection)}, and - * {@link Collection#retainAll(Collection)} methods for bulk operations. Note that all - * {@link Collection} methods in the queue may throw {@link IgniteException} in case - * of failure. - * <p> - * All queue operations have synchronous and asynchronous counterparts. - * <h1 class="header">Bounded vs Unbounded</h1> - * Queues can be {@code unbounded} or {@code bounded}. {@code Bounded} queues can - * have maximum capacity. Queue capacity can be set at creation time and cannot be - * changed later. Here is an example of how to create {@code bounded} {@code LIFO} queue with - * capacity of {@code 1000} items. - * <pre name="code" class="java"> - * GridCacheQueue<String> queue = cache().queue("anyName", LIFO, 1000); - * ... - * queue.add("item"); - * </pre> - * For {@code bounded} queues <b>blocking</b> operations, such as {@link #take()} or {@link #put(Object)} - * are available. These operations will block until queue capacity changes to make the operation - * possible. - * <h1 class="header">Collocated vs Non-collocated</h1> - * Queue items can be placed on one node or distributed throughout grid nodes - * (governed by {@code collocated} parameter). {@code Non-collocated} mode is provided only - * for partitioned caches. If {@code collocated} parameter is {@code true}, then all queue items - * will be collocated on one node, otherwise items will be distributed through all grid nodes. - * Unless explicitly specified, by default queues are {@code collocated}. - * <p> - * Here is an example of how create {@code unbounded} queue - * in non-collocated mode. - * <pre name="code" class="java"> - * GridCacheQueue<String> queue = cache().queue("anyName", 0 /*unbounded*/, false /*non-collocated*/); - * ... - * queue.add("item"); - * </pre> - * <h1 class="header">Creating Cache Queues</h1> - * Instances of distributed cache queues can be created by calling the following method - * on {@link GridCacheDataStructures} API: - * <ul> - * <li>{@link GridCacheDataStructures#queue(String, int, boolean, boolean)}</li> - * </ul> - * @see GridCacheDataStructures#queue(String, int, boolean, boolean) - * @see GridCacheDataStructures#removeQueue(String) - * @see GridCacheDataStructures#removeQueue(String, int) - */ -public interface GridCacheQueue<T> extends BlockingQueue<T> { - /** - * Gets queue name. - * - * @return Queue name. - */ - public String name(); - - /** {@inheritDoc} */ - @Override public boolean add(T item) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean offer(T item) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean offer(T item, long timeout, TimeUnit unit) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean addAll(Collection<? extends T> items) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean contains(Object item) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean containsAll(Collection<?> items) throws IgniteException; - - /** {@inheritDoc} */ - @Override public void clear() throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean remove(Object item) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean removeAll(Collection<?> items) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean isEmpty() throws IgniteException; - - /** {@inheritDoc} */ - @Override public Iterator<T> iterator() throws IgniteException; - - /** {@inheritDoc} */ - @Override public Object[] toArray() throws IgniteException; - - /** {@inheritDoc} */ - @Override public <T> T[] toArray(T[] a) throws IgniteException; - - /** {@inheritDoc} */ - @Override public boolean retainAll(Collection<?> items) throws IgniteException; - - /** {@inheritDoc} */ - @Override public int size() throws IgniteException; - - /** {@inheritDoc} */ - @Override @Nullable public T poll() throws IgniteException; - - /** {@inheritDoc} */ - @Override @Nullable public T peek() throws IgniteException; - - /** {@inheritDoc} */ - @Override public void put(T item) throws IgniteException; - - /** {@inheritDoc} */ - @Override @Nullable public T take() throws IgniteException; - - /** {@inheritDoc} */ - @Override @Nullable public T poll(long timeout, TimeUnit unit) throws IgniteException; - - /** - * Removes all of the elements from this queue. Method is used in massive queues with huge numbers of elements. - * - * @param batchSize Batch size. - * @throws IgniteException if operation failed. - */ - public void clear(int batchSize) throws IgniteException; - - /** - * Gets maximum number of elements of the queue. - * - * @return Maximum number of elements. If queue is unbounded {@code Integer.MAX_SIZE} will return. - * @throws IgniteCheckedException If operation failed. - */ - public int capacity() throws IgniteCheckedException; - - /** - * Returns {@code true} if this queue is bounded. - * - * @return {@code true} if this queue is bounded. - * @throws IgniteCheckedException If operation failed. - */ - public boolean bounded() throws IgniteCheckedException; - - /** - * Returns {@code true} if this queue can be kept on the one node only. - * Returns {@code false} if this queue can be kept on the many nodes. - * - * @return {@code true} if this queue is in {@code collocated} mode {@code false} otherwise. - * @throws IgniteCheckedException If operation failed. - */ - public boolean collocated() throws IgniteCheckedException; - - /** - * Gets status of queue. - * - * @return {@code true} if queue was removed from cache {@code false} otherwise. - */ - public boolean removed(); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheSet.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheSet.java b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheSet.java deleted file mode 100644 index fe368aa..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/GridCacheSet.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.datastructures; - -import org.apache.ignite.*; - -import java.util.*; - -/** - * Set implementation based on on In-Memory Data Grid. - * <h1 class="header">Overview</h1> - * Cache set implements {@link Set} interface and provides all methods from collections. - * Note that all {@link Collection} methods in the set may throw {@link IgniteException} in case of failure - * or if set was removed. - * <h1 class="header">Collocated vs Non-collocated</h1> - * Set items can be placed on one node or distributed throughout grid nodes - * (governed by {@code collocated} parameter). {@code Non-collocated} mode is provided only - * for partitioned caches. If {@code collocated} parameter is {@code true}, then all set items - * will be collocated on one node, otherwise items will be distributed through all grid nodes. - * @see GridCacheDataStructures#set(String, boolean, boolean) - * @see GridCacheDataStructures#removeSet(String) - */ -public interface GridCacheSet<T> extends Set<T> { - /** - * Gets set name. - * - * @return Set name. - */ - public String name(); - - /** - * Returns {@code true} if this set can be kept on the one node only. - * Returns {@code false} if this set can be kept on the many nodes. - * - * @return {@code True} if this set is in {@code collocated} mode {@code false} otherwise. - * @throws IgniteCheckedException If operation failed. - */ - public boolean collocated() throws IgniteCheckedException; - - /** - * Gets status of set. - * - * @return {@code True} if set was removed from cache {@code false} otherwise. - */ - public boolean removed(); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/package.html ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/package.html b/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/package.html deleted file mode 100644 index af7bc37..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/datastructures/package.html +++ /dev/null @@ -1,24 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> - -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<body> - <!-- Package description. --> - Contains distributed data structures that work on top of in-memory data grid. -</body> -</html> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionFilter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionFilter.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionFilter.java deleted file mode 100644 index e73dadf..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionFilter.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction; - -import org.apache.ignite.cache.*; -import org.gridgain.grid.cache.*; - -/** - * Eviction filter to specify which entries should not be evicted. Not applicable when - * calling explicit evict via {@link GridCacheEntry#evict()}. - * If {@link #evictAllowed(GridCacheEntry)} method returns {@code false} then eviction - * policy will not be notified and entry will never be evicted. - * <p> - * Eviction filter can be configured via {@link CacheConfiguration#getEvictionFilter()} - * configuration property. Default value is {@code null} which means that all - * cache entries will be tracked by eviction policy. - */ -public interface GridCacheEvictionFilter<K, V> { - /** - * Checks if entry may be evicted from cache. - * - * @param entry Cache entry. - * @return {@code True} if it is allowed to evict this entry. - */ - public boolean evictAllowed(GridCacheEntry<K, V> entry); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionPolicy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionPolicy.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionPolicy.java deleted file mode 100644 index 178d4c6..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/GridCacheEvictionPolicy.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction; - -import org.gridgain.grid.cache.*; -import org.gridgain.grid.cache.eviction.fifo.*; -import org.gridgain.grid.cache.eviction.lru.*; -import org.gridgain.grid.cache.eviction.random.*; - -/** - * Pluggable cache eviction policy. Usually, implementations will internally order - * cache entries based on {@link #onEntryAccessed(boolean, GridCacheEntry)} notifications and - * whenever an element needs to be evicted, {@link GridCacheEntry#evict()} - * method should be called. If you need to access the underlying cache directly - * from this policy, you can get it via {@link GridCacheEntry#projection()} method. - * <p> - * GridGain comes with following eviction policies out-of-the-box: - * <ul> - * <li>{@link GridCacheLruEvictionPolicy}</li> - * <li>{@link GridCacheRandomEvictionPolicy}</li> - * <li>{@link GridCacheFifoEvictionPolicy}</li> - * </ul> - * <p> - * The eviction policy thread-safety is ensured by GridGain. Implementations of this interface should - * not worry about concurrency and should be implemented as they were only accessed from one thread. - * <p> - * Note that implementations of all eviction policies provided by GridGain are very - * light weight in a way that they are all lock-free (or very close to it), and do not - * create any internal tables, arrays, or other expensive structures. - * The eviction order is preserved by attaching light-weight meta-data to existing - * cache entries. - */ -public interface GridCacheEvictionPolicy<K, V> { - /** - * Callback for whenever entry is accessed. - * - * @param rmv {@code True} if entry has been removed, {@code false} otherwise. - * @param entry Accessed entry. - */ - public void onEntryAccessed(boolean rmv, GridCacheEntry<K, V> entry); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicy.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicy.java deleted file mode 100644 index 7838a73..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicy.java +++ /dev/null @@ -1,210 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.fifo; - -import org.apache.ignite.*; -import org.apache.ignite.cache.*; -import org.gridgain.grid.cache.*; -import org.gridgain.grid.cache.eviction.*; -import org.jdk8.backport.*; -import org.jdk8.backport.ConcurrentLinkedDeque8.*; -import org.gridgain.grid.util.typedef.*; -import org.gridgain.grid.util.typedef.internal.*; - -import java.util.*; - -import static org.gridgain.grid.cache.GridCachePeekMode.*; - -/** - * Eviction policy based on {@code First In First Out (FIFO)} algorithm. This - * implementation is very efficient since it does not create any additional - * table-like data structures. The {@code FIFO} ordering information is - * maintained by attaching ordering metadata to cache entries. - */ -public class GridCacheFifoEvictionPolicy<K, V> implements GridCacheEvictionPolicy<K, V>, - GridCacheFifoEvictionPolicyMBean { - /** Tag. */ - private final String meta = UUID.randomUUID().toString(); - - /** Maximum size. */ - private volatile int max = CacheConfiguration.DFLT_CACHE_SIZE; - - /** FIFO queue. */ - private final ConcurrentLinkedDeque8<GridCacheEntry<K, V>> queue = - new ConcurrentLinkedDeque8<>(); - - /** - * Constructs FIFO eviction policy with all defaults. - */ - public GridCacheFifoEvictionPolicy() { - // No-op. - } - - /** - * Constructs FIFO eviction policy with maximum size. Empty entries are allowed. - * - * @param max Maximum allowed size of cache before entry will start getting evicted. - */ - public GridCacheFifoEvictionPolicy(int max) { - A.ensure(max > 0, "max > 0"); - - this.max = max; - } - - /** - * Gets maximum allowed size of cache before entry will start getting evicted. - * - * @return Maximum allowed size of cache before entry will start getting evicted. - */ - @Override public int getMaxSize() { - return max; - } - - /** - * Sets maximum allowed size of cache before entry will start getting evicted. - * - * @param max Maximum allowed size of cache before entry will start getting evicted. - */ - @Override public void setMaxSize(int max) { - A.ensure(max > 0, "max > 0"); - - this.max = max; - } - - /** {@inheritDoc} */ - @Override public int getCurrentSize() { - return queue.size(); - } - - /** {@inheritDoc} */ - @Override public String getMetaAttributeName() { - return meta; - } - - /** - * Gets read-only view on internal {@code FIFO} queue in proper order. - * - * @return Read-only view ono internal {@code 'FIFO'} queue. - */ - public Collection<GridCacheEntry<K, V>> queue() { - return Collections.unmodifiableCollection(queue); - } - - /** {@inheritDoc} */ - @Override public void onEntryAccessed(boolean rmv, GridCacheEntry<K, V> entry) { - if (!rmv) { - if (!entry.isCached()) - return; - - // Shrink only if queue was changed. - if (touch(entry)) - shrink(); - } - else { - Node<GridCacheEntry<K, V>> node = entry.removeMeta(meta); - - if (node != null) - queue.unlinkx(node); - } - } - - /** - * @param entry Entry to touch. - * @return {@code True} if queue has been changed by this call. - */ - private boolean touch(GridCacheEntry<K, V> entry) { - Node<GridCacheEntry<K, V>> node = entry.meta(meta); - - // Entry has not been enqueued yet. - if (node == null) { - while (true) { - node = queue.offerLastx(entry); - - if (entry.putMetaIfAbsent(meta, node) != null) { - // Was concurrently added, need to clear it from queue. - queue.unlinkx(node); - - // Queue has not been changed. - return false; - } - else if (node.item() != null) { - if (!entry.isCached()) { - // Was concurrently evicted, need to clear it from queue. - queue.unlinkx(node); - - return false; - } - - return true; - } - // If node was unlinked by concurrent shrink() call, we must repeat the whole cycle. - else if (!entry.removeMeta(meta, node)) - return false; - } - } - - // Entry is already in queue. - return false; - } - - /** - * Shrinks FIFO queue to maximum allowed size. - */ - private void shrink() { - int max = this.max; - - int startSize = queue.sizex(); - - for (int i = 0; i < startSize && queue.sizex() > max; i++) { - GridCacheEntry<K, V> entry = queue.poll(); - - if (entry == null) - break; - - if (!entry.evict()) { - entry.removeMeta(meta); - - touch(entry); - } - } - } - - /** - * Checks entry for empty value. - * - * @param entry Entry to check. - * @return {@code True} if entry is empty. - */ - private boolean empty(GridCacheEntry<K, V> entry) { - try { - return entry.peek(F.asList(GLOBAL)) == null; - } - catch (IgniteCheckedException e) { - U.error(null, e.getMessage(), e); - - assert false : "Should never happen: " + e; - - return false; - } - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(GridCacheFifoEvictionPolicy.class, this); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicyMBean.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicyMBean.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicyMBean.java deleted file mode 100644 index b1f41a4..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/GridCacheFifoEvictionPolicyMBean.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.fifo; - -import org.apache.ignite.mbean.*; - -/** - * MBean for {@code FIFO} eviction policy. - */ -@IgniteMBeanDescription("MBean for FIFO cache eviction policy.") -public interface GridCacheFifoEvictionPolicyMBean { - /** - * Gets name of metadata attribute used to store eviction policy data. - * - * @return Name of metadata attribute used to store eviction policy data. - */ - @IgniteMBeanDescription("Name of metadata attribute used to store eviction policy data.") - public String getMetaAttributeName(); - - /** - * Gets maximum allowed cache size. - * - * @return Maximum allowed cache size. - */ - @IgniteMBeanDescription("Maximum allowed cache size.") - public int getMaxSize(); - - /** - * Sets maximum allowed cache size. - * - * @param max Maximum allowed cache size. - */ - @IgniteMBeanDescription("Set maximum allowed cache size.") - public void setMaxSize(int max); - - /** - * Gets current queue size. - * - * @return Current queue size. - */ - @IgniteMBeanDescription("Current FIFO queue size.") - public int getCurrentSize(); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/package.html ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/package.html b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/package.html deleted file mode 100644 index a9bf047..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/fifo/package.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<body> - <!-- Package description. --> - Contains cache FIFO eviction policy implementations. -</body> -</html> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsEvictionFilter.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsEvictionFilter.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsEvictionFilter.java deleted file mode 100644 index 1e84dac..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsEvictionFilter.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.ggfs; - -import org.gridgain.grid.cache.*; -import org.gridgain.grid.cache.eviction.*; -import org.gridgain.grid.kernal.processors.ggfs.*; - -/** - * GGFS eviction filter which will not evict blocks of particular files. - */ -public class GridCacheGgfsEvictionFilter implements GridCacheEvictionFilter { - /** {@inheritDoc} */ - @Override public boolean evictAllowed(GridCacheEntry entry) { - Object key = entry.getKey(); - - return !(key instanceof GridGgfsBlockKey && ((GridGgfsBlockKey)key).evictExclude()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicy.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicy.java deleted file mode 100644 index 9f0d298..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicy.java +++ /dev/null @@ -1,353 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.ggfs; - -import org.apache.ignite.*; -import org.apache.ignite.fs.*; -import org.gridgain.grid.cache.*; -import org.gridgain.grid.cache.eviction.*; -import org.gridgain.grid.kernal.processors.ggfs.*; -import org.jdk8.backport.*; -import org.jdk8.backport.ConcurrentLinkedDeque8.*; -import org.jetbrains.annotations.*; - -import java.util.*; -import java.util.concurrent.atomic.*; -import java.util.regex.*; - -/** - * GGFS eviction policy which evicts particular blocks. - */ -public class GridCacheGgfsPerBlockLruEvictionPolicy implements GridCacheEvictionPolicy<GridGgfsBlockKey, byte[]>, - GridCacheGgfsPerBlockLruEvictionPolicyMBean { - /** Meta denoting node in the queue. */ - public static final String META_NODE = "ggfs_node"; - - /** Maximum size. When reached, eviction begins. */ - private volatile long maxSize; - - /** Maximum amount of blocks. When reached, eviction begins. */ - private volatile int maxBlocks; - - /** Collection of regex for paths which must not be evicted. */ - private volatile Collection<String> excludePaths; - - /** Exclusion patterns. */ - private volatile Collection<Pattern> excludePatterns; - - /** Whether patterns must be recompiled during the next call. */ - private final AtomicBoolean excludeRecompile = new AtomicBoolean(true); - - /** Queue. */ - private final ConcurrentLinkedDeque8<GridCacheEntry<GridGgfsBlockKey, byte[]>> queue = - new ConcurrentLinkedDeque8<>(); - - /** Current size of all enqueued blocks in bytes. */ - private final LongAdder curSize = new LongAdder(); - - /** - * Default constructor. - */ - public GridCacheGgfsPerBlockLruEvictionPolicy() { - // No-op. - } - - /** - * Constructor. - * - * @param maxSize Maximum size. When reached, eviction begins. - * @param maxBlocks Maximum amount of blocks. When reached, eviction begins. - */ - public GridCacheGgfsPerBlockLruEvictionPolicy(long maxSize, int maxBlocks) { - this(maxSize, maxBlocks, null); - } - - /** - * Constructor. - * - * @param maxSize Maximum size. When reached, eviction begins. - * @param maxBlocks Maximum amount of blocks. When reached, eviction begins. - * @param excludePaths Collection of regex for path which must not be evicted. - */ - public GridCacheGgfsPerBlockLruEvictionPolicy(long maxSize, int maxBlocks, - @Nullable Collection<String> excludePaths) { - this.maxSize = maxSize; - this.maxBlocks = maxBlocks; - this.excludePaths = excludePaths; - } - - /** {@inheritDoc} */ - @Override public void onEntryAccessed(boolean rmv, GridCacheEntry<GridGgfsBlockKey, byte[]> entry) { - if (!rmv) { - if (!entry.isCached()) - return; - - if (touch(entry)) - shrink(); - } - else { - MetaEntry meta = entry.removeMeta(META_NODE); - - if (meta != null && queue.unlinkx(meta.node())) - changeSize(-meta.size()); - } - } - - /** - * @param entry Entry to touch. - * @return {@code True} if new node has been added to queue by this call. - */ - private boolean touch(GridCacheEntry<GridGgfsBlockKey, byte[]> entry) { - byte[] val = entry.peek(); - - int blockSize = val != null ? val.length : 0; - - MetaEntry meta = entry.meta(META_NODE); - - // Entry has not been enqueued yet. - if (meta == null) { - while (true) { - Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> node = queue.offerLastx(entry); - - meta = new MetaEntry(node, blockSize); - - if (entry.putMetaIfAbsent(META_NODE, meta) != null) { - // Was concurrently added, need to clear it from queue. - queue.unlinkx(node); - - // Queue has not been changed. - return false; - } - else if (node.item() != null) { - if (!entry.isCached()) { - // Was concurrently evicted, need to clear it from queue. - queue.unlinkx(node); - - return false; - } - - // Increment current size. - changeSize(blockSize); - - return true; - } - // If node was unlinked by concurrent shrink() call, we must repeat the whole cycle. - else if (!entry.removeMeta(META_NODE, node)) - return false; - } - } - else { - int oldBlockSize = meta.size(); - - Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> node = meta.node(); - - if (queue.unlinkx(node)) { - // Move node to tail. - Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> newNode = queue.offerLastx(entry); - - int delta = blockSize - oldBlockSize; - - if (!entry.replaceMeta(META_NODE, meta, new MetaEntry(newNode, blockSize))) { - // Was concurrently added, need to clear it from queue. - if (queue.unlinkx(newNode)) - delta -= blockSize; - } - - if (delta != 0) { - changeSize(delta); - - if (delta > 0) - // Total size increased, so shrinking could be needed. - return true; - } - } - } - - // Entry is already in queue. - return false; - } - - /** - * Shrinks queue to maximum allowed size. - */ - private void shrink() { - long maxSize = this.maxSize; - int maxBlocks = this.maxBlocks; - - int cnt = queue.sizex(); - - for (int i = 0; i < cnt && (maxBlocks > 0 && queue.sizex() > maxBlocks || - maxSize > 0 && curSize.longValue() > maxSize); i++) { - GridCacheEntry<GridGgfsBlockKey, byte[]> entry = queue.poll(); - - if (entry == null) - break; // Queue is empty. - - byte[] val = entry.peek(); - - if (val != null) - changeSize(-val.length); // Change current size as we polled entry from the queue. - - if (!entry.evict()) { - // Reorder entries which we failed to evict. - entry.removeMeta(META_NODE); - - touch(entry); - } - } - } - - /** - * Change current size. - * - * @param delta Delta in bytes. - */ - private void changeSize(int delta) { - if (delta != 0) - curSize.add(delta); - } - - /** {@inheritDoc} */ - @Override public long getMaxSize() { - return maxSize; - } - - /** {@inheritDoc} */ - @Override public void setMaxSize(long maxSize) { - this.maxSize = maxSize; - } - - /** {@inheritDoc} */ - @Override public int getMaxBlocks() { - return maxBlocks; - } - - /** {@inheritDoc} */ - @Override public void setMaxBlocks(int maxBlocks) { - this.maxBlocks = maxBlocks; - } - - /** {@inheritDoc} */ - @Override public Collection<String> getExcludePaths() { - return Collections.unmodifiableCollection(excludePaths); - } - - /** {@inheritDoc} */ - @Override public void setExcludePaths(@Nullable Collection<String> excludePaths) { - this.excludePaths = excludePaths; - - excludeRecompile.set(true); - } - - /** {@inheritDoc} */ - @Override public long getCurrentSize() { - return curSize.longValue(); - } - - /** {@inheritDoc} */ - @Override public int getCurrentBlocks() { - return queue.size(); - } - - /** - * Check whether provided path must be excluded from evictions. - * - * @param path Path. - * @return {@code True} in case non block of related file must be excluded. - * @throws IgniteCheckedException In case of faulty patterns. - */ - public boolean exclude(IgniteFsPath path) throws IgniteCheckedException { - assert path != null; - - Collection<Pattern> excludePatterns0; - - if (excludeRecompile.compareAndSet(true, false)) { - // Recompile. - Collection<String> excludePaths0 = excludePaths; - - if (excludePaths0 != null) { - excludePatterns0 = new HashSet<>(excludePaths0.size(), 1.0f); - - for (String excludePath : excludePaths0) { - try { - excludePatterns0.add(Pattern.compile(excludePath)); - } - catch (PatternSyntaxException ignore) { - throw new IgniteCheckedException("Invalid regex pattern: " + excludePath); - } - } - - excludePatterns = excludePatterns0; - } - else - excludePatterns0 = excludePatterns = null; - } - else - excludePatterns0 = excludePatterns; - - if (excludePatterns0 != null) { - String pathStr = path.toString(); - - for (Pattern pattern : excludePatterns0) { - if (pattern.matcher(pathStr).matches()) - return true; - } - } - - return false; - } - - /** - * Meta entry. - */ - private static class MetaEntry { - /** Queue node. */ - private final Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> node; - - /** Data size. */ - private final int size; - - /** - * Constructor. - * - * @param node Queue node. - * @param size Data size. - */ - private MetaEntry(Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> node, int size) { - assert node != null; - assert size >= 0; - - this.node = node; - this.size = size; - } - - /** - * @return Queue node. - */ - private Node<GridCacheEntry<GridGgfsBlockKey, byte[]>> node() { - return node; - } - - /** - * @return Data size. - */ - private int size() { - return size; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicyMBean.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicyMBean.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicyMBean.java deleted file mode 100644 index 690c715..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/GridCacheGgfsPerBlockLruEvictionPolicyMBean.java +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.ggfs; - -import org.apache.ignite.mbean.*; -import org.jetbrains.annotations.*; - -import java.util.*; - -/** - * MBean for {@code GGFS per-block LRU} eviction policy. - */ -@IgniteMBeanDescription("MBean for GGFS per-block LRU cache eviction policy.") -public interface GridCacheGgfsPerBlockLruEvictionPolicyMBean { - /** - * Gets maximum allowed size of all blocks in bytes. - * - * @return Maximum allowed size of all blocks in bytes. - */ - @IgniteMBeanDescription("Maximum allowed size of all blocks in bytes.") - public long getMaxSize(); - - /** - * Sets maximum allowed size of data in all blocks in bytes. - * - * @param maxSize Maximum allowed size of data in all blocks in bytes. - */ - @IgniteMBeanDescription("Sets aximum allowed size of data in all blocks in bytes.") - public void setMaxSize(long maxSize); - - /** - * Gets maximum allowed amount of blocks. - * - * @return Maximum allowed amount of blocks. - */ - @IgniteMBeanDescription("Maximum allowed amount of blocks.") - public int getMaxBlocks(); - - /** - * Sets maximum allowed amount of blocks. - * - * @param maxBlocks Maximum allowed amount of blocks. - */ - @IgniteMBeanDescription("Sets maximum allowed amount of blocks.") - public void setMaxBlocks(int maxBlocks); - - /** - * Gets collection of regex for paths whose blocks must not be evicted. - * - * @return Collection of regex for paths whose blocks must not be evicted. - */ - @IgniteMBeanDescription("Collection of regex for paths whose blocks must not be evicted.") - @Nullable public Collection<String> getExcludePaths(); - - /** - * Sets collection of regex for paths whose blocks must not be evicted. - * - * @param excludePaths Collection of regex for paths whose blocks must not be evicted. - */ - @IgniteMBeanDescription("Sets collection of regex for paths whose blocks must not be evicted.") - public void setExcludePaths(@Nullable Collection<String> excludePaths); - - /** - * Gets current size of data in all blocks. - * - * @return Current size of data in all blocks. - */ - @IgniteMBeanDescription("Current size of data in all blocks.") - public long getCurrentSize(); - - /** - * Gets current amount of blocks. - * - * @return Current amount of blocks. - */ - @IgniteMBeanDescription("Current amount of blocks.") - public int getCurrentBlocks(); -} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/package.html ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/package.html b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/package.html deleted file mode 100644 index 7505d73..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/ggfs/package.html +++ /dev/null @@ -1,23 +0,0 @@ -<!-- - Licensed to the Apache Software Foundation (ASF) under one or more - contributor license agreements. See the NOTICE file distributed with - this work for additional information regarding copyright ownership. - The ASF licenses this file to You under the Apache License, Version 2.0 - (the "License"); you may not use this file except in compliance with - the License. You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - --> -<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html> -<body> -<!-- Package description. --> -Contains GGFS LRU eviction policy implementations. -</body> -</html> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7b1a738d/modules/core/src/main/java/org/gridgain/grid/cache/eviction/lru/GridCacheLruEvictionPolicy.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/lru/GridCacheLruEvictionPolicy.java b/modules/core/src/main/java/org/gridgain/grid/cache/eviction/lru/GridCacheLruEvictionPolicy.java deleted file mode 100644 index 3535221..0000000 --- a/modules/core/src/main/java/org/gridgain/grid/cache/eviction/lru/GridCacheLruEvictionPolicy.java +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.gridgain.grid.cache.eviction.lru; - -import org.apache.ignite.cache.*; -import org.gridgain.grid.cache.*; -import org.gridgain.grid.cache.eviction.*; -import org.jdk8.backport.*; -import org.jdk8.backport.ConcurrentLinkedDeque8.*; -import org.gridgain.grid.util.typedef.internal.*; - -import java.util.*; - -/** - * Eviction policy based on {@code Least Recently Used (LRU)} algorithm. This - * implementation is very efficient since it is lock-free and does not - * create any additional table-like data structures. The {@code LRU} ordering - * information is maintained by attaching ordering metadata to cache entries. - */ -public class GridCacheLruEvictionPolicy<K, V> implements GridCacheEvictionPolicy<K, V>, - GridCacheLruEvictionPolicyMBean { - /** Tag. */ - private final String meta = UUID.randomUUID().toString(); - - /** Maximum size. */ - private volatile int max = CacheConfiguration.DFLT_CACHE_SIZE; - - /** Queue. */ - private final ConcurrentLinkedDeque8<GridCacheEntry<K, V>> queue = - new ConcurrentLinkedDeque8<>(); - - /** - * Constructs LRU eviction policy with all defaults. - */ - public GridCacheLruEvictionPolicy() { - // No-op. - } - - /** - * Constructs LRU eviction policy with maximum size. - * - * @param max Maximum allowed size of cache before entry will start getting evicted. - */ - public GridCacheLruEvictionPolicy(int max) { - A.ensure(max > 0, "max > 0"); - - this.max = max; - } - - /** - * Gets maximum allowed size of cache before entry will start getting evicted. - * - * @return Maximum allowed size of cache before entry will start getting evicted. - */ - @Override public int getMaxSize() { - return max; - } - - /** - * Sets maximum allowed size of cache before entry will start getting evicted. - * - * @param max Maximum allowed size of cache before entry will start getting evicted. - */ - @Override public void setMaxSize(int max) { - A.ensure(max > 0, "max > 0"); - - this.max = max; - } - - /** {@inheritDoc} */ - @Override public int getCurrentSize() { - return queue.size(); - } - - /** {@inheritDoc} */ - @Override public String getMetaAttributeName() { - return meta; - } - - /** - * Gets read-only view on internal {@code FIFO} queue in proper order. - * - * @return Read-only view ono internal {@code 'FIFO'} queue. - */ - public Collection<GridCacheEntry<K, V>> queue() { - return Collections.unmodifiableCollection(queue); - } - - /** {@inheritDoc} */ - @Override public void onEntryAccessed(boolean rmv, GridCacheEntry<K, V> entry) { - if (!rmv) { - if (!entry.isCached()) - return; - - if (touch(entry)) - shrink(); - } - else { - Node<GridCacheEntry<K, V>> node = entry.removeMeta(meta); - - if (node != null) - queue.unlinkx(node); - } - } - - /** - * @param entry Entry to touch. - * @return {@code True} if new node has been added to queue by this call. - */ - private boolean touch(GridCacheEntry<K, V> entry) { - Node<GridCacheEntry<K, V>> node = entry.meta(meta); - - // Entry has not been enqueued yet. - if (node == null) { - while (true) { - node = queue.offerLastx(entry); - - if (entry.putMetaIfAbsent(meta, node) != null) { - // Was concurrently added, need to clear it from queue. - queue.unlinkx(node); - - // Queue has not been changed. - return false; - } - else if (node.item() != null) { - if (!entry.isCached()) { - // Was concurrently evicted, need to clear it from queue. - queue.unlinkx(node); - - return false; - } - - return true; - } - // If node was unlinked by concurrent shrink() call, we must repeat the whole cycle. - else if (!entry.removeMeta(meta, node)) - return false; - } - } - else if (queue.unlinkx(node)) { - // Move node to tail. - Node<GridCacheEntry<K, V>> newNode = queue.offerLastx(entry); - - if (!entry.replaceMeta(meta, node, newNode)) - // Was concurrently added, need to clear it from queue. - queue.unlinkx(newNode); - } - - // Entry is already in queue. - return false; - } - - /** - * Shrinks queue to maximum allowed size. - */ - private void shrink() { - int max = this.max; - - int startSize = queue.sizex(); - - for (int i = 0; i < startSize && queue.sizex() > max; i++) { - GridCacheEntry<K, V> entry = queue.poll(); - - if (entry == null) - break; - - if (!entry.evict()) { - entry.removeMeta(meta); - - touch(entry); - } - } - } - - /** {@inheritDoc} */ - @Override public String toString() { - return S.toString(GridCacheLruEvictionPolicy.class, this, "size", queue.sizex()); - } -}