예제 #1
0
  /**
   * To verify access if unit time has already over
   *
   * @param configuration -The Configuration for this caller
   * @param throttleContext -The Throttle that caller having pass
   * @param currentTime -The system current time
   * @return boolean -The boolean value which say access will allow or not
   */
  private boolean canAccessIfUnitTimeOver(
      CallerConfiguration configuration, ThrottleContext throttleContext, long currentTime) {

    boolean canAccess = false;
    // if number of access for a unit time is less than MAX and
    // if the unit time period (session time) has just over
    int maxRequest = configuration.getMaximumRequestPerUnitTime();
    if (maxRequest != 0) {
      if ((this.globalCount.get() + this.localCount.get()) < maxRequest) {
        if (this.nextTimeWindow != 0) {
          // Removes and sends the current state to others  (clustered env)
          throttleContext.removeAndFlushCaller(this.id);
        }
        if (log.isDebugEnabled()) {
          log.debug(
              "CallerContext Checking access if unit time over next time window>> Access allowed="
                  + maxRequest
                  + " available="
                  + (maxRequest - (this.globalCount.get() + this.localCount.get()))
                  + " key="
                  + this.getId()
                  + " currentGlobalCount="
                  + globalCount
                  + " currentTime="
                  + currentTime
                  + " nextTimeWindow="
                  + this.nextTimeWindow
                  + " currentLocalCount="
                  + localCount
                  + " Tier="
                  + configuration.getID()
                  + " nextAccessTime="
                  + this.nextAccessTime);
        }
        canAccess = true; // this is bonus access
        // next time callers can access as a new one
      } else {
        // if number of access for a unit time has just been greater than MAX now same as a new
        // session
        // OR if caller in prohibit session  and prohibit period has just over
        if ((this.nextAccessTime == 0) || (this.nextAccessTime <= currentTime)) {
          if (log.isDebugEnabled()) {
            log.debug(
                "CallerContext Checking access if unit time over>> Access allowed="
                    + maxRequest
                    + " available="
                    + (maxRequest - (this.globalCount.get() + this.localCount.get()))
                    + " key="
                    + this.getId()
                    + " currentGlobalCount="
                    + globalCount
                    + " currentTime="
                    + currentTime
                    + " nextTimeWindow="
                    + this.nextTimeWindow
                    + " currentLocalCount="
                    + localCount
                    + " Tier="
                    + configuration.getID()
                    + " nextAccessTime="
                    + this.nextAccessTime);
          }
          // remove previous callercontext instance
          if (this.nextTimeWindow != 0) {
            throttleContext.removeCallerContext(id);
          }
          // reset the states so that, this is the first access
          this.nextAccessTime = 0;
          canAccess = true;

          this.globalCount.set(0); // can access the system   and this is same as first access
          this.localCount.set(1);
          this.firstAccessTime = currentTime;
          this.nextTimeWindow = currentTime + configuration.getUnitTime();
          // registers caller and send the current state to others (clustered env)
          throttleContext.addAndFlushCallerContext(this, id);
          throttleContext.replicateTimeWindow(this.id);

          if (log.isDebugEnabled()) {
            log.debug(
                "Caller="
                    + this.getId()
                    + " has reset counters and added for replication when unit "
                    + "time is over");
          }
        } else {
          // if  caller in prohibit session  and prohibit period has not  over
          if (log.isDebugEnabled()) {
            String type =
                ThrottleConstants.IP_BASE == configuration.getType() ? "IP address" : "domain";
            log.debug(
                "Even unit time has over , CallerContext in prohibit state :"
                    + type
                    + " - "
                    + this.id);
          }
        }
      }
    }
    return canAccess;
  }
