31 if (
mountpoint_->catalog_mgr()->GetRootHash() == root_hash)
32 return kStatusUp2Date;
35 if (IsInMaintenanceMode())
36 return kStatusMaintenance;
38 if (atomic_cas32(&drainout_mode_, 0, 1)) {
41 invalidator_handle_.Reset();
42 invalidator_->InvalidateInodes(&invalidator_handle_);
43 atomic_inc32(&drainout_mode_);
47 return kStatusDraining;
50 int32_t drainout_code = 0;
54 drainout_code = atomic_read32(&drainout_mode_);
55 if (drainout_code == 0)
60 if (
mountpoint_->catalog_mgr()->GetRootHash() == root_hash)
61 return kStatusUp2Date;
62 return kStatusFailGeneral;
72 if (IsInMaintenanceMode())
73 return kStatusMaintenance;
76 "catalog TTL expired, checking revision against blacklists");
78 &&
mountpoint_->catalog_mgr()->IsRevisionBlacklisted()) {
80 "repository revision blacklisted, aborting");
88 SetOfflineMode(
false);
89 if (atomic_cas32(&drainout_mode_, 0, 1)) {
92 "new catalog revision available, "
93 "draining out meta-data caches");
94 invalidator_handle_.Reset();
95 invalidator_->InvalidateInodes(&invalidator_handle_);
96 atomic_inc32(&drainout_mode_);
101 return kStatusDraining;
105 "reload failed (%s), applying short term TTL",
107 SetOfflineMode(
true);
111 : kStatusFailNoSpace;
114 "catalog up to date (could be offline mode)");
115 SetOfflineMode(
mountpoint_->catalog_mgr()->offline_mode());
118 catalogs_valid_until_ = time(NULL) + ttl;
120 return kStatusUp2Date;
137 case kStatusDraining:
149 fence_maintenance_.Drain();
150 atomic_cas32(&maintenance_mode_, 0, 1);
151 fence_maintenance_.Open();
157 invalidator_handle_.Reset();
158 invalidator_->InvalidateInodes(&invalidator_handle_);
159 invalidator_handle_.WaitFor();
164 void **fuse_channel_or_session,
165 bool fuse_notify_invalidation)
169 mountpoint, fuse_channel_or_session, fuse_notify_invalidation))
170 , invalidator_handle_(static_cast<int>(mountpoint->kcache_timeout_sec()))
171 , fence_(new
Fence())
172 , offline_mode_(false)
173 , catalogs_valid_until_(
MountPoint::kIndefiniteDeadline) {
202 uint64_t deadline = 0;
203 struct pollfd watch_ctrl;
205 watch_ctrl.events = POLLIN | POLLPRI;
207 watch_ctrl.revents = 0;
208 int retval = poll(&watch_ctrl, 1, timeout_ms);
210 if (errno == EINTR) {
211 if (timeout_ms >= 0) {
213 timeout_ms = (now > deadline) ? 0 : (deadline - now) * 1000;
218 "remount trigger connection failure (%d)", errno);
227 assert(watch_ctrl.revents != 0);
247 const unsigned buf_size = 1 +
sizeof(int);
250 memcpy(&buf[1], &timeout,
sizeof(timeout));
262 "warning, could not apply updated catalog revision, "
263 "entering offline mode");
atomic_int32 critical_section_
int pipe_remount_trigger_[2]
FileSystem * file_system()
void TryFinish(const shash::Any &root_hash=shash::Any())
void EnterMaintenanceMode()
InodeGenerationInfo inode_generation_info_
FuseInvalidator::Handle invalidator_handle_
static void * MainRemountTrigger(void *data)
lru::InodeCache * inode_cache()
bool EnterCriticalSection()
assert((mem||(size==0))&&"Out Of Memory")
static const unsigned kShortTermTTL
atomic_int32 drainout_mode_
lru::Md5PathCache * md5path_cache()
void MakePipe(int pipe_fd[2])
MountPoint * mountpoint_
Not owned.
cvmfs::InodeGenerationInfo * inode_generation_info_
Not owned.
FuseInvalidator * invalidator_
LoadReturn ChangeRoot(const shash::Any &root_hash)
time_t catalogs_valid_until_
catalog::ClientCatalogManager * catalog_mgr()
Status CheckSynchronously()
virtual inode_t GetGeneration()=0
catalog::InodeAnnotation * inode_annotation()
lru::PathCache * path_cache()
unsigned GetEffectiveTtlSec()
IoErrorInfo * io_error_info()
Status ChangeRoot(const shash::Any &root_hash)
void SetOfflineMode(bool value)
bool IsInMaintenanceMode()
uint64_t GetRevision() const
pthread_t thread_remount_trigger_
const char * Code2Ascii(const LoadReturn error)
void SetAlarm(int timeout)
void LeaveCriticalSection()
FuseRemounter(MountPoint *mountpoint, cvmfs::InodeGenerationInfo *inode_generation_info, void **fuse_channel_or_session, bool fuse_notify_invalidation)
bool offline_mode() const
uint64_t inode_generation
void WritePipe(int fd, const void *buf, size_t nbyte)
void ReadPipe(int fd, void *buf, size_t nbyte)
void ClosePipe(int pipe_fd[2])
atomic_int32 maintenance_mode_
CVMFS_EXPORT void LogCvmfs(const LogSource source, const int mask, const char *format,...)