blob: 198278e876559c168d4a8c135c1240ffe3c10e45 [file] [log] [blame]
/*
* 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.
*/
#include "RegionExpiryTask.hpp"
#include "CacheImpl.hpp"
#include "RegionInternal.hpp"
namespace apache {
namespace geode {
namespace client {
RegionExpiryTask::RegionExpiryTask(ExpiryTaskManager& manager,
std::shared_ptr<RegionInternal> region,
ExpirationAction action,
const duration_t& duration)
: ExpiryTask(manager),
region_(region),
duration_(duration),
action_(action) {}
ExpiryTask::time_point_t RegionExpiryTask::expire_at() const {
auto statistics = region_->getStatistics();
auto last_time = statistics->getLastAccessedSteadyTime();
if (region_->getAttributes().getRegionTimeToLive() >
std::chrono::seconds::zero()) {
last_time = statistics->getLastModifiedSteadyTime();
}
return last_time + duration_;
}
bool RegionExpiryTask::on_expire() {
auto tp = expire_at();
if (tp > ExpiryTask::clock_t::now()) {
// Region expiration needs to be re-scheduled as it was accessed/modified
// since the last time the expiration task was (re-)scheduled.
// This is the best approach, rather than re-scheduling the task each time
// the region is accessed/modified, as access/modify is a more frequent
// event than expiration.
reset(tp);
return false;
}
const auto full_path = region_->getFullPath().c_str();
switch (action_) {
case ExpirationAction::INVALIDATE: {
LOGDEBUG("RegionExpiryTask INVALIDATE region [%s]", full_path);
region_->invalidateRegionNoThrow(nullptr, CacheEventFlags::EXPIRATION);
break;
}
case ExpirationAction::LOCAL_INVALIDATE: {
LOGDEBUG("RegionExpiryTask LOCAL_INVALIDATE region [%s]", full_path);
region_->invalidateRegionNoThrow(
nullptr, CacheEventFlags::EXPIRATION | CacheEventFlags::LOCAL);
break;
}
case ExpirationAction::DESTROY: {
LOGDEBUG("RegionExpiryTask DESTROY region [%s]", full_path);
region_->destroyRegionNoThrow(nullptr, true, CacheEventFlags::EXPIRATION);
break;
}
case ExpirationAction::LOCAL_DESTROY: {
LOGDEBUG("RegionExpiryTask LOCAL_DESTROY region [%s]", full_path);
region_->destroyRegionNoThrow(
nullptr, true, CacheEventFlags::EXPIRATION | CacheEventFlags::LOCAL);
break;
}
case ExpirationAction::INVALID_ACTION: {
LOGERROR("Unknown expiration action %d for region [%s]", action_,
full_path);
break;
}
}
return true;
}
} // namespace client
} // namespace geode
} // namespace apache