예제 #2
0
  /**
   * To verify access if the unit time has already not over
   *
   * @param configuration - -The Configuration for this caller
   * @param throttleContext -The Throttle Context
   * @param currentTime -The system current time
   * @return boolean -The boolean value which say access will allow or not
   */
  private boolean canAccessIfUnitTimeNotOver(
      CallerConfiguration configuration, ThrottleContext throttleContext, long currentTime) {
    boolean canAccess = false;
    int maxRequest = configuration.getMaximumRequestPerUnitTime();
    if (maxRequest != 0) {
      if ((this.globalCount.get() + this.localCount.get())
          < maxRequest) { // If the globalCount is less than max request
        if (log.isDebugEnabled()) {
          log.debug(
              "CallerContext Checking access if unit time is not over and less than max count>> Access "
                  + "allowed="
                  + maxRequest
                  + " available="
                  + (maxRequest - (this.globalCount.get() + this.localCount.get()))
                  + " key="
                  + this.getId()
                  + " currentGlobalCount="
                  + globalCount
                  + " currentTime="
                  + currentTime
                  + " "
                  + "nextTimeWindow="
                  + this.nextTimeWindow
                  + " currentLocalCount="
                  + localCount
                  + " Tier="
                  + configuration.getID()
                  + " nextAccessTime="
                  + this.nextAccessTime);
        }
        canAccess = true; // can continue access
        this.localCount.incrementAndGet();
        // Send the current state to others (clustered env)
        throttleContext.flushCallerContext(this, id);
        // can complete access

      } else {
        // else , if caller has not already prohibit
        if (this.nextAccessTime == 0) {
          // and if there is no prohibit time  period in configuration
          long prohibitTime = configuration.getProhibitTimePeriod();
          if (prohibitTime == 0) {
            // prohibit access until unit time period is over
            this.nextAccessTime = this.firstAccessTime + configuration.getUnitTime();
          } else {
            // if there is a prohibit time period in configuration ,then
            // set it as prohibit period
            this.nextAccessTime = currentTime + prohibitTime;
          }
          if (log.isDebugEnabled()) {
            String type =
                ThrottleConstants.IP_BASE == configuration.getType() ? "IP address" : "domain";
            log.debug(
                "Maximum Number of requests are reached for caller with " + type + " - " + this.id);
          }
          // Send the current state to others (clustered env)
          throttleContext.flushCallerContext(this, id);
        } else {
          // else , if the caller has already prohibit and prohibit
          // time period has already over
          if (this.nextAccessTime <= currentTime) {
            if (log.isDebugEnabled()) {
              log.debug(
                  "CallerContext Checking access if unit time is not over before time window exceed >> "
                      + "Access allowed="
                      + maxRequest
                      + " available="
                      + (maxRequest - (this.globalCount.get() + this.localCount.get()))
                      + " key="
                      + this.getId()
                      + " currentGlobalCount="
                      + globalCount
                      + " currentTime="
                      + currentTime
                      + " "
                      + "nextTimeWindow="
                      + this.nextTimeWindow
                      + " currentLocalCount="
                      + localCount
                      + " "
                      + "Tier="
                      + configuration.getID()
                      + " nextAccessTime="
                      + this.nextAccessTime);
            }
            // remove previous caller context
            if (this.nextTimeWindow != 0) {
              throttleContext.removeCallerContext(id);
            }
            // reset the states so that, this is the first access
            this.nextAccessTime = 0;
            canAccess = true;

            this.globalCount.set(0); // can access the system   and this is same as first access
            this.localCount.set(1);
            this.firstAccessTime = currentTime;
            this.nextTimeWindow = currentTime + configuration.getUnitTime();
            throttleContext.addAndFlushCallerContext(this, this.id);
            throttleContext.replicateTimeWindow(this.id);

            if (log.isDebugEnabled()) {
              log.debug(
                  "Caller="
                      + this.getId()
                      + " has reset counters and added for replication when unit "
                      + "time is not over");
            }
          } else {
            if (log.isDebugEnabled()) {
              String type =
                  ThrottleConstants.IP_BASE == configuration.getType() ? "IP address" : "domain";
              log.debug(
                  "Prohibit period is not yet over for caller with " + type + " - " + this.id);
            }
          }
        }
      }
    }
    return canAccess;
  }