@Override
  public boolean put(Object object) throws CacheException, InterruptedException {
    giiLock.readLock().lock(); // fix for bug #41681 - durable client misses event

    try {
      if (giiCount.get() > 0) {
        if (logger.isDebugEnabled()) {
          logger.debug("{}: adding message to GII queue of size {}: {}", regionName,
              giiQueue.size(), object);
        }

        if (object instanceof HAEventWrapper) {
          HAEventWrapper wrapper = (HAEventWrapper) object;
          wrapper.incrementPutInProgressCounter("GII queue");
        }

        giiQueue.add(object);
      } else {
        if (logger.isTraceEnabled()) {
          logger.trace("{}: adding message to HA queue: {}", regionName, object);
        }
        basicPut(object);
      }
    } finally {
      giiLock.readLock().unlock();
    }

    // basicPut() invokes dace.putObject() to put onto HARegionQueue
    // However, dace.putObject could return true even though
    // the event is not put onto the HARegionQueue due to eliding events etc.
    // So it is not reliable to be used whether offheap ref ownership is passed over to
    // the queue (if and when HARegionQueue uses offheap). The probable
    // solution could be that to let dace.putObject() to increase offheap REF count
    // when it puts the event onto the region queue. Also always release (dec)
    // the offheap REF count from the caller.
    return true;
  }
Adds an object at the queue's tail. The implementation supports concurrent put operations in a
performant manner. This is done in following steps: <br>
1)Check if the Event being added has a sequence ID less than the Last Dispatched SequenceId. If
yes do not add the Event to the Queue <br>
2)If no then Do a "put-if-absent" on the eventsMap ,inserting the
LastDispatchedAndCurrentEvents object or adding the position to the existing object for the
ThreadIdentifier

It is possible that DispatchedAnCurrentEvents object just retrieved by the put thread has
expired thus a one level recursion can occur to do a valid put

The operation is thread safe & is guarded by taking a lock on LastDispatchedAndCurrentEvents
object & SIZE Lock

@param object object to put onto the queue
geode-core/src/main/java/org/apache/geode/internal/cache/ha/HARegionQueue.java