From 25af536e4799bb05f27e6c4b7599a0fd892cf88c Mon Sep 17 00:00:00 2001 From: Dave Dykstra <2129743+DrDaveD@users.noreply.github.com> Date: Tue, 7 Nov 2017 09:42:16 -0600 Subject: [PATCH 01/15] prefer cvmfs-config-default over cvmfs-config virtual package --- packaging/debian/cvmfs/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/debian/cvmfs/control b/packaging/debian/cvmfs/control index ab0b595bf3..47fef1f4ee 100644 --- a/packaging/debian/cvmfs/control +++ b/packaging/debian/cvmfs/control @@ -9,7 +9,7 @@ Homepage: http://cernvm.cern.ch/portal/filesystem Package: cvmfs Architecture: i386 amd64 armhf arm64 #Pre-Depends: ${misc:Pre-Depends} (preparation for multiarch support) -Depends: cvmfs-config, bash, coreutils, grep, gawk, sed, perl, psmisc, autofs, fuse, curl, attr, libfuse2, debianutils, libc-bin, sysvinit-utils, zlib1g, gdb, uuid-dev, uuid +Depends: cvmfs-config-default | cvmfs-config, bash, coreutils, grep, gawk, sed, perl, psmisc, autofs, fuse, curl, attr, libfuse2, debianutils, libc-bin, sysvinit-utils, zlib1g, gdb, uuid-dev, uuid Recommends: autofs (>= 5.1.2) #Multi-Arch: same (preparation for multiarch support) Homepage: http://cernvm.cern.ch From 873ff4082cddc7996eacacd41fb16a6bc9089f2b Mon Sep 17 00:00:00 2001 From: Dave Dykstra <2129743+DrDaveD@users.noreply.github.com> Date: Tue, 7 Nov 2017 09:43:22 -0600 Subject: [PATCH 02/15] add Conflicts: cvmfs-config to turn cvmfs-config into a virtual package --- packaging/debian/config-default/control | 1 + packaging/debian/config-none/control | 1 + 2 files changed, 2 insertions(+) diff --git a/packaging/debian/config-default/control b/packaging/debian/config-default/control index dbeb5c8d63..380867ae18 100644 --- a/packaging/debian/config-default/control +++ b/packaging/debian/config-default/control @@ -12,6 +12,7 @@ Replaces: cvmfs-keys Conflicts: cvmfs-keys Breaks: cvmfs-keys, cvmfs (<< 2.1.20), cvmfs-server (<< 2.1.20) Provides: cvmfs-config +Conflicts: cvmfs-config Description: CernVM File System Default Configuration Defaulf configuration and public keys for mounting common CernVM-FS repositories. diff --git a/packaging/debian/config-none/control b/packaging/debian/config-none/control index feab5afe1e..10e465661f 100644 --- a/packaging/debian/config-none/control +++ b/packaging/debian/config-none/control @@ -10,6 +10,7 @@ Package: cvmfs-config-none Architecture: all Breaks: cvmfs (<< 2.1.20), cvmfs-server (<< 2.1.20) Provides: cvmfs-config +Conflicts: cvmfs-config Description: CernVM File System Empty Configuration Empty package to fulfill the "cvmfs-config" dependency of cvmfs. Can be used to provide custom configuration to CernVM-FS. From 18cf5f1847042e8ae12d0cb3c40b5f063733e31f Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Wed, 8 Nov 2017 16:32:46 +0100 Subject: [PATCH 03/15] workaround: turn off active cache eviction --- cvmfs/fuse_evict.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cvmfs/fuse_evict.cc b/cvmfs/fuse_evict.cc index 5ee68368e2..7a981e291f 100644 --- a/cvmfs/fuse_evict.cc +++ b/cvmfs/fuse_evict.cc @@ -60,7 +60,10 @@ bool FuseInvalidator::HasFuseNotifyInval() { * that doesn't support active invalidation? How old does the kernel need * to be? Probably that situation is never triggered in practice. */ - return FUSE_VERSION >= 29; + // Invalidation of entries can silently remove mount points on top of cvmfs. + // Turning active evition off for the time being. + // return FUSE_VERSION >= 29; + return false; } From f472dbedddf88fe85d7f7bc6e77556200a176a45 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 9 Nov 2017 00:15:20 +0100 Subject: [PATCH 04/15] use fuse's inval_inode instead of inval_entry --- cvmfs/duplex_fuse.h | 8 +++---- cvmfs/fuse_evict.cc | 32 ++++++++++--------------- cvmfs/fuse_evict.h | 12 ++-------- cvmfs/fuse_remount.cc | 4 ++-- cvmfs/glue_buffer.h | 43 +++++++++++++++++++++++++++++++--- cvmfs/talk.cc | 24 +++++++++++++++++++ test/unittests/t_fuse_evict.cc | 18 +++++++------- 7 files changed, 93 insertions(+), 48 deletions(-) diff --git a/cvmfs/duplex_fuse.h b/cvmfs/duplex_fuse.h index 25e1717acc..69e1f4e831 100644 --- a/cvmfs/duplex_fuse.h +++ b/cvmfs/duplex_fuse.h @@ -13,11 +13,11 @@ extern "C" { // Empty structs have different sizes in C and C++, hence the dummy int struct fuse_chan { int dummy; }; // Defined in t_fuse_evict.cc -extern unsigned fuse_lowlevel_notify_inval_entry_cnt; -static int __attribute__((used)) fuse_lowlevel_notify_inval_entry( - void *, unsigned long, const char *, size_t) // NOLINT (ulong from fuse) +extern unsigned fuse_lowlevel_notify_inval_inode_cnt; +static int __attribute__((used)) fuse_lowlevel_notify_inval_inode( + void *, fuse_ino_t, off_t, off_t) // NOLINT (ulong from fuse) { - fuse_lowlevel_notify_inval_entry_cnt++; + fuse_lowlevel_notify_inval_inode_cnt++; return -1; } } diff --git a/cvmfs/fuse_evict.cc b/cvmfs/fuse_evict.cc index 7a981e291f..bc99f7dc7f 100644 --- a/cvmfs/fuse_evict.cc +++ b/cvmfs/fuse_evict.cc @@ -60,10 +60,7 @@ bool FuseInvalidator::HasFuseNotifyInval() { * that doesn't support active invalidation? How old does the kernel need * to be? Probably that situation is never triggered in practice. */ - // Invalidation of entries can silently remove mount points on top of cvmfs. - // Turning active evition off for the time being. - // return FUSE_VERSION >= 29; - return false; + return FUSE_VERSION >= 29; } @@ -91,7 +88,7 @@ FuseInvalidator::~FuseInvalidator() { } -void FuseInvalidator::InvalidateDentries(Handle *handle) { +void FuseInvalidator::InvalidateInodes(Handle *handle) { assert(handle != NULL); char c = 'I'; WritePipe(pipe_ctrl_[1], &c, 1); @@ -133,30 +130,25 @@ void *FuseInvalidator::MainInvalidator(void *data) { // We must not hold a lock when calling fuse_lowlevel_notify_inval_entry. // Therefore, we first copy all the inodes into a temporary data structure. - EvictableObject evictable_object; glue::InodeTracker::Cursor cursor( invalidator->inode_tracker_->BeginEnumerate()); - while (invalidator->inode_tracker_->Next( - &cursor, &evictable_object.inode, &evictable_object.name)) + uint64_t inode; + while (invalidator->inode_tracker_->NextInode(&cursor, &inode)) { - invalidator->evict_list_.PushBack(evictable_object); + invalidator->evict_list_.PushBack(inode); } invalidator->inode_tracker_->EndEnumerate(&cursor); unsigned i = 0; unsigned N = invalidator->evict_list_.size(); while (i < N) { - evictable_object = invalidator->evict_list_.At(i); - if (evictable_object.inode == 0) - evictable_object.inode = FUSE_ROOT_ID; - // Can return non-zero value if parent entry was already evicted - fuse_lowlevel_notify_inval_entry( - *invalidator->fuse_channel_, - evictable_object.inode, - evictable_object.name.GetChars(), - evictable_object.name.GetLength()); - LogCvmfs(kLogCvmfs, kLogDebug, "evicting <%" PRIu64 ">/%s", - evictable_object.inode, evictable_object.name.c_str()); + uint64_t inode = invalidator->evict_list_.At(i); + if (inode == 0) + inode = FUSE_ROOT_ID; + // Can fail, e.g. the inode might be already evicted + fuse_lowlevel_notify_inval_inode( + *invalidator->fuse_channel_, inode, 0, 0); + LogCvmfs(kLogCvmfs, kLogDebug, "evicting inode %"PRIu64, inode); if ((++i % kCheckTimeoutFreqOps) == 0) { if (platform_monotonic_time() >= deadline) { diff --git a/cvmfs/fuse_evict.h b/cvmfs/fuse_evict.h index d991d32888..38c9d168e4 100644 --- a/cvmfs/fuse_evict.h +++ b/cvmfs/fuse_evict.h @@ -64,7 +64,7 @@ class FuseInvalidator : SingleCopy { struct fuse_chan **fuse_channel); ~FuseInvalidator(); void Spawn(); - void InvalidateDentries(Handle *handle); + void InvalidateInodes(Handle *handle); private: /** @@ -81,14 +81,6 @@ class FuseInvalidator : SingleCopy { */ static const unsigned kCheckTimeoutFreqOps; // = 256 - /** - * The information given to fuse_lowlevel_notify_inval_entry - */ - struct EvictableObject { - uint64_t inode; - NameString name; - }; - static void *MainInvalidator(void *data); glue::InodeTracker *inode_tracker_; @@ -101,7 +93,7 @@ class FuseInvalidator : SingleCopy { * thread should be shut down. */ atomic_int32 terminated_; - BigVector evict_list_; + BigVector evict_list_; }; // class FuseInvalidator #endif // CVMFS_FUSE_EVICT_H_ diff --git a/cvmfs/fuse_remount.cc b/cvmfs/fuse_remount.cc index 5fba669d47..4a6e8ce91d 100644 --- a/cvmfs/fuse_remount.cc +++ b/cvmfs/fuse_remount.cc @@ -54,7 +54,7 @@ FuseRemounter::Status FuseRemounter::Check() { "new catalog revision available, " "draining out meta-data caches"); invalidator_handle_.Reset(); - invalidator_->InvalidateDentries(&invalidator_handle_); + invalidator_->InvalidateInodes(&invalidator_handle_); atomic_inc32(&drainout_mode_); // drainout_mode_ == 2, IsInDrainoutMode is now 'true' } else { @@ -112,7 +112,7 @@ void FuseRemounter::EnterMaintenanceMode() { // Flush caches before reload of fuse module invalidator_handle_.Reset(); - invalidator_->InvalidateDentries(&invalidator_handle_); + invalidator_->InvalidateInodes(&invalidator_handle_); invalidator_handle_.WaitFor(); } diff --git a/cvmfs/glue_buffer.h b/cvmfs/glue_buffer.h index 3e7e60c110..34d1a8fbe8 100644 --- a/cvmfs/glue_buffer.h +++ b/cvmfs/glue_buffer.h @@ -394,6 +394,14 @@ class InodeMap { class InodeReferences { public: + /** + * Used to enumerate all inodes + */ + struct Cursor { + Cursor() : idx(0) { } + uint32_t idx; + }; + InodeReferences() { map_.Init(16, 0, hasher_inode); } @@ -425,6 +433,24 @@ class InodeReferences { map_.Clear(); } + Cursor BeginEnumerate() { + return Cursor(); + } + + bool Next(Cursor *cursor, uint64_t *inode) { + uint64_t empty_key = map_.empty_key(); + while (cursor->idx < map_.capacity()) { + if (map_.keys()[cursor->idx] == empty_key) { + cursor->idx++; + continue; + } + *inode = map_.keys()[cursor->idx]; + cursor->idx++; + return true; + } + return false; + } + private: SmallHashDynamic map_; }; @@ -442,8 +468,14 @@ class InodeTracker { * Used to actively evict all known paths from kernel caches */ struct Cursor { - explicit Cursor(const PathStore::Cursor &c) : csr_paths(c) { } + explicit Cursor( + const PathStore::Cursor &p, + const InodeReferences::Cursor &i) + : csr_paths(p) + , csr_inos(i) + { } PathStore::Cursor csr_paths; + InodeReferences::Cursor csr_inos; }; // Cannot be moved to the statistics manager because it has to survive @@ -540,10 +572,11 @@ class InodeTracker { Cursor BeginEnumerate() { Lock(); - return Cursor(path_map_.path_store()->BeginEnumerate()); + return Cursor(path_map_.path_store()->BeginEnumerate(), + inode_references_.BeginEnumerate()); } - bool Next(Cursor *cursor, uint64_t *inode_parent, NameString *name) { + bool NextEntry(Cursor *cursor, uint64_t *inode_parent, NameString *name) { shash::Md5 parent_md5; StringRef name_ref; bool result = path_map_.path_store()->Next( @@ -558,6 +591,10 @@ class InodeTracker { return true; } + bool NextInode(Cursor *cursor, uint64_t *inode) { + return inode_references_.Next(&(cursor->csr_inos), inode); + } + void EndEnumerate(Cursor *cursor) { Unlock(); } diff --git a/cvmfs/talk.cc b/cvmfs/talk.cc index 10476c16df..0fca878df4 100644 --- a/cvmfs/talk.cc +++ b/cvmfs/talk.cc @@ -587,6 +587,30 @@ void *TalkManager::MainResponder(void *data) { (*i)->so_version + ")\n"; } talk_mgr->Answer(con_fd, history_str); + } else if (line == "vfs inodes") { + string result; + glue::InodeTracker::Cursor cursor( + mount_point->inode_tracker()->BeginEnumerate()); + uint64_t inode; + while (mount_point->inode_tracker()->NextInode(&cursor, &inode)) { + result += StringifyInt(inode) + "\n"; + } + mount_point->inode_tracker()->EndEnumerate(&cursor); + talk_mgr->Answer(con_fd, result); + } else if (line == "vfs entries") { + string result; + glue::InodeTracker::Cursor cursor( + mount_point->inode_tracker()->BeginEnumerate()); + uint64_t inode_parent; + NameString name; + while (mount_point->inode_tracker()->NextEntry( + &cursor, &inode_parent, &name)) + { + result += "<" + StringifyInt(inode_parent) + ">/" + name.ToString() + + "\n"; + } + mount_point->inode_tracker()->EndEnumerate(&cursor); + talk_mgr->Answer(con_fd, result); } else if (line == "version") { string version_str = string(VERSION) + " (CernVM-FS Fuse Module)\n" + cvmfs::loader_exports_->loader_version + " (Loader)\n"; diff --git a/test/unittests/t_fuse_evict.cc b/test/unittests/t_fuse_evict.cc index 605fba8ff8..c33c03597e 100644 --- a/test/unittests/t_fuse_evict.cc +++ b/test/unittests/t_fuse_evict.cc @@ -9,7 +9,7 @@ #include "util/string.h" extern "C" { -unsigned fuse_lowlevel_notify_inval_entry_cnt = 0; +unsigned fuse_lowlevel_notify_inval_inode_cnt = 0; } class T_FuseInvalidator : public ::testing::Test { @@ -48,14 +48,14 @@ TEST_F(T_FuseInvalidator, StartStop) { TEST_F(T_FuseInvalidator, InvalidateTimeout) { FuseInvalidator::Handle handle(0); EXPECT_FALSE(handle.IsDone()); - invalidator_->InvalidateDentries(&handle); + invalidator_->InvalidateInodes(&handle); handle.WaitFor(); EXPECT_TRUE(handle.IsDone()); invalidator_->terminated_ = 1; FuseInvalidator::Handle handle2(1000000); EXPECT_FALSE(handle2.IsDone()); - invalidator_->InvalidateDentries(&handle2); + invalidator_->InvalidateInodes(&handle2); handle2.WaitFor(); EXPECT_TRUE(handle2.IsDone()); } @@ -70,26 +70,26 @@ TEST_F(T_FuseInvalidator, InvalidateOps) { FuseInvalidator::Handle handle(0); EXPECT_FALSE(handle.IsDone()); - invalidator_->InvalidateDentries(&handle); + invalidator_->InvalidateInodes(&handle); handle.WaitFor(); EXPECT_TRUE(handle.IsDone()); EXPECT_EQ(FuseInvalidator::kCheckTimeoutFreqOps, - fuse_lowlevel_notify_inval_entry_cnt); + fuse_lowlevel_notify_inval_inode_cnt); FuseInvalidator::Handle handle2(1000000); EXPECT_FALSE(handle2.IsDone()); - invalidator_->InvalidateDentries(&handle2); + invalidator_->InvalidateInodes(&handle2); handle2.WaitFor(); EXPECT_TRUE(handle2.IsDone()); EXPECT_EQ(FuseInvalidator::kCheckTimeoutFreqOps + 1024, - fuse_lowlevel_notify_inval_entry_cnt); + fuse_lowlevel_notify_inval_inode_cnt); invalidator_->terminated_ = 1; handle2.Reset(); EXPECT_FALSE(handle2.IsDone()); - invalidator_->InvalidateDentries(&handle2); + invalidator_->InvalidateInodes(&handle2); handle2.WaitFor(); EXPECT_TRUE(handle2.IsDone()); EXPECT_EQ((2 * FuseInvalidator::kCheckTimeoutFreqOps) + 1024, - fuse_lowlevel_notify_inval_entry_cnt); + fuse_lowlevel_notify_inval_inode_cnt); } From 43cb62e9e782ab90d3667dae0a190e1d5a8357b1 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 9 Nov 2017 00:22:54 +0100 Subject: [PATCH 05/15] add integration test for mounts on top of cvmfs --- test/src/076-mountover/main | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 test/src/076-mountover/main diff --git a/test/src/076-mountover/main b/test/src/076-mountover/main new file mode 100644 index 0000000000..f9a8055fdd --- /dev/null +++ b/test/src/076-mountover/main @@ -0,0 +1,22 @@ + +cvmfs_test_name="Mount over a directory in cvmfs and reload" + +cleanup() { + sudo umount /cvmfs/cvmfs-config.cern.ch/etc/cvmfs +} + +cvmfs_run_test() { + logfile=$1 + + cvmfs_mount cvmfs-config.cern.ch || return 1 + sudo mount -t proc none /cvmfs/cvmfs-config.cern.ch/etc/cvmfs || return 2 + trap cleanup EXIT HUP INT TERM + + ls /cvmfs/cvmfs-config.cern.ch/etc/cvmfs/self || return 10 + sudo cvmfs_config reload cvmfs-config.cern.ch || return 11 + + ls /cvmfs/cvmfs-config.cern.ch/etc/cvmfs/self || return 20 + + return 0 +} + From 8c60e35e176005cd00de9a66ce0fcd4e1e903e12 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 9 Nov 2017 09:12:12 +0100 Subject: [PATCH 06/15] fix compile error --- cvmfs/duplex_fuse.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cvmfs/duplex_fuse.h b/cvmfs/duplex_fuse.h index 69e1f4e831..0559ec20c9 100644 --- a/cvmfs/duplex_fuse.h +++ b/cvmfs/duplex_fuse.h @@ -15,7 +15,7 @@ struct fuse_chan { int dummy; }; // Defined in t_fuse_evict.cc extern unsigned fuse_lowlevel_notify_inval_inode_cnt; static int __attribute__((used)) fuse_lowlevel_notify_inval_inode( - void *, fuse_ino_t, off_t, off_t) // NOLINT (ulong from fuse) + void *, unsigned /*fuse_ino_t*/, off_t, off_t) // NOLINT (ulong from fuse) { fuse_lowlevel_notify_inval_inode_cnt++; return -1; From 33ecf2e5dd6fe3bb4b75ee834ef2a3423379f3b1 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 9 Nov 2017 12:04:27 +0100 Subject: [PATCH 07/15] fix compilation errors, extend inode tracker unit test --- cvmfs/fuse_evict.cc | 2 +- test/unittests/t_glue_buffer.cc | 41 ++++++++++++++++++++++++--------- 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/cvmfs/fuse_evict.cc b/cvmfs/fuse_evict.cc index bc99f7dc7f..67f89f45e7 100644 --- a/cvmfs/fuse_evict.cc +++ b/cvmfs/fuse_evict.cc @@ -148,7 +148,7 @@ void *FuseInvalidator::MainInvalidator(void *data) { // Can fail, e.g. the inode might be already evicted fuse_lowlevel_notify_inval_inode( *invalidator->fuse_channel_, inode, 0, 0); - LogCvmfs(kLogCvmfs, kLogDebug, "evicting inode %"PRIu64, inode); + LogCvmfs(kLogCvmfs, kLogDebug, "evicting inode %" PRIu64, inode); if ((++i % kCheckTimeoutFreqOps) == 0) { if (platform_monotonic_time() >= deadline) { diff --git a/test/unittests/t_glue_buffer.cc b/test/unittests/t_glue_buffer.cc index 6c824d76e2..0d98284743 100644 --- a/test/unittests/t_glue_buffer.cc +++ b/test/unittests/t_glue_buffer.cc @@ -20,39 +20,58 @@ class T_GlueBuffer : public ::testing::Test { TEST_F(T_GlueBuffer, InodeTracker) { - uint64_t inode = 0; + uint64_t inode_parent = 0; NameString name; + uint64_t inode = 0; InodeTracker::Cursor cursor = inode_tracker_.BeginEnumerate(); - EXPECT_FALSE(inode_tracker_.Next(&cursor, &inode, &name)); - EXPECT_FALSE(inode_tracker_.Next(&cursor, &inode, &name)); + EXPECT_FALSE(inode_tracker_.NextEntry(&cursor, &inode_parent, &name)); + EXPECT_FALSE(inode_tracker_.NextEntry(&cursor, &inode_parent, &name)); + EXPECT_FALSE(inode_tracker_.NextInode(&cursor, &inode)); inode_tracker_.EndEnumerate(&cursor); inode_tracker_.VfsGet(1, PathString("")); inode_tracker_.VfsGet(2, PathString("/foo")); inode_tracker_.VfsGet(4, PathString("/foo/bar")); cursor = inode_tracker_.BeginEnumerate(); - int bitset = 0; + int bitset_entry = 0; + int bitset_inode = 0; for (unsigned i = 0; i < 3; ++i) { - EXPECT_TRUE(inode_tracker_.Next(&cursor, &inode, &name)); - switch (inode) { + EXPECT_TRUE(inode_tracker_.NextEntry(&cursor, &inode_parent, &name)); + EXPECT_TRUE(inode_tracker_.NextInode(&cursor, &inode)); + switch (inode_parent) { case 0: EXPECT_EQ("", name.ToString()); - bitset |= 1; + bitset_entry |= 1; break; case 1: EXPECT_EQ("foo", name.ToString()); - bitset |= 2; + bitset_entry |= 2; break; case 2: EXPECT_EQ("bar", name.ToString()); - bitset |= 4; + bitset_entry |= 4; + break; + default: + EXPECT_FALSE(true); + } + switch (inode) { + case 1: + bitset_inode |= 1; + break; + case 2: + bitset_inode |= 2; + break; + case 4: + bitset_inode |= 4; break; default: EXPECT_FALSE(true); } } - EXPECT_EQ(7, bitset); - EXPECT_FALSE(inode_tracker_.Next(&cursor, &inode, &name)); + EXPECT_EQ(7, bitset_entry); + EXPECT_EQ(7, bitset_inode); + EXPECT_FALSE(inode_tracker_.NextEntry(&cursor, &inode_parent, &name)); + EXPECT_FALSE(inode_tracker_.NextInode(&cursor, &inode)); inode_tracker_.EndEnumerate(&cursor); } From 4f1293474fe983692230d6189e26b4f76e5351ba Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 9 Nov 2017 13:42:45 +0100 Subject: [PATCH 08/15] fix compilation on EL<=5 --- cvmfs/duplex_fuse.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cvmfs/duplex_fuse.h b/cvmfs/duplex_fuse.h index 0559ec20c9..7ff51b6f79 100644 --- a/cvmfs/duplex_fuse.h +++ b/cvmfs/duplex_fuse.h @@ -32,6 +32,11 @@ static int __attribute__((used)) fuse_lowlevel_notify_inval_entry( { abort(); } +static int __attribute__((used)) fuse_lowlevel_notify_inval_inode( + void *, fuse_ino_t, off_t, off_t) // NOLINT +{ + abort(); +} } #endif #endif From 5256e733e6608f815a448b9ea55763115e1f7d37 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Mon, 13 Nov 2017 10:10:17 +0100 Subject: [PATCH 09/15] changelog --- ChangeLog | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 204f8e8ab7..014a83e0eb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,6 @@ 2.4.3: - * Work around for alien cache on BeeGFS (CVM-1403) + * Invalidate inodes instead of dentries on reload/remount (CVM-1423) + * Workaround for alien cache on BeeGFS (CVM-1403) 2.4.2: * Skip external files during garbage collection (CVM-1396) From 2bbca0b1229ba537ff2dcfb91b428c48f6c3b49f Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Tue, 14 Nov 2017 16:19:31 +0100 Subject: [PATCH 10/15] changelog --- ChangeLog | 1 + 1 file changed, 1 insertion(+) diff --git a/ChangeLog b/ChangeLog index 014a83e0eb..34da26127b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ 2.4.3: + * Turn cvmfs-config into Debian virtual package (CVM-1420) * Invalidate inodes instead of dentries on reload/remount (CVM-1423) * Workaround for alien cache on BeeGFS (CVM-1403) From 7aac1b40e606452d90335a61e3a8ba8bb9f401f1 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Tue, 14 Nov 2017 16:22:31 +0100 Subject: [PATCH 11/15] update changelog for Debian config packages --- packaging/debian/config-default/changelog | 6 ++++++ packaging/debian/config-none/changelog | 6 ++++++ 2 files changed, 12 insertions(+) diff --git a/packaging/debian/config-default/changelog b/packaging/debian/config-default/changelog index edeed119b8..657d85838a 100644 --- a/packaging/debian/config-default/changelog +++ b/packaging/debian/config-default/changelog @@ -1,3 +1,9 @@ +cvmfs-config-default (1.6-1) lucid; urgency=low + + * Turn into virtual package + + -- Dave Dykstra Tue, 14 Nov 2017 16:00:00 +0000 + cvmfs-config-default (1.5-1) lucid; urgency=low * Update comment on config repository diff --git a/packaging/debian/config-none/changelog b/packaging/debian/config-none/changelog index e300240b95..9f93c7c8b2 100644 --- a/packaging/debian/config-none/changelog +++ b/packaging/debian/config-none/changelog @@ -1,3 +1,9 @@ +cvmfs-config-none (1.1-0) lucid; urgency=low + + * Turn into virtual package + + -- Dave Dykstra Tue, 14 Nov 2017 16:00:00 +0000 + cvmfs-config-none (1.0-2) lucid; urgency=low * Fix packaging errors From a35e63cbd971209667a7865041292b1f382cda64 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Tue, 14 Nov 2017 16:25:35 +0100 Subject: [PATCH 12/15] fix packaging error --- packaging/debian/config-default/control | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packaging/debian/config-default/control b/packaging/debian/config-default/control index 380867ae18..977b8f99fd 100644 --- a/packaging/debian/config-default/control +++ b/packaging/debian/config-default/control @@ -9,10 +9,9 @@ Homepage: http://cernvm.cern.ch/portal/filesystem Package: cvmfs-config-default Architecture: all Replaces: cvmfs-keys -Conflicts: cvmfs-keys +Conflicts: cvmfs-keys cvmfs-config Breaks: cvmfs-keys, cvmfs (<< 2.1.20), cvmfs-server (<< 2.1.20) Provides: cvmfs-config -Conflicts: cvmfs-config Description: CernVM File System Default Configuration Defaulf configuration and public keys for mounting common CernVM-FS repositories. From c9ac2eb10faa1db3b23cc5754c38a8d361e2efce Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Tue, 14 Nov 2017 16:26:45 +0100 Subject: [PATCH 13/15] fix syntax error in debian package source --- packaging/debian/config-default/control | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/debian/config-default/control b/packaging/debian/config-default/control index 977b8f99fd..d7dc70d84d 100644 --- a/packaging/debian/config-default/control +++ b/packaging/debian/config-default/control @@ -9,7 +9,7 @@ Homepage: http://cernvm.cern.ch/portal/filesystem Package: cvmfs-config-default Architecture: all Replaces: cvmfs-keys -Conflicts: cvmfs-keys cvmfs-config +Conflicts: cvmfs-keys, cvmfs-config Breaks: cvmfs-keys, cvmfs (<< 2.1.20), cvmfs-server (<< 2.1.20) Provides: cvmfs-config Description: CernVM File System Default Configuration From c9c8a13066a9bf204f5a41efc913955463c555bf Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Tue, 14 Nov 2017 16:37:20 +0100 Subject: [PATCH 14/15] bump config package version used in integration tests --- ci/cvmfs/deb.sh | 2 +- ci/cvmfs/rpm.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ci/cvmfs/deb.sh b/ci/cvmfs/deb.sh index 94538d936b..9f602570b5 100755 --- a/ci/cvmfs/deb.sh +++ b/ci/cvmfs/deb.sh @@ -19,7 +19,7 @@ CVMFS_SOURCE_LOCATION="$1" CVMFS_RESULT_LOCATION="$2" CVMFS_NIGHTLY_BUILD_NUMBER="${3-0}" -CVMFS_CONFIG_PACKAGE="cvmfs-config-default_1.1-1_all.deb" +CVMFS_CONFIG_PACKAGE="cvmfs-config-default_1.6-1_all.deb" # retrieve the upstream version string from CVMFS cvmfs_version="$(get_cvmfs_version_from_cmake $CVMFS_SOURCE_LOCATION)" diff --git a/ci/cvmfs/rpm.sh b/ci/cvmfs/rpm.sh index 53b5a269ac..171ac60c46 100755 --- a/ci/cvmfs/rpm.sh +++ b/ci/cvmfs/rpm.sh @@ -19,7 +19,7 @@ CVMFS_SOURCE_LOCATION="$1" CVMFS_RESULT_LOCATION="$2" CVMFS_NIGHTLY_BUILD_NUMBER="${3-0}" -CVMFS_CONFIG_PACKAGE="cvmfs-config-default-1.2-1.noarch.rpm" +CVMFS_CONFIG_PACKAGE="cvmfs-config-default-1.4-1.noarch.rpm" rpm_infra_dirs="BUILD RPMS SOURCES SRPMS TMP" rpm_src_dir="${CVMFS_SOURCE_LOCATION}/packaging/rpm" From f91a87b85074a09eedbc3b632e89dd02e848a1e8 Mon Sep 17 00:00:00 2001 From: Jakob Blomer Date: Thu, 26 Oct 2017 11:15:21 +0200 Subject: [PATCH 15/15] adjust unit tests to new dns root server ip --- test/unittests/t_dns.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/unittests/t_dns.cc b/test/unittests/t_dns.cc index 7ab1da2e6a..aba215a0ad 100644 --- a/test/unittests/t_dns.cc +++ b/test/unittests/t_dns.cc @@ -608,7 +608,7 @@ TEST_F(T_Dns, CaresResolverMany) { ExpectResolvedName(hosts[0], "a.root-servers.net", "198.41.0.4", "[2001:503:ba3e::2:30]"); ExpectResolvedName(hosts[1], "b.root-servers.net", - "192.228.79.201", "[2001:500:200::b]"); + "199.9.14.201", "[2001:500:200::b]"); ExpectResolvedName(hosts[2], "c.root-servers.net", "192.33.4.12", "[2001:500:2::c]"); ExpectResolvedName(hosts[3], "d.root-servers.net", @@ -993,7 +993,7 @@ TEST_F(T_Dns, NormalResolverCombinedSlow) { ExpectResolvedName(hosts[0], "a.root-servers.net", "198.41.0.4", "[2001:503:ba3e::2:30]"); ExpectResolvedName(hosts[1], "b.root-servers.net", - "192.228.79.201", "[2001:500:200::b]"); + "199.9.14.201", "[2001:500:200::b]"); EXPECT_EQ(kFailOk, hosts[2].status()); ExpectResolvedName(hosts[3], "127.0.0.1", "127.0.0.1", ""); ExpectResolvedName(hosts[4], "[::1]", "", "[::1]");