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())
81 "repository revision blacklisted, aborting");
89 SetOfflineMode(
false);
90 if (atomic_cas32(&drainout_mode_, 0, 1)) {
93 "new catalog revision available, "
94 "draining out meta-data caches");
95 invalidator_handle_.Reset();
96 invalidator_->InvalidateInodes(&invalidator_handle_);
97 atomic_inc32(&drainout_mode_);
102 return kStatusDraining;
106 "reload failed (%s), applying short term TTL",
108 SetOfflineMode(
true);
112 kStatusFailGeneral : kStatusFailNoSpace;
115 "catalog up to date (could be offline mode)");
116 SetOfflineMode(
mountpoint_->catalog_mgr()->offline_mode());
117 unsigned ttl = offline_mode_ ?
119 catalogs_valid_until_ = time(NULL) + ttl;
121 return kStatusUp2Date;
138 case kStatusDraining:
150 fence_maintenance_.Drain();
151 atomic_cas32(&maintenance_mode_, 0, 1);
152 fence_maintenance_.Open();
158 invalidator_handle_.Reset();
159 invalidator_->InvalidateInodes(&invalidator_handle_);
160 invalidator_handle_.WaitFor();
165 void **fuse_channel_or_session,
166 bool fuse_notify_invalidation)
170 fuse_channel_or_session,
171 fuse_notify_invalidation)),
172 invalidator_handle_(static_cast<int>(mountpoint->kcache_timeout_sec())),
174 offline_mode_(false),
175 catalogs_valid_until_(
MountPoint::kIndefiniteDeadline) {
204 uint64_t deadline = 0;
205 struct pollfd watch_ctrl;
207 watch_ctrl.events = POLLIN | POLLPRI;
209 watch_ctrl.revents = 0;
210 int retval = poll(&watch_ctrl, 1, timeout_ms);
212 if (errno == EINTR) {
213 if (timeout_ms >= 0) {
215 timeout_ms = (now > deadline) ? 0 : (deadline - now) * 1000;
220 "remount trigger connection failure (%d)", errno);
229 assert(watch_ctrl.revents != 0);
249 const unsigned buf_size = 1 +
sizeof(int);
252 memcpy(&buf[1], &timeout,
sizeof(timeout));
264 "warning, could not apply updated catalog revision, "
265 "entering offline mode");
277 int retval = pthread_create(
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,...)