public static void updateRates(String type, long rate) {
   LOGGER.debug("updateRates : type={}, rate={}", type, rate);
   Iterator<RateLimiterDescriptor> iterator = rateLimiterMap.asMap().keySet().iterator();
   while (iterator.hasNext()) {
     RateLimiterDescriptor oldRateDesc = iterator.next();
     if (type.equals(oldRateDesc.getType())) {
       LOGGER.trace("updateRates : invalidated rate={}", oldRateDesc);
       rateLimiterMap.invalidate(oldRateDesc);
       RateLimiterDescriptor newRateDesc =
           new RateLimiterDescriptor(oldRateDesc.getType(), oldRateDesc.getAppId(), rate);
       LOGGER.trace("updateRates : updating rate desc={}, rate={}", newRateDesc, rate);
       rateLimiterMap.put(newRateDesc, RateLimiter.create(rate));
       rateLimiterMap.refresh(newRateDesc);
     }
   }
 }
 public static boolean isAllowed(RateLimiterDescriptor descriptor) {
   if (descriptor.getPermitsPerSecond() <= 0) {
     LOGGER.trace("isAllowed : rate limiting disabled");
     return true;
   }
   try {
     LOGGER.trace("isAllowed : getting ratelimiter for descriptor={}", descriptor);
     RateLimiter r = getOrCreate(descriptor);
     LOGGER.trace("isAllowed : retireved ratelimiter={}, rate={}", r, r.getRate());
     return r.tryAcquire();
   } catch (ExecutionException e) {
     LOGGER.error(
         "isAllowed : Caught exception getting RateLimiter for descriptor : {}", descriptor, e);
     return false;
   }
 }
 public RateLimiter load(RateLimiterDescriptor descriptor) {
   return RateLimiter.create(descriptor.getPermitsPerSecond());
 }