Full Code of cern-eos/eos for AI

master a94b0f29148b cached
2385 files
100.5 MB
6.1M tokens
9990 symbols
1 requests
Copy disabled (too large) Download .txt
Showing preview only (24,196K chars total). Download the full file to get everything.
Repository: cern-eos/eos
Branch: master
Commit: a94b0f29148b
Files: 2385
Total size: 100.5 MB

Directory structure:
gitextract_gne0gw27/

├── .clang-format
├── .clang-tidy
├── .codeclimate.yml
├── .ctest/
│   └── config.cmake
├── .git-blame-ignore-revs
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .ignore
├── .mailmap
├── .pre-commit-config.yaml
├── AUDIT.md
├── ApMon/
│   ├── AUTHORS
│   ├── COPYING
│   ├── ChangeLog
│   ├── INSTALL
│   ├── Makefile
│   ├── NEWS
│   ├── README
│   ├── eos-apmon.spec
│   ├── etc/
│   │   └── logrotate.d/
│   │       └── eosapmond
│   ├── jenkins-build.sh
│   ├── maketar.sh
│   ├── opt/
│   │   └── eos/
│   │       └── apmon/
│   │           └── eosapmond
│   ├── perl/
│   │   └── ApMon/
│   │       ├── ApMon/
│   │       │   ├── BgMonitor.pm
│   │       │   ├── Common.pm
│   │       │   ├── ConfigLoader.pm
│   │       │   ├── ProcInfo.pm
│   │       │   └── XDRUtils.pm
│   │       ├── ApMon.pm
│   │       ├── sendToML.sh
│   │       └── servMon.sh
│   ├── run.sh
│   └── usr/
│       └── lib/
│           └── systemd/
│               └── system/
│                   └── eosapmond.service
├── CMakeLists.txt
├── CTestConfig.cmake
├── License
├── README.md
├── archive/
│   ├── CMakeLists.txt
│   ├── eosarch/
│   │   ├── __init__.py
│   │   ├── archivefile.py
│   │   ├── asynchandler.py
│   │   ├── configuration.py
│   │   ├── exceptions.py
│   │   ├── processinfo.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── env.py
│   │   │   └── test_archivefile.py
│   │   ├── transfer.py
│   │   └── utils.py
│   ├── eosarch_reconstruct.py
│   ├── eosarch_run.py
│   ├── eosarchived.conf
│   ├── eosarchived.py
│   ├── eosarchived.service
│   ├── eosarchived_env.sysconfig
│   └── opt-eos-xrootd.pth
├── auth_plugin/
│   ├── CMakeLists.txt
│   ├── EosAuthOfs.cc
│   ├── EosAuthOfs.hh
│   ├── EosAuthOfsDirectory.cc
│   ├── EosAuthOfsDirectory.hh
│   ├── EosAuthOfsFile.cc
│   ├── EosAuthOfsFile.hh
│   ├── Namespace.hh
│   ├── ProtoUtils.cc
│   ├── ProtoUtils.hh
│   └── proto/
│       ├── Chksum.proto
│       ├── Chmod.proto
│       ├── DirClose.proto
│       ├── DirFname.proto
│       ├── DirOpen.proto
│       ├── DirRead.proto
│       ├── Exists.proto
│       ├── FS_ctl.proto
│       ├── FileClose.proto
│       ├── FileFname.proto
│       ├── FileOpen.proto
│       ├── FileRead.proto
│       ├── FileStat.proto
│       ├── FileWrite.proto
│       ├── Fsctl.proto
│       ├── GetStats.proto
│       ├── Mkdir.proto
│       ├── Prepare.proto
│       ├── Rem.proto
│       ├── Remdir.proto
│       ├── Rename.proto
│       ├── Request.proto
│       ├── Response.proto
│       ├── Stat.proto
│       ├── Truncate.proto
│       ├── XrdOucErrInfo.proto
│       ├── XrdSecEntity.proto
│       ├── XrdSfsFSctl.proto
│       └── XrdSfsPrep.proto
├── client/
│   ├── CMakeLists.txt
│   ├── Namespace.hh
│   └── grpc/
│       ├── Find.cc
│       ├── GrpcClient.cc
│       ├── GrpcClient.hh
│       ├── GrpcClientAuthProcessor.hh
│       ├── Insert.cc
│       ├── Md.cc
│       ├── Ns.cc
│       ├── NsStat.cc
│       └── Ping.cc
├── cmake/
│   ├── CPUArchFlags.cmake
│   ├── DownloadProject.CMakeLists.cmake.in
│   ├── DownloadProject.cmake
│   ├── EosCompileFlags.cmake
│   ├── EosCoverage.cmake
│   ├── EosFindLibs.cmake
│   ├── EosGraphviz.cmake
│   ├── EosOSDefaults.cmake
│   ├── EosSummary.cmake
│   ├── EosTui.cmake
│   ├── EosTuiInstall.cmake.in
│   ├── EosUtils.cmake
│   ├── FindActiveMQCPP.cmake
│   ├── FindAtomic.cmake
│   ├── FindEosGrpcGateway.cmake
│   ├── FindGRPC.cmake
│   ├── FindGlobus.cmake
│   ├── FindLibevent.cmake
│   ├── FindProtobuf3.cmake
│   ├── FindPythonSitePkg.cmake
│   ├── FindRocksDB.cmake
│   ├── FindScitokens.cmake
│   ├── FindSnappy.cmake
│   ├── FindSparseHash.cmake
│   ├── FindSphinx.cmake
│   ├── FindXRootD.cmake
│   ├── FindZMQ.cmake
│   ├── Findabsl.cmake
│   ├── Findbz2.cmake
│   ├── Finddavix.cmake
│   ├── Findeosfolly.cmake
│   ├── Findfuse.cmake
│   ├── Findfuse3.cmake
│   ├── Findglibc.cmake
│   ├── Findhelp2man.cmake
│   ├── Findisal.cmake
│   ├── Findisal_crypto.cmake
│   ├── Findjemalloc.cmake
│   ├── Findjsoncpp.cmake
│   ├── Findkrb5.cmake
│   ├── Findldap.cmake
│   ├── Findlibbfd.cmake
│   ├── Findlibproc2.cmake
│   ├── Findlibunwind.cmake
│   ├── Findlz4.cmake
│   ├── Findncurses.cmake
│   ├── Findnfs.cmake
│   ├── Findprocps.cmake
│   ├── Findreadline.cmake
│   ├── Finduuid.cmake
│   ├── Findxfs.cmake
│   ├── Findxxhash.cmake
│   ├── Findzstd.cmake
│   ├── cmake_uninstall.cmake.in
│   └── config_spec.cmake.in
├── common/
│   ├── Assert.hh
│   ├── AssistedThread.hh
│   ├── Audit.cc
│   ├── Audit.hh
│   ├── BehaviourConfig.cc
│   ├── BehaviourConfig.hh
│   ├── BufferManager.cc
│   ├── BufferManager.hh
│   ├── CLI11.hpp
│   ├── CMakeLists.txt
│   ├── CloExec.hh
│   ├── ClockGetTime.cc
│   ├── ClockGetTime.hh
│   ├── CommentLog.cc
│   ├── CommentLog.hh
│   ├── ConcurrentQueue.hh
│   ├── Config.cc
│   ├── Config.hh
│   ├── Constants.hh
│   ├── CopyProcess.hh
│   ├── Counter.hh
│   ├── CtaCommon.hh
│   ├── DBG.hh
│   ├── Definitions.hh
│   ├── EosLayoutPrint.cc
│   ├── ErrnoToString.cc
│   ├── ErrnoToString.hh
│   ├── ExpiryCache.hh
│   ├── FileId.hh
│   ├── FileMap.hh
│   ├── FileSystem.cc
│   ├── FileSystem.hh
│   ├── Fmd.cc
│   ├── Fmd.hh
│   ├── FutureWrapper.hh
│   ├── Glob.cc
│   ├── Glob.hh
│   ├── IRWMutex.hh
│   ├── InodeTranslator.hh
│   ├── InstanceName.cc
│   ├── InstanceName.hh
│   ├── IntervalStopwatch.cc
│   ├── IntervalStopwatch.hh
│   ├── IoPipe.hh
│   ├── JeMallocHandler.cc
│   ├── JeMallocHandler.hh
│   ├── LOGGING.md
│   ├── LRU.hh
│   ├── LayoutId.hh
│   ├── LinuxFds.hh
│   ├── LinuxMemConsumption.hh
│   ├── LinuxStat.hh
│   ├── LinuxTotalMem.hh
│   ├── Locators.cc
│   ├── Locators.hh
│   ├── Logging.cc
│   ├── Logging.hh
│   ├── Macros.hh
│   ├── Mapping.cc
│   ├── Mapping.hh
│   ├── Murmur3.hh
│   ├── MutexLatencyWatcher.cc
│   ├── MutexLatencyWatcher.hh
│   ├── Namespace.hh
│   ├── OAuth.cc
│   ├── OAuth.hh
│   ├── ObserverMgr.hh
│   ├── Parallel.hh
│   ├── ParseUtils.hh
│   ├── PasswordHandler.hh
│   ├── Path.hh
│   ├── PthreadRWMutex.cc
│   ├── PthreadRWMutex.hh
│   ├── QuarkDBHealthParser.hh
│   ├── RWMutex.cc
│   ├── RWMutex.hh
│   ├── RateLimit.cc
│   ├── RateLimit.hh
│   ├── RegexWrapper.cc
│   ├── RegexWrapper.hh
│   ├── Report.cc
│   ├── Report.hh
│   ├── SecEntity.hh
│   ├── ShardedCache.hh
│   ├── SharedCallbackList.hh
│   ├── SharedMutex.cc
│   ├── SharedMutex.hh
│   ├── ShellCmd.cc
│   ├── ShellCmd.hh
│   ├── ShellExecutor.cc
│   ├── ShellExecutor.hh
│   ├── StackTrace.hh
│   ├── StacktraceHere.cc
│   ├── StacktraceHere.hh
│   ├── Statfs.cc
│   ├── Statfs.hh
│   ├── Statistics.hh
│   ├── Status.hh
│   ├── SteadyClock.hh
│   ├── Strerror_r_wrapper.cc
│   ├── Strerror_r_wrapper.hh
│   ├── StringConversion.cc
│   ├── StringConversion.hh
│   ├── StringSplit.hh
│   ├── StringTokenizer.cc
│   ├── StringTokenizer.hh
│   ├── StringUtils.hh
│   ├── SymKeys.cc
│   ├── SymKeys.hh
│   ├── SyncAll.hh
│   ├── SystemClock.hh
│   ├── ThreadPool.hh
│   ├── Timing.hh
│   ├── UnixGroupsFetcher.cc
│   ├── UnixGroupsFetcher.hh
│   ├── Untraceable.hh
│   ├── UriCapCipher.cc
│   ├── UriCapCipher.hh
│   ├── Utils.cc
│   ├── Utils.hh
│   ├── VirtualIdentity.cc
│   ├── VirtualIdentity.hh
│   ├── WFEClient.hh
│   ├── WaitInterval.hh
│   ├── WebNotify.cc
│   ├── WebNotify.hh
│   ├── XattrCompat.hh
│   ├── XrdConnPool.cc
│   ├── XrdConnPool.hh
│   ├── XrdErrorMap.cc
│   ├── XrdErrorMap.hh
│   ├── async/
│   │   ├── ExecutorMgr.hh
│   │   └── OpaqueFuture.hh
│   ├── blake3/
│   │   ├── README.md
│   │   ├── blake3.c
│   │   ├── blake3.h
│   │   ├── blake3_avx2.c
│   │   ├── blake3_avx2_x86-64_unix.S
│   │   ├── blake3_avx512.c
│   │   ├── blake3_avx512_x86-64_unix.S
│   │   ├── blake3_dispatch.c
│   │   ├── blake3_impl.h
│   │   ├── blake3_neon.c
│   │   ├── blake3_portable.c
│   │   ├── blake3_sse2.c
│   │   ├── blake3_sse2_x86-64_unix.S
│   │   ├── blake3_sse41.c
│   │   ├── blake3_sse41_x86-64_unix.S
│   │   └── main.c
│   ├── concurrency/
│   │   ├── AlignMacros.hh
│   │   ├── AlignedArray.hh
│   │   ├── AtomicUniquePtr.h
│   │   ├── RCULite.hh
│   │   ├── ThreadEpochCounter.cc
│   │   └── ThreadEpochCounter.hh
│   ├── config/
│   │   ├── ConfigParsing.cc
│   │   ├── ConfigParsing.hh
│   │   └── ConfigStore.hh
│   ├── crc32c/
│   │   ├── crc32c.cc
│   │   ├── crc32c.h
│   │   ├── crc32ctables.cc
│   │   └── crc32ctables.h
│   ├── doxygen.hh
│   ├── eos_cta_pb/
│   │   ├── CMakeLists.txt
│   │   └── EosCtaAlertHandler.hh
│   ├── exception/
│   │   ├── Exception.cc
│   │   └── Exception.hh
│   ├── highwayhash/
│   │   ├── arch_specific.h
│   │   ├── c_bindings.h
│   │   ├── compiler_specific.h
│   │   ├── data_parallel.h
│   │   ├── endianess.h
│   │   ├── hh_avx2.h
│   │   ├── hh_buffer.h
│   │   ├── hh_neon.h
│   │   ├── hh_portable.h
│   │   ├── hh_sse41.h
│   │   ├── hh_types.h
│   │   ├── hh_vsx.h
│   │   ├── highwayhash.h
│   │   ├── highwayhash_target.h
│   │   ├── highwayhash_test_target.h
│   │   ├── iaca.h
│   │   ├── instruction_sets.h
│   │   ├── load3.h
│   │   ├── nanobenchmark.h
│   │   ├── os_mac.h
│   │   ├── os_specific.h
│   │   ├── profiler.h
│   │   ├── robust_statistics.h
│   │   ├── scalar.h
│   │   ├── scalar_sip_tree_hash.h
│   │   ├── sip_hash.h
│   │   ├── sip_tree_hash.h
│   │   ├── state_helpers.h
│   │   ├── tsc_timer.h
│   │   ├── vector128.h
│   │   ├── vector256.h
│   │   ├── vector_neon.h
│   │   └── vector_test_target.h
│   ├── hopscotch_hash.hh
│   ├── hopscotch_map.hh
│   ├── http/
│   │   ├── HttpHandler.hh
│   │   ├── HttpRequest.cc
│   │   ├── HttpRequest.hh
│   │   ├── HttpResponse.cc
│   │   ├── HttpResponse.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── MimeTypes.hh
│   │   ├── OwnCloud.hh
│   │   ├── PlainHttpResponse.hh
│   │   ├── ProtocolHandler.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   └── s3/
│   │       ├── S3Handler.cc
│   │       ├── S3Handler.hh
│   │       └── S3Response.hh
│   ├── json/
│   │   ├── Json.hh
│   │   ├── JsonCppJsonifier.hh
│   │   ├── Jsonifiable.hh
│   │   └── Jsonifier.hh
│   ├── mq/
│   │   ├── FsChangeListener.cc
│   │   ├── FsChangeListener.hh
│   │   ├── GlobalConfigChangeListener.cc
│   │   ├── GlobalConfigChangeListener.hh
│   │   ├── LocalHash.cc
│   │   ├── LocalHash.hh
│   │   ├── MessagingRealm.cc
│   │   ├── MessagingRealm.hh
│   │   ├── Namespace.hh
│   │   ├── QdbListener.cc
│   │   ├── QdbListener.hh
│   │   ├── SharedDequeProvider.cc
│   │   ├── SharedDequeProvider.hh
│   │   ├── SharedHashProvider.cc
│   │   ├── SharedHashProvider.hh
│   │   ├── SharedHashWrapper.cc
│   │   ├── SharedHashWrapper.hh
│   │   └── XrdMqTiming.hh
│   ├── mutextest/
│   │   └── RWMutexTest.cc
│   ├── plugin_manager/
│   │   ├── DynamicLibrary.cc
│   │   ├── DynamicLibrary.hh
│   │   ├── Plugin.hh
│   │   ├── PluginManager.cc
│   │   └── PluginManager.hh
│   ├── shaping/
│   │   ├── IoStatsKey.hh
│   │   └── SlidingWindowStats.hh
│   ├── shellexectest/
│   │   └── shell_exec_test.cc
│   ├── stringencoders/
│   │   ├── modp_numtoa.c
│   │   └── modp_numtoa.h
│   ├── table_formatter/
│   │   ├── TableCell.cc
│   │   ├── TableCell.hh
│   │   ├── TableFormatterBase.cc
│   │   ├── TableFormatterBase.hh
│   │   └── TableFormatting.hh
│   ├── thread_id.hh
│   ├── token/
│   │   ├── EosTok.cc
│   │   ├── EosTok.hh
│   │   ├── SciToken.cc
│   │   ├── SciToken.hh
│   │   ├── Token.hh
│   │   ├── eosscitokenmodule.c
│   │   ├── example/
│   │   │   └── eossci.py
│   │   ├── scitoken.h
│   │   └── setup.py
│   ├── ulib/
│   │   ├── hash_align.h
│   │   ├── hash_align_prot.h
│   │   ├── ulib.c
│   │   ├── util_algo.h
│   │   └── util_class.h
│   └── utils/
│       ├── BackOffInvoker.hh
│       ├── BindArguments.hh
│       ├── ContainerUtils.hh
│       ├── RandUtils.hh
│       ├── TypeTraits.hh
│       ├── XrdUtils.cc
│       └── XrdUtils.hh
├── console/
│   ├── CMakeLists.txt
│   ├── CommandFramework.cc
│   ├── CommandFramework.hh
│   ├── ConsoleArgParser.cc
│   ├── ConsoleArgParser.hh
│   ├── ConsoleCliCommand.cc
│   ├── ConsoleCliCommand.hh
│   ├── ConsoleCompletion.cc
│   ├── ConsoleCompletion.hh
│   ├── ConsoleMain.cc
│   ├── ConsoleMain.hh
│   ├── ConsoleMainExecutable.cc
│   ├── GlobalOptions.hh
│   ├── ICommand.hh
│   ├── README.md
│   ├── RegexUtil.cc
│   ├── RegexUtil.hh
│   ├── commands/
│   │   ├── HealthCommand.cc
│   │   ├── HealthCommand.hh
│   │   ├── coms/
│   │   │   └── unused/
│   │   │       ├── com_access.cc
│   │   │       ├── com_accounting.cc
│   │   │       ├── com_archive.cc
│   │   │       ├── com_attr.cc
│   │   │       ├── com_backup.cc
│   │   │       ├── com_cd.cc
│   │   │       ├── com_chmod.cc
│   │   │       ├── com_chown.cc
│   │   │       ├── com_clear.cc
│   │   │       ├── com_cp.cc
│   │   │       ├── com_daemon.cc
│   │   │       ├── com_debug.cc
│   │   │       ├── com_du.cc
│   │   │       ├── com_evict.cc
│   │   │       ├── com_file.cc
│   │   │       ├── com_fuse.cc
│   │   │       ├── com_fusex.cc
│   │   │       ├── com_geosched.cc
│   │   │       ├── com_health.cc
│   │   │       ├── com_info.cc
│   │   │       ├── com_inspector.cc
│   │   │       ├── com_json.cc
│   │   │       ├── com_license.cc
│   │   │       ├── com_ln.cc
│   │   │       ├── com_map.cc
│   │   │       ├── com_member.cc
│   │   │       ├── com_mkdir.cc
│   │   │       ├── com_motd.cc
│   │   │       ├── com_mv.cc
│   │   │       ├── com_old_find.cc
│   │   │       ├── com_print.cc
│   │   │       ├── com_proto_access.cc
│   │   │       ├── com_proto_acl.cc
│   │   │       ├── com_proto_config.cc
│   │   │       ├── com_proto_convert.cc
│   │   │       ├── com_proto_debug.cc
│   │   │       ├── com_proto_devices.cc
│   │   │       ├── com_proto_df.cc
│   │   │       ├── com_proto_find.cc
│   │   │       ├── com_proto_fs.cc
│   │   │       ├── com_proto_fsck.cc
│   │   │       ├── com_proto_group.cc
│   │   │       ├── com_proto_io.cc
│   │   │       ├── com_proto_node.cc
│   │   │       ├── com_proto_ns.cc
│   │   │       ├── com_proto_quota.cc
│   │   │       ├── com_proto_recycle.cc
│   │   │       ├── com_proto_register.cc
│   │   │       ├── com_proto_rm.cc
│   │   │       ├── com_proto_route.cc
│   │   │       ├── com_proto_sched.cc
│   │   │       ├── com_proto_space.cc
│   │   │       ├── com_proto_token.cc
│   │   │       ├── com_pwd.cc
│   │   │       ├── com_quit.cc
│   │   │       ├── com_quota.cc
│   │   │       ├── com_rclone.cc
│   │   │       ├── com_reconnect.cc
│   │   │       ├── com_report.cc
│   │   │       ├── com_rm.cc
│   │   │       ├── com_rmdir.cc
│   │   │       ├── com_role.cc
│   │   │       ├── com_rtlog.cc
│   │   │       ├── com_scitoken.cc
│   │   │       ├── com_silent.cc
│   │   │       ├── com_squash.cc
│   │   │       ├── com_stat.cc
│   │   │       ├── com_status.cc
│   │   │       ├── com_test.cc
│   │   │       ├── com_timing.cc
│   │   │       ├── com_touch.cc
│   │   │       ├── com_tracker.cc
│   │   │       ├── com_version.cc
│   │   │       ├── com_vid.cc
│   │   │       ├── com_who.cc
│   │   │       └── com_whoami.cc
│   │   ├── helpers/
│   │   │   ├── AclHelper.cc
│   │   │   ├── AclHelper.hh
│   │   │   ├── FsHelper.cc
│   │   │   ├── FsHelper.hh
│   │   │   ├── FsckHelper.cc
│   │   │   ├── FsckHelper.hh
│   │   │   ├── ICmdHelper.cc
│   │   │   ├── ICmdHelper.hh
│   │   │   ├── NewfindHelper.cc
│   │   │   ├── NewfindHelper.hh
│   │   │   ├── NodeHelper.cc
│   │   │   ├── NodeHelper.hh
│   │   │   ├── RecycleHelper.cc
│   │   │   ├── RecycleHelper.hh
│   │   │   ├── TokenHelper.cc
│   │   │   ├── TokenHelper.hh
│   │   │   └── jwk_generator/
│   │   │       ├── c_resource.hpp
│   │   │       ├── errors.hpp
│   │   │       ├── jwk_generator.hpp
│   │   │       ├── keyspecs/
│   │   │       │   ├── ec_key.hpp
│   │   │       │   └── rsa_key.hpp
│   │   │       ├── libs/
│   │   │       │   ├── base64_url.hpp
│   │   │       │   ├── json.hpp
│   │   │       │   └── uuid.hpp
│   │   │       └── openssl_wrapper.hpp
│   │   └── native/
│   │       ├── CoreNativeCommands.cc
│   │       ├── LegacySymbols.cc
│   │       ├── access-proto-native.cc
│   │       ├── accounting-cmd-native.cc
│   │       ├── acl-proto-native.cc
│   │       ├── archive-cmd-native.cc
│   │       ├── attr-cmd-native.cc
│   │       ├── backup-cmd-native.cc
│   │       ├── cat-com-native.cc
│   │       ├── cd-cmd-native.cc
│   │       ├── chmod-cmd-native.cc
│   │       ├── chown-cmd-native.cc
│   │       ├── clear-cmd-native.cc
│   │       ├── config-proto-native.cc
│   │       ├── convert-proto-native.cc
│   │       ├── cp-cmd-native.cc
│   │       ├── daemon-native.cc
│   │       ├── debug-cmd-native.cc
│   │       ├── devices-proto-native.cc
│   │       ├── df-proto-native.cc
│   │       ├── du-native.cc
│   │       ├── du-proto-native.cc
│   │       ├── evict-cmd-native.cc
│   │       ├── file-cmd-native.cc
│   │       ├── fileinfo-alias.cc
│   │       ├── find-proto-native.cc
│   │       ├── fs-proto-native.cc
│   │       ├── fsck-proto-native.cc
│   │       ├── fuse-native.cc
│   │       ├── fusex-cmd-native.cc
│   │       ├── geosched-cmd-native.cc
│   │       ├── group-proto-native.cc
│   │       ├── health-native.cc
│   │       ├── info-alias.cc
│   │       ├── info-native.cc
│   │       ├── inspector-proto-native.cc
│   │       ├── io-proto-native.cc
│   │       ├── license-native.cc
│   │       ├── ln-cmd-native.cc
│   │       ├── ls-cmd-native.cc
│   │       ├── ls-compat.cc
│   │       ├── map-cmd-native.cc
│   │       ├── member-cmd-native.cc
│   │       ├── mkdir-cmd-native.cc
│   │       ├── motd-cmd-native.cc
│   │       ├── mv-alias.cc
│   │       ├── node-proto-native.cc
│   │       ├── ns-proto-native.cc
│   │       ├── oldfind-cmd-native.cc
│   │       ├── pwd-native.cc
│   │       ├── quota-proto-native.cc
│   │       ├── rclone-cmd-native.cc
│   │       ├── reconnect-native.cc
│   │       ├── recycle-proto-native.cc
│   │       ├── register-proto-native.cc
│   │       ├── report-native.cc
│   │       ├── rm-proto-native.cc
│   │       ├── rmdir-cmd-native.cc
│   │       ├── role-native.cc
│   │       ├── route-proto-native.cc
│   │       ├── rtlog-cmd-native.cc
│   │       ├── sched-proto-native.cc
│   │       ├── scitoken-native.cc
│   │       ├── space-proto-native.cc
│   │       ├── squash-cmd-native.cc
│   │       ├── stat-native.cc
│   │       ├── status-native.cc
│   │       ├── test-native.cc
│   │       ├── token-proto-native.cc
│   │       ├── touch-cmd-native.cc
│   │       ├── tracker-proto-native.cc
│   │       ├── tui-native.cc
│   │       ├── version-cmd-native.cc
│   │       ├── vid-cmd-native.cc
│   │       ├── who-cmd-native.cc
│   │       └── whoami-cmd-native.cc
│   ├── eos-iam-mapfile
│   ├── eosadmin
│   └── eosreport
├── coverage/
│   └── eoslcov.rc
├── debian/
│   ├── compat
│   ├── control.template
│   ├── copyright
│   ├── eos-client.install
│   ├── eos-fusex.install
│   ├── eos-fusex.postinst
│   ├── eos-test.install
│   ├── eos-testkeytab.install
│   ├── eos-testkeytab.postinst
│   ├── rules
│   └── source/
│       └── format
├── doc/
│   ├── _themes/
│   │   ├── solar_theme/
│   │   │   ├── __init__.py
│   │   │   ├── layout.html
│   │   │   ├── static/
│   │   │   │   ├── solar.css
│   │   │   │   └── solarized-dark.css
│   │   │   └── theme.conf
│   │   └── sphinx13/
│   │       ├── layout.html
│   │       └── theme.conf
│   ├── citrine/
│   │   ├── Doxyfile
│   │   ├── backup_clone.rst
│   │   ├── backup_clone.txt
│   │   ├── clicommands/
│   │   │   ├── accounting.rst
│   │   │   ├── acl.rst
│   │   │   ├── archive.rst
│   │   │   ├── attr.rst
│   │   │   ├── backup.rst
│   │   │   ├── cd.rst
│   │   │   ├── chmod.rst
│   │   │   ├── chown.rst
│   │   │   ├── clear.rst
│   │   │   ├── config.rst
│   │   │   ├── console.rst
│   │   │   ├── cp.rst
│   │   │   ├── debug.rst
│   │   │   ├── evict.rst
│   │   │   ├── exit.rst
│   │   │   ├── file.rst
│   │   │   ├── fileinfo.rst
│   │   │   ├── find.rst
│   │   │   ├── fs.rst
│   │   │   ├── fsck.rst
│   │   │   ├── fuse.rst
│   │   │   ├── fusex.rst
│   │   │   ├── geosched.rst
│   │   │   ├── group.rst
│   │   │   ├── health.rst
│   │   │   ├── help.rst
│   │   │   ├── info.rst
│   │   │   ├── inspector.rst
│   │   │   ├── io.rst
│   │   │   ├── json.rst
│   │   │   ├── license.rst
│   │   │   ├── ln.rst
│   │   │   ├── ls.rst
│   │   │   ├── map.rst
│   │   │   ├── member.rst
│   │   │   ├── mkdir.rst
│   │   │   ├── motd.rst
│   │   │   ├── mv.rst
│   │   │   ├── newfind.rst
│   │   │   ├── node.rst
│   │   │   ├── ns.rst
│   │   │   ├── pointq.rst
│   │   │   ├── pwd.rst
│   │   │   ├── question.rst
│   │   │   ├── quit.rst
│   │   │   ├── quota.rst
│   │   │   ├── reconnect.rst
│   │   │   ├── recycle.rst
│   │   │   ├── rm.rst
│   │   │   ├── rmdir.rst
│   │   │   ├── role.rst
│   │   │   ├── route.rst
│   │   │   ├── rtlog.rst
│   │   │   ├── silent.rst
│   │   │   ├── space.rst
│   │   │   ├── squash.rst
│   │   │   ├── stat.rst
│   │   │   ├── test.rst
│   │   │   ├── timing.rst
│   │   │   ├── token.rst
│   │   │   ├── touch.rst
│   │   │   ├── tracker.rst
│   │   │   ├── transfer.rst
│   │   │   ├── version.rst
│   │   │   ├── vid.rst
│   │   │   ├── who.rst
│   │   │   └── whoami.rst
│   │   ├── clicommands.rst
│   │   ├── conf.py
│   │   ├── configuration/
│   │   │   ├── archive.rst
│   │   │   ├── balancing.rst
│   │   │   ├── converter.rst
│   │   │   ├── converter_engine.rst
│   │   │   ├── draining.rst
│   │   │   ├── egi.rst
│   │   │   ├── fsck.rst
│   │   │   ├── fuse.rst
│   │   │   ├── fusex.rst
│   │   │   ├── geobalancer.rst
│   │   │   ├── geoscheduling.rst
│   │   │   ├── geotags.rst
│   │   │   ├── groupbalancer.rst
│   │   │   ├── groupdrainer.rst
│   │   │   ├── http.rst
│   │   │   ├── http_tpc.rst
│   │   │   ├── import.rst
│   │   │   ├── inspector.rst
│   │   │   ├── kinetic.rst
│   │   │   ├── logicalpath.rst
│   │   │   ├── lru.rst
│   │   │   ├── master.rst
│   │   │   ├── master_quarkdb.rst
│   │   │   ├── namespace.rst
│   │   │   ├── permission.rst
│   │   │   ├── proxys.rst
│   │   │   ├── qos.rst
│   │   │   ├── quarkdb.rst
│   │   │   ├── quota.rst
│   │   │   ├── recyclebin.rst
│   │   │   ├── route.rst
│   │   │   ├── s3.rst
│   │   │   ├── scheduler.rst
│   │   │   ├── tracker.rst
│   │   │   ├── transfer.rst
│   │   │   ├── tty.rst
│   │   │   └── wfe.rst
│   │   ├── configuration.rst
│   │   ├── contents.rst
│   │   ├── develop.rst
│   │   ├── generate_docs.py
│   │   ├── index.rst
│   │   ├── install.rst
│   │   ├── intro.rst
│   │   ├── quickstart/
│   │   │   ├── admin/
│   │   │   │   ├── configure.rst
│   │   │   │   └── krb5.rst
│   │   │   ├── boxed.rst
│   │   │   ├── client/
│   │   │   │   └── configure.rst
│   │   │   ├── docker_image.rst
│   │   │   ├── install.rst
│   │   │   ├── kubernetes.rst
│   │   │   ├── ns_quarkdb.rst
│   │   │   ├── setup_repo.rst
│   │   │   ├── uboxed.rst
│   │   │   ├── ubuntu.rst
│   │   │   └── update_eos4to5.rst
│   │   ├── quickstart.rst
│   │   ├── releases/
│   │   │   ├── amber.rst
│   │   │   ├── beryl-release.rst
│   │   │   ├── beryl.rst
│   │   │   ├── citrine-release.rst
│   │   │   ├── citrine.rst
│   │   │   ├── diopside-release.rst
│   │   │   └── diopside.rst
│   │   ├── releases.rst
│   │   ├── restapi/
│   │   │   ├── fileinfo.rst
│   │   │   ├── format.rst
│   │   │   ├── fs.rst
│   │   │   ├── group.rst
│   │   │   ├── grpc.rst
│   │   │   ├── node.rst
│   │   │   ├── ns.rst
│   │   │   ├── putrange.rst
│   │   │   ├── space.rst
│   │   │   ├── version.rst
│   │   │   └── who.rst
│   │   ├── restapi.rst
│   │   ├── taperestapi/
│   │   │   └── configuration.rst
│   │   ├── taperestapi.rst
│   │   ├── using/
│   │   │   ├── archive.rst
│   │   │   ├── attributelocks.rst
│   │   │   ├── eos_services.rst
│   │   │   ├── fusex.rst
│   │   │   ├── oauth2.rst
│   │   │   ├── policies.rst
│   │   │   ├── priorities.rst
│   │   │   ├── rain.rst
│   │   │   ├── reports.rst
│   │   │   ├── sharedfs.rst
│   │   │   ├── squashfs.rst
│   │   │   ├── systemd.rst
│   │   │   ├── tokens.rst
│   │   │   └── versions.rst
│   │   └── using.rst
│   └── diopside/
│       ├── architecture/
│       │   └── index.rst
│       ├── blog/
│       │   └── features.rst
│       ├── conf.py
│       ├── configuration.rst
│       ├── faq/
│       │   ├── exotic.rst
│       │   └── index.rst
│       ├── index.rst
│       ├── introduction/
│       │   └── index.rst
│       ├── manual/
│       │   ├── configuration.rst
│       │   ├── develop.rst
│       │   ├── egi.rst
│       │   ├── formats.rst
│       │   ├── getting-started.rst
│       │   ├── hardware-installation.rst
│       │   ├── index.rst
│       │   ├── interfaces.rst
│       │   ├── microservices.rst
│       │   ├── protocols.rst
│       │   └── using.rst
│       ├── my-changes.patch
│       └── releases/
│           ├── #diopside-release.rst#
│           ├── 5.4.0/
│           │   └── recycle_bin_config.rst
│           ├── amber.rst
│           ├── beryl-release.rst
│           ├── beryl.rst
│           ├── citrine-release.rst
│           ├── citrine.rst
│           ├── diopside-release.rst
│           ├── diopside.rst
│           └── index.rst
├── elrepopackage.spec
├── eos.spec.in
├── fst/
│   ├── CMakeLists.txt
│   ├── Config.cc
│   ├── Config.hh
│   ├── Deletion.hh
│   ├── Health.cc
│   ├── Health.hh
│   ├── Load.cc
│   ├── Load.hh
│   ├── Namespace.hh
│   ├── ScanDir.cc
│   ├── ScanDir.hh
│   ├── Verify.hh
│   ├── XrdFstOfs.cc
│   ├── XrdFstOfs.hh
│   ├── XrdFstOfsFile.cc
│   ├── XrdFstOfsFile.hh
│   ├── XrdFstOss.cc
│   ├── XrdFstOss.hh
│   ├── XrdFstOssFile.cc
│   ├── XrdFstOssFile.hh
│   ├── checksum/
│   │   ├── Adler.cc
│   │   ├── Adler.hh
│   │   ├── BLAKE3.hh
│   │   ├── CRC32.hh
│   │   ├── CRC32C.hh
│   │   ├── CRC64.hh
│   │   ├── CheckSum.cc
│   │   ├── CheckSum.hh
│   │   ├── ChecksumGroup.hh
│   │   ├── ChecksumPlugins.hh
│   │   ├── HWH64.hh
│   │   ├── MD5.hh
│   │   ├── SHA1.hh
│   │   ├── SHA256.hh
│   │   ├── XXHASH64.hh
│   │   └── cycletimer.h
│   ├── eoscp.cc
│   ├── filemd/
│   │   ├── FmdAttr.cc
│   │   ├── FmdAttr.hh
│   │   ├── FmdHandler.cc
│   │   ├── FmdHandler.hh
│   │   ├── FmdMgm.cc
│   │   └── FmdMgm.hh
│   ├── http/
│   │   ├── HttpHandler.cc
│   │   ├── HttpHandler.hh
│   │   ├── HttpHandlerFstFileCache.cc
│   │   ├── HttpHandlerFstFileCache.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   ├── s3/
│   │   │   ├── S3Handler.cc
│   │   │   └── S3Handler.hh
│   │   └── xrdhttp/
│   │       ├── EosFstHttpHandler.cc
│   │       ├── EosFstHttpHandler.hh
│   │       └── README.md
│   ├── io/
│   │   ├── AsyncMetaHandler.cc
│   │   ├── AsyncMetaHandler.hh
│   │   ├── ChunkHandler.cc
│   │   ├── ChunkHandler.hh
│   │   ├── FileIo.cc
│   │   ├── FileIo.hh
│   │   ├── FileIoPlugin-Server.cc
│   │   ├── FileIoPlugin.cc
│   │   ├── FileIoPlugin.hh
│   │   ├── FileIoPluginCommon.hh
│   │   ├── SimpleHandler.cc
│   │   ├── SimpleHandler.hh
│   │   ├── VectChunkHandler.cc
│   │   ├── VectChunkHandler.hh
│   │   ├── davix/
│   │   │   ├── DavixIo.cc
│   │   │   └── DavixIo.hh
│   │   ├── local/
│   │   │   ├── FsIo.cc
│   │   │   ├── FsIo.hh
│   │   │   ├── LocalIo.cc
│   │   │   └── LocalIo.hh
│   │   ├── nfs/
│   │   │   ├── NfsIo.cc
│   │   │   └── NfsIo.hh
│   │   └── xrd/
│   │       ├── ResponseCollector.cc
│   │       ├── ResponseCollector.hh
│   │       ├── XrdIo.cc
│   │       └── XrdIo.hh
│   ├── layout/
│   │   ├── HeaderCRC.cc
│   │   ├── HeaderCRC.hh
│   │   ├── Layout.cc
│   │   ├── Layout.hh
│   │   ├── LayoutPlugin.cc
│   │   ├── LayoutPlugin.hh
│   │   ├── PlainLayout.cc
│   │   ├── PlainLayout.hh
│   │   ├── RaidDpLayout.cc
│   │   ├── RaidDpLayout.hh
│   │   ├── RainBlock.cc
│   │   ├── RainBlock.hh
│   │   ├── RainGroup.cc
│   │   ├── RainGroup.hh
│   │   ├── RainMetaLayout.cc
│   │   ├── RainMetaLayout.hh
│   │   ├── ReedSLayout.cc
│   │   ├── ReedSLayout.hh
│   │   ├── ReplicaParLayout.cc
│   │   ├── ReplicaParLayout.hh
│   │   ├── gf-complete/
│   │   │   ├── .gitignore
│   │   │   ├── AUTHORS
│   │   │   ├── COPYING
│   │   │   ├── ChangeLog
│   │   │   ├── License.txt
│   │   │   ├── Makefile.am
│   │   │   ├── NEWS
│   │   │   ├── README
│   │   │   ├── README.txt
│   │   │   ├── autogen.sh
│   │   │   ├── configure.ac
│   │   │   ├── examples/
│   │   │   │   ├── Makefile.am
│   │   │   │   ├── gf_example_1.c
│   │   │   │   ├── gf_example_2.c
│   │   │   │   ├── gf_example_3.c
│   │   │   │   ├── gf_example_4.c
│   │   │   │   ├── gf_example_5.c
│   │   │   │   ├── gf_example_6.c
│   │   │   │   └── gf_example_7.c
│   │   │   ├── include/
│   │   │   │   ├── gf_complete.h
│   │   │   │   ├── gf_general.h
│   │   │   │   ├── gf_int.h
│   │   │   │   ├── gf_method.h
│   │   │   │   ├── gf_rand.h
│   │   │   │   ├── gf_w16.h
│   │   │   │   ├── gf_w32.h
│   │   │   │   ├── gf_w4.h
│   │   │   │   ├── gf_w64.h
│   │   │   │   └── gf_w8.h
│   │   │   ├── m4/
│   │   │   │   ├── ax_check_compile_flag.m4
│   │   │   │   ├── ax_ext.m4
│   │   │   │   ├── ax_gcc_x86_avx_xgetbv.m4
│   │   │   │   ├── ax_gcc_x86_cpuid.m4
│   │   │   │   ├── ltoptions.m4
│   │   │   │   ├── ltsugar.m4
│   │   │   │   └── lt~obsolete.m4
│   │   │   ├── manual/
│   │   │   │   ├── gf-complete.html
│   │   │   │   └── style.css
│   │   │   ├── src/
│   │   │   │   ├── Makefile.am
│   │   │   │   ├── gf.c
│   │   │   │   ├── gf_general.c
│   │   │   │   ├── gf_method.c
│   │   │   │   ├── gf_rand.c
│   │   │   │   ├── gf_w128.c
│   │   │   │   ├── gf_w16.c
│   │   │   │   ├── gf_w32.c
│   │   │   │   ├── gf_w4.c
│   │   │   │   ├── gf_w64.c
│   │   │   │   ├── gf_w8.c
│   │   │   │   ├── gf_wgen.c
│   │   │   │   └── neon/
│   │   │   │       ├── gf_w16_neon.c
│   │   │   │       ├── gf_w32_neon.c
│   │   │   │       ├── gf_w4_neon.c
│   │   │   │       ├── gf_w64_neon.c
│   │   │   │       └── gf_w8_neon.c
│   │   │   ├── test/
│   │   │   │   ├── Makefile.am
│   │   │   │   └── gf_unit.c
│   │   │   └── tools/
│   │   │       ├── Makefile.am
│   │   │       ├── gf_add.c
│   │   │       ├── gf_div.c
│   │   │       ├── gf_inline_time.c
│   │   │       ├── gf_methods.c
│   │   │       ├── gf_mult.c
│   │   │       ├── gf_poly.c
│   │   │       ├── gf_time.c
│   │   │       └── time_tool.sh
│   │   └── jerasure/
│   │       ├── .gitattributes
│   │       ├── .gitignore
│   │       ├── AUTHORS
│   │       ├── COPYING
│   │       ├── ChangeLog
│   │       ├── Examples/
│   │       │   ├── .gitignore
│   │       │   ├── Makefile.am
│   │       │   ├── cauchy_01.c
│   │       │   ├── cauchy_02.c
│   │       │   ├── cauchy_03.c
│   │       │   ├── cauchy_04.c
│   │       │   ├── decoder.c
│   │       │   ├── encode_decode.sh
│   │       │   ├── encoder.c
│   │       │   ├── jerasure_01.c
│   │       │   ├── jerasure_02.c
│   │       │   ├── jerasure_03.c
│   │       │   ├── jerasure_04.c
│   │       │   ├── jerasure_05.c
│   │       │   ├── jerasure_06.c
│   │       │   ├── jerasure_07.c
│   │       │   ├── jerasure_08.c
│   │       │   ├── liberation_01.c
│   │       │   ├── reed_sol_01.c
│   │       │   ├── reed_sol_02.c
│   │       │   ├── reed_sol_03.c
│   │       │   ├── reed_sol_04.c
│   │       │   ├── reed_sol_test_gf.c
│   │       │   ├── reed_sol_time_gf.c
│   │       │   ├── test_all_gfs.sh
│   │       │   ├── test_galois.c
│   │       │   └── time_all_gfs_argv_init.sh
│   │       ├── License.txt
│   │       ├── Makefile.am
│   │       ├── NEWS
│   │       ├── PERF.txt
│   │       ├── README
│   │       ├── configure.ac
│   │       ├── include/
│   │       │   ├── cauchy.h
│   │       │   ├── galois.h
│   │       │   ├── jerasure.h
│   │       │   ├── liberation.h
│   │       │   ├── reed_sol.h
│   │       │   └── timing.h
│   │       ├── m4/
│   │       │   ├── ax_check_compile_flag.m4
│   │       │   ├── ax_ext.m4
│   │       │   ├── ax_gcc_x86_avx_xgetbv.m4
│   │       │   ├── ax_gcc_x86_cpuid.m4
│   │       │   └── ax_require_defined.m4
│   │       └── src/
│   │           ├── Makefile.am
│   │           ├── cauchy.c
│   │           ├── cauchy_best_r6.c
│   │           ├── galois.c
│   │           ├── jerasure.c
│   │           ├── liberation.c
│   │           ├── reed_sol.c
│   │           └── timing.c
│   ├── storage/
│   │   ├── Communicator.cc
│   │   ├── ErrorReport.cc
│   │   ├── FileSystem.cc
│   │   ├── FileSystem.hh
│   │   ├── MgmSyncer.cc
│   │   ├── MonitorVarPartition.hh
│   │   ├── Publish.cc
│   │   ├── Remover.cc
│   │   ├── Report.cc
│   │   ├── Scrub.cc
│   │   ├── Storage.cc
│   │   ├── Storage.hh
│   │   ├── Supervisor.cc
│   │   ├── TrafficShaping.cc
│   │   ├── TrafficShaping.hh
│   │   └── Verify.cc
│   ├── tools/
│   │   ├── Adler32.cc
│   │   ├── CheckBlockXS.cc
│   │   ├── CheckSum.cc
│   │   ├── ComputeBlockXS.cc
│   │   ├── ConvertFileMD.cc
│   │   ├── IoPing.c
│   │   ├── RainCheck.cc
│   │   ├── RainHdrDump.cc
│   │   ├── RecoverRaidDP.cc
│   │   ├── ScanXS.cc
│   │   ├── eosfstinfo
│   │   └── eosfstregister
│   ├── utils/
│   │   ├── CheckFileReadWithPattern.cc
│   │   ├── CreateFileWithPattern.cc
│   │   ├── DiskMeasurements.cc
│   │   ├── DiskMeasurements.hh
│   │   ├── DiskMeasurementsMain.cc
│   │   ├── FSPathHandler.cc
│   │   ├── FSPathHandler.hh
│   │   ├── FTSWalkTree.hh
│   │   ├── IoPriority.cc
│   │   ├── IoPriority.hh
│   │   ├── OpenFileTracker.cc
│   │   ├── OpenFileTracker.hh
│   │   ├── ScanRate.cc
│   │   ├── ScanRate.hh
│   │   ├── StdFSWalkTree.hh
│   │   ├── TpcInfo.hh
│   │   ├── TransformAttr.hh
│   │   ├── XrdOfsPathHandler.cc
│   │   └── XrdOfsPathHandler.hh
│   └── xrdcl_plugins/
│       ├── CMakeLists.txt
│       ├── RainFile.cc
│       ├── RainFile.hh
│       ├── RainPlugin.cc
│       └── RainPlugin.hh
├── fusex/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── auth/
│   │   ├── AuthenticationGroup.cc
│   │   ├── AuthenticationGroup.hh
│   │   ├── BoundIdentityProvider.cc
│   │   ├── BoundIdentityProvider.hh
│   │   ├── CMakeLists.txt
│   │   ├── CredentialCache.hh
│   │   ├── CredentialFinder.cc
│   │   ├── CredentialFinder.hh
│   │   ├── CredentialValidator.cc
│   │   ├── CredentialValidator.hh
│   │   ├── DirectoryIterator.cc
│   │   ├── DirectoryIterator.hh
│   │   ├── EnvironmentReader.cc
│   │   ├── EnvironmentReader.hh
│   │   ├── FileDescriptor.hh
│   │   ├── JailIdentifier.cc
│   │   ├── JailIdentifier.hh
│   │   ├── Logbook.cc
│   │   ├── Logbook.hh
│   │   ├── LoginIdentifier.cc
│   │   ├── LoginIdentifier.hh
│   │   ├── ProcessCache.cc
│   │   ├── ProcessCache.hh
│   │   ├── ProcessInfo.cc
│   │   ├── ProcessInfo.hh
│   │   ├── README.md
│   │   ├── RmInfo.cc
│   │   ├── RmInfo.hh
│   │   ├── ScopedEUidSetter.hh
│   │   ├── ScopedFsUidSetter.hh
│   │   ├── SecurityChecker.cc
│   │   ├── SecurityChecker.hh
│   │   ├── UnixAuthenticator.cc
│   │   ├── UnixAuthenticator.hh
│   │   ├── UserCredentialFactory.cc
│   │   ├── UserCredentialFactory.hh
│   │   ├── UserCredentials.hh
│   │   ├── Utils.cc
│   │   ├── Utils.hh
│   │   ├── UuidStore.cc
│   │   └── UuidStore.hh
│   ├── backend/
│   │   ├── backend.cc
│   │   └── backend.hh
│   ├── benchmark/
│   │   ├── CMakeLists.txt
│   │   ├── eos-fusex-certify
│   │   └── fusex-benchmark.cc
│   ├── cap/
│   │   ├── cap.cc
│   │   └── cap.hh
│   ├── data/
│   │   ├── bufferll.hh
│   │   ├── cache.cc
│   │   ├── cache.hh
│   │   ├── cacheconfig.hh
│   │   ├── cachehandler.hh
│   │   ├── cachelock.hh
│   │   ├── cachesyncer.cc
│   │   ├── cachesyncer.hh
│   │   ├── data.cc
│   │   ├── data.hh
│   │   ├── dircleaner.cc
│   │   ├── dircleaner.hh
│   │   ├── diskcache.cc
│   │   ├── diskcache.hh
│   │   ├── interval_tree.hh
│   │   ├── io.hh
│   │   ├── journalcache.cc
│   │   ├── journalcache.hh
│   │   ├── memorycache.cc
│   │   ├── memorycache.hh
│   │   ├── rbtree.hh
│   │   ├── xrdclproxy.cc
│   │   └── xrdclproxy.hh
│   ├── eoscfsd/
│   │   ├── README.md
│   │   ├── cfs.sh
│   │   ├── cfskey.hh
│   │   ├── cfslogin.cc
│   │   ├── cfslogin.hh
│   │   ├── cfsmapping.hh
│   │   ├── cfsquota.hh
│   │   ├── cfsrecycle.cc
│   │   ├── cfsrecycle.hh
│   │   ├── cfsutil.hh
│   │   ├── cfsvattr.hh
│   │   ├── eoscfsd.cc
│   │   ├── eoscfsd.hh
│   │   ├── keychange.hh
│   │   ├── obfuscate.hh
│   │   └── overlay.hh
│   ├── eosfusebind
│   ├── eosxd/
│   │   ├── eosfuse.cc
│   │   ├── eosfuse.hh
│   │   ├── llfusexx.hh
│   │   └── main.cc
│   ├── fuse.conf.example
│   ├── fuse.example.stats.json
│   ├── fusex.proto
│   ├── kv/
│   │   ├── NoKV.cc
│   │   ├── NoKV.hh
│   │   ├── RocksKV.cc
│   │   ├── RocksKV.hh
│   │   └── kv.hh
│   ├── md/
│   │   ├── kernelcache.hh
│   │   ├── md.cc
│   │   └── md.hh
│   ├── misc/
│   │   ├── ConcurrentMount.cc
│   │   ├── ConcurrentMount.hh
│   │   ├── FuseException.hh
│   │   ├── FuseId.hh
│   │   ├── MacOSXHelper.hh
│   │   ├── RunningPidScanner.cc
│   │   ├── RunningPidScanner.hh
│   │   ├── SyncQueue.hh
│   │   ├── ThreadPool.hh
│   │   ├── Track.hh
│   │   ├── filename.hh
│   │   ├── fusexrdlogin.cc
│   │   ├── fusexrdlogin.hh
│   │   ├── longstring.cc
│   │   ├── longstring.hh
│   │   ├── richacl.hh
│   │   └── stringTS.hh
│   ├── stat/
│   │   ├── Stat.cc
│   │   └── Stat.hh
│   ├── submount/
│   │   ├── SubMount.cc
│   │   └── SubMount.hh
│   ├── tests/
│   │   ├── CMakeLists.txt
│   │   ├── auth/
│   │   │   ├── credential-finder.cc
│   │   │   ├── environment-reader.cc
│   │   │   ├── logbook.cc
│   │   │   ├── login-identifier.cc
│   │   │   ├── process-cache.cc
│   │   │   ├── process-info.cc
│   │   │   ├── rm-info.cc
│   │   │   ├── security-checker.cc
│   │   │   ├── test-utils.cc
│   │   │   ├── test-utils.hh
│   │   │   └── utils.cc
│   │   ├── eos-fusex-git-annex
│   │   ├── eos-fusex-recovery
│   │   ├── eos-test-fusex-messaging
│   │   ├── eos-test-fusex-producer-consumer
│   │   ├── interval-tree.cc
│   │   ├── ioverify.cc
│   │   ├── journal-cache.cc
│   │   ├── lru-test.cc
│   │   ├── rb-tree.cc
│   │   ├── rocks-kv.cc
│   │   └── stress/
│   │       └── xrdcl-proxy.cc
│   └── tsan/
│       └── suppressions.tsan
├── genversion.sh
├── git/
│   └── bin/
│       └── enable-hooks.sh
├── gitlab-ci/
│   ├── .gitlab-ci-build-macos.yml
│   ├── .gitlab-ci-build-ubuntu.yml
│   ├── .gitlab-ci-test-dock_include.yml
│   ├── .gitlab-ci-test-helm-server-multigroup-values.yml
│   ├── .gitlab-ci-test-helm_fusex_values.yml
│   ├── .gitlab-ci-test-helm_include.yml
│   ├── .gitlab-ci-test-helm_kuberos_values.yml
│   ├── .gitlab-ci-test-helm_server_values.yml
│   ├── .gitlab-ci-test-k8s_include.yml
│   ├── after_script_docker_test.sh
│   ├── after_script_k8s_test.sh
│   ├── before_script_docker_test.sh
│   ├── before_script_k8s_test.sh
│   ├── export_codename.sh
│   ├── export_commit-type.sh
│   ├── generate_debian_metadata.sh
│   ├── prebuild_OSbase/
│   │   ├── prebuild-cc7.Dockerfile
│   │   ├── prebuild-cc7_exotic.Dockerfile
│   │   ├── prebuild-el10.Dockerfile
│   │   ├── prebuild-el8.Dockerfile
│   │   ├── prebuild-el9-arm64.Dockerfile
│   │   └── prebuild-el9.Dockerfile
│   ├── publish_deb.sh
│   ├── remove_old_artifacts.sh
│   ├── remove_old_artifacts_debian.sh
│   ├── setup_ccache.sh
│   ├── setup_ccache_deb.sh
│   ├── setup_ccache_fc.sh
│   ├── sign_debian_repository.sh
│   ├── store_artifacts.sh
│   ├── store_artifacts_debian.sh
│   ├── store_stable_artifacts.sh
│   └── utilities_func_for_tests.sh
├── icons/
│   └── EOS.icns
├── man/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── create_eos_cmds.pl
│   └── create_man.sh
├── mgm/
│   ├── #Iostat.cc#
│   ├── CMakeLists.txt
│   ├── CtaUtils.cc
│   ├── CtaUtils.hh
│   ├── EosCtaReporter.cc
│   ├── EosCtaReporter.hh
│   ├── FuseServer/
│   │   ├── Caps.cc
│   │   ├── Caps.hh
│   │   ├── Clients.cc
│   │   ├── Clients.hh
│   │   ├── Flush.cc
│   │   ├── Flush.hh
│   │   ├── FusexCastBatch.hh
│   │   ├── Locks.cc
│   │   ├── Locks.hh
│   │   ├── Namespace.hh
│   │   ├── Server.cc
│   │   └── Server.hh
│   ├── Namespace.hh
│   ├── README.md
│   ├── access/
│   │   ├── Access.cc
│   │   └── Access.hh
│   ├── acl/
│   │   ├── Acl.cc
│   │   ├── Acl.hh
│   │   └── README.md
│   ├── adminsocket/
│   │   ├── AdminSocket.cc
│   │   └── AdminSocket.hh
│   ├── auth/
│   │   ├── AccessChecker.cc
│   │   └── AccessChecker.hh
│   ├── authz/
│   │   ├── XrdMgmAuthz.cc
│   │   └── XrdMgmAuthz.hh
│   ├── balancer/
│   │   ├── FsBalancer.cc
│   │   ├── FsBalancer.hh
│   │   ├── FsBalancerStats.cc
│   │   └── FsBalancerStats.hh
│   ├── bulk-request/
│   │   ├── BulkRequest.cc
│   │   ├── BulkRequest.hh
│   │   ├── BulkRequestFactory.cc
│   │   ├── BulkRequestFactory.hh
│   │   ├── BulkRequestHelper.hh
│   │   ├── File.hh
│   │   ├── FileCollection.hh
│   │   ├── README.md
│   │   ├── business/
│   │   │   ├── BulkRequestBusiness.cc
│   │   │   └── BulkRequestBusiness.hh
│   │   ├── dao/
│   │   │   ├── IBulkRequestDAO.hh
│   │   │   ├── factories/
│   │   │   │   ├── AbstractDAOFactory.hh
│   │   │   │   ├── ProcDirectoryDAOFactory.cc
│   │   │   │   └── ProcDirectoryDAOFactory.hh
│   │   │   └── proc/
│   │   │       ├── ProcDirBulkRequestFile.cc
│   │   │       ├── ProcDirBulkRequestFile.hh
│   │   │       ├── ProcDirectoryBulkRequestDAO.cc
│   │   │       ├── ProcDirectoryBulkRequestDAO.hh
│   │   │       ├── ProcDirectoryBulkRequestLocations.cc
│   │   │       ├── ProcDirectoryBulkRequestLocations.hh
│   │   │       └── cleaner/
│   │   │           ├── BulkRequestProcCleaner.cc
│   │   │           ├── BulkRequestProcCleaner.hh
│   │   │           ├── BulkRequestProcCleanerConfig.cc
│   │   │           └── BulkRequestProcCleanerConfig.hh
│   │   ├── exception/
│   │   │   ├── BulkRequestException.hh
│   │   │   └── PersistencyException.hh
│   │   ├── interface/
│   │   │   ├── IMgmFileSystemInterface.hh
│   │   │   ├── RealMgmFileSystemInterface.cc
│   │   │   └── RealMgmFileSystemInterface.hh
│   │   ├── prepare/
│   │   │   ├── CancellationBulkRequest.hh
│   │   │   ├── EvictBulkRequest.hh
│   │   │   ├── PrepareUtils.cc
│   │   │   ├── PrepareUtils.hh
│   │   │   ├── StageBulkRequest.hh
│   │   │   ├── manager/
│   │   │   │   ├── BulkRequestPrepareManager.cc
│   │   │   │   ├── BulkRequestPrepareManager.hh
│   │   │   │   ├── PrepareManager.cc
│   │   │   │   └── PrepareManager.hh
│   │   │   └── query-prepare/
│   │   │       ├── QueryPrepareResult.cc
│   │   │       └── QueryPrepareResult.hh
│   │   ├── response/
│   │   │   └── QueryPrepareResponse.hh
│   │   └── utils/
│   │       ├── PrepareArgumentsWrapper.hh
│   │       └── json/
│   │           └── QueryPrepareResponseJson.hh
│   ├── commandmap/
│   │   ├── CommandMap.cc
│   │   └── CommandMap.hh
│   ├── config/
│   │   ├── IConfigEngine.cc
│   │   ├── IConfigEngine.hh
│   │   ├── QuarkConfigHandler.cc
│   │   ├── QuarkConfigHandler.hh
│   │   ├── QuarkDBConfigEngine.cc
│   │   ├── QuarkDBConfigEngine.hh
│   │   └── eos-config-inspect.cc
│   ├── convert/
│   │   ├── ConversionInfo.cc
│   │   ├── ConversionInfo.hh
│   │   ├── ConversionJob.cc
│   │   ├── ConversionJob.hh
│   │   ├── ConversionTag.hh
│   │   ├── ConverterEngine.cc
│   │   └── ConverterEngine.hh
│   ├── devices/
│   │   ├── Devices.cc
│   │   └── Devices.hh
│   ├── drain/
│   │   ├── DrainFs.cc
│   │   ├── DrainFs.hh
│   │   ├── DrainTransferJob.cc
│   │   ├── DrainTransferJob.hh
│   │   ├── Drainer.cc
│   │   └── Drainer.hh
│   ├── egroup/
│   │   ├── Egroup.cc
│   │   └── Egroup.hh
│   ├── eos-repair-tool
│   ├── features/
│   │   ├── Features.cc
│   │   └── Features.hh
│   ├── filesystem/
│   │   ├── FileSystem.cc
│   │   └── FileSystem.hh
│   ├── fsck/
│   │   ├── Fsck.cc
│   │   ├── Fsck.hh
│   │   ├── FsckEntry.cc
│   │   └── FsckEntry.hh
│   ├── fsview/
│   │   ├── FsView.cc
│   │   └── FsView.hh
│   ├── fuse-locks/
│   │   ├── LockTracker.cc
│   │   └── LockTracker.hh
│   ├── geobalancer/
│   │   ├── GeoBalancer.cc
│   │   └── GeoBalancer.hh
│   ├── geotree/
│   │   ├── SchedulingFastTree.hh
│   │   ├── SchedulingSlowTree.cc
│   │   ├── SchedulingSlowTree.hh
│   │   ├── SchedulingTreeCommon.cc
│   │   ├── SchedulingTreeCommon.hh
│   │   ├── SchedulingTreeTest.cc
│   │   └── SchedulingTreeTest.cc.testfile
│   ├── geotreeengine/
│   │   ├── GeoTreeEngine.cc
│   │   └── GeoTreeEngine.hh
│   ├── groupbalancer/
│   │   ├── BalancerEngine.cc
│   │   ├── BalancerEngine.hh
│   │   ├── BalancerEngineFactory.hh
│   │   ├── BalancerEngineTypes.hh
│   │   ├── BalancerEngineUtils.hh
│   │   ├── ConverterUtils.cc
│   │   ├── ConverterUtils.hh
│   │   ├── FreeSpaceBalancerEngine.cc
│   │   ├── FreeSpaceBalancerEngine.hh
│   │   ├── GroupBalancer.cc
│   │   ├── GroupBalancer.hh
│   │   ├── GroupsInfoFetcher.cc
│   │   ├── GroupsInfoFetcher.hh
│   │   ├── MinMaxBalancerEngine.cc
│   │   ├── MinMaxBalancerEngine.hh
│   │   ├── StdDevBalancerEngine.cc
│   │   ├── StdDevBalancerEngine.hh
│   │   ├── StdDrainerEngine.cc
│   │   └── StdDrainerEngine.hh
│   ├── groupdrainer/
│   │   ├── DrainProgressTracker.cc
│   │   ├── DrainProgressTracker.hh
│   │   ├── GroupDrainer.cc
│   │   ├── GroupDrainer.hh
│   │   └── RetryTracker.hh
│   ├── grpc/
│   │   ├── GrpcNsInterface.cc
│   │   ├── GrpcNsInterface.hh
│   │   ├── GrpcRestGwInterface.cc
│   │   ├── GrpcRestGwInterface.hh
│   │   ├── GrpcRestGwServer.cc
│   │   ├── GrpcRestGwServer.hh
│   │   ├── GrpcServer.cc
│   │   ├── GrpcServer.hh
│   │   ├── GrpcWncInterface.cc
│   │   ├── GrpcWncInterface.hh
│   │   ├── GrpcWncServer.cc
│   │   └── GrpcWncServer.hh
│   ├── http/
│   │   ├── HttpHandler.cc
│   │   ├── HttpHandler.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   ├── rapidxml/
│   │   │   ├── license.txt
│   │   │   ├── rapidxml.hpp
│   │   │   ├── rapidxml_print.hpp
│   │   │   └── rapidxml_utils.hpp
│   │   ├── rest-api/
│   │   │   ├── Constants.hh
│   │   │   ├── README.md
│   │   │   ├── action/
│   │   │   │   ├── Action.hh
│   │   │   │   └── tape/
│   │   │   │       ├── TapeAction.hh
│   │   │   │       ├── TapeActions.hh
│   │   │   │       ├── archiveinfo/
│   │   │   │       │   ├── GetArchiveInfo.cc
│   │   │   │       │   └── GetArchiveInfo.hh
│   │   │   │       ├── release/
│   │   │   │       │   ├── CreateReleaseBulkRequest.cc
│   │   │   │       │   └── CreateReleaseBulkRequest.hh
│   │   │   │       └── stage/
│   │   │   │           ├── CancelStageBulkRequest.cc
│   │   │   │           ├── CancelStageBulkRequest.hh
│   │   │   │           ├── CreateStageBulkRequest.cc
│   │   │   │           ├── CreateStageBulkRequest.hh
│   │   │   │           ├── DeleteStageBulkRequest.cc
│   │   │   │           ├── DeleteStageBulkRequest.hh
│   │   │   │           ├── GetStageBulkRequest.cc
│   │   │   │           └── GetStageBulkRequest.hh
│   │   │   ├── business/
│   │   │   │   └── tape/
│   │   │   │       ├── ITapeRestApiBusiness.hh
│   │   │   │       ├── TapeRestApiBusiness.cc
│   │   │   │       └── TapeRestApiBusiness.hh
│   │   │   ├── config/
│   │   │   │   └── tape/
│   │   │   │       ├── TapeRestApiConfig.cc
│   │   │   │       └── TapeRestApiConfig.hh
│   │   │   ├── exception/
│   │   │   │   ├── Exceptions.hh
│   │   │   │   ├── JsonValidationException.hh
│   │   │   │   └── RestException.hh
│   │   │   ├── handler/
│   │   │   │   ├── RestHandler.cc
│   │   │   │   ├── RestHandler.hh
│   │   │   │   ├── tape/
│   │   │   │   │   ├── TapeRestHandler.cc
│   │   │   │   │   └── TapeRestHandler.hh
│   │   │   │   └── wellknown/
│   │   │   │       ├── WellKnownHandler.cc
│   │   │   │       └── WellKnownHandler.hh
│   │   │   ├── json/
│   │   │   │   ├── builder/
│   │   │   │   │   ├── JsonModelBuilder.hh
│   │   │   │   │   ├── ValidationError.hh
│   │   │   │   │   └── jsoncpp/
│   │   │   │   │       ├── JsonCppModelBuilder.hh
│   │   │   │   │       └── JsonCppValidator.hh
│   │   │   │   └── tape/
│   │   │   │       ├── TapeJsonifiers.hh
│   │   │   │       ├── TapeModelBuilders.hh
│   │   │   │       ├── TapeRestApiJsonifier.hh
│   │   │   │       └── model-builders/
│   │   │   │           └── validators/
│   │   │   │               └── TapeJsonCppValidator.hh
│   │   │   ├── manager/
│   │   │   │   ├── RestApiManager.cc
│   │   │   │   └── RestApiManager.hh
│   │   │   ├── model/
│   │   │   │   ├── tape/
│   │   │   │   │   ├── archiveinfo/
│   │   │   │   │   │   └── GetArchiveInfoResponseModel.hh
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── ErrorModel.cc
│   │   │   │   │   │   ├── ErrorModel.hh
│   │   │   │   │   │   └── FilesContainer.hh
│   │   │   │   │   └── stage/
│   │   │   │   │       ├── CreateStageBulkRequestModel.hh
│   │   │   │   │       ├── CreatedStageBulkRequestResponseModel.hh
│   │   │   │   │       ├── GetStageBulkRequestResponseModel.hh
│   │   │   │   │       └── PathsModel.hh
│   │   │   │   └── wellknown/
│   │   │   │       └── tape/
│   │   │   │           └── GetTapeWellKnownModel.hh
│   │   │   ├── response/
│   │   │   │   ├── ErrorHandling.hh
│   │   │   │   ├── RestApiResponse.hh
│   │   │   │   ├── RestApiResponseFactory.hh
│   │   │   │   ├── RestResponseFactory.cc
│   │   │   │   └── RestResponseFactory.hh
│   │   │   ├── router/
│   │   │   │   └── Router.hh
│   │   │   ├── utils/
│   │   │   │   ├── URLBuilder.cc
│   │   │   │   ├── URLBuilder.hh
│   │   │   │   ├── URLParser.cc
│   │   │   │   └── URLParser.hh
│   │   │   └── wellknown/
│   │   │       └── tape/
│   │   │           ├── TapeRestApiEndpoint.cc
│   │   │           ├── TapeRestApiEndpoint.hh
│   │   │           ├── TapeWellKnownInfos.cc
│   │   │           └── TapeWellKnownInfos.hh
│   │   ├── s3/
│   │   │   ├── S3Handler.cc
│   │   │   ├── S3Handler.hh
│   │   │   ├── S3Store.cc
│   │   │   └── S3Store.hh
│   │   ├── webdav/
│   │   │   ├── LockResponse.cc
│   │   │   ├── LockResponse.hh
│   │   │   ├── PropFindResponse.cc
│   │   │   ├── PropFindResponse.hh
│   │   │   ├── PropPatchResponse.cc
│   │   │   ├── PropPatchResponse.hh
│   │   │   ├── WebDAVHandler.cc
│   │   │   ├── WebDAVHandler.hh
│   │   │   ├── WebDAVResponse.cc
│   │   │   └── WebDAVResponse.hh
│   │   └── xrdhttp/
│   │       ├── EosMgmHttpHandler.cc
│   │       ├── EosMgmHttpHandler.hh
│   │       └── README.md
│   ├── imaster/
│   │   ├── IMaster.cc
│   │   └── IMaster.hh
│   ├── inflighttracker/
│   │   ├── InFlightTracker.cc
│   │   └── InFlightTracker.hh
│   ├── inspector/
│   │   ├── FileInspector.cc
│   │   ├── FileInspector.hh
│   │   ├── FileInspectorStats.cc
│   │   └── FileInspectorStats.hh
│   ├── iostat/
│   │   ├── Iostat.cc
│   │   └── Iostat.hh
│   ├── lru/
│   │   ├── LRU.cc
│   │   └── LRU.hh
│   ├── macros/
│   │   ├── Macros.cc
│   │   └── Macros.hh
│   ├── misc/
│   │   ├── AuditHelpers.hh
│   │   ├── Constants.hh
│   │   └── IdTrackerWithValidity.hh
│   ├── namespacestats/
│   │   ├── NamespaceStats.cc
│   │   └── NamespaceStats.hh
│   ├── ofs/
│   │   ├── XrdMgmOfs.cc
│   │   ├── XrdMgmOfs.hh
│   │   ├── XrdMgmOfsConfigure.cc
│   │   ├── XrdMgmOfsDirectory.cc
│   │   ├── XrdMgmOfsDirectory.hh
│   │   ├── XrdMgmOfsFile.cc
│   │   ├── XrdMgmOfsFile.hh
│   │   ├── XrdMgmOfsSecurity.hh
│   │   ├── XrdMgmOfsTrace.hh
│   │   ├── cmds/
│   │   │   ├── Access.inc
│   │   │   ├── Attr.inc
│   │   │   ├── Auth.inc
│   │   │   ├── Chksum.inc
│   │   │   ├── Chmod.inc
│   │   │   ├── Chown.inc
│   │   │   ├── Coverage.inc
│   │   │   ├── DeleteExternal.inc
│   │   │   ├── DropReplica.inc
│   │   │   ├── ErrorLogListener.inc
│   │   │   ├── Exists.inc
│   │   │   ├── FAttr.inc
│   │   │   ├── Find.inc
│   │   │   ├── FsConfigListener.inc
│   │   │   ├── Fsctl.inc
│   │   │   ├── Link.inc
│   │   │   ├── Mkdir.inc
│   │   │   ├── PathMap.inc
│   │   │   ├── Remdir.inc
│   │   │   ├── Rename.inc
│   │   │   ├── Rm.inc
│   │   │   ├── SharedPath.inc
│   │   │   ├── ShouldRedirect.inc
│   │   │   ├── ShouldRoute.inc
│   │   │   ├── ShouldStall.inc
│   │   │   ├── Shutdown.inc
│   │   │   ├── Stacktrace.inc
│   │   │   ├── Stat.inc
│   │   │   ├── Stripes.inc
│   │   │   ├── Touch.inc
│   │   │   ├── Utimes.inc
│   │   │   └── Version.inc
│   │   └── fsctl/
│   │       ├── Access.cc
│   │       ├── AdjustReplica.cc
│   │       ├── Checksum.cc
│   │       ├── Chmod.cc
│   │       ├── Chown.cc
│   │       ├── Commit.cc
│   │       ├── CommitHelper.cc
│   │       ├── CommitHelper.hh
│   │       ├── Drop.cc
│   │       ├── Event.cc
│   │       ├── Fusex.cc
│   │       ├── GetFusex.cc
│   │       ├── Getfmd.cc
│   │       ├── Mkdir.cc
│   │       ├── Open.cc
│   │       ├── Readlink.cc
│   │       ├── Redirect.cc
│   │       ├── Stat.cc
│   │       ├── Statvfs.cc
│   │       ├── Symlink.cc
│   │       ├── Utimes.cc
│   │       └── Version.cc
│   ├── pathrouting/
│   │   ├── PathRouting.cc
│   │   └── PathRouting.hh
│   ├── placement/
│   │   ├── ClusterDataTypes.hh
│   │   ├── ClusterMap.cc
│   │   ├── ClusterMap.hh
│   │   ├── FlatScheduler.cc
│   │   ├── FlatScheduler.hh
│   │   ├── FsScheduler.cc
│   │   ├── FsScheduler.hh
│   │   ├── PlacementStrategy.cc
│   │   ├── PlacementStrategy.hh
│   │   ├── RRSeed.hh
│   │   ├── RoundRobinPlacementStrategy.cc
│   │   ├── RoundRobinPlacementStrategy.hh
│   │   ├── ThreadLocalRRSeed.cc
│   │   ├── ThreadLocalRRSeed.hh
│   │   ├── WeightedRandomStrategy.cc
│   │   ├── WeightedRandomStrategy.hh
│   │   ├── WeightedRoundRobinStrategy.cc
│   │   └── WeightedRoundRobinStrategy.hh
│   ├── policy/
│   │   ├── Policy.cc
│   │   └── Policy.hh
│   ├── proc/
│   │   ├── IProcCommand.cc
│   │   ├── IProcCommand.hh
│   │   ├── ProcCommand.cc
│   │   ├── ProcCommand.hh
│   │   ├── ProcInterface.cc
│   │   ├── ProcInterface.hh
│   │   ├── admin/
│   │   │   ├── Access.cc
│   │   │   ├── AccessCmd.cc
│   │   │   ├── AccessCmd.hh
│   │   │   ├── Backup.cc
│   │   │   ├── Backup.hh
│   │   │   ├── ConfigCmd.cc
│   │   │   ├── ConfigCmd.hh
│   │   │   ├── ConvertCmd.cc
│   │   │   ├── ConvertCmd.hh
│   │   │   ├── DebugCmd.cc
│   │   │   ├── DebugCmd.hh
│   │   │   ├── DevicesCmd.cc
│   │   │   ├── DevicesCmd.hh
│   │   │   ├── EvictCmd.cc
│   │   │   ├── EvictCmd.hh
│   │   │   ├── FileRegisterCmd.cc
│   │   │   ├── FileRegisterCmd.hh
│   │   │   ├── FsCmd.cc
│   │   │   ├── FsCmd.hh
│   │   │   ├── FsckCmd.cc
│   │   │   ├── FsckCmd.hh
│   │   │   ├── Fusex.cc
│   │   │   ├── GeoSched.cc
│   │   │   ├── GroupCmd.cc
│   │   │   ├── GroupCmd.hh
│   │   │   ├── IoCmd.cc
│   │   │   ├── IoCmd.hh
│   │   │   ├── IoShapingCmd.cc
│   │   │   ├── NodeCmd.cc
│   │   │   ├── NodeCmd.hh
│   │   │   ├── NsCmd.cc
│   │   │   ├── NsCmd.hh
│   │   │   ├── Quota.cc
│   │   │   ├── QuotaCmd.cc
│   │   │   ├── QuotaCmd.hh
│   │   │   ├── Rtlog.cc
│   │   │   ├── SchedCmd.cc
│   │   │   ├── SchedCmd.hh
│   │   │   ├── SpaceCmd.cc
│   │   │   ├── SpaceCmd.hh
│   │   │   └── Vid.cc
│   │   ├── proc_fs.cc
│   │   ├── proc_fs.hh
│   │   └── user/
│   │       ├── Accounting.cc
│   │       ├── AclCmd.cc
│   │       ├── AclCmd.hh
│   │       ├── Archive.cc
│   │       ├── Attr.cc
│   │       ├── Cd.cc
│   │       ├── Chmod.cc
│   │       ├── Chown.cc
│   │       ├── DfCmd.cc
│   │       ├── DfCmd.hh
│   │       ├── File.cc
│   │       ├── Fileinfo.cc
│   │       ├── Find.cc
│   │       ├── Fuse.cc
│   │       ├── FuseX.cc
│   │       ├── Ls.cc
│   │       ├── Map.cc
│   │       ├── Member.cc
│   │       ├── Mkdir.cc
│   │       ├── Motd.cc
│   │       ├── NewfindCmd.cc
│   │       ├── NewfindCmd.hh
│   │       ├── Quota.cc
│   │       ├── RecycleCmd.cc
│   │       ├── RecycleCmd.hh
│   │       ├── Rm.cc
│   │       ├── RmCmd.cc
│   │       ├── RmCmd.hh
│   │       ├── Rmdir.cc
│   │       ├── RouteCmd.cc
│   │       ├── RouteCmd.hh
│   │       ├── TokenCmd.cc
│   │       ├── TokenCmd.hh
│   │       ├── Version.cc
│   │       ├── Who.cc
│   │       └── Whoami.cc
│   ├── qdbmaster/
│   │   ├── QdbMaster.cc
│   │   └── QdbMaster.hh
│   ├── quota/
│   │   ├── #Quota.cc#
│   │   ├── Quota.cc
│   │   └── Quota.hh
│   ├── recycle/
│   │   ├── Recycle.cc
│   │   ├── Recycle.hh
│   │   ├── RecycleEntry.cc
│   │   ├── RecycleEntry.hh
│   │   ├── RecyclePolicy.cc
│   │   └── RecyclePolicy.hh
│   ├── routeendpoint/
│   │   ├── RouteEndpoint.cc
│   │   └── RouteEndpoint.hh
│   ├── scheduler/
│   │   ├── Scheduler.cc
│   │   └── Scheduler.hh
│   ├── shaping/
│   │   ├── TrafficShaping.cc
│   │   └── TrafficShaping.hh
│   ├── stat/
│   │   ├── Stat.cc
│   │   └── Stat.hh
│   ├── tgc/
│   │   ├── AsyncResult.hh
│   │   ├── AsyncUint64ShellCmd.cc
│   │   ├── AsyncUint64ShellCmd.hh
│   │   ├── BlockingFlag.hh
│   │   ├── CachedValue.hh
│   │   ├── Constants.hh
│   │   ├── DummyClock.hh
│   │   ├── DummyTapeGcMgm.cc
│   │   ├── DummyTapeGcMgm.hh
│   │   ├── FreedBytesHistogram.cc
│   │   ├── FreedBytesHistogram.hh
│   │   ├── IClock.cc
│   │   ├── IClock.hh
│   │   ├── ITapeGcMgm.cc
│   │   ├── ITapeGcMgm.hh
│   │   ├── Lru.cc
│   │   ├── Lru.hh
│   │   ├── MaxLenExceeded.cc
│   │   ├── MaxLenExceeded.hh
│   │   ├── MultiSpaceTapeGc.cc
│   │   ├── MultiSpaceTapeGc.hh
│   │   ├── RealClock.cc
│   │   ├── RealClock.hh
│   │   ├── RealTapeGcMgm.cc
│   │   ├── RealTapeGcMgm.hh
│   │   ├── SmartSpaceStats.cc
│   │   ├── SmartSpaceStats.hh
│   │   ├── SpaceConfig.hh
│   │   ├── SpaceNotFound.cc
│   │   ├── SpaceNotFound.hh
│   │   ├── SpaceStats.hh
│   │   ├── SpaceToTapeGcMap.cc
│   │   ├── SpaceToTapeGcMap.hh
│   │   ├── TapeGc.cc
│   │   ├── TapeGc.hh
│   │   ├── TapeGcStats.hh
│   │   └── TestingTapeGc.hh
│   ├── tracker/
│   │   ├── ReplicationTracker.cc
│   │   └── ReplicationTracker.hh
│   ├── utils/
│   │   ├── AttrHelper.cc
│   │   ├── AttrHelper.hh
│   │   ├── FileSystemRegistry.cc
│   │   ├── FileSystemRegistry.hh
│   │   ├── FileSystemStatusUtils.cc
│   │   ├── FileSystemStatusUtils.hh
│   │   ├── FilesystemUuidMapper.cc
│   │   └── FilesystemUuidMapper.hh
│   ├── vid/
│   │   ├── Vid.cc
│   │   └── Vid.hh
│   ├── wfe/
│   │   ├── WFE.cc
│   │   └── WFE.hh
│   ├── wfe.proto
│   ├── workflow/
│   │   ├── Workflow.cc
│   │   └── Workflow.hh
│   ├── xattr/
│   │   ├── XattrLock.hh
│   │   └── XattrSet.hh
│   └── zmq/
│       ├── ZMQ.cc
│       └── ZMQ.hh
├── misc/
│   ├── CMakeLists.txt
│   ├── cmake/
│   │   ├── cmake-3.15.5-Linux-x86_64.sh
│   │   └── cmake-3.19.7-Linux-x86_64.sh
│   ├── egi/
│   │   ├── CMakeLists.txt
│   │   ├── eos-info-provider.py
│   │   └── eos-star-accounting.py
│   ├── etc/
│   │   ├── CMakeLists.txt
│   │   ├── auto.cfsd
│   │   ├── auto.master.d/
│   │   │   └── cfsd.autofs
│   │   ├── bash_completion.d/
│   │   │   └── eos
│   │   ├── cron.d/
│   │   │   ├── eos-health
│   │   │   ├── eos-logs
│   │   │   ├── eos-mgm-monitoring
│   │   │   ├── eos-reports
│   │   │   └── xrd-alive
│   │   ├── eos/
│   │   │   ├── cfsd/
│   │   │   │   └── eoscfsd.conf
│   │   │   └── config/
│   │   │       ├── fst/
│   │   │       │   └── fst
│   │   │       ├── generic/
│   │   │       │   └── all
│   │   │       ├── mgm/
│   │   │       │   ├── auth
│   │   │       │   ├── mgm
│   │   │       │   └── mgm.modules
│   │   │       ├── modules/
│   │   │       │   └── alice
│   │   │       └── qdb/
│   │   │           └── qdb
│   │   ├── eos.client.keytab
│   │   ├── eos.keytab
│   │   ├── fuse.conf
│   │   ├── fuse.conf.eos
│   │   ├── logrotate.d/
│   │   │   ├── eos-fuse-logs
│   │   │   ├── eos-fusex-logs
│   │   │   └── eos-logs
│   │   ├── profile.d/
│   │   │   └── eos-completion.sh
│   │   ├── sysconfig/
│   │   │   └── eos_env.example
│   │   ├── systemd/
│   │   │   └── system/
│   │   │       ├── eos.service
│   │   │       ├── eos.target
│   │   │       ├── eos5-fst@.service
│   │   │       ├── eos5-mgm@.service
│   │   │       ├── eos5-qdb@.service
│   │   │       ├── eos5.service
│   │   │       ├── eos@.service
│   │   │       ├── eos@.socket
│   │   │       ├── eos@master.service
│   │   │       └── eos@slave.service
│   │   ├── xrd.cf.auth
│   │   ├── xrd.cf.fed
│   │   ├── xrd.cf.fst
│   │   ├── xrd.cf.mgm
│   │   ├── xrd.cf.prefix
│   │   ├── xrd.cf.quarkdb
│   │   ├── xrd.cf.sync
│   │   └── zsh/
│   │       └── site-functions/
│   │           └── _eos
│   ├── sbin/
│   │   ├── CMakeLists.txt
│   │   ├── eos-diagnostic-tool
│   │   ├── eos-inspectorreport
│   │   ├── eos-inspectorstat
│   │   ├── eos-jwk-https
│   │   ├── eos-jwker.readme
│   │   ├── eos-mdreport
│   │   ├── eos-mdstat
│   │   ├── eos-prom-push
│   │   ├── eos-reportstat
│   │   ├── eos-status
│   │   ├── eos_start.sh
│   │   ├── eos_start_pre.sh
│   │   ├── mount.eoscfs
│   │   ├── mount.eosx
│   │   ├── mount.eosx3
│   │   └── umount.fuse
│   ├── selinux/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── choose_selinux.sh
│   │   ├── eosfuse-7.pp
│   │   └── eosfuse.te
│   ├── usr/
│   │   ├── CMakeLists.txt
│   │   ├── eos-fusex-core.conf
│   │   └── eosd.conf
│   └── var/
│       ├── CMakeLists.txt
│       └── eos/
│           ├── test/
│           │   ├── LeakSanitizer.supp
│           │   └── fuse/
│           │       └── untar/
│           │           ├── untar.tgz
│           │           └── xrootd.tgz
│           └── wfe/
│               └── bash/
│                   └── shell
├── namespace/
│   ├── CMakeLists.txt
│   ├── Constants.cc
│   ├── Constants.hh
│   ├── MDException.cc
│   ├── MDException.hh
│   ├── MDLocking.cc
│   ├── MDLocking.hh
│   ├── Namespace.hh
│   ├── PermissionHandler.cc
│   ├── PermissionHandler.hh
│   ├── Prefetcher.cc
│   ├── Prefetcher.hh
│   ├── Resolver.cc
│   ├── Resolver.hh
│   ├── interface/
│   │   ├── ContainerIterators.hh
│   │   ├── IContainerMD.hh
│   │   ├── IContainerMDSvc.hh
│   │   ├── IFileMD.hh
│   │   ├── IFileMDSvc.hh
│   │   ├── IFsView.hh
│   │   ├── INamespaceGroup.hh
│   │   ├── INamespaceStats.hh
│   │   ├── IQuota.hh
│   │   ├── IView.hh
│   │   ├── Identifiers.hh
│   │   ├── LockableNSObject.hh
│   │   └── Misc.hh
│   ├── locking/
│   │   ├── BulkNsObjectLocker.hh
│   │   ├── NSObjectLocker.hh
│   │   └── RawPtr.hh
│   ├── ns_quarkdb/
│   │   ├── CMakeLists.txt
│   │   ├── CacheRefreshListener.cc
│   │   ├── CacheRefreshListener.hh
│   │   ├── ConfigurationParser.hh
│   │   ├── Constants.hh
│   │   ├── ContainerMD.cc
│   │   ├── ContainerMD.hh
│   │   ├── FileMD.cc
│   │   ├── FileMD.hh
│   │   ├── LRU.hh
│   │   ├── NamespaceGroup.cc
│   │   ├── NamespaceGroup.hh
│   │   ├── NsQuarkdbPlugin.cc
│   │   ├── NsQuarkdbPlugin.hh
│   │   ├── QClPerformance.cc
│   │   ├── QClPerformance.hh
│   │   ├── QdbContactDetails.hh
│   │   ├── VersionEnforcement.cc
│   │   ├── VersionEnforcement.hh
│   │   ├── accounting/
│   │   │   ├── ContainerAccounting.cc
│   │   │   ├── ContainerAccounting.hh
│   │   │   ├── FileSystemHandler.cc
│   │   │   ├── FileSystemHandler.hh
│   │   │   ├── FileSystemView.cc
│   │   │   ├── FileSystemView.hh
│   │   │   ├── QuotaNodeCore.cc
│   │   │   ├── QuotaNodeCore.hh
│   │   │   ├── QuotaStats.cc
│   │   │   ├── QuotaStats.hh
│   │   │   ├── SetChangeList.hh
│   │   │   ├── SyncTimeAccounting.cc
│   │   │   └── SyncTimeAccounting.hh
│   │   ├── explorer/
│   │   │   ├── NamespaceExplorer.cc
│   │   │   └── NamespaceExplorer.hh
│   │   ├── flusher/
│   │   │   ├── MetadataFlusher.cc
│   │   │   └── MetadataFlusher.hh
│   │   ├── inspector/
│   │   │   ├── AttributeExtraction.cc
│   │   │   ├── AttributeExtraction.hh
│   │   │   ├── ContainerScanner.cc
│   │   │   ├── ContainerScanner.hh
│   │   │   ├── FileMetadataFilter.cc
│   │   │   ├── FileMetadataFilter.hh
│   │   │   ├── FileScanner.cc
│   │   │   ├── FileScanner.hh
│   │   │   ├── Inspector.cc
│   │   │   ├── Inspector.hh
│   │   │   ├── OutputSink.cc
│   │   │   ├── OutputSink.hh
│   │   │   ├── Printing.cc
│   │   │   └── Printing.hh
│   │   ├── persistency/
│   │   │   ├── ContainerMDSvc.cc
│   │   │   ├── ContainerMDSvc.hh
│   │   │   ├── FileMDSvc.cc
│   │   │   ├── FileMDSvc.hh
│   │   │   ├── FileSystemIterator.cc
│   │   │   ├── FileSystemIterator.hh
│   │   │   ├── MetadataFetcher.cc
│   │   │   ├── MetadataFetcher.hh
│   │   │   ├── MetadataProvider.cc
│   │   │   ├── MetadataProvider.hh
│   │   │   ├── MetadataProviderShard.cc
│   │   │   ├── MetadataProviderShard.hh
│   │   │   ├── NextInodeProvider.cc
│   │   │   ├── NextInodeProvider.hh
│   │   │   ├── RequestBuilder.cc
│   │   │   ├── RequestBuilder.hh
│   │   │   ├── Serialization.cc
│   │   │   ├── Serialization.hh
│   │   │   ├── UnifiedInodeProvider.cc
│   │   │   └── UnifiedInodeProvider.hh
│   │   ├── tests/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── ContainerMDSvcTest.cc
│   │   │   ├── EosNamespaceBenchmark.cc
│   │   │   ├── FileMDSvcTest.cc
│   │   │   ├── FileSystemViewTest.cc
│   │   │   ├── HierarchicalViewTest.cc
│   │   │   ├── LruBenchmark.cc
│   │   │   ├── Main.cc
│   │   │   ├── MetadataFiltering.cc
│   │   │   ├── MetadataTests.cc
│   │   │   ├── MockContainerMD.hh
│   │   │   ├── MockContainerMDSvc.hh
│   │   │   ├── MockFileMDSvc.hh
│   │   │   ├── Namespace.hh
│   │   │   ├── NextInodeProviderTest.cc
│   │   │   ├── NsTests.cc
│   │   │   ├── NsTests.hh
│   │   │   ├── OtherTests.cc
│   │   │   ├── README.md
│   │   │   ├── TestUtils.hh
│   │   │   ├── VariousTests.cc
│   │   │   └── utils/
│   │   │       └── break-file.py
│   │   ├── tools/
│   │   │   ├── EosConvertToLocalityHashes.cc
│   │   │   ├── Fid2PathTool.cc
│   │   │   ├── InodeToFidTool.cc
│   │   │   └── InspectionTool.cc
│   │   ├── utils/
│   │   │   ├── FutureVectorIterator.hh
│   │   │   ├── QuotaRecomputer.cc
│   │   │   └── QuotaRecomputer.hh
│   │   └── views/
│   │       ├── HierarchicalView.cc
│   │       └── HierarchicalView.hh
│   └── utils/
│       ├── Attributes.hh
│       ├── BalanceCalculator.hh
│       ├── Buffer.hh
│       ├── Checksum.hh
│       ├── DataHelper.cc
│       ├── DataHelper.hh
│       ├── Descriptor.cc
│       ├── Descriptor.hh
│       ├── Etag.cc
│       ├── Etag.hh
│       ├── FileListRandomPicker.cc
│       ├── FileListRandomPicker.hh
│       ├── LocalityHint.hh
│       ├── Mode.hh
│       ├── PathProcessor.hh
│       ├── RenameSafetyCheck.hh
│       ├── RmrfHelper.hh
│       ├── Stat.hh
│       └── StringConvertion.hh
├── nginx/
│   ├── README
│   ├── etc/
│   │   ├── init.d/
│   │   │   └── nginx.init
│   │   ├── logrotate.d/
│   │   │   └── nginx.logrotate
│   │   ├── nginx/
│   │   │   └── nginx.eos.conf.template
│   │   ├── sysconfig/
│   │   │   ├── nginx.sysconfig
│   │   │   └── nginx.sysconfig.systemd
│   │   └── systemd/
│   │       └── nginx.service
│   ├── jenkins-build.sh
│   ├── makesrpm.sh
│   ├── nginx-allow-proxy-certs.patch
│   ├── nginx-allow-put-redirect.patch
│   ├── nginx-no-body-before-redirect.patch
│   └── nginx.spec
├── proto/
│   ├── Audit.proto
│   ├── CMakeLists.txt
│   ├── eos_rest_gateway/
│   │   ├── eos_rest_gateway_service.proto
│   │   └── google/
│   │       └── api/
│   │           ├── annotations.proto
│   │           └── http.proto
│   ├── fst/
│   │   ├── Delete.proto
│   │   └── FmdBase.proto
│   └── namespace/
│       └── ns_quarkdb/
│           ├── ChangelogEntry.proto
│           ├── ContainerMd.proto
│           └── FileMd.proto
├── repo/
│   ├── eos-el7-dev.repo
│   ├── eos-el7.repo
│   ├── eos-el8-dev.repo
│   ├── eos-el8.repo
│   ├── eos-el8s-dev.repo
│   ├── eos-el8s.repo
│   ├── eos-el9s-dev.repo
│   └── eos-el9s.repo
├── test/
│   ├── CMakeLists.txt
│   ├── EosChecksumBenchmark.cc
│   ├── EosCryptoTimingTest.cc
│   ├── EosHashBenchmark.cc
│   ├── EosIdMapBenchmark.cc
│   ├── EosLoggingBenchmark.cc
│   ├── EosMmap.cc
│   ├── EosOpenTruncUpdate.cc
│   ├── EosUdpDumper.cc
│   ├── TestHmacSha256.cc
│   ├── ThreadPoolTest.cc
│   ├── XrdCpAbort.cc
│   ├── XrdCpAppend.cc
│   ├── XrdCpAppendOverlap.cc
│   ├── XrdCpBackward.cc
│   ├── XrdCpDownloadRandom.cc
│   ├── XrdCpExtend.cc
│   ├── XrdCpHoles.cc
│   ├── XrdCpNonStreaming.cc
│   ├── XrdCpPartial.cc
│   ├── XrdCpPgRead.cc
│   ├── XrdCpPosixCache.cc
│   ├── XrdCpRandom.cc
│   ├── XrdCpShrink.cc
│   ├── XrdCpSlowWriter.cc
│   ├── XrdCpTruncate.cc
│   ├── XrdCpUpdate.cc
│   ├── XrdStress.cc
│   ├── XrdStress.hh
│   ├── benchmark/
│   │   ├── CMakeLists.txt
│   │   ├── ConfigProto.proto
│   │   ├── Configuration.cc
│   │   ├── Configuration.hh
│   │   ├── DirEos.cc
│   │   ├── DirEos.hh
│   │   ├── FileEos.cc
│   │   ├── FileEos.hh
│   │   ├── Namespace.hh
│   │   ├── ProtoIo.cc
│   │   ├── ProtoIo.hh
│   │   ├── Result.cc
│   │   ├── Result.hh
│   │   ├── ResultProto.proto
│   │   ├── eosbenchmark.cc
│   │   └── eosbenchmark.hh
│   ├── eos-accounting-test
│   ├── eos-acl-concurrent
│   ├── eos-altxs-test
│   ├── eos-backup
│   ├── eos-backup-browser
│   ├── eos-balance-test
│   ├── eos-bash
│   ├── eos-convert-test
│   ├── eos-defaultcc-test
│   ├── eos-drain-test
│   ├── eos-file-cont-detached-test
│   ├── eos-fsck-test
│   ├── eos-fst-close-test
│   ├── eos-groupdrain-test
│   ├── eos-grpc-test
│   ├── eos-http-upload-test
│   ├── eos-https-functional-test
│   ├── eos-instance-test
│   ├── eos-instance-test-ci
│   ├── eos-io-test
│   ├── eos-lru-test
│   ├── eos-macaroon-init
│   ├── eos-manila-test
│   ├── eos-oc-test
│   ├── eos-quota-test
│   ├── eos-rain-test
│   ├── eos-rclone-test
│   ├── eos-recycle-test
│   ├── eos-rename-test
│   ├── eos-squash-test
│   ├── eos-synctime-test
│   ├── eos-test-utils
│   ├── eos-timestamp-test
│   ├── eos-token-test
│   ├── eos-traffic-shaping-test
│   ├── eos_io_tool.cc
│   ├── eoscp-rain-test
│   ├── fuse/
│   │   └── eos-fuse-test
│   ├── fusex/
│   │   ├── eos-fusex-functional-test
│   │   └── eos-test-credential-bindings
│   ├── microbenchmarks/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── common/
│   │   │   ├── BM_AtomicPtr.cc
│   │   │   ├── BM_IdMap.cc
│   │   │   ├── BM_Random.cc
│   │   │   ├── BM_StringUtils.cc
│   │   │   ├── BM_ThreadId.cc
│   │   │   └── BM_XrdString.cc
│   │   ├── main.cc
│   │   ├── mgm/
│   │   │   ├── BM_FlatScheduler.cc
│   │   │   └── BM_RRSeed.cc
│   │   └── namespace/
│   │       └── ns_quarkdb/
│   │           ├── BM_NSLocking.cc
│   │           └── README.md
│   ├── mq/
│   │   ├── SharedHashLoadTest.cc
│   │   ├── XrdMqClientMaster.cc
│   │   ├── XrdMqClientTest.cc
│   │   ├── XrdMqClientWorker.cc
│   │   ├── XrdMqQueueDumper.cc
│   │   ├── XrdMqQueueFeeder.cc
│   │   ├── XrdMqQueueInjection.cc
│   │   ├── XrdMqSharedObjectBroadCastClient.cc
│   │   ├── XrdMqSharedObjectClient.cc
│   │   └── XrdMqSharedObjectQueueClient.cc
│   ├── test-eos-iam-mapfile.py
│   └── xrdstress
├── test.cmake
├── unit_tests/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── auth_plugin/
│   │   ├── AuthFsTest.cc
│   │   ├── Namespace.hh
│   │   ├── TestEnv.cc
│   │   └── TestEnv.hh
│   ├── common/
│   │   ├── AuditTests.cc
│   │   ├── BackOffInvokerTests.cc
│   │   ├── BufferManagerTests.cc
│   │   ├── ConcurrentQueueTests.cc
│   │   ├── ConfigStoreTests.cc
│   │   ├── ConfigTests.cc
│   │   ├── ContainerUtilsTests.cc
│   │   ├── CounterTests.cc
│   │   ├── EosTokenTests.cc
│   │   ├── FileIdTests.cc
│   │   ├── FileMapTests.cc
│   │   ├── FutureWrapperTests.cc
│   │   ├── GlobTests.cc
│   │   ├── InodeTests.cc
│   │   ├── LoggingTests.cc
│   │   ├── LoggingTestsUtils.cc
│   │   ├── MappingTestFixture.hh
│   │   ├── MappingTests.cc
│   │   ├── MemConfigStore.hh
│   │   ├── Namespace.hh
│   │   ├── ObserverMgrTests.cc
│   │   ├── PathTests.cc
│   │   ├── RWMutexTest.cc
│   │   ├── RandTests.cc
│   │   ├── RateLimitTests.cc
│   │   ├── RegexWrapperTests.cc
│   │   ├── SciTokensTests.cc
│   │   ├── ShardedCacheTests.cc
│   │   ├── StringConversionTests.cc
│   │   ├── StringSplitTests.cc
│   │   ├── StringTokenizerTests.cc
│   │   ├── StringUtilsTests.cc
│   │   ├── SymKeysTests.cc
│   │   ├── ThreadPoolTest.cc
│   │   ├── TimingTests.cc
│   │   ├── UriCapCipherTests.cc
│   │   ├── UtilsTests.cc
│   │   ├── VariousTests.cc
│   │   ├── WebNotifyTests.cc
│   │   ├── XrdConnPoolTests.cc
│   │   ├── async/
│   │   │   ├── ExecutorMgrTests.cc
│   │   │   ├── FollyExecutorFixture.hh
│   │   │   └── OpaqueFutureTests.cc
│   │   └── concurrency/
│   │       ├── AlignedAtomicArrayTests.cc
│   │       ├── AtomicUniquePtrTests.cc
│   │       ├── RCUTests.cc
│   │       └── ThreadEpochCounterTests.cc
│   ├── console/
│   │   ├── AclCmdTest.cc
│   │   ├── CmdsTests.cc
│   │   ├── ConsoleCompletionTest.cc
│   │   ├── ConsoleUtilTests.cc
│   │   ├── ParseCommentTest.cc
│   │   └── RegexUtilTest.cc
│   ├── fst/
│   │   ├── HealthTest.cc
│   │   ├── HttpHandlerFstFileCacheTests.cc
│   │   ├── LoadTests.cc
│   │   ├── MonitorVarPartitionTest.cc
│   │   ├── Namespace.hh
│   │   ├── NfsIoTests.cc
│   │   ├── ResponseCollectorTests.cc
│   │   ├── ScanDirTests.cc
│   │   ├── TestEnv.cc
│   │   ├── TestEnv.hh
│   │   ├── TmpDirTree.hh
│   │   ├── UtilsTest.cc
│   │   ├── WalkDirTreeTests.cc
│   │   ├── XrdFstOfsFileInternalTest.cc
│   │   ├── XrdFstOfsFileTest.cc
│   │   ├── XrdFstOfsTests.cc
│   │   ├── XrdFstOssFileTest.cc
│   │   ├── XrdIoTests.cc
│   │   └── main_fst.cc
│   ├── fusex/
│   │   └── StatTests.cc
│   ├── mgm/
│   │   ├── AccessTests.cc
│   │   ├── AclCmdTests.cc
│   │   ├── CapsTests.cc
│   │   ├── CommitHelperTests.cc
│   │   ├── ConversionInfoTests.cc
│   │   ├── CtaUtilsTests.cc
│   │   ├── EgroupTests.cc
│   │   ├── FileSystemRegistryTests.cc
│   │   ├── FsViewTests.cc
│   │   ├── FsckEntryTests.cc
│   │   ├── FusexCastBatchTests.cc
│   │   ├── HttpTests.cc
│   │   ├── IdTrackerTests.cc
│   │   ├── IostatTests.cc
│   │   ├── LRUTests.cc
│   │   ├── LockTrackerTests.cc
│   │   ├── PolicyTests.cc
│   │   ├── ProcFsTests.cc
│   │   ├── QuarkDBConfigTests.cc
│   │   ├── RecyclePolicyTests.cc
│   │   ├── RecycleTests.cc
│   │   ├── RoutingTests.cc
│   │   ├── XrdMgmOfsFileTests.cc
│   │   ├── XrdMgmOfsTests.cc
│   │   ├── bulk-request/
│   │   │   ├── BulkRequestPrepareManagerTest.cc
│   │   │   ├── MockPrepareMgmFSInterface.cc
│   │   │   ├── MockPrepareMgmFSInterface.hh
│   │   │   ├── PrepareManagerTest.cc
│   │   │   └── PrepareManagerTest.hh
│   │   ├── groupbalancer/
│   │   │   ├── BalancerEngineTypeTests.cc
│   │   │   ├── FreeSpaceBalancerTests.cc
│   │   │   ├── GroupBalancerUtilsTests.cc
│   │   │   ├── GroupsInfoFetcherTests.cc
│   │   │   ├── MinMaxBalancerEngineTests.cc
│   │   │   ├── StdDevBalancerEngineTests.cc
│   │   │   └── StdDrainerTests.cc
│   │   ├── groupdrainer/
│   │   │   ├── DrainProgressTrackerTests.cc
│   │   │   ├── GroupDrainerRetry.cc
│   │   │   └── GroupDrainerTests.cc
│   │   ├── http/
│   │   │   ├── HttpServerTests.cc
│   │   │   └── rest-api/
│   │   │       └── tape/
│   │   │           ├── JsonCPPTapeModelBuilderTest.cc
│   │   │           ├── JsonCPPTapeModelBuilderTest.hh
│   │   │           ├── RestApiTest.cc
│   │   │           └── RestApiTest.hh
│   │   ├── placement/
│   │   │   ├── ClusterMapFixture.hh
│   │   │   ├── ClusterMapTests.cc
│   │   │   ├── FsSchedulerTests.cc
│   │   │   ├── PlacementStrategyTests.cc
│   │   │   ├── RRSeedTests.cc
│   │   │   ├── SchedulerTests.cc
│   │   │   └── ThreadLocalRRSeedTests.cc
│   │   ├── tgc/
│   │   │   ├── CachedValueTests.cc
│   │   │   ├── FreedBytesHistogramTests.cc
│   │   │   ├── LruTests.cc
│   │   │   ├── MultiSpaceTapeGcTests.cc
│   │   │   ├── SmartSpaceStatsTests.cc
│   │   │   ├── SpaceToTapeGcMapTests.cc
│   │   │   └── TapeGcTests.cc
│   │   └── utils/
│   │       └── AttrHelperTests.cc
│   └── with_qdb/
│       ├── Main.cc
│       ├── TestUtils.cc
│       ├── TestUtils.hh
│       └── configuration.cc
└── utils/
    ├── CMakeLists.txt
    ├── README.osx
    ├── astylerc
    ├── centos7-dev-environment.sh
    ├── centos8-dev-environment.sh
    ├── clang-format-diff.py
    ├── el7-packages.sh
    ├── el9-dev-environment.sh
    ├── eos-cdmi-setup.sh
    ├── eos-fst-clean
    ├── eos-log-clean
    ├── eos-mgm-clean
    ├── eos-osx-package-prepare.sh
    ├── eos-osx-package.sh
    ├── eos-ports-block
    ├── eos-tty-broadcast
    ├── eos-uninstall
    ├── eos-xrootd-install.sh
    ├── eosx
    ├── filter-trace/
    │   ├── .gitignore
    │   ├── eos-filter-stacktrace
    │   └── test-eos-filter-stacktrace.py
    ├── flamegraph/
    │   ├── eos-make-flamegraph
    │   ├── eos-util-flamegraph
    │   └── eos-util-stackcollapse
    ├── get-xrootd-git-master.sh
    ├── make-keytab
    ├── replace-in-sources
    ├── route-http
    └── zstdtail.cc

================================================
FILE CONTENTS
================================================

================================================
FILE: .clang-format
================================================
Language: Cpp
AccessModifierOffset: -2
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignOperands: Align
AlignTrailingComments: true
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: AllDefinitions
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes
BinPackArguments: true
BinPackParameters: true
BraceWrapping:
  AfterClass: false
  AfterControlStatement: false
  AfterEnum: false
  AfterFunction: true
  AfterNamespace: false
  AfterObjCDeclaration: false
  AfterStruct: false
  AfterUnion: false
  BeforeCatch: false
  BeforeElse: false
  IndentBraces: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true
ColumnLimit: 90
CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: true
DerivePointerAlignment: false
DisableFormat: false
ExperimentalAutoDetectBinPacking: false
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
IncludeCategories:
  - Regex: '^"(llvm|llvm-c|clang|clang-c)/'
    Priority: 2
  - Regex: '^(<|"(gtest|isl|json)/)'
    Priority: 3
  - Regex: '.*'
    Priority: 1
IncludeIsMainRegex: '$'
IndentCaseLabels: false
IndentWidth: 2
IndentWrappedFunctionNames: false
KeepEmptyLinesAtTheStartOfBlocks: true
MacroBlockBegin: ''
MacroBlockEnd: ''
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None
ObjCBlockIndentWidth: 2
ObjCSpaceAfterProperty: false
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left
ReflowComments: Always
SortIncludes: true
SpaceAfterCStyleCast: false
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInContainerLiterals: true
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false
Standard: c++17
TabWidth: 8
UseTab: Never
JavaScriptQuotes: Leave
InsertBraces: true


================================================
FILE: .clang-tidy
================================================
---
Checks: 'clang-diagnostic-*,clang-analyzer-*,-clang-analyzer-alpha*,*,-cppcoreguidelines-pro-bounds-pointer-arithmetic,-cert-err61-cpp,-misc-throw-by-value-catch-by-reference,-clang-analyzer-alpha.deadcode.UnreachableCode,-cert-err58-cpp,-clang-analyzer-alpha.*,-clang-analyzer-security.insecureAPI.strcpy,-cppcoreguidelines-pro-type-vararg,-cppcoreguidelines-pro-type-reinterpret-cast,-google-runtime-int,-modernize-raw-string-literal,-cppcoreguidelines-pro-bounds-constant-array-index,-llvmlibc-*'
WarningsAsErrors: ''
HeaderFilterRegex: ''
AnalyzeTemporaryDtors: false
CheckOptions:
  - key: cert-dcl59-cpp.HeaderFileExtensions
    value: h,hh,hpp,hxx
  - key: cert-err61-cpp.CheckThrowTemporaries
    value: '1'
  - key: cert-oop11-cpp.IncludeStyle
    value: llvm
  - key: cert-oop11-cpp.UseCERTSemantics
    value: '1'
  - key: cppcoreguidelines-pro-bounds-constant-array-index.GslHeader
    value: ''
  - key: cppcoreguidelines-pro-bounds-constant-array-index.IncludeStyle
    value: '0'
  - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays
    value: '0'
  - key: google-build-namespaces.HeaderFileExtensions
    value: h,hh,hpp,hxx
  - key: google-global-names-in-headers.HeaderFileExtensions
    value: h
  - key: google-readability-braces-around-statements.ShortStatementLines
    value: '1'
  - key: google-readability-function-size.BranchThreshold
    value: '4294967295'
  - key: google-readability-function-size.LineThreshold
    value: '4294967295'
  - key: google-readability-function-size.StatementThreshold
    value: '800'
  - key: google-readability-namespace-comments.ShortNamespaceLines
    value: '10'
  - key: google-readability-namespace-comments.SpacesBeforeComments
    value: '2'
  - key: google-runtime-int.SignedTypePrefix
    value: int
  - key: google-runtime-int.TypeSuffix
    value: ''
  - key: google-runtime-int.UnsignedTypePrefix
    value: uint
  - key: llvm-namespace-comment.ShortNamespaceLines
    value: '1'
  - key: llvm-namespace-comment.SpacesBeforeComments
    value: '1'
  - key: misc-assert-side-effect.AssertMacros
    value: assert
  - key: misc-assert-side-effect.CheckFunctionCalls
    value: '0'
  - key: misc-dangling-handle.HandleClasses
    value: 'std::basic_string_view;std::experimental::basic_string_view'
  - key: misc-definitions-in-headers.HeaderFileExtensions
    value: ',h,hh,hpp,hxx'
  - key: misc-definitions-in-headers.UseHeaderFileExtension
    value: '1'
  - key: misc-misplaced-widening-cast.CheckImplicitCasts
    value: '1'
  - key: misc-move-constructor-init.IncludeStyle
    value: llvm
  - key: misc-move-constructor-init.UseCERTSemantics
    value: '0'
  - key: misc-sizeof-expression.WarnOnSizeOfCompareToConstant
    value: '1'
  - key: misc-sizeof-expression.WarnOnSizeOfConstant
    value: '1'
  - key: misc-sizeof-expression.WarnOnSizeOfThis
    value: '1'
  - key: misc-string-constructor.LargeLengthThreshold
    value: '8388608'
  - key: misc-string-constructor.WarnOnLargeLength
    value: '1'
  - key: misc-suspicious-missing-comma.MaxConcatenatedTokens
    value: '5'
  - key: misc-suspicious-missing-comma.RatioThreshold
    value: '0.200000'
  - key: misc-suspicious-missing-comma.SizeThreshold
    value: '5'
  - key: misc-suspicious-string-compare.StringCompareLikeFunctions
    value: ''
  - key: misc-suspicious-string-compare.WarnOnImplicitComparison
    value: '1'
  - key: misc-suspicious-string-compare.WarnOnLogicalNotComparison
    value: '0'
  - key: misc-throw-by-value-catch-by-reference.CheckThrowTemporaries
    value: '1'
  - key: modernize-loop-convert.MaxCopySize
    value: '16'
  - key: modernize-loop-convert.MinConfidence
    value: reasonable
  - key: modernize-loop-convert.NamingStyle
    value: CamelCase
  - key: modernize-pass-by-value.IncludeStyle
    value: llvm
  - key: modernize-replace-auto-ptr.IncludeStyle
    value: llvm
  - key: modernize-use-nullptr.NullMacros
    value: 'NULL'
  - key: performance-faster-string-find.StringLikeClasses
    value: 'std::basic_string'
  - key: performance-for-range-copy.WarnOnAllAutoCopies
    value: '0'
  - key: readability-braces-around-statements.ShortStatementLines
    value: '1'
  - key: readability-function-size.BranchThreshold
    value: '4294967295'
  - key: readability-function-size.LineThreshold
    value: '4294967295'
  - key: readability-function-size.StatementThreshold
    value: '800'
  - key: readability-identifier-naming.AbstractClassCase
    value: aNy_CasE
  - key: readability-identifier-naming.AbstractClassPrefix
    value: ''
  - key: readability-identifier-naming.AbstractClassSuffix
    value: ''
  - key: readability-identifier-naming.ClassCase
    value: aNy_CasE
  - key: readability-identifier-naming.ClassConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.ClassConstantPrefix
    value: ''
  - key: readability-identifier-naming.ClassConstantSuffix
    value: ''
  - key: readability-identifier-naming.ClassMemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.ClassMemberPrefix
    value: ''
  - key: readability-identifier-naming.ClassMemberSuffix
    value: ''
  - key: readability-identifier-naming.ClassMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.ClassMethodPrefix
    value: ''
  - key: readability-identifier-naming.ClassMethodSuffix
    value: ''
  - key: readability-identifier-naming.ClassPrefix
    value: ''
  - key: readability-identifier-naming.ClassSuffix
    value: ''
  - key: readability-identifier-naming.ConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstantMemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstantMemberPrefix
    value: ''
  - key: readability-identifier-naming.ConstantMemberSuffix
    value: ''
  - key: readability-identifier-naming.ConstantParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstantParameterPrefix
    value: ''
  - key: readability-identifier-naming.ConstantParameterSuffix
    value: ''
  - key: readability-identifier-naming.ConstantPrefix
    value: ''
  - key: readability-identifier-naming.ConstantSuffix
    value: ''
  - key: readability-identifier-naming.ConstexprFunctionCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstexprFunctionPrefix
    value: ''
  - key: readability-identifier-naming.ConstexprFunctionSuffix
    value: ''
  - key: readability-identifier-naming.ConstexprMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstexprMethodPrefix
    value: ''
  - key: readability-identifier-naming.ConstexprMethodSuffix
    value: ''
  - key: readability-identifier-naming.ConstexprVariableCase
    value: aNy_CasE
  - key: readability-identifier-naming.ConstexprVariablePrefix
    value: ''
  - key: readability-identifier-naming.ConstexprVariableSuffix
    value: ''
  - key: readability-identifier-naming.EnumCase
    value: aNy_CasE
  - key: readability-identifier-naming.EnumConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.EnumConstantPrefix
    value: ''
  - key: readability-identifier-naming.EnumConstantSuffix
    value: ''
  - key: readability-identifier-naming.EnumPrefix
    value: ''
  - key: readability-identifier-naming.EnumSuffix
    value: ''
  - key: readability-identifier-naming.FunctionCase
    value: aNy_CasE
  - key: readability-identifier-naming.FunctionPrefix
    value: ''
  - key: readability-identifier-naming.FunctionSuffix
    value: ''
  - key: readability-identifier-naming.GlobalConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.GlobalConstantPrefix
    value: ''
  - key: readability-identifier-naming.GlobalConstantSuffix
    value: ''
  - key: readability-identifier-naming.GlobalFunctionCase
    value: aNy_CasE
  - key: readability-identifier-naming.GlobalFunctionPrefix
    value: ''
  - key: readability-identifier-naming.GlobalFunctionSuffix
    value: ''
  - key: readability-identifier-naming.GlobalVariableCase
    value: aNy_CasE
  - key: readability-identifier-naming.GlobalVariablePrefix
    value: ''
  - key: readability-identifier-naming.GlobalVariableSuffix
    value: ''
  - key: readability-identifier-naming.IgnoreFailedSplit
    value: '0'
  - key: readability-identifier-naming.InlineNamespaceCase
    value: aNy_CasE
  - key: readability-identifier-naming.InlineNamespacePrefix
    value: ''
  - key: readability-identifier-naming.InlineNamespaceSuffix
    value: ''
  - key: readability-identifier-naming.LocalConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.LocalConstantPrefix
    value: ''
  - key: readability-identifier-naming.LocalConstantSuffix
    value: ''
  - key: readability-identifier-naming.LocalVariableCase
    value: aNy_CasE
  - key: readability-identifier-naming.LocalVariablePrefix
    value: ''
  - key: readability-identifier-naming.LocalVariableSuffix
    value: ''
  - key: readability-identifier-naming.MemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.MemberPrefix
    value: ''
  - key: readability-identifier-naming.MemberSuffix
    value: ''
  - key: readability-identifier-naming.MethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.MethodPrefix
    value: ''
  - key: readability-identifier-naming.MethodSuffix
    value: ''
  - key: readability-identifier-naming.NamespaceCase
    value: aNy_CasE
  - key: readability-identifier-naming.NamespacePrefix
    value: ''
  - key: readability-identifier-naming.NamespaceSuffix
    value: ''
  - key: readability-identifier-naming.ParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.ParameterPackCase
    value: aNy_CasE
  - key: readability-identifier-naming.ParameterPackPrefix
    value: ''
  - key: readability-identifier-naming.ParameterPackSuffix
    value: ''
  - key: readability-identifier-naming.ParameterPrefix
    value: ''
  - key: readability-identifier-naming.ParameterSuffix
    value: ''
  - key: readability-identifier-naming.PrivateMemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.PrivateMemberPrefix
    value: ''
  - key: readability-identifier-naming.PrivateMemberSuffix
    value: ''
  - key: readability-identifier-naming.PrivateMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.PrivateMethodPrefix
    value: ''
  - key: readability-identifier-naming.PrivateMethodSuffix
    value: ''
  - key: readability-identifier-naming.ProtectedMemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.ProtectedMemberPrefix
    value: ''
  - key: readability-identifier-naming.ProtectedMemberSuffix
    value: ''
  - key: readability-identifier-naming.ProtectedMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.ProtectedMethodPrefix
    value: ''
  - key: readability-identifier-naming.ProtectedMethodSuffix
    value: ''
  - key: readability-identifier-naming.PublicMemberCase
    value: aNy_CasE
  - key: readability-identifier-naming.PublicMemberPrefix
    value: ''
  - key: readability-identifier-naming.PublicMemberSuffix
    value: ''
  - key: readability-identifier-naming.PublicMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.PublicMethodPrefix
    value: ''
  - key: readability-identifier-naming.PublicMethodSuffix
    value: ''
  - key: readability-identifier-naming.StaticConstantCase
    value: aNy_CasE
  - key: readability-identifier-naming.StaticConstantPrefix
    value: ''
  - key: readability-identifier-naming.StaticConstantSuffix
    value: ''
  - key: readability-identifier-naming.StaticVariableCase
    value: aNy_CasE
  - key: readability-identifier-naming.StaticVariablePrefix
    value: ''
  - key: readability-identifier-naming.StaticVariableSuffix
    value: ''
  - key: readability-identifier-naming.StructCase
    value: aNy_CasE
  - key: readability-identifier-naming.StructPrefix
    value: ''
  - key: readability-identifier-naming.StructSuffix
    value: ''
  - key: readability-identifier-naming.TemplateParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.TemplateParameterPrefix
    value: ''
  - key: readability-identifier-naming.TemplateParameterSuffix
    value: ''
  - key: readability-identifier-naming.TemplateTemplateParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.TemplateTemplateParameterPrefix
    value: ''
  - key: readability-identifier-naming.TemplateTemplateParameterSuffix
    value: ''
  - key: readability-identifier-naming.TypeTemplateParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.TypeTemplateParameterPrefix
    value: ''
  - key: readability-identifier-naming.TypeTemplateParameterSuffix
    value: ''
  - key: readability-identifier-naming.TypedefCase
    value: aNy_CasE
  - key: readability-identifier-naming.TypedefPrefix
    value: ''
  - key: readability-identifier-naming.TypedefSuffix
    value: ''
  - key: readability-identifier-naming.UnionCase
    value: aNy_CasE
  - key: readability-identifier-naming.UnionPrefix
    value: ''
  - key: readability-identifier-naming.UnionSuffix
    value: ''
  - key: readability-identifier-naming.ValueTemplateParameterCase
    value: aNy_CasE
  - key: readability-identifier-naming.ValueTemplateParameterPrefix
    value: ''
  - key: readability-identifier-naming.ValueTemplateParameterSuffix
    value: ''
  - key: readability-identifier-naming.VariableCase
    value: aNy_CasE
  - key: readability-identifier-naming.VariablePrefix
    value: ''
  - key: readability-identifier-naming.VariableSuffix
    value: ''
  - key: readability-identifier-naming.VirtualMethodCase
    value: aNy_CasE
  - key: readability-identifier-naming.VirtualMethodPrefix
    value: ''
  - key: readability-identifier-naming.VirtualMethodSuffix
    value: ''
  - key: readability-simplify-boolean-expr.ChainedConditionalAssignment
    value: '0'
  - key: readability-simplify-boolean-expr.ChainedConditionalReturn
    value: '0'


================================================
FILE: .codeclimate.yml
================================================
plugins:
  cppcheck:
    enabled: true


================================================
FILE: .ctest/config.cmake
================================================
# This file is meant to contain set commands for options
# you'd normally set at configuration when calling CMake.

# For example, to compile with C++20, uncomment the line below
# set(CMAKE_CXX_STANDARD 20 CACHE STRING "C++Standard")


================================================
FILE: .git-blame-ignore-revs
================================================
# This file contains a list of commits that should be ignored by some git commands including `git blame`.
# You may need to enable this feature in your git configuration by running:
# - git config blame.ignoreRevsFile .git-blame-ignore-revs
# Web interfaces of git such as GitHub and GitLab also support this feature.
# Commits that do not add or change any functionality but only reformat the code or fix typos should be added to this file. This way, when you run `git blame` on a file, you won't see these commits and can focus on the commits that actually changed the code.
# The following command can be run to check if any of the commits in this file are missing from the history:
# - for rev in $(grep -vE '^#|^$' .git-blame-ignore-revs); do git rev-parse -q --verify "${rev}^{commit}" >/dev/null || echo "Missing: $rev"; done

fd828b6155b3caf28676b4568065c0911529618b
f4b1931dd80ca8708b7802080eb468d5f7a19bda
683def495afe2567b108fb0de9ad8d3eb1ec43c8


================================================
FILE: .gitignore
================================================
*.lo
*.o
*.la
*.pyc
.libs
.deps
Makefile
Makefile.in
Console/eos
console/iam.cfg
XrdMqOfs/xrdmqclientmaster
XrdMqOfs/xrdmqclienttest
XrdMqOfs/xrdmqclientworker
XrdMqOfs/xrdmqcryptotest
XrdMqOfs/xrdmqdumper
aclocal.m4
autom4te.cache
config.guess
config.log
config.status
config.sub
configure
depcomp
eos.spec
install-sh
libtool
ltmain.sh
missing
doxy.log
doxydoc
*~
Namespace/tests/text_runner
valgrind.supp
eos-log-repair
/build*/
__pycache__
kineticio-dist.tgz
# clion specific configs
/cmake-build*/
/.idea/
# eclipse specific configs
/.settings/
.cproject
.project
.vscode
nbproject
my_clang_cache.cmake
# ccache specific configs
/ccache/
# documentation artifacts
doc/_build/
doc/html/
debian/control

# ApMon specific
ApMon/*.tar.gz
ApMon/rpmbuild*
ApMon/eos-apmon-*
!ApMon/Makefile

# clangd file
compile_commands.json
.cache


================================================
FILE: .gitlab-ci.yml
================================================
# ************************************************************************
# * EOS - the CERN Disk Storage System                                   *
# * Copyright (C) 2023 CERN/Switzerland                                  *
# *                                                                      *
# * This program is free software: you can redistribute it and/or modify *
# * it under the terms of the GNU General Public License as published by *
# * the Free Software Foundation, either version 3 of the License, or    *
# * (at your option) any later version.                                  *
# *                                                                      *
# * This program is distributed in the hope that it will be useful,      *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
# * GNU General Public License for more details.                         *
# *                                                                      *
# * You should have received a copy of the GNU General Public License    *
# * along with this program.  If not, see <http://www.gnu.org/licenses/>.*
# ************************************************************************

stages:
  - build:manual
  - pre-commit
  - prebuild
  - build:rpm
  - build:dockerimage
  - test
  - publish
  - clean

variables:
  CODENAME: "diopside"

default:
  interruptible: true
  before_script:
    - source gitlab-ci/export_commit-type.sh
    - echo "Exporting COMMIT_TYPE=${COMMIT_TYPE}"

include:
  # - template: Code-Quality.gitlab-ci.yml
  #  - local: /gitlab-ci/.gitlab-ci-test-dock_include.yml @note on the file
  #  - local: /gitlab-ci/.gitalb-ci-build-macos.yml
  - local: /gitlab-ci/.gitlab-ci-build-ubuntu.yml
  - local: /gitlab-ci/.gitlab-ci-test-k8s_include.yml
  - local: /gitlab-ci/.gitlab-ci-test-helm_include.yml

workflow:
  auto_cancel:
    on_new_commit: interruptible

  rules:
    - if: $CI_COMMIT_BRANCH
      variables:
        #KOJI_SCRATCH: "--scratch --skip-tag"
        KOJI_SCRATCH: "--scratch"
    - if: $CI_COMMIT_TAG
      variables:
        KOJI_SCRATCH: ""
#-------------------------------------------------------------------------------
# Prebuild
#-------------------------------------------------------------------------------
.doc-skip:
  stage: .pre
  script:
    - |
      if git diff --name-only $CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA | grep -qv '^docs/'; then
         echo "Non doc changes detected, running full pipeline"
         exit 0
      fi
      echo "Documentation-only changes detected. Skipping pipeline."
      # In an ideal world this job failing at the top should not trigger builds
      # we don't live in that world! In order to avoid creating more complex
      # dependency graphs, we just cancel the pipeline
      curl -X POST -H "PRIVATE-TOKEN: $GITLAB_CI_TOKEN" "$CI_API_V4_URL/projects/$CI_PROJECT_ID/pipelines/$CI_PIPELINE_ID/cancel"
      exit 1
  allow_failure: true
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule"'
      when: never
    - changes:
        - docs/**/*
      when: always
    - when: never


.prebuild-template: &prebuild-template_definition
  stage: prebuild
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - export DESTINATION="gitlab-registry.cern.ch/dss/eos/prebuild-${PREBUILD_NAME}-${CODENAME}"
    - export DOCKERFILE="$CI_PROJECT_DIR/gitlab-ci/prebuild_OSbase/prebuild-${PREBUILD_NAME}.Dockerfile"
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json
    # no need yet for --build-arg PREBUILD_NAME="$PREBUILD_NAME" --build-arg CMAKE_OPTIONS="$CMAKE_OPTIONS" --build-arg CXXFLAGS="$CXXFLAGS"
    - /kaniko/executor --cache="false" --destination $DESTINATION --dockerfile $DOCKERFILE --context $CI_PROJECT_DIR --build-arg=EOS_CODENAME="${CODENAME}" --compressed-caching=false --use-new-run
  only:
    variables:
      - $PREBUILD_TRIGGER


prebuild-el8:
  extends: .prebuild-template
  variables:
    PREBUILD_NAME: el8


prebuild-el9:
  extends: .prebuild-template
  variables:
    PREBUILD_NAME: el9


prebuild-el10:
  extends: .prebuild-template
  variables:
    PREBUILD_NAME: el10


prebuild-el9-arm64:
  extends: .prebuild-template
  variables:
    PREBUILD_NAME: el9-arm64
  tags:
    - k8s-arm


.prebuild-el9_coverage:
  extends: .prebuild-template
  variables:
    PREBUILD_NAME: el9_coverage
  only:
    variables:
      - $COVERAGE_SCHEDULE


clone_docker:
  stage: build:rpm
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  script:
    - dnf install --nogpg -y git
    - git clone https://gitlab.cern.ch/eos/eos-docker.git
  artifacts:
    expire_in: 1 day
    paths:
      - eos-docker/


#-------------------------------------------------------------------------------
# Build RPMs
#-------------------------------------------------------------------------------

.build-template: &build-template_definition
  stage: build:rpm
  variables:
    PKG_MGR: dnf
    CMAKE_BIN: cmake
  script:
    - git submodule sync --recursive && git submodule update --init -f --recursive
    - mkdir build; cd build; ${CMAKE_BIN} .. -DPACKAGEONLY=1 -DEOS_GRPC_GW=1 -Wno-dev; make srpm; cd ..;
    - echo -e "[eos-depend]\nname=EOS dependencies\nbaseurl=http://storage-ci.web.cern.ch/storage-ci/eos/${CODENAME}-depend/el-$(rpm --eval '%{rhel}')/$(uname -m)/\ngpgcheck=0\nenabled=1\npriority=2\n" >> /etc/yum.repos.d/eos-depend.repo
    - |
      if [[ ${PKG_MGR} == "yum" ]]; then
        ${PKG_MGR} remove --nogpgcheck -y eos-xrootd;
        ${PKG_MGR}-builddep --nogpgcheck -y --setopt="cern*.exclude=xrootd*" build/SRPMS/*;
      else
        ${PKG_MGR} builddep --nogpgcheck --allowerasing -y --setopt="cern*.exclude=xrootd*" build/SRPMS/*;
      fi
    - |
      if [[ -n "$CI_COMMIT_TAG" ]]; then
        export CCACHE_DISABLE=1;
        ${PKG_MGR} install -y gnupg2;
      else
        source gitlab-ci/setup_ccache.sh;
      fi
    - rpmbuild --rebuild --with server --with eos_grpc_gateway --define "_rpmdir build/RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" build/SRPMS/* | (ts 2> /dev/null || true; tee)
    - ccache -s
    - if [[ -n "$CI_COMMIT_TAG" ]]; then gpg2 --batch --import $STCI_REPO_KEY; printf "" | setsid rpmsign --define='%_gpg_name stci@cern.ch' --define='%_signature gpg' --addsign build/RPMS/*.rpm; fi
    - mkdir ${BUILD_NAME}_artifacts; cp -rv build/*RPMS/ build/eos-*.tar.gz ${BUILD_NAME}_artifacts
  cache:
    key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
    paths:
      - ccache/
  artifacts:
    expire_in: 60 days
    paths:
      - ${BUILD_NAME}_artifacts/


build_el8:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el8-${CODENAME}
  variables:
    BUILD_NAME: el-8
  extends: .build-template
  only:
    - schedules
    - tags


build_el9:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-${CODENAME}
  variables:
    BUILD_NAME: el-9
  extends: .build-template


build_el10:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el10-${CODENAME}
  variables:
    BUILD_NAME: el-10
  extends: .build-template
  only:
    - schedules
    - tags


build_el9_arm64:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-arm64-${CODENAME}
  variables:
    BUILD_NAME: el-9-arm64
  extends: .build-template
  tags:
    - k8s-arm
  only:
    - schedules
    - tags


#-------------------------------------------------------------------------------
# EOS client builds for RHEL
#-------------------------------------------------------------------------------

.build-client-srpm-template: &build-client-srpm-template_definition
  stage: build:rpm
  script:
    - dnf config-manager --add-repo https://linuxsoft.cern.ch/cern/rhel/$(rpm --eval '%{rhel}')/CERN/$(uname -m)/ --set-enabled
    - dnf install cern-gpg-keys --nogpgcheck -y
    - rpm --import /etc/pki/rpm-gpg/* || true
    - dnf install rpm-build cmake gcc-c++ git -y
    - git submodule sync --recursive && git submodule update --init -f --recursive
    - mkdir -pv build; cd build;
    - cmake ../ -DPACKAGEONLY=1 -DCLIENT=1 -Wno-dev
    - make srpm; cd ..;
    - mkdir -p ${CI_JOB_NAME}_artifacts
    - cp -rv build/SRPMS/ ${CI_JOB_NAME}_artifacts
  artifacts:
    expire_in: 60 days
    paths:
      - ${CI_JOB_NAME}_artifacts
  only:
    - schedules
    - tags


rh-8:
 extends: .build-client-srpm-template
 image: gitlab-registry.cern.ch/linuxsupport/ubi8/ubi


rh-9:
 extends: .build-client-srpm-template
 image: gitlab-registry.cern.ch/linuxsupport/ubi9/ubi


rh-10:
 extends: .build-client-srpm-template
 image: gitlab-registry.cern.ch/linuxsupport/ubi10/ubi


#-------------------------------------------------------------------------------
# Fedora builds
#-------------------------------------------------------------------------------

.build-fedora-template: &build-fedora-template_definition
  stage: build:rpm
  script:
    - dnf install --nogpg -y gcc-c++ cmake make rpm-build which git tar dnf-plugins-core ccache rpm-sign
    - git submodule sync --recursive && git submodule update --init -f --recursive
    - mkdir build; cd build
    - cmake .. -DPACKAGEONLY=1 -Wno-dev; make srpm; cd ..
    - echo -e "[eos-depend]\nname=EOS dependencies\nbaseurl=http://storage-ci.web.cern.ch/storage-ci/eos/${CODENAME}-depend/${BUILD_NAME}/x86_64/\ngpgcheck=0\nenabled=1\nexclude=xrootd*\npriority=4\n" > /etc/yum.repos.d/eos-depend.repo
    - dnf builddep --nogpgcheck --allowerasing -y build/SRPMS/*
    - if [[ -n "$CI_COMMIT_TAG" ]]; then export CCACHE_DISABLE=1; else source gitlab-ci/setup_ccache_fc.sh; fi
    - rpmbuild --rebuild --with server --define "_rpmdir build/RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" build/SRPMS/*
    - ccache -s
    - if [[ -n "$CI_COMMIT_TAG" ]]; then gpg2 --batch --import $STCI_REPO_KEY; printf "" | setsid rpmsign --define='%_gpg_name stci@cern.ch' --define='%_signature gpg' --addsign build/RPMS/*.rpm; fi
    - mkdir ${BUILD_NAME}_artifacts; cp -R build/SRPMS build/RPMS ${BUILD_NAME}_artifacts
  cache:
    key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
    paths:
      - ccache/
  artifacts:
    expire_in: 60 days
    paths:
      - ${BUILD_NAME}_artifacts/
  allow_failure: true


build_fedora_38:
  extends: .build-fedora-template
  image: registry.fedoraproject.org/fedora:38
  variables:
    BUILD_NAME: fc-38
  only:
    - schedules
    - tags


build_fedora_rawhide:
  extends: .build-fedora-template
  image: registry.fedoraproject.org/fedora:rawhide
  variables:
    BUILD_NAME: fc-rawhide
  only:
    - schedules
  when: manual


#-------------------------------------------------------------------------------
# Exotic builds
#-------------------------------------------------------------------------------

.build_exotic-template: &build_exotic-template_definition
  stage: build:rpm
  variables:
    PKG_MGR: dnf
    CMAKE_CMD: cmake3
  script:
    - export DIST=$(rpm --eval '%{rhel}')
    - ${PKG_MGR} install -y git ccache tar sudo which tar gzip moreutils
    - git submodule sync --recursive && git submodule update --init -f --recursive
    - mkdir build; cd build
    - ${CMAKE_CMD} .. -DPACKAGEONLY=1 ${CMAKE_OPTIONS} -Wno-dev
    - make srpm; cd ..;
    - |
      if [[ "$RPMBUILD_OPTIONS" == *asan* ]]; then
        echo -e "[eos-asan-depend]\nname=EOS dependencies\nbaseurl=http://storage-ci.web.cern.ch/storage-ci/eos/${CODENAME}-depend/el-${DIST}-asan/x86_64/\ngpgcheck=0\nenabled=1\npriority=2\n" > /etc/yum.repos.d/eos-depend.repo;
        # Install the asan enabled dependencies
        ${PKG_MGR} remove -y eos-xrootd eos-folly eos-grpc eos-rocksdb || true;
      elif [[ "$RPMBUILD_OPTIONS" == *tsan* ]]; then
        echo -e "[eos-tsan-depend]\nname=EOS dependencies\nbaseurl=http://storage-ci.web.cern.ch/storage-ci/eos/${CODENAME}-depend/el-${DIST}-tsan/x86_64/\ngpgcheck=0\nenabled=1\npriority=2\n" > /etc/yum.repos.d/eos-depend.repo;
        # Install the tsan enabled dependencies
        ${PKG_MGR} remove -y eos-xrootd eos-folly eos-grpc eos-rocksdb || true;
      else
        echo -e "[eos-depend]\nname=EOS dependencies\nbaseurl=http://storage-ci.web.cern.ch/storage-ci/eos/${CODENAME}-depend/el-${DIST}/x86_64/\ngpgcheck=0\nenabled=1\npriority=2\n" > /etc/yum.repos.d/eos-depend.repo;
      fi
    - |
      if [[ ${PKG_MGR} == "yum" ]]; then
        ${PKG_MGR}-builddep --nogpgcheck --setopt="cern*.exclude=xrootd*" -y build/SRPMS/*
      else
        ${PKG_MGR} install -y dnf-plugins-core
        ${PKG_MGR} builddep --nogpgcheck --setopt="cern*.exclude=xrootd*" -y build/SRPMS/*
      fi
    - mkdir -p ${BUILD_NAME}_artifacts
    - if [[ -n "$CI_COMMIT_TAG" ]]; then export CCACHE_DISABLE=1; else source gitlab-ci/setup_ccache.sh; fi
    - rpmbuild --rebuild ${RPMBUILD_OPTIONS} --define "_rpmdir build/RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" build/SRPMS/* | ts
    - ccache -s
    - if [[ -n "$CI_COMMIT_TAG" ]]; then gpg2 --batch --import $STCI_REPO_KEY; printf "" | setsid rpmsign --define='%_gpg_name stci@cern.ch' --define='%_signature gpg' --addsign build/RPMS/*.rpm; fi
    - cp -R build/SRPMS/ build/RPMS/ ${BUILD_NAME}_artifacts
  cache:
    key: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
    paths:
      - ccache/
  artifacts:
    expire_in: 1 day
    paths:
      - ${BUILD_NAME}_artifacts/
  dependencies: []
  allow_failure: true


build_el9_asan:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-${CODENAME}
  variables:
    CMAKE_CMD: cmake
    BUILD_NAME: el-9-asan
    CMAKE_OPTIONS: "-DASAN=1"
    RPMBUILD_OPTIONS: "--with server --with asan"
    CXXFLAGS: "-Wno-parentheses"    # Avoid boost header compilation errors
  before_script:
    - ${PKG_MGR} install -y epel-release libasan cmake gcc gcc-c++ rpmdevtools
  extends: .build_exotic-template
  when: manual


build_client_el9_tsan:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-${CODENAME}
  variables:
    CMAKE_CMD: cmake
    BUILD_NAME: el-9-tsan
    CMAKE_OPTIONS: "-DTSAN=1"
    RPMBUILD_OPTIONS: "--with tsan"
    CXXFLAGS: "-Wno-parentheses"    # Avoid boost header compilation errors
  before_script:
    - ${PKG_MGR} install -y epel-release libtsan cmake gcc gcc-c++ which rpmdevtools
  extends: .build_exotic-template
  when: manual


build_el9_clang:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-${CODENAME}
  variables:
    BUILD_NAME: el-9-clang
    CMAKE_OPTIONS: "-DCLANG_BUILD=1"
    RPMBUILD_OPTIONS: "--with clang --with server"
  extends: .build_exotic-template
  only:
    - schedules
    - triggers


# @note Please contact CTA team / jleduc if you want to change this job
build_cc7_opt_xrootd:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-cc7-${CODENAME}
  variables:
    PKG_MGR: yum
    BUILD_NAME: cc7_opt_xrootd
    CMAKE_OPTIONS: "-DEOS_XROOTD=1"
    RPMBUILD_OPTIONS: "--with eos_xrootd_rh"
  before_script:
    - sed -i "s/pgm \/usr\/bin\/xrdcp/pgm \/bin\/true/g" misc/etc/xrd.cf.fst
  except:
    - tags
  extends: .build_exotic-template
  when: manual


build_el9_coverage:
  image: gitlab-registry.cern.ch/dss/eos/prebuild-el9-${CODENAME}
  variables:
    BUILD_NAME: el9_coverage
    RPMBUILD_OPTIONS: "--with coverage"
  only:
    variables:
      - $COVERAGE_SCHEDULE
  extends: .build_exotic-template

#-------------------------------------------------------------------------------
# Build docker images
#-------------------------------------------------------------------------------

.build_dockerimage-template:
  stage: build:dockerimage
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  variables:
    EXTRA_TAG: ""
  script:
    # @note keep $CACHE orthogonal to $IMAGE_TAG, do not join the "if"s
    - if [[ -n "$CI_COMMIT_TAG" ]] || [[ "x$CI_PIPELINE_SOURCE" == "xschedule" ]];
      then CACHE="false";
      else CACHE="true";
      fi
    - if [[ -n "$CI_COMMIT_TAG" ]];
      then IMAGE_TAG="$CI_COMMIT_TAG${OS_TAG}${EXTRA_TAG}";
      else IMAGE_TAG="$CI_COMMIT_SHORT_SHA${OS_TAG}${EXTRA_TAG}";
      fi
    - IMAGE_REPO="gitlab-registry.cern.ch/dss/eos/eos-ci"
    - DESTINATION="${IMAGE_REPO}:${IMAGE_TAG}"
    - echo "CACHE=$CACHE - DESTINATION=$DESTINATION"
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --cache=$CACHE --destination $DESTINATION --dockerfile $DOCKERFILE --context $CI_PROJECT_DIR --build-arg=EOS_CODENAME="${CODENAME}" --compressed-caching=false --use-new-run
  retry: 1


el9_docker_image:
  extends: .build_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/Dockerfile_el9
    OS_TAG: ".el9"
  needs:
    - job: clone_docker
    - job: build_el9

el10_docker_image:
  extends: .build_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/Dockerfile_el10
    OS_TAG: ".el10"
  needs:
    - job: clone_docker
    - job: build_el10
  only:
    - schedules
    - tags


el9_asan_docker_image:
  extends: .build_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/Dockerfile_el9_asan
    EXTRA_TAG: "_asan"
    OS_TAG: ".el9"
  needs:
    - job: clone_docker
    - job: build_el9_asan
  when: manual
  allow_failure: true


.el9_coverage_docker_image:
  extends: .build_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/Dockerfile_coverage
    EXTRA_TAG: "_coverage"
    OS_TAG: ".el9"
  needs:
    - job: clone_docker
    - job: build_el9_coverage
  only:
    variables:
      - $COVERAGE_SCHEDULE
  allow_failure: true


#-------------------------------------------------------------------------------
# Code quality, from codeclimate plugins - disabled
#-------------------------------------------------------------------------------

# .code_quality:
#   artifacts:
#     paths: [gl-code-quality-report.json]
#   rules:
#     - if: '$CI_PIPELINE_SOURCE == "schedule"'
#       allow_failure: true

# .code_quality_html:
#   extends: code_quality
#   variables:
#     REPORT_FORMAT: html
#   artifacts:
#     paths: [gl-code-quality-report.html]

#-------------------------------------------------------------------------------
# Dock8rnetes testing framework (exec_cmd wraps both docker and k8s!)
#-------------------------------------------------------------------------------

.dock8s_before_script_template: &dock8s_before_script_template
  stage: test
  before_script:
    - case $CI_JOB_NAME in
      "k8s"*  )
        source ./gitlab-ci/before_script_k8s_test.sh;
        source ./gitlab-ci/utilities_func_for_tests.sh --type k8s $K8S_NAMESPACE ;;
      "dock"* )
        source ./gitlab-ci/before_script_docker_test.sh;
        source ./gitlab-ci/utilities_func_for_tests.sh --type docker; ;;
      esac
  variables:
    OS_TAG: ".el9"


.dock8s_after_script_template: &dock8s_after_script_template
  after_script:
    - case $CI_JOB_NAME in
      "k8s"*  )
        source ./gitlab-ci/after_script_k8s_test.sh ;;
      "dock"* )
        source ./gitlab-ci/after_script_docker_test.sh ;;
      esac


.dock8s_system_test_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    - date
    - exec_cmd eos-mgm1 'eos ns mutex --toggleorder'
    - exec_cmd eos-mgm1 'eos-instance-test-ci'
    - date
    - exec_cmd eos-mgm1 'eos-unit-tests-with-instance -n root://localhost//eos/dockertest/'
    - exec_cmd eos-mgm1 'grep "RWMutex. Order Checking Error in thread" /var/log/eos/mgm/xrdlog.mgm && exit 1 || exit 0'
    - date
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-test-utils ./eos-test-utils; chmod +x eos-test-utils
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-fst-close-test ./eos-fst-close-test; chmod +x eos-fst-close-test
    - case $CI_JOB_NAME in
      "k8s"*  )
        export EOS_MGM_URL="root://eos-mgm1.eos-mgm1.$K8S_NAMESPACE.svc.cluster.local";
        ./eos-fst-close-test --mgm ${EOS_MGM_URL} --type k8s $K8S_NAMESPACE ;;
      "dock"* )
        ./eos-fst-close-test --type docker ;;
      esac
    - date
  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/


.dock8s_convert_fsck_recycle_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-test-utils ./eos-test-utils; chmod +x eos-test-utils
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-convert-test ./eos-convert-test; chmod +x eos-convert-test
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-fsck-test ./eos-fsck-test; chmod +x eos-fsck-test
    - cp_to_local_cmd eos-cli1:/usr/sbin/eos-recycle-test ./eos-recycle-test; chmod +x eos-recycle-test
    - case $CI_JOB_NAME in
      "k8s"*  )
        ./eos-convert-test --type k8s $K8S_NAMESPACE;
        ./eos-fsck-test --max-delay 600 --type k8s $K8S_NAMESPACE;
        ./eos-recycle-test --type k8s $K8S_NAMESPACE;;
      "dock"* )
        ./eos-convert-test --type docker;
        ./eos-fsck-test --max-delay 600 --type docker;
        ./eos-recycle-test --type docker;;
      esac
    - rm -rf eos-test-utils
    - rm -rf eos-convert-test
    - rm -rf eos-fsck-test
    - rm -rf eos-recycle-test

  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/


.dock8s_rtb_clone_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    # prepare mountpoints
    - exec_cmd eos-cli1 'atd; at now <<< "mkdir -p /eos1/ && mount -t fuse eosxd -ofsname=mount-1 /eos1/; mkdir -p /eos2/ && mount -t fuse eosxd -ofsname=mount-2 /eos2/;"'
    - exec_cmd eos-cli1 'count=0; while [[ $count -le 10 ]] && ( [[ ! -d /eos1/dockertest/ ]] || [[ ! -d /eos2/dockertest/ ]] ); do echo "Wait for mount... $count"; (( count++ )); sleep 1; done;'
    # download tests repo
    - exec_cmd eos-cli1 'git clone https://gitlab.cern.ch/dss/eosclient-tests.git'
    - exec_cmd eos-cli1 'cd /eosclient-tests && pip install -r requirements.txt'
    # ubuntu releases do not support 'clone' yet, skip its test
    - case $CI_JOB_NAME in
      "ub_focal"* | "ub_jammy"* ) ;;
      *                          ) exec_cmd eos-cli1 'cd /eosclient-tests; clone_tests/clone_test.sh prepare; rc=$?; exit $rc' ;;
      esac
  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/


.dock8s_fusex_test_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    # prepare mountpoints
    - exec_cmd eos-cli1 'atd; at now <<< "mkdir -p /eos1/ && mount -t fuse eosxd -ofsname=mount-1 /eos1/; mkdir -p /eos2/ && mount -t fuse eosxd -ofsname=mount-2 /eos2/;"'
    - exec_cmd eos-cli1 'count=0; while [[ $count -le 10 ]] && ( [[ ! -d /eos1/dockertest/ ]] || [[ ! -d /eos2/dockertest/ ]] ); do echo "Wait for mount... $count"; (( count++ )); sleep 1; done;'
    # fusex functional bindings
    - exec_cmd eos-cli1 'atd; at now <<< "mkdir -p /eosfunctionaltest/ && mount -t fuse eosxd -ofsname=eosdockertest /eosfunctionaltest/;"'
    - exec_cmd eos-cli1 'count=0; while [[ $count -le 10 ]] && [[ ! -d /eosfunctionaltest/dockertest/ ]] ; do echo "Wait for mount... $count"; (( count++ )); sleep 1; done;'
    - exec_cmd eos-cli1 'su eos-user -c "mkdir -m 700 -p /eosfunctionaltest/dockertest/credentialtest/ && cd /eosfunctionaltest/dockertest/credentialtest/"'
    - exec_cmd eos-cli1 'su eos-user -c "eos-test-credential-bindings /eosfunctionaltest/dockertest/credentialtest/"'
    # fusex benchmark
    - exec_cmd eos-mgm1 'eos ns mutex --toggleorder'
    - exec_cmd eos-cli1 'su eos-user -c "mkdir -p /eos1/dockertest/fusex_tests/ && cd /eos1/dockertest/fusex_tests/ && fusex-benchmark"'
    - exec_cmd eos-mgm1 'grep "RWMutex. Order Checking Error in thread" /var/log/eos/mgm/xrdlog.mgm && exit 1 || exit 0'
    # download tests repo
    - exec_cmd eos-cli1 'git clone https://gitlab.cern.ch/dss/eosclient-tests.git'
    - exec_cmd eos-cli1 'cd /eosclient-tests && pip install -r requirements.txt'
    # run the tests

    # @todo(esindril): run "all" tests in schedule mode once these are properly supported
    # if [[ "$CI_PIPELINE_SOURCE" == "schedule" ]];
    # then
    #   exec_cmd eos-mgm1 'eos vid add gateway "eos-cli1.eos-cli1.${K8S_NAMESPACE}.svc.cluster.local" unix';
    #   exec_cmd eos-cli1 'env EOS_FUSE_NO_ROOT_SQUASH=1 python3 /eosclient-tests/run.py --workdir="/eos1/dockertest /eos2/dockertest" ci';
    # fi
    # until then just run the "ci" tests
    - exec_cmd eos-cli1 'cd eosclient-tests; for n in prepare/*.sh; do /bin/bash $n prepare; done'
    - exec_cmd eos-cli1 'su eos-user -c "python3 /eosclient-tests/run.py --workdir=\"/eos1/dockertest /eos2/dockertest\" ci"'
    - exec_cmd eos-cli1 'cd eosclient-tests; for n in prepare/*.sh; do /bin/bash $n cleanup; done'

    # fusex test SAMBA gateways authentication settings
    # this will run on the client pod
    - exec_cmd eos-mgm1 'eos vid enable sss'
    - exec_cmd eos-mgm1 'eos vid enable unix'
    - CLI_POD_HOSTNAME="$(exec_cmd eos-cli1 'hostname -f')"
    - echo ${CLI_POD_HOSTNAME}
    - exec_cmd eos-mgm1 "eos vid add gateway ${CLI_POD_HOSTNAME} unix"
    - exec_cmd eos-cli1 'eos-fusex-functional-test --samba'
  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/

.dock8s_cbox_test_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    # enable converter and prepare eoshome folder, cernbox alike
    - exec_cmd eos-mgm1 'eos convert config set status=on'
    - exec_cmd eos-mgm1 './eos_create_userhome.sh eos-user'
    # prepare mountpoints
    - exec_cmd eos-cli1 'atd; at now <<< "mkdir -p /eos/ && mount -t fuse eosxd -ofsname=eosdockertest /eos/"'
    - exec_cmd eos-cli1 'count=0; while [[ $count -le 10 ]] && ( [[ ! -d /eos/ ]] ); do echo "Wait for mount... $count"; (( count++ )); sleep 1; done;'
    # set krb5 ticket and download tests repo @note the 'export KRB5CCNAME to FILE: type' is a spooky trick, can be made nicer.
    - exec_cmd eos-cli1 'echo -e "export KRB5CCNAME=FILE:/tmp/krb5cc_$(id -u eos-user)" >> ~/.bashrc'
    - exec_cmd eos-cli1 'su eos-user -c "kinit eos-user@TEST.EOS -k -t /home/eos-user/eos-user.keytab"'
    - exec_cmd eos-cli1 'su eos-user -c "git clone https://gitlab.cern.ch/dss/eosclient-tests.git /eos/user/e/eos-user/eosclient-tests"'
    - exec_cmd eos-cli1 'su eos-user -c "cd /eos/user/e/eos-user/eosclient-tests && pip install -r requirements.txt"'
    # launch the tests
    - exec_cmd eos-cli1 'su eos-user -c "cd /eos/user/e/eos-user && python3 ./eosclient-tests/run.py --workdir=/eos/user/e/eos-user ci-eosfuse_release"'
    - exec_cmd eos-cli1 'su eos-user -c "cd /eos/user/e/eos-user && python3 ./eosclient-tests/run.py --workdir=/eos/user/e/eos-user regression"'
  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/

.dock8s_reva_test_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    # enable converter and prepare eoshome folder, cernbox alike
    - exec_cmd eos-mgm1 'eos convert config set status=on'
    - exec_cmd eos-mgm1 './eos_create_userhome.sh eos-user'
    # prepare mountpoints
    - exec_cmd eos-cli1 'atd; at now <<< "mkdir -p /eos/ && mount -t fuse eosxd -ofsname=eosdockertest /eos/"'
    - exec_cmd eos-cli1 'count=0; while [[ $count -le 10 ]] && ( [[ ! -d /eos/ ]] ); do echo "Wait for mount... $count"; (( count++ )); sleep 1; done;'

    # install dependencies
    - exec_cmd eos-mgm1 'yum -y install nodejs npm git make tar'

    # Install go
    - exec_cmd eos-mgm1 "export PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH\" && /usr/bin/wget https://go.dev/dl/go1.25.1.linux-amd64.tar.gz && /usr/bin/tar -C /usr/local -xzf go1.25.1.linux-amd64.tar.gz && ln -s /usr/local/go/bin/go /usr/bin/go && ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt || echo Failed to install golang"
    - exec_cmd eos-mgm1 'npm install -g @intuit/judo'

    # Build reva from latest tag
    - exec_cmd eos-mgm1 'git clone https://github.com/cs3org/reva.git'
    - |
      exec_cmd eos-mgm1 'export PATH="$(/usr/bin/go env GOPATH)/bin:$PATH"; cd reva; git fetch --tags ;
      export latest_tag=$(git tag --sort=-version:refname | grep -E "^v[0-9]+\.[0-9]+\.[0-9]+$" | head -1) ;
      echo "Building reva tag: $latest_tag" ;
      git checkout "$latest_tag"; make reva; make cernbox-revad; mkdir -p ../tmp'

    # Put users.json and groups.json in the right place
    - exec_cmd eos-mgm1 'cp reva/tests/integration/reva-cli/config/users.json tmp/users.json'
    - exec_cmd eos-mgm1 'cp reva/tests/integration/reva-cli/config/groups.json tmp/groups.json'

    # Put eos path as basepath for tests:
    - |
      exec_cmd eos-mgm1 \
      "find reva/tests/integration/reva-cli -type f -name '*.yaml' -exec sed -i 's|^[[:space:]]*BASEDIR: \"/localfs\"$|  BASEDIR: \"/eos/test\"|' {} +"

    # Prepare mgm (add users, set vid mapping, create directory)
    - exec_cmd eos-mgm1 "groupadd -g 123 myusers"
    - exec_cmd eos-mgm1 "useradd -u 1255 -g myusers testuser"
    - exec_cmd eos-mgm1 "useradd -u 1256 -g myusers testreceivinguser"
    - exec_cmd eos-mgm1 "eos mkdir /eos/test"
    - exec_cmd eos-mgm1 "eos chown 1255:123 /eos/test"
    - exec_cmd eos-mgm1 "eos acl --sys u:1255=rwx /eos"
    - exec_cmd eos-mgm1 "eos recycle config --add-bin /eos/"
    - exec_cmd eos-mgm1 "eos attr set sys.versioning=\"10\" /eos/test"
    - exec_cmd eos-mgm1 "eos attr set sys.forced.atomic=\"1\" /eos/test"
    - exec_cmd eos-mgm1 "eos attr set sys.allow.oc.sync=\"1\" /eos/test"
    - exec_cmd eos-mgm1 "eos attr ls /eos/test"
    - exec_cmd eos-mgm1 "eos vid add gateway \"127.0.0.1\" grpc"
    - exec_cmd eos-mgm1 "eos vid add gateway \"[:1]\" grpc"
    - exec_cmd eos-mgm1 "eos vid add gateway \"[::1]\" grpc"
    - exec_cmd eos-mgm1 "eos vid add gateway \"127.0.0.1\" https"
    - exec_cmd eos-mgm1 "eos vid add gateway \"[:1]\" https"
    - exec_cmd eos-mgm1 "eos vid add gateway \"[::1]\" https"
    - exec_cmd eos-mgm1 "eos vid set map -grpc key:auth_key vuid:11  vgid:11"
    - exec_cmd eos-mgm1 "eos vid set map -https key:auth_key vuid:11  vgid:11"
    - exec_cmd eos-mgm1 "eos vid set membership 11 +sudo"
    - exec_cmd eos-mgm1 "eos vid set membership 11 -uids 3"
    - exec_cmd eos-mgm1 "eos vid set membership 11 -gids 4"
    - exec_cmd eos-mgm1 "eos access allow group myusers"
    - echo ${MGM_POD_HOSTNAME}

    # We connect over https, and the certificate is only valid for the hostname, so replace localhost with the MGM's hostname
    - exec_cmd eos-mgm1 'sed -i "s/^\(master_url = \"https:\/\/\)localhost\(:[0-9][0-9]*\"\)/\1$(hostname -f)\2/" reva/tests/integration/reva-cli/config/revad-eos.toml'

    # Start revad
    - exec_cmd eos-mgm1 './reva/cmd/revad/revad -c reva/tests/integration/reva-cli/config/revad-eos.toml </dev/null >revad.log 2>&1 & echo $! > revad.pid'

    # Tests and debug output
    - exec_cmd eos-mgm1 "cd reva; make test-reva-cli"
    - exec_cmd eos-mgm1 "eos vid ls"
    - exec_cmd eos-mgm1 "eos access ls"
    - exec_cmd eos-mgm1 "cat revad.log"
  artifacts:
    when: on_failure
    expire_in: 3 days
    paths:
      - eos-logs-${CI_JOB_ID}/
  allow_failure: true


.dock8s_flamegraph_test_template:
  extends:
    - .dock8s_before_script_template
    - .dock8s_after_script_template
  script:
    - date
    - echo 0 > /proc/sys/kernel/perf_event_paranoid; cat /proc/sys/kernel/perf_event_paranoid
    - echo 0 > /proc/sys/kernel/kptr_restrict; cat /proc/sys/kernel/kptr_restrict
    - exec_cmd eos-mgm1 "mkdir eos-flamegraph-data; cd eos-flamegraph-data; /usr/sbin/eos-make-flamegraph"
  artifacts:
    expire_in: 1 days
    paths:
      - eos-logs-${CI_JOB_ID}/


.unit_test_template: &unit_test_template_definition
  stage: test
  variables:
    OS_TAG: ".el9"
  script:
    # generic unit tests
    - eos-unit-tests
    - eos-unit-tests-fst
    - eos-fusex-tests
    - pip3 install pytest; python3 -m pytest /usr/sbin/test-eos-iam-mapfile.py
    # namespace specific unit tests
    - export EOS_QUARKDB_HOSTPORT=localhost:7777
    - quarkdb-create --path /var/quarkdb/node-0
    - chown -R daemon:daemon /var/quarkdb/node-0
    - xrootd -n qdb -c /etc/xrd.cf.quarkdb -l /var/log/eos/xrdlog.qdb -b -Rdaemon
    - eos-ns-quarkdb-tests
    - cp /usr/sbin/qclient-tests . && GTEST_DEATH_TEST_USE_FORK=1 ./qclient-tests
  needs:
    - job: el9_docker_image
      artifacts: false
  retry: 1
  tags:
     - docker_node
     - dock


unit_test:tag:
  extends: .unit_test_template
  image:
    name: gitlab-registry.cern.ch/dss/eos/eos-ci:${CI_COMMIT_TAG}${OS_TAG}
    entrypoint: ["/bin/bash", "-c"]
  only:
    - tags


unit_test:
  extends: .unit_test_template
  image:
    name: gitlab-registry.cern.ch/dss/eos/eos-ci:${CI_COMMIT_SHORT_SHA}${OS_TAG}
    entrypoint: ["/bin/bash", "-c"]
  except:
    - tags


unit_test_asan:
  extends: .unit_test_template
  image:
    name: gitlab-registry.cern.ch/dss/eos/eos-ci:${CI_COMMIT_SHORT_SHA}${OS_TAG}${EXTRA_TAG}
    entrypoint: ["/bin/bash", "-c"]
  variables:
    LSAN_OPTIONS: "suppressions=/var/eos/test/LeakSanitizer.supp"  # Suppress known memory leaks. For the generic tests
    ASAN_OPTIONS: "fast_unwind_on_malloc=0"  # Avoid indirect leaks from linked dependencies. For the namespace tests
    EXTRA_TAG: "_asan"
  needs:
    - job: el9_asan_docker_image
      artifacts: false
  when: manual
  allow_failure: true


#-------------------------------------------------------------------------------
# RPM publishing
#-------------------------------------------------------------------------------

.publish_koji_template: &publish_koji_template_definition
  stage: publish
  image: gitlab-registry.cern.ch/linuxsupport/rpmci/kojicli
  script:
    - yum install --nogpg -y sssd-client
    - kinit stci@CERN.CH -k -t /stci.krb5/stci.keytab
    # KOJI_SCRATCH will be set for branches and empty for tags
    - koji build ${KOJI_SCRATCH} ${TARGET} ${BUILD_NAME}_artifacts/SRPMS/*.src.rpm
  tags:
    - docker_node
    - publish
  when: manual


publish_koji_al8:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos8al"
    BUILD_NAME: "el-8"
  only:
    - schedules
    - tags
  needs:
    - job: build_el8
      artifacts: true


publish_koji_al9:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos9al"
    BUILD_NAME: "el-9"
  needs:
    - job: build_el9
      artifacts: true


publish_koji_al10:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos10al"
    BUILD_NAME: "el-10"
  only:
    - schedules
    - tags
  needs:
    - job: build_el10
      artifacts: true


publish_koji_rh-8:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos8el"
    BUILD_NAME: "rh-8"
  only:
    - schedules
    - tags
  needs:
    - job: rh-8


publish_koji_rh-9:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos9el"
    BUILD_NAME: "rh-9"
  only:
    - schedules
    - tags
  needs:
    - job: rh-9


publish_koji_rh-10:
  <<: *publish_koji_template_definition
  variables:
    TARGET: "eos10el"
    BUILD_NAME: "rh-10"
  only:
    - schedules
    - tags
  needs:
    - job: rh-10



email_notification:
   stage: publish
   image: gitlab-registry.cern.ch/linuxsupport/alma9-base
   variables:
     ENV: production
     TO_ADDRS: project-eos-commits@cern.ch,lxbatch-experts@cern.ch
   script:
     - dnf install -y git python pip
     - git clone https://token:$EOS_REPO_MAILSERVICE_TOKEN@gitlab.cern.ch/eos/eos-mailservices-code-samples.git
     - cd eos-mailservices-code-samples/Python/oauth2-samples; pip install --no-input -r requirements.txt
     - export EOS_VERSION=$CI_COMMIT_TAG
     - python -m oauth2_smtp
   needs:
     - job: publish_koji_al9
   only:
     - tags

# This job uses CI_JOB_TOKEN to trigger a pipeline in the CTA project.
# This means that whoever triggers this job, must have the rights to start a pipeline in CTA.
notify_cta_project:
  stage: publish
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  needs:
    - job: el9_docker_image
      artifacts: false
  variables:
    CTA_BRANCH: main
  script:
    - dnf install --nogpg -y curl gawk jq
    - CTA_PROJECT_ID="139306"
    - CTA_PROJECT_API="https://gitlab.cern.ch/api/v4/projects/$CTA_PROJECT_ID"
    - TRIGGER_URL="$CTA_PROJECT_API/trigger/pipeline"
    # Construct EOS versions
    - |
      if [[ -z "$CI_COMMIT_TAG" ]]; then
        EOS_IMAGE_TAG="$CI_COMMIT_SHORT_SHA.el9";
      else
        EOS_IMAGE_TAG="$CI_COMMIT_TAG.el9";
        EOS_VERSION=$(dnf -q --repofrompath=temprepo,https://storage-ci.web.cern.ch/storage-ci/eos/diopside/tag/testing/el-9/x86_64/ --repo=temprepo repoquery --qf "%{version}-%{release}\n" eos-client | grep "${CI_COMMIT_TAG}" | tail -1);
        if [[ -z ${EOS_VERSION} ]]; then
          echo "ERROR: Could not find EOS RPMs for ${CI_COMMIT_TAG} in storage-ci.web.cern.ch/storage-ci/eos/diopside/tag/testing/el-9/x86_64/"
          exit 1
        fi
      fi
    # Extract XRootD version from eos.spec.in
    - xrd_min=$(grep '^%define xrootd_version_min' eos.spec.in | awk '{print $3}')
    - XROOTD_VERSION=$(dnf -q --repofrompath=temprepo,https://xrootd.web.cern.ch/repo/testing/el9/x86_64/ --repo=temprepo repoquery --qf "%{epoch}:%{version}-%{release}\n" xrootd | grep "${xrd_min}" | tail  -1)
    # Get the latest stable CTA version
    - LATEST_CTA_VERSION=$(dnf -q --repofrompath=temprepo,https://cta-public-repo.web.cern.ch/stable/cta-5/el9/cta/x86_64/ --repo=temprepo repoquery --latest-limit=1 --qf "%{version}-%{release}" cta-taped)
    # Against an existing CTA tag, we can only trigger a pipeline where a different EOS image is used
    - echo "Triggering pipeline against CTA version $LATEST_CTA_VERSION with EOS image tag $EOS_IMAGE_TAG"
    - curl -X POST
          -F token=$CI_JOB_TOKEN
          -F ref=$CTA_BRANCH
          -F "variables[CUSTOM_EOS_IMAGE_TAG]=$EOS_IMAGE_TAG"
          -F "variables[CUSTOM_CTA_VERSION]=$LATEST_CTA_VERSION"
          -F "variables[PIPELINE_TYPE]=REGR_AGAINST_CTA_VERSION"
          $TRIGGER_URL
    # Against the CTA main branch, we can also test the client EOS and XRootD versions if we are on a (EOS) tag
    # If we are not on a (EOS) tag, the EOS RPMs are not accessible by the CTA pipeline, so we only test against the image
    - |
      if [[ -z "$CI_COMMIT_TAG" ]]; then
        echo "Triggering pipeline against CTA main branch"
        echo "Using EOS image tag $EOS_IMAGE_TAG and XRootD version $XROOTD_VERSION"
        curl -X POST \
            -F token=$CI_JOB_TOKEN \
            -F ref=$CTA_BRANCH \
            -F "variables[CUSTOM_EOS_IMAGE_TAG]=$EOS_IMAGE_TAG" \
            -F "variables[CUSTOM_XROOTD_VERSION]=$XROOTD_VERSION" \
            -F "variables[PIPELINE_TYPE]=REGR_AGAINST_CTA_MAIN" \
            $TRIGGER_URL
      else
        echo "Triggering pipeline against CTA main branch"
        echo "Using EOS image tag $EOS_IMAGE_TAG, EOS client version $EOS_VERSION and XRootD version $XROOTD_VERSION"
        curl -X POST \
            -F token=$CI_JOB_TOKEN \
            -F ref=$CTA_BRANCH \
            -F "variables[CUSTOM_EOS_IMAGE_TAG]=$EOS_IMAGE_TAG" \
            -F "variables[CUSTOM_EOS_VERSION]=$EOS_VERSION" \
            -F "variables[CUSTOM_XROOTD_VERSION]=$XROOTD_VERSION" \
            -F "variables[PIPELINE_TYPE]=REGR_AGAINST_CTA_MAIN" \
            $TRIGGER_URL
      fi
  rules:
    - if: '$CI_COMMIT_TAG'
      when: on_success
    - when: manual
      allow_failure: true

rpm_commit_artifacts:
  stage: publish
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  needs:
    - job: build_el8
      artifacts: true
      optional: true
    - job: build_el9
      artifacts: true
    - job: build_el10
      artifacts: true
      optional: true
    - job: build_el9_arm64
      artifacts: true
      optional: true
    - job: build_fedora_38
      artifacts: true
      optional: true
  script:
    - dnf install --nogpg -y sudo sssd-client createrepo
    - if [[ -n "$CI_COMMIT_TAG" ]]; then echo "This only works for commits"; exit 0; else BUILD_TYPE="commit"; fi
    - sudo -u stci -H ./gitlab-ci/store_artifacts.sh ${CODENAME} ${BUILD_TYPE} /eos/project/s/storage-ci/www/eos
  tags:
    - docker_node
    - publish
  except:
    - tags
  allow_failure: true
  when: manual


rpm_testing_artifacts:
  stage: publish
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  script:
    - dnf install --nogpg -y sudo sssd-client createrepo
    - if [[ -n "$CI_COMMIT_TAG" ]]; then BUILD_TYPE="tag/testing"; else BUILD_TYPE="commit"; fi
    - sudo -u stci -H ./gitlab-ci/store_artifacts.sh ${CODENAME} ${BUILD_TYPE} /eos/project/s/storage-ci/www/eos
  tags:
    - docker_node
    - publish
  only:
    - master
    - tags
  retry: 1


rpm_stable_artifacts:
  stage: publish
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  script:
    - dnf install --nogpg -y sudo sssd-client createrepo
    - if [[ -n "$CI_COMMIT_TAG" ]]; then BUILD_TYPE="tag"; else echo "This only works for tags"; exit 0; fi
    - ./gitlab-ci/store_artifacts.sh ${CODENAME} ${BUILD_TYPE} /mnt/eos_repositories/eos
    - sudo -u stci -H ./gitlab-ci/store_stable_artifacts.sh ${CODENAME} /eos/project/s/storage-ci/www/eos ${CI_COMMIT_TAG}
    - echo ${CI_COMMIT_TAG} | sudo -u stci tee /eos/project/s/storage-ci/www/eos/${CODENAME}/tag/latest_version
  tags:
    - docker_node
    - publish
  only:
    - tags
  dependencies: []
  when: manual


#to be run after the rpm publish
.publish_dockerimage-template:
  stage: publish
  image:
    name: gcr.io/kaniko-project/executor:debug
    entrypoint: [""]
  script:
    - if [[ -n "$CI_COMMIT_TAG" ]]; then
        export REPOBRANCH="tag-testing";
        export DESTINATION="${IMAGE_REPO}:${CI_COMMIT_TAG}${OS_TAG}";
      else
        export REPOBRANCH="commit";
        export DESTINATION="${IMAGE_REPO}:${CI_COMMIT_SHORT_SHA}${OS_TAG}";
      fi
    - echo "{\"auths\":{\"$CI_REGISTRY\":{\"auth\":\"$(echo -n $CI_REGISTRY_USER:$CI_REGISTRY_PASSWORD | base64)\"}}}" > /kaniko/.docker/config.json
    - /kaniko/executor --cache=false --destination $DESTINATION --dockerfile $DOCKERFILE --context $CI_PROJECT_DIR --build-arg=EOS_CODENAME="${CODENAME}" --build-arg=REPOBRANCH="${REPOBRANCH}" --compressed-caching=false --use-new-run
  retry: 1


el9_publish_dockerimage_all:
  extends: .publish_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/minimal/el9_minimal.Dockerfile
    IMAGE_REPO: "gitlab-registry.cern.ch/dss/eos/eos-all"
    OS_TAG: ".el9"
  needs:
    - job: clone_docker
    - job: build_el9
  allow_failure: true
  when: manual


el9_publish_dockerimage_fusex:
  extends: .publish_dockerimage-template
  variables:
    DOCKERFILE: eos-docker/minimal/el9_minimal.fusex-only.Dockerfile
    IMAGE_REPO: "gitlab-registry.cern.ch/dss/eos/eos-fusex"
    OS_TAG: ".el9"
  needs:
    - job: clone_docker
    - job: build_el9
  allow_failure: true
  when: manual


#-------------------------------------------------------------------------------
# RPM cleaning
#-------------------------------------------------------------------------------

clean_rpm_artifacts:
  stage: clean
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  script:
    - dnf install --nogpg -y sssd-client sudo createrepo
    - sudo -u stci -H ./gitlab-ci/remove_old_artifacts.sh
  allow_failure: true
  only:
    - triggers
    - schedules
  tags:
    - docker_node


# get all the namespaces, filter out the "mgmt" ones, delete if older than 30h
clean_k8s_cluster:
  stage: clean
  image: alpine/k8s:1.18.2
  script:
    - export KUBECONFIG=$K8S_CONFIG
    - set +o pipefail
    - kubectl get namespaces --no-headers | grep -v 'default\|kube-node-lease\|kube-public\|kube-system\|magnum-tiller' |
        awk 'match($3,/(([3-9][0-9]|[1-9][0-9][0-9]+)h|[1-9][0-9]*d)/) {print $1}' | xargs --no-run-if-empty kubectl delete namespaces
  dependencies: []
  allow_failure: true
  only:
    - schedules
  tags:
    - docker_node
    - k8s


# @todo cleanup helm leftover for failed / hanging tests. May be merged to 'clean_k8s_cluster'
clean_helm_cluster:
  stage: clean
  image: gitlab-registry.cern.ch/dss/alpine-enhanced:3.13.5
  script:
    - export KUBECONFIG=$K8S_CONFIG
    - echo "Please, implement me!"
  dependencies: []
  allow_failure: true
  only:
    - schedules


#-------------------------------------------------------------------------------
# Manually triggered builds
#-------------------------------------------------------------------------------

.eos_nginx_build_template:
  stage: build:manual
  variables:
    PKG_MGR: dnf
  script:
    - ${PKG_MGR} install --nogpg -y gcc-c++ cmake make rpm-build which git sudo yum-utils createrepo sssd-client
    - cd nginx
    - ./makesrpm.sh
    - |
      if [[ ${PKG_MGR} == "yum" ]]; then
        ${PKG_MGR}-builddep -y --nogpgcheck *.src.rpm
      else
        ${PKG_MGR} install -y dnf-plugins-core
        ${PKG_MGR} builddep -y --nogpgcheck *.src.rpm
      fi
    - mkdir RPMS
    - rpmbuild --rebuild --define "_rpmdir RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" *.src.rpm
    - STORAGE_PATH=/eos/project/s/storage-ci/www/eos/${CODENAME}-depend/${BUILD_NAME}/x86_64
    - sudo -u stci -H mkdir -p $STORAGE_PATH
    - sudo -u stci -H cp -f RPMS/*.rpm $STORAGE_PATH
    - sudo -u stci -H createrepo --update -q $STORAGE_PATH
  tags:
    - docker_node
  when: manual


eos_nginx_el-8:
  extends: .eos_nginx_build_template
  image: gitlab-registry.cern.ch/linuxsupport/alma8-base
  variables:
    BUILD_NAME: el-8


eos_nginx_el-9:
  extends: .eos_nginx_build_template
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  variables:
    BUILD_NAME: el-9


#-------------------------------------------------------------------------------
# ALICE ApMon builds
#-------------------------------------------------------------------------------

.build-apmon-template: &build-apmon-template-definition
  stage: build:manual
  variables:
    PKG_MGR: dnf
  script:
    - ${PKG_MGR} install --nogpg -y gcc-c++ make rpm-build which git sssd-client sudo createrepo rsync tar gawk
    - cd ApMon; ./maketar.sh
    - rpmbuild --define "_source_filedigest_algorithm md5" --define "_binary_filedigest_algorithm md5" --define "_topdir ./rpmbuild" -ts eos-apmon-*.tar.gz
    - |
      if [[ ${PKG_MGR} == "yum" ]]; then
        ${PKG_MGR}-builddep -y --nogpgcheck rpmbuild/SRPMS/eos-apmon-*.src.rpm
      else
        ${PKG_MGR} install -y dnf-plugins-core
        ${PKG_MGR} builddep -y --nogpgcheck rpmbuild/SRPMS/eos-apmon-*.src.rpm
      fi
    - rpmbuild --rebuild --define "_rpmdir rpmbuild/RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" rpmbuild/SRPMS/eos-apmon-*.src.rpm
    - sudo -u stci -H mkdir -p ${STORAGE_PATH}
    - sudo -u stci -H cp -f rpmbuild/RPMS/*.rpm ${STORAGE_PATH}
    - sudo -u stci -H createrepo --update -q ${STORAGE_PATH}
  tags:
    - docker_node
  when: manual


eos_apmon_el-8:
  image: gitlab-registry.cern.ch/linuxsupport/alma8-base
  variables:
    STORAGE_PATH: /eos/project/s/storage-ci/www/eos/${CODENAME}-depend/el-8/x86_64
  extends: .build-apmon-template


eos_apmon_el-9:
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  variables:
    STORAGE_PATH: /eos/project/s/storage-ci/www/eos/${CODENAME}-depend/el-9/x86_64
  extends: .build-apmon-template


eos_docs:
  stage: build:manual
  image: gitlab-registry.cern.ch/linuxsupport/alma9-base
  script:
    - yum install --nogpg -y make python3-sphinx sssd-client sudo which git
    - cd doc
    - export PYTHONPATH=`pwd`/_themes/
    - cd diopside
    - make html
    - make html
    - sudo kinit stci@CERN.CH -k -t /stci.krb5/stci.keytab
    - sudo -u stci -H rm -rf /eos/project/e/eos/www/docs/diopside/*
    - sudo -u stci -H cp -R _build/html/* /eos/project/e/eos/www/docs/diopside
  tags:
    - docker_node
  rules:
    - if: '$CI_COMMIT_TAG'
      when: on_success
      allow_failure: true
    - when: manual
      allow_failure: true


.eos_repopackage:
  stage: build:manual
  image: gitlab-registry.cern.ch/linuxsupport/cc7-base
  script:
    - yum install --nogpg -y rpm-build sssd-client sudo createrepo
    - mkdir build
    - cd build
    - rpmbuild --bb --define "_rpmdir RPMS/" --define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" ../elrepopackage.spec
    - STORAGE_PATH=/eos/project/s/storage-ci/www/eos/${CODENAME}/tag/el-7/x86_64
    - sudo -u stci -H mkdir -p $STORAGE_PATH
    - sudo -u stci -H cp -f RPMS/*.rpm $STORAGE_PATH
    - sudo -u stci -H createrepo --update -q $STORAGE_PATH
  tags:
    - docker_node
  when: manual

pre_commit:
  stage: pre-commit
  image: gitlab-registry.cern.ch/linuxsupport/alma10-base
  needs: [ ]
  variables:
    PIP_NO_CACHE_DIR: "1"
  before_script:
    - dnf install -y git python python-pip clang-tools-extra
    - python -m pip install --upgrade pip
    - pip install pre-commit
  script:
    # Run pre-commit against all files starting from a given commit to HEAD
    # This is done to avoid issues with large diffs when running pre-commit on all files (blocks the CI for ~10 minutes)
    # When (if) the whole is formatted, we can remove the `--from-ref` and `--to-ref` options to always check all files

    # pre-commit is run but clang-format will not be applied to all files, just to changed lines.
    # In this stage it will not run since there are no changes, so clang-format here will do nothing
    - pre-commit run --from-ref $(git merge-base origin/master HEAD) --to-ref HEAD --all-files

    # Now we compute the diff and run clang-format on the diff only, as if we had the hook installed during our commits.
    # This will modify the files in place, so you can copy-paste this command to fix the formatting issues locally and then commit the changes but if you have the hook installed you should never need to!
    - git diff -U0 $(git merge-base origin/master HEAD) HEAD | python3 utils/clang-format-diff.py -p1 -i

    # check if the previous command made any changes, if so, fail the job to enforce formatting
    - git diff --exit-code || (echo "Code is not properly formatted, please run the above command to fix the formatting issues and commit the changes." && exit 1)

  allow_failure: true # we could enable this soon but let's keep it optional for now until people have had time to adapt to the new formatting rules


================================================
FILE: .gitmodules
================================================
[submodule "namespace/ns_quarkdb/qclient"]
	path = namespace/ns_quarkdb/qclient
	url = https://gitlab.cern.ch/eos/qclient.git
[submodule "mgm/cta_interface"]
	path = mgm/cta_interface
	url = https://gitlab.cern.ch/eos/xrootd-ssi-protobuf-interface.git
[submodule "common/backward-cpp"]
	path = common/backward-cpp
	url = https://github.com/bombela/backward-cpp.git
	branch = master
[submodule "common/xrootd-ssi-protobuf-interface"]
	path = common/xrootd-ssi-protobuf-interface
	url = https://:@gitlab.cern.ch:8443/eos/xrootd-ssi-protobuf-interface.git
[submodule "unit_tests/googletest"]
	path = unit_tests/googletest
	url = https://github.com/google/googletest
[submodule "common/grpc-proto"]
	path = common/grpc-proto
	url = https://:@gitlab.cern.ch:8443/eos/grpc-proto.git
[submodule "common/jwt-cpp"]
	path = common/jwt-cpp
	url = https://github.com/Thalhammer/jwt-cpp.git
[submodule "quarkdb"]
	path = quarkdb
	url = https://gitlab.cern.ch/eos/quarkdb.git
[submodule "test/microbenchmarks/benchmark"]
	path = test/microbenchmarks/benchmark
	url = https://github.com/google/benchmark
[submodule "common/cppzmq"]
	path = common/cppzmq
	url = https://github.com/zeromq/cppzmq.git
[submodule "proto/eos-protobuf-spec"]
	path = proto/eos-protobuf-spec
	url = https://gitlab.cern.ch/eos/eos-protobuf-spec.git
[submodule "fst/css_plugin"]
	path = fst/css_plugin
	url = https://gitlab.cern.ch/eos/css_plugin.git
[submodule "console/parser"]
	path = console/parser
	url = https://github.com/CLIUtils/CLI11.git


================================================
FILE: .ignore
================================================
unit_tests/googletest/
common/fmt/
namespace/ns_quarkdb/qclient/src/fmt/
common/sqlite/
man/man1/
.vscode


================================================
FILE: .mailmap
================================================
Abhishek Lekshmanan <abhishek.lekshmanan@cern.ch> <abhi@pcitstmbpabhi.dyndns.cern.ch>
Abhishek Lekshmanan <abhishek.lekshmanan@cern.ch> <abhishek.l@cern.ch>
Andrea Manzi <andrea.manzi@cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <Andreas.Joachim.Jeters@cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <Andreas.Joachim.Peters@cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <apeters@Andreass-MacBook-Pro-3.local>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <apeters@pb-d-128-141-236-219.cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <apeters@pb-d-128-141-237-197.cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <apeters@pb-d-128-141-237-94.cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <apeters@pcitsmd01.cern.ch>
Andreas Joachim Peters <andreas.joachim.peters@cern.ch> <root@ajp.cern.ch>
Andreas Stoeve <andreas.stoeve@cern.ch>
Andreas Stoeve <andreas.stoeve@cern.ch> <andreas.stove@cern.ch>
Andreas Stoeve <andreas.stoeve@cern.ch> <andreasstove@outlook.dk>
Andreas Stoeve <andreas.stoeve@cern.ch> <astoeve@andreas-devbox.cern.ch>
Andreas Stoeve <andreas.stoeve@cern.ch> <astoeve@cern.ch>
Andreas Stoeve <andreas.stoeve@cern.ch> <astoeve@intel-nuc-2-007.dyndns.cern.ch>
Andreea Prigoreanu <andreea.prigoreanu@cern.ch>
Branko Blagojevic <branko.blagojevic@comtrade.com> <branko@c7-dev.localdomain>
Cristian Contescu <acontesc@cern.ch>
Crystal Chua <crystal.chua@aarnet.edu.au> <cchua@gdpt-k15.cdn.aarnet.edu.au>
Elvin Alin Sindrilaru <elvin.alin.sindrilaru@cern.ch>
Elvin Alin Sindrilaru <elvin.alin.sindrilaru@cern.ch> <elvin.sindrilaru@cern.ch>
Elvin Alin Sindrilaru <elvin.alin.sindrilaru@cern.ch> <esindril@cern.ch>
Elvin Alin Sindrilaru <elvin.alin.sindrilaru@cern.ch> <esindril@eos.cern.ch>
Geoffray Adde <geoffray.adde@cern.ch>
Geoffray Adde <geoffray.adde@cern.ch> <gadde@gaddelaptop.cern.ch>
Geoffray Adde <geoffray.adde@cern.ch> <gaddelocal@pcitdss1411.cern.ch>
Geoffray Adde <geoffray.adde@cern.ch> <geoffrayadde@Megans-MacBook-Pro-2.local>
Herve Rousseau <herve.rousseau@cern.ch> <hroussea@cern.ch>
Herve Rousseau <herve.rousseau@cern.ch> <munsternet@gmail.com>
Jaroslav Guenther <jaroslav.guenther@cern.ch>
Jaroslav Guenther <jaroslav.guenther@cern.ch> <Jaroslav.Guenther@cern.ch>
Jaroslav Guenther <jaroslav.guenther@cern.ch> <JaroslavGuenther@cern.ch>
Jozsef Makai <jozsef.makai@cern.ch> <jmakai@cern.ch>
Jozsef Makai <jozsef.makai@cern.ch> <jozsef.makai.1992@gmail.com>
Konstantinos Tsitsimpikos <konstantinos.tsitsimpikos@cern.ch>
Konstantinos Tsitsimpikos <konstantinos.tsitsimpikos@cern.ch> <ktsitsimpikos@vagabond.cern.ch>
Lukasz Janyst <ljanyst@cern.ch>
Manuel Reis <manuel.b.reis@cern.ch> <root@manuel-dev.cern.ch>
Manuel Reis <manuel.b.reis@cern.ch> <root@manuel-dev4.cern.ch>
Michal Kamil Simon <michal.simon@cern.ch> <Michal.Simon@cern.ch>
Mr Jenkins <jenkins@pb-d-128-141-194-219.cern.ch>
Paul Lensing <paul.lensing@cern.ch> <paul.h.lensing@seagate.com>
Paul Lensing <paul.lensing@cern.ch> <paul.lensing@gmail.com>
Paul Lensing <paul.lensing@cern.ch> <plensing@engine>
Paul Lensing <paul.lensing@cern.ch> <root@engine.dyndns.cern.ch>
Steven Murray <Steven.Murray@cern.ch> <Steve.Murray@cern.ch>
Unknown <root@alieostest.cern.ch>
Unknown <root@diamondns.cern.ch>
Unknown <root@eosdevsrv1.cern.ch>
Unknown <root@eosdevsrv2.cern.ch>
Unknown <root@eosplus611.cern.ch>
Unknown <root@geotreemgm.cern.ch>
Unknown <root@p05153074617805.cern.ch>
Unknown <root@slc7.cern.ch>
Unknown <root@st-srv-100-18594.cern.ch>
Unknown <root@taishan02.ihep.ac.cn>
Unknown <root@vmeos02.cern.ch>
Unknown <root@vmeos03.cern.ch>


================================================
FILE: .pre-commit-config.yaml
================================================
fail_fast: false
repos:
  - repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v6.0.0
    hooks:
      - id: check-added-large-files
      - id: check-case-conflict
      - id: check-merge-conflict
      - id: check-symlinks
      - id: check-yaml
      - id: debug-statements
      - id: end-of-file-fixer
      - id: mixed-line-ending
      - id: requirements-txt-fixer
      - id: trailing-whitespace

  #  # Disable for now and use clang-format-diff.py instead to only format changed lines.
  #  - repo: https://github.com/pocc/pre-commit-hooks
  #    rev: v1.3.5
  #    hooks:
  #      - id: clang-format
  #        name: clang-format
  #        types_or: [ c, c++ ]
  #        args:
  #          - -i
  #    stages: [ manual ]

  - repo: local
    hooks:
      - id: clang-format-diff
        name: clang-format-diff
        # We pipe 'git diff' to the python script.
        # -p1 strips the a/ b/ prefixes from the diff so the script finds the files.
        # -i applies the edits in-place.
        entry: bash -c 'git diff -U0 --no-color --cached | python3 utils/clang-format-diff.py -p1 -i'
        language: system
        types_or: [ c, c++ ]
        pass_filenames: false


================================================
FILE: AUDIT.md
================================================
## EOS Audit Logging

### Overview

EOS implements structured audit logging for successful operations that modify the namespace or file metadata. Audit entries are encoded as JSON (one record per line), written directly into ZSTD-compressed log segments, and rotated every 1 hour by default. A symlink `audit.zstd` always points to the current active segment.

This document explains what is logged, the record format, where files are written, rotation behavior, how to parse the logs, and where audit hooks are integrated in the codebase.

### Scope: What gets logged

- **Successful namespace-affecting operations by identified users**:
  - **Files**: CREATE, DELETE, RENAME/MOVE, TRUNCATE, WRITE (commit), UPDATE (open for write without create/truncate)
  - **Directories**: MKDIR, RMDIR, RENAME/MOVE
  - **Symlinks**: SYMLINK creation, DELETE
  - **Metadata**: CHMOD, CHOWN, SET_XATTR, RM_XATTR, SET_ACL
- **Optional**: READ and LIST can be enabled later (not default; high volume).
- **Excluded**: Failed attempts, internal non-human activities (e.g. purge/version housekeeping).

### Record format (protobuf → JSON)

Each audit line is a JSON serialization of the `eos.audit.AuditRecord` protobuf (`proto/Audit.proto`). Key elements:

- **Common fields**
  - `timestamp` (int64): seconds since epoch (server time)
  - `path` (string): absolute path to object; directory paths end with '/'
  - `operation` (enum): one of CREATE, DELETE, RENAME, WRITE, TRUNCATE, SET_XATTR, RM_XATTR, SET_ACL, CHMOD, CHOWN, MKDIR, RMDIR, SYMLINK, UPDATE
  - `client_ip` (string), `account` (string)
  - `auth` (mechanism string + attributes map)
  - `authorization` (reasons[])
  - `trace_id` (string): server trace id
  - `target` (string): for rename/symlink target path
  - `uuid` (string): client/session id (empty if placeholder `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx`)
  - `tid` (string): client trace identifier
  - `app` (string): client application
  - `svc` (string): emitting service (e.g. "mgm")

- **State snapshots**
  - `before` / `after` (Stat): include `ctime`, `mtime`, `uid`, `gid`, `mode` (uint32), `mode_octal` (string), `size` (uint64), `checksum` (hex string for files)
  - `attrs` (repeated AttrChange): `{ name, before, after }` for xattr changes (non-system attributes)

- **Nanosecond resolution times**
  - `Stat.ctime_ns` and `Stat.mtime_ns` provide full-resolution strings in the form `seconds.nanoseconds` (e.g. `1730985600.123456789`).

- **Source and version metadata**
  - `src_file`, `src_line`: source file and line where the audit call originated
  - `version`: software version used when emitting the record

Example JSON line (pretty-printed for readability):

```json
{
  "timestamp": 1730985600,
  "path": "/eos/user/a/alice/data/file.txt",
  "operation": "WRITE",
  "client_ip": "192.0.2.10",
  "account": "alice",
  "auth": { "mechanism": "krb5", "attributes": {"principal": "alice@EXAMPLE.ORG"} },
  "authorization": { "reasons": ["uid-match"] },
  "trace_id": "srv-abc123",
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "tid": "cli-xyz789",
  "app": "eoscp",
  "svc": "mgm",
  "before": { "ctime": 1730980000, "mtime": 1730981000, "uid": 1000, "gid": 1000, "mode": 420, "mode_octal": "0100644", "size": 1024, "checksum": "a1b2..." },
  "after":  { "ctime": 1730980000, "mtime": 1730985600, "ctime_ns": "1730980000.000000000", "mtime_ns": "1730985600.123456789", "uid": 1000, "gid": 1000, "mode": 420, "mode_octal": "0100644", "size": 4096, "checksum": "dead..." },
  "src_file": "mgm/FuseServer/Server.cc",
  "src_line": 2600,
  "version": "<eos-version>"
}
```

### Log files, rotation, and location

- **Location**: `<logdir>/audit/` where `logdir` is derived from `XRDLOGDIR` (see `mgm/XrdMgmOfsConfigure.cc`).
  - Directory is created on startup if missing; mode 0755; owned appropriately by the service user.
- **Active segment symlink**: `<logdir>/audit/audit.zstd` points to the current segment file.
- **Segments**: Files are ZSTD-compressed; rotated every 1 hour by default.
  - Override the rotation interval via environment variable: `EOS_AUDIT_ROTATION=<seconds>`
  - Filenames include seconds for uniqueness: `audit-YYYYMMDD-HHMMSS.zst`
  - On rotation, the symlink is atomically updated to the new segment.

### ZSTD stream and flushing

- On opening a new segment, the ZSTD frame header is flushed immediately to avoid `zstdcat` errors on empty files.
- Each record is written and flushed so small bursts are visible promptly.

### Implementation details

- `common/Audit.hh`, `common/Audit.cc` implement the audit writer:
  - Thread-safe writer with internal locking
  - Base directory configurable via `setBaseDirectory` or during construction
  - `audit(const AuditRecord&)` and a convenience overload to populate from `VirtualIdentity`, operation, path, etc.
  - Automatic rotation based on time; symlink management (`audit.zstd`)
  - Normalizes placeholder UUID to empty string

### READ and LIST auditing (optional)

- **Disabled by default.** Enable only when needed due to potential volume.
- **Enabling via API** (on `eos::common::Audit`):
  - `setReadAuditing(true|false)` — enable/disable READ auditing
  - `setListAuditing(true|false)` — enable/disable directory LIST auditing
- **Suffix filter for READ auditing**:
  - By default, READ auditing applies to common document-style files: `txt, pdf, doc, docx, ppt, pptx, xls, xlsx, odt, ods, odp, rtf, csv, json, xml, yaml, yml, md, html, htm`.
  - Configure at runtime with `setReadAuditSuffixes({"pdf","docx",...})`.
  - If the vector contains `"*"`, all files are audited for READ (equivalent to `setReadAuditAll(true)`).
  - Matching is case-insensitive and based on the file extension of the path being opened.
- **Where READ/LIST audits are emitted**:
  - READ: in `mgm/XrdMgmOfsFile.cc::open` for successful read-only opens (including 0-size files served by MGM) when enabled and suffix matches.
  - LIST: in `mgm/XrdMgmOfsDirectory.cc::_open` on successful directory opens when enabled.

### Default settings in XrdMgmOfs

- The MGM reads environment variables at startup and applies them to the `Audit` instance:
  - Default mode (`EOS_MGM_AUDIT` unset or `default`):
    - Audit all modifications (CREATE, DELETE, RENAME, TRUNCATE, WRITE, UPDATE, metadata changes)
    - Audit READ for the default document-style suffix list
    - Do not audit LIST

### Per-directory attribute-based auditing (sys.audit)

- When `EOS_MGM_AUDIT=attribute`, global auditing is disabled and auditing is enabled per directory via the extended attribute `sys.audit` set on the parent directory (for files) or the directory itself (for LIST).
- Valid values for `sys.audit` (case-insensitive):
  - `none` / `no` / `false` / `off`: disable auditing for that directory
  - `modifications`: enable modifications only (CREATE/DELETE/RENAME/TRUNCATE/WRITE/UPDATE/metadata)
  - `default`: enable modifications and READ filtered by the default suffix list; LIST remains off
  - `detail`: enable modifications and READ for all files; LIST remains off
  - `all`: enable everything including LIST and READ for all files
- Evaluation points:
  - Files: parent directory’s `sys.audit`
  - LIST: the directory’s own `sys.audit`
- Notes:
  - `EOS_MGM_AUDIT=off` disables auditing completely; `sys.audit` is ignored.
  - In non-`attribute` modes, global settings control auditing; `sys.audit` is not used to override them.

### Environment configuration

- `EOS_MGM_AUDIT` — control overall audit level (parsed in `XrdMgmOfs` and applied during configure):
  - `none`, `false`, `no`, `off`, or empty: disable all auditing
  - `default`: audit modifications and READ for default document suffixes (no LIST)
  - `modifications`: audit only modifications (no LIST, no READ)
  - `detail`: audit modifications and READ for all files (no LIST)
  - `all`: audit everything, including LIST and READ for all files
  - `attribute`: create the audit logger but disable all global auditing; auditing is enabled explicitly via `sys.audit`

- `EOS_MGM_AUDIT_READ_SUFFIX` — override the READ suffix filter:
  - Comma-separated list, case-insensitive (e.g. `pdf,docx,json`)
  - Use `*` to audit READ for all files
  - If unset, the built-in default document-style list is used

Notes:
- Variables are parsed in `XrdMgmOfs` constructor and applied after the `Audit` instance is created in `XrdMgmOfsConfigure.cc`.
- Setting `EOS_MGM_AUDIT=attribute` keeps the logger active while relying solely on per-directory `sys.audit` to enable auditing.
- Setting `EOS_MGM_AUDIT=off` disables the logger entirely (no auditing).

### Integration points (where audits are emitted)

- Core MGM (`mgm/`):
  - `XrdMgmOfs.hh`: `std::unique_ptr<eos::common::Audit> mAudit` member
  - `XrdMgmOfsConfigure.cc`: initializes `mAudit` with `<logdir>/audit/`
  - Operations:
    - Files: `XrdMgmOfsFile.cc::open` (CREATE, TRUNCATE, UPDATE, READ), `fsctl/Commit.cc` (WRITE)
    - Directories: `Mkdir.cc` (MKDIR), `Remdir.cc` (RMDIR), `XrdMgmOfsDirectory.cc` (LIST)
    - Metadata: `Chmod.cc` (CHMOD), `Chown.cc` (CHOWN), `Attr.cc` (SET_XATTR, RM_XATTR)
    - Symlinks: `Link.cc` (SYMLINK)
    - Delete: `Rm.cc` (DELETE)

- FUSE server (`mgm/FuseServer/Server.cc`):
  - Directories: `OpSetDirectory` (MKDIR, UPDATE/RENAME/MOVE; xattr changes), `OpDeleteDirectory` (RMDIR)
  - Files: `OpSetFile` (CREATE, UPDATE, RENAME/MOVE; CHMOD/CHOWN detection; xattr changes), `OpDeleteFile` (DELETE)
  - Symlinks: `OpSetLink` (SYMLINK), `OpDeleteLink` (DELETE)

### Directory path convention

- Directory paths in audit entries include a trailing slash `/` for unambiguous parsing.

### Mode representation

- `mode` is stored as an integer (uint32) and `mode_octal` as a string in octal for convenience.

### Parsing and tooling

- Stream current audit records:

```bash
zstdcat <logdir>/audit/audit.zstd | jq '.'
```

- Follow audit logs across rotations (like `tail -F`):

```bash
zstdtail <logdir>/audit/audit.zstd
# Or with filtering:
zstdtail <logdir>/audit/audit.zstd -- jq 'select(.operation == "DELETE")'
```

- Historical segments are named `audit-YYYYMMDD-HHMMSS.zst`. Each line is a standalone JSON record; consumers can ingest line-by-line.

### Testing and performance

- Unit tests: `unit_tests/common/AuditTests.cc`
  - Rotation and symlink behavior
  - Benchmark: writes 100,000 records and measures elapsed time

### Notes and caveats

- Only successful operations are logged.
- READ/LIST are intentionally omitted by default due to volume; can be added later.
- The audit writer flushes after each record for operational visibility; adjust if batching is later desired.




================================================
FILE: ApMon/AUTHORS
================================================


================================================
FILE: ApMon/COPYING
================================================
		    GNU GENERAL PUBLIC LICENSE
		       Version 2, June 1991

 Copyright (C) 1989, 1991 Free Software Foundation, Inc.
     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

			    Preamble

  The licenses for most software are designed to take away your
freedom to share and change it.  By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

  When we speak of free software, we are referring to freedom, not
price.  Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.

  To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

  For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

  We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

  Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

  Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

  The precise terms and conditions for copying, distribution and
modification follow.

		    GNU GENERAL PUBLIC LICENSE
   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

  0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License.  The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language.  (Hereinafter, translation is included without limitation in
the term "modification".)  Each licensee is addressed as "you".

Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope.  The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.

  1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.

You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.

  2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:

    a) You must cause the modified files to carry prominent notices
    stating that you changed the files and the date of any change.

    b) You must cause any work that you distribute or publish, that in
    whole or in part contains or is derived from the Program or any
    part thereof, to be licensed as a whole at no charge to all third
    parties under the terms of this License.

    c) If the modified program normally reads commands interactively
    when run, you must cause it, when started running for such
    interactive use in the most ordinary way, to print or display an
    announcement including an appropriate copyright notice and a
    notice that there is no warranty (or else, saying that you provide
    a warranty) and that users may redistribute the program under
    these conditions, and telling the user how to view a copy of this
    License.  (Exception: if the Program itself is interactive but
    does not normally print such an announcement, your work based on
    the Program is not required to print an announcement.)

These requirements apply to the modified work as a whole.  If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works.  But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.

Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.

In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.

  3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:

    a) Accompany it with the complete corresponding machine-readable
    source code, which must be distributed under the terms of Sections
    1 and 2 above on a medium customarily used for software interchange; or,

    b) Accompany it with a written offer, valid for at least three
    years, to give any third party, for a charge no more than your
    cost of physically performing source distribution, a complete
    machine-readable copy of the corresponding source code, to be
    distributed under the terms of Sections 1 and 2 above on a medium
    customarily used for software interchange; or,

    c) Accompany it with the information you received as to the offer
    to distribute corresponding source code.  (This alternative is
    allowed only for noncommercial distribution and only if you
    received the program in object code or executable form with such
    an offer, in accord with Subsection b above.)

The source code for a work means the preferred form of the work for
making modifications to it.  For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable.  However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.

If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.

  4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License.  Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.

  5. You are not required to accept this License, since you have not
signed it.  However, nothing else grants you permission to modify or
distribute the Program or its derivative works.  These actions are
prohibited by law if you do not accept this License.  Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.

  6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions.  You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.

  7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License.  If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all.  For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.

If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.

It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices.  Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.

This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.

  8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded.  In such case, this License incorporates
the limitation as if written in the body of this License.

  9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time.  Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.

Each version is given a distinguishing version number.  If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation.  If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.

  10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission.  For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this.  Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.

			    NO WARRANTY

  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.

  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.

		     END OF TERMS AND CONDITIONS

	    How to Apply These Terms to Your New Programs

  If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.

  To do so, attach the following notices to the program.  It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA


Also add information on how to contact you by electronic and paper mail.

If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:

    Gnomovision version 69, Copyright (C) year  name of author
    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License.  Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.

You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary.  Here is a sample; alter the names:

  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
  `Gnomovision' (which makes passes at compilers) written by James Hacker.

  <signature of Ty Coon>, 1 April 1989
  Ty Coon, President of Vice

This General Public License does not permit incorporating your program into
proprietary programs.  If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library.  If this is what you want to do, use the GNU Library General
Public License instead of this License.


================================================
FILE: ApMon/ChangeLog
================================================


================================================
FILE: ApMon/INSTALL
================================================
Installation Instructions
*************************

Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free
Software Foundation, Inc.

This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.

Basic Installation
==================

These are generic installation instructions.

   The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation.  It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions.  Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').

   It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring.  (Caching is
disabled by default to prevent problems with accidental use of stale
cache files.)

   If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release.  If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.

   The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'.  You only need
`configure.ac' if you want to change it or regenerate `configure' using
a newer version of `autoconf'.

The simplest way to compile this package is:

  1. `cd' to the directory containing the package's source code and type
     `./configure' to configure the package for your system.  If you're
     using `csh' on an old version of System V, you might need to type
     `sh ./configure' instead to prevent `csh' from trying to execute
     `configure' itself.

     Running `configure' takes awhile.  While running, it prints some
     messages telling which features it is checking for.

  2. Type `make' to compile the package.

  3. Optionally, type `make check' to run any self-tests that come with
     the package.

  4. Type `make install' to install the programs and any data files and
     documentation.

  5. You can remove the program binaries and object files from the
     source code directory by typing `make clean'.  To also remove the
     files that `configure' created (so you can compile the package for
     a different kind of computer), type `make distclean'.  There is
     also a `make maintainer-clean' target, but that is intended mainly
     for the package's developers.  If you use it, you may have to get
     all sorts of other programs in order to regenerate files that came
     with the distribution.

Compilers and Options
=====================

Some systems require unusual options for compilation or linking that the
`configure' script does not know about.  Run `./configure --help' for
details on some of the pertinent environment variables.

   You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment.  Here
is an example:

     ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix

   *Note Defining Variables::, for more details.

Compiling For Multiple Architectures
====================================

You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory.  To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'.  `cd' to the
directory where you want the object files and executables to go and run
the `configure' script.  `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.

   If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a
time in the source code directory.  After you have installed the
package for one architecture, use `make distclean' before reconfiguring
for another architecture.

Installation Names
==================

By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc.  You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PREFIX'.

   You can specify separate installation prefixes for
architecture-specific files and architecture-independent files.  If you
give `configure' the option `--exec-prefix=PREFIX', the package will
use PREFIX as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.

   In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files.  Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.

   If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.

Optional Features
=================

Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System).  The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.

   For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.

Specifying the System Type
==========================

There may be some features `configure' cannot figure out automatically,
but needs to determine by the type of machine the package will run on.
Usually, assuming the package is built to be run on the _same_
architectures, `configure' can figure that out, but if it prints a
message saying it cannot guess the machine type, give it the
`--build=TYPE' option.  TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:

     CPU-COMPANY-SYSTEM

where SYSTEM can have one of these forms:

     OS KERNEL-OS

   See the file `config.sub' for the possible values of each field.  If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.

   If you are _building_ compiler tools for cross-compiling, you should
use the `--target=TYPE' option to select the type of system they will
produce code for.

   If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.

Sharing Defaults
================

If you want to set default values for `configure' scripts to share, you
can create a site shell script called `config.site' that gives default
values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists.  Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.

Defining Variables
==================

Variables not defined in a site shell script can be set in the
environment passed to `configure'.  However, some packages may run
configure again during the build, and the customized values of these
variables may be lost.  In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'.  For example:

     ./configure CC=/usr/local2/bin/gcc

will cause the specified gcc to be used as the C compiler (unless it is
overridden in the site shell script).

`configure' Invocation
======================

`configure' recognizes the following options to control how it operates.

`--help'
`-h'
     Print a summary of the options to `configure', and exit.

`--version'
`-V'
     Print the version of Autoconf used to generate the `configure'
     script, and exit.

`--cache-file=FILE'
     Enable the cache: use and save the results of the tests in FILE,
     traditionally `config.cache'.  FILE defaults to `/dev/null' to
     disable caching.

`--config-cache'
`-C'
     Alias for `--cache-file=config.cache'.

`--quiet'
`--silent'
`-q'
     Do not print messages saying which checks are being made.  To
     suppress all normal output, redirect it to `/dev/null' (any error
     messages will still be shown).

`--srcdir=DIR'
     Look for the package's source code in directory DIR.  Usually
     `configure' can determine that directory automatically.

`configure' also accepts some other, not widely useful, options.  Run
`configure --help' for more details.



================================================
FILE: ApMon/Makefile
================================================
SPECFILE = $(shell find . -maxdepth 1 -type f -name '*.spec' )
DIST    ?= $(shell rpm --eval %{dist})
RPMBUILD = $(shell pwd)/rpmbuild

PACKAGE  = $(shell awk '$$1 == "Name:"     { print $$2 }' $(SPECFILE) )
VERSION  = $(shell awk '$$1 == "Version:"  { print $$2 }' $(SPECFILE) )

PERLDIR  = $(shell perl -V:installsitearch | cut -d "'" -f 2)
INSTALL ?= install
DESTDIR ?= $(RPMBUILD)/BUILDROOT

clean:
	rm -rf $(PACKAGE)-$(VERSION)
	rm -rf eos-apmon-*.tar.gz
	rm -rf $(RPMBUILD)

dist: clean
	mkdir -p $(PACKAGE)-$(VERSION)
	rsync -aC --exclude '.__afs*' --exclude $(PACKAGE)-$(VERSION) . $(PACKAGE)-$(VERSION)
	tar cpfz ./$(PACKAGE)-$(VERSION).tar.gz $(PACKAGE)-$(VERSION)

install:
	mkdir -p $(DESTDIR)/perl/ApMon/ApMon/
	mkdir -p $(DESTDIR)/etc/logrotate.d/
	mkdir -p $(DESTDIR)/opt/eos/apmon
	mkdir -p $(DESTDIR)/etc/sysconfig/
	mkdir -p $(DESTDIR)/var/log/eos
	mkdir -p $(DESTDIR)/$(PERLDIR)/ApMon/ApMon
	mkdir -p $(DESTDIR)/usr/sbin/
	mkdir -p $(DESTDIR)/usr/lib/systemd/system/
	mkdir -p $(DESTDIR)/var/log/eos/apmon
	cd perl; for name in `find . -type f | grep -v svn`; do $(INSTALL) -m 755 $$name $(DESTDIR)/$(PERLDIR)/$$name; done
	$(INSTALL) -m 644 usr/lib/systemd/system/eosapmond.service $(DESTDIR)/usr/lib/systemd/system/
	$(INSTALL) -m 755 opt/eos/apmon/eosapmond $(DESTDIR)/opt/eos/apmon/eosapmond
	$(INSTALL) -m 644 etc/logrotate.d/eosapmond $(DESTDIR)/etc/logrotate.d/eosapmond
	$(INSTALL) -m 755 run.sh $(DESTDIR)/opt/eos/apmon/run.sh

prepare: dist
	mkdir -p $(RPMBUILD)/RPMS/$(DIST)
	mkdir -p $(RPMBUILD)/SRPMS/
	mkdir -p $(RPMBUILD)/SPECS/
	mkdir -p $(RPMBUILD)/SOURCES/
	mkdir -p $(RPMBUILD)/BUILD/
	cp eos-apmon-*.tar.gz $(RPMBUILD)/SOURCES 
	cp $(SPECFILE) $(RPMBUILD)/SOURCES 

srpm: prepare $(SPECFILE)
	rpmbuild --define "_source_filedigest_algorithm md5" --define "_binary_filedigest_algorithm md5" \
		--define "_topdir $(RPMBUILD)" -ts $(RPMBUILD)/SOURCES/eos-apmon-*.tar.gz

rpm: srpm
	rpmbuild --rebuild --define "_rpmdir $(RPMBUILD)/RPMS/" \
		--define "_build_name_fmt %%{NAME}-%%{VERSION}-%%{RELEASE}.%%{ARCH}.rpm" rpmbuild/SRPMS/eos-apmon-*.src.rpm


================================================
FILE: ApMon/NEWS
================================================


================================================
FILE: ApMon/README
================================================


================================================
FILE: ApMon/eos-apmon.spec
================================================
%{!?perl_sitearch: %define perl_sitearch %(eval "`%{__perl} -V:installsitearch`"; echo $installsitearch)}
%define _unpackaged_files_terminate_build 0
%define __os_install_post       /bin/true
%define debug_package %{nil}

Summary: eos-apmon package
Name: eos-apmon
Version: 1.1.13
Release: 1%{?dist}
URL: none
Source0: %{name}-%{version}.tar.gz
License: OpenSource
Group: Applications/Eos

BuildRequires: systemd-rpm-macros

Requires: perl

%description
This package contains service scripts for ML monitoring in EOS

The service is started via systemd
systemctl start | stop | status | restart eosapmond.service

The initd scripts were done by Andreas-Joachim Peters [CERN] (EMAIL: andreas.joachim.peters@cern.ch).

%prep
%setup -q

%install
rm -rf %{buildroot}
mkdir -p %{buildroot}
%{__make} install DESTDIR=%{buildroot}

%post
%systemd_post eosapmond.service

%preun
%systemd_preun eosapmond.service

%postun
%systemd_postun_with_restart eosapmond.service

%files
%defattr(-,root,root)
/%{_unitdir}/eosapmond.service
/etc/logrotate.d/eosapmond
%{perl_sitearch}/ApMon/
/opt/eos/apmon/eosapmond
/opt/eos/apmon/run.sh

%changelog
* Mon Apr 28 2025 Martin Vala <martin.vala@cern.ch> - 1.1.13-1
- Xrootd version is parsed from eos-xrootd package

* Wed Mar 19 2025 Gianmaria Del Monte <gianmaria.del.monte@cern.ch> - 1.1.12-1
- Move to systemd service

* Fri Jan 26 2024  Volodymyr Yurchenko <volodymyr.yurchenko@cern.ch> - 1.1.11-1
- install systemd unit file compatible with Alma 9

* Wed Aug  4 2021  Elvin Sindrilaru <esindril@cern.ch> - 1.1.10-1
- move the apmon logs out of the EOS FST owned directory and
  place them in /var/log/eos/apmon/
- bump version to 1.1.10

* Fri Dec  6 2019  Cristian Contescu <acontesc@cern.ch> - 1.1.9-1
- add fix for interface detection (fix traffic reporting)

* Wed Apr  2 2014 root <root@eosdevsrv1.cern.ch> - 1.1.4-1
- add "_xrootd_" to the instance name
- fix RPM version discovery for EOS and XRootD packages

* Mon Mar 12 2011 root <peters@pcsmd01.cern.ch> - 1.1.0-0
- Initial build.



================================================
FILE: ApMon/etc/logrotate.d/eosapmond
================================================
/var/log/eos/apmon/apmon.log {
	missingok
	daily
        copytruncate
        create 755 root root
        dateext
        rotate 200
        compress
}


================================================
FILE: ApMon/jenkins-build.sh
================================================
#!/bin/bash
#-------------------------------------------------------------------------------
# @author Elvin-Alin Sindrilaru - CERN
# @brief Script used by Jenkins to build EOS ApMon rpms
#-------------------------------------------------------------------------------

#************************************************************************
# * EOS - the CERN Disk Storage System                                   *
# * Copyright (C) 2016 CERN/Switzerland                                  *
# *                                                                      *
# * This program is free software: you can redistribute it and/or modify *
# * it under the terms of the GNU General Public License as published by *
# * the Free Software Foundation, either version 3 of the License, or    *
# * (at your option) any later version.                                  *
# *                                                                      *
# * This program is distributed in the hope that it will be useful,      *
# * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
# * GNU General Public License for more details.                         *
# *                                                                      *
# * You should have received a copy of the GNU General Public License    *
# * along with this program.  If not, see <http://www.gnu.org/licenses/>.*
# ************************************************************************/

#-------------------------------------------------------------------------------
# Print help
#-------------------------------------------------------------------------------
function printHelp()
{
  echo "Usage:                                                               " 1>&2
  echo "${0} <branch_or_tag> <xrootd_tag> <build_number> <dst_path>          " 1>&2
  echo "  <branch_or_tag> branch name in the form of \"origin/master\" or tag" 1>&2
  echo "                  name e.g. 1.0.0 for which to build the project     " 1>&2
  echo "  <xrootd_tag>    XRootD tag version used for this build             " 1>&2
  echo "  <build_number>  build number value passed in by Jenkins            " 1>&2
  echo "  <platform>      build platform e.g. slc-6, el-7, fc-24             " 1>&2
  echo "  <architecture>  build architecture e.g. x86_64, i386               " 1>&2
  echo "  <dst_path>      destination path for the rpms built                " 1>&2
}

#-------------------------------------------------------------------------------
# Get the local branch name and dist tag for the rpms. For example local branch
# name of branch 'origin/master' is master. The dist tag for Scientific Linux 5
# can be 'slc5' or 'el5'.
# Function sets two global variables BRANCH and DIST.
#-------------------------------------------------------------------------------
function getLocalBranchAndDistTag()
{
  if [[ ${#} -ne 2 ]]; then
    echo "Usage:                                                               " 1>&2
    echo "${0} <branch_or_tag> <platform>                                      " 1>&2
    echo "  <branch_or_tag> branch name in the form of \"origin/master\" or tag" 1>&2
    echo "                  name e.g. 1.0.0 for which to build the project     " 1>&2
    echo "  <platform>      build platform e.g. slc-6, el-7, fc-24             " 1>&2
    exit 1
  fi

  local BRANCH_OR_TAG=${1}
  local PLATORM=${2}
  local TAG_REGEX="^[04]+\..*$"
  local TAG_REGEX_CITRINE="^4.*$"

  # If this is a tag get the branch it belogs to
  if [[ "${BRANCH_OR_TAG}" =~ ${TAG_REGEX} ]]; then
    if [[ "${BRANCH_OR_TAG}" =~ ${TAG_REGEX_CITRINE} ]]; then
	    BRANCH="citrine"
    fi
  else
    BRANCH=$(basename ${BRANCH_OR_TAG})
    if [[ "${BRANCH}"  == "master" ]]; then
	    BRANCH="citrine"
     fi
  fi

  # For any other branch use the latest XRootD release
  XROOTD_TAG="v4.3.0"
  DIST=".${PLATFORM}"


  # Remove any "-" from the dist tag
  DIST="${DIST//-}"

  echo "Local branch:         ${BRANCH}"
  echo "Dist tag:             ${DIST}  "
}

#-------------------------------------------------------------------------------
# Main - when we are called the current BRANCH_OR_TAG is already checked-out and
#        the script must be run from the **same directory** where it resides.
#-------------------------------------------------------------------------------
if [[ ${#} -ne 6 ]]; then
    printHelp
    exit 1
fi

BRANCH_OR_TAG=${1}
XROOTD_TAG=${2}
BUILD_NUMBER=${3}
PLATFORM=${4}
ARCHITECTURE=${5}
DST_PATH=${6}

echo "Build number:         ${BUILD_NUMBER}"
echo "Branch or tag:        ${BRANCH_OR_TAG}"
echo "XRootD tag:           ${XROOTD_TAG}"
echo "Build platform:       ${PLATFORM}"
echo "Build architecture:   ${ARCHITECTURE}"
echo "Destination path:     ${DST_PATH}"
echo "Running in directory: $(pwd)"

# Get local branch and dist tag for the RPMS
getLocalBranchAndDistTag ${BRANCH_OR_TAG} ${PLATFORM}

# Move to ApMon directory and create the tarball
cd ApMon
./maketar.sh
# Build the source RPM
rpmbuild --define "_source_filedigest_algorithm md5" --define "_binary_filedigest_algorithm md5" --define "_topdir ./rpmbuild" -ts eos-apmon-*.tar.gz
# Move the source RPM
mv rpmbuild/SRPMS/eos-apmon-*.src.rpm .
# Get the mock configurations from gitlab
git clone ssh://git@gitlab.cern.ch:7999/dss/dss-ci-mock.git ../dss-ci-mock
# Prepare the mock configuration
cat ../dss-ci-mock/eos-templates/${PLATFORM}-${ARCHITECTURE}.cfg.in | sed "s/__XROOTD_TAG__/${XROOTD_TAG}/" | sed "s/__BUILD_NUMBER__/${BUILD_NUMBER}/" > eos.cfg
# Build the RPMs
mock --yum --init --uniqueext="eos-apmon01" -r ./eos.cfg --rebuild ./eos-apmon-*.src.rpm --resultdir ../rpms -D "dist ${DIST}"
# List of branches for CI YUM repo
BRANCH_LIST=('citrine')

# If building one of the production branches then push rpms to YUM repo
if [[ ${BRANCH_LIST[*]} =~ $BRANCH ]] ; then
  cd ../rpms/
  # Make sure the directories are created and rebuild the YUM repo
  YUM_REPO_PATH="${DST_PATH}/${BRANCH}/tag/${PLATFORM}/${ARCHITECTURE}"
  echo "Save ApMon RPMs in YUM repo: ${YUM_REPO_PATH}"
  aklog
  mkdir -p ${YUM_REPO_PATH}
  cp -f *.rpm ${YUM_REPO_PATH}
  createrepo --update -q ${YUM_REPO_PATH}
else
  echo "RPMs for branch ${BRANCH} are NOT saved in any YUM repository!"
fi


================================================
FILE: ApMon/maketar.sh
================================================
#!/bin/sh

# Extract package related information
specfile=`find . -maxdepth 1 -name '*.spec' -type f`
name=`awk '$1 == "Name:" { print $2 }' ${specfile}`
version=`awk '$1 == "Version:" { print $2 }' ${specfile}`

# Create the distribution tarball
rm -rf ${name}-${version}
rsync -aC --exclude '.__afs*' . ${name}-${version}
tar -zcf ${name}-${version}.tar.gz ${name}-${version}
rm -rf ${name}-${version}


================================================
FILE: ApMon/opt/eos/apmon/eosapmond
================================================
#!/usr/bin/perl
# apmonpl <MONALISAHOST> <LOGFILE> <APMONLOGLEVEL> <NODES-NAME> <HOST-NAME> <XRD-PID>

if (@ARGV != 6) {
    print "Usage: $0 <MONALISAHOST> <LOGFILE> <APMONLOGLEVEL> <NODES-NAME> <HOST-NAME> <XRD-PID>";
    exit(1);
}

# Redirect stdout and stderr to log file
if (!open(STDOUT, ">>", $ARGV[1])) {
    print STDERR "ERROR: cannot stream stdout into $ARGV[1]\n";
    exit(-1);
}
STDOUT->autoflush(1);

if (!open(STDERR, ">>", $ARGV[1])) {
    print STDERR "ERROR: cannot stream stderr into $ARGV[1]\n";
    exit(-1);
}
STDERR->autoflush(1);

use POSIX qw(setsid);
my $sid = setsid();
if ($sid < 0) {
    print STDERR "ERROR: failed to create new session (setsid())\n";
    exit(-1);
}

use strict;
use warnings;
use ApMon;
my $apm = new ApMon(0);
my $now = `date`;
chomp $now;
printf "# Starting at $now\n";
select STDOUT; $| = 1;
select STDERR; $| = 1;
$apm->setLogLevel($ARGV[2]);
$apm->setDestinations(["$ARGV[0]"]);
$apm->setMonitorClusterNode("$ARGV[3]_xrootd_Nodes", "$ARGV[4]");
$apm->addJobToMonitor($ARGV[5], '', 'xrootd_Services', "$ARGV[4]");

while(1){
    $apm->sendBgMonitoring();
    sleep(120);
}


================================================
FILE: ApMon/perl/ApMon/ApMon/BgMonitor.pm
================================================
package ApMon::BgMonitor;

use strict;
use warnings;

use ApMon::Common qw(logger);
use ApMon::ProcInfo;
use Data::Dumper;
use Net::Domain;

# Settings for Data::Dumper's dump of last values
$Data::Dumper::Indent = 1;
$Data::Dumper::Purity = 1;

# Background Monitor constructor
sub new {
	my ($type, $cmdPipe, $confFile, $lastValuesFile, $allowBgProcs, $confLoader) = @_;
	my $this = {};
	bless $this;
	$this->{CMD_PIPE} = $cmdPipe;
	$this->{CONF_FILE} = $confFile;
	$this->{LAST_VALUES_FILE} = $lastValuesFile;
	$this->{ALLOW_BG_PROCESSES} = $allowBgProcs;
	$this->{CONFIG_LOADER} = $confLoader;
	$this->{LAST_CONF_CHECK_TIME} = 0;
	$this->{CONF_RECHECK} = 1;
	$this->{CONF_CHECK_INTERVAL} = 20;
	$this->{SEND_BG_MONITORING} = 0;
	
	my $hostname = Net::Domain::hostfqdn();
	$this->{BG_MONITOR_CLUSTER} = "ApMon_SysMon";
	$this->{BG_MONITOR_NODE} = $hostname;
	$this->{JOBS} = {};
	

	$this->{PROC_INFO} = new ApMon::ProcInfo();
	return $this;
}

# This call will never return!
# It should be a used just from a child process whose role is just background monitoring.
# In order to report data, user has to send a bg_enable message to enable this.
sub run {
        my $this = shift;
	my $userMsg = "";
	sleep(1);
        while(1) {
		$userMsg = ApMon::Common::readMessage($this->{CMD_PIPE});
                $this->parseParentMessage($userMsg) if $userMsg; # use $this->{CMD_PIPE} channel to get messages from user
                $this->sendBgMonitoring() if $this->{SEND_BG_MONITORING};
                sleep(10);	# updates sould never be more often than this!
        }
}

# Registers another job for monitoring. This can be called by user or from readMessage.
sub addJobToMonitor {
	my ($this, $pid, $workDir, $clusterName, $nodeName) = @_;

	$this->{JOBS}->{$pid}->{CLUSTER} = $clusterName;
	$this->{JOBS}->{$pid}->{NODE} = $nodeName;
	$this->{PROC_INFO}->addJobToMonitor($pid, $workDir);
}

# Removes a job from the monitored processes. This can be called either by user or by readMessage.
sub removeJobToMonitor {
	my ($this, $pid) = @_;

	delete $this->{JOBS}->{$pid};
	$this->{PROC_INFO}->removeJobToMonitor($pid);
}

# Sets the default cluster and node name for the system-related information.
sub setMonitorClusterNode {
	my ($this, $cluster, $node) = @_;

	$this->{BG_MONITOR_CLUSTER} = $cluster;
	$this->{BG_MONITOR_NODE} = $node;
}

# Enables or disables sending of monitoring info
sub enableBgMonitoring {
	my ($this, $enable) = @_;

	$this->{SEND_BG_MONITORING} = $enable;
}

# Sets the log level for BG_MONITOR
sub setLogLevel {
	my ($this, $level) = @_;
	ApMon::Common::setLogLevel($level);
}

# Sets the maximum rate for the messages sent by user
sub setMaxMsgRate {
        my ($this, $rate) = @_;

	ApMon::Common::setMaxMsgRate($rate);
}

# Sets the SI2k meter for this machine
sub setCpuSI2k {
	my ($this, $si2k) = @_;

	ApMon::Common::setCpuSI2k($si2k);
}

# Sets the cpu speed as the one detected when probing cpu type for si2k
sub setCpuMHz {
	my ($this, $mhz) = @_;

	$ApMon::Common::CpuMHz = $mhz;
}

# This is used only if BgMonitor is used as a dedicated monitoring process in order to interpret
# messages from parent process.
sub parseParentMessage {
	my ($this, $msg) = @_;
	
	my ($pid, $workDir, $cluster, $node);
	my @msgs = split(/\n/, $msg);
	for $msg (@msgs){
		$this->setLogLevel($1) if $msg =~ /loglevel:(.*)/;
		$this->setMaxMsgRate($1) if $msg =~ /maxMsgRate:(.*)/;
		$this->enableBgMonitoring($1) if $msg =~ /bg_enable:(.*)/;
		$this->setCpuSI2k($1) if $msg =~ /cpu_si2k:(.*)/;
		$this->setCpuMHz($1) if $msg =~ /cpu_mhz:(.*)/;
		$pid = $1 if $msg =~ /pid:(.*)/;
		$this->removeJobToMonitor($1) if $msg =~ /rm_pid:(.*)/;
		$workDir = $1 if $msg =~ /work_dir:(.*)/;
		$cluster = $1 if $msg =~ /bg_cluster:(.*)/;
		if($msg =~ /bg_node:(.*)/){
			$node = $1;
			if(defined $pid){
				$this->addJobToMonitor($pid, $workDir, $cluster, $node);
				undef $pid;
				undef $cluster;
			}
			if(defined $cluster){
				$this->setMonitorClusterNode($cluster, $node);
				undef $cluster;
			}
		}
	}
}

# This will send the background information to the interested listeners. It is called either from backgroundMonitor
# or directly by the user from time to time to avoid having a sepparate process for this task.
# information is about the system (load, network, memory etc.) and about a number of jobs (PIDs).
#
# If $mustSend is != 0, the bgMonitoring data is sent regardles of when it was last time sent. This allows
# sending a 'last result', just before the end of a job, and which can happen anytime.
sub sendBgMonitoring {
        my $this = shift;
	my $mustSend = shift || 0;

        ApMon::Common::updateConfig($this);
        my (@crtSysParams, @crtJobParams, $now, @sys_results, @job_results, $optsRef, $prevRawData);
        $now = time;
	my $updatedProcInfo = 0;
        for my $dest (keys %{$this->{DESTINATIONS}}) {
                $optsRef = $this->{DESTINATIONS}->{$dest}->{OPTS};
		$prevRawData = $this->{DESTINATIONS}->{$dest}->{PREV_RAW_DATA};
                @crtSysParams = ();
                @crtJobParams = ();
                # for each destination and its options, check if we have to do any background monitoring
                if($optsRef->{'sys_monitoring'} and ($mustSend or $optsRef->{'sys_data_sent'} + $optsRef->{'sys_interval'} <= $now)){
                        for my $param (keys %$optsRef){
                                if($param =~ /^sys_(.+)/ and $optsRef->{$param}){
                                        push(@crtSysParams, $1) unless ($1 eq 'monitoring') or ($1 eq 'interval') or ($1 eq 'data_sent');
                                }
                        }
                        $optsRef->{'sys_data_sent'} = $now;
                }
                if($optsRef->{'job_monitoring'} and ($mustSend or $optsRef->{'job_data_sent'} + $optsRef->{'job_interval'} <= $now)){
                        for my $param (keys %$optsRef){
                                       if($param =~ /^job_(.+)/ and $optsRef->{$param}){
                                               push(@crtJobParams, "$1") unless ($1 eq 'monitoring') or ($1 eq 'interval') or ($1 eq 'data_sent');
                                       }
                        }
                        $optsRef->{'job_data_sent'} = $now;
                }
                if($optsRef->{'general_info'} and ($mustSend or $optsRef->{'general_data_sent'} + 2 * $optsRef->{'sys_interval'} <= $now)){
                        for my $param (keys %$optsRef){
                                if(!($param =~ /^sys_/) and !($param =~ /^job_/) and ($optsRef->{$param})){
                                        push(@crtSysParams, $param) unless ($param eq 'general_info') or ($param eq 'general_data_sent');
                                }
                        }
			$optsRef->{'general_data_sent'} = $now;
                }
		if((! $updatedProcInfo) and (@crtSysParams > 0 or @crtJobParams > 0)){
			$this->{PROC_INFO}->update();
			$updatedProcInfo = 1;
		}
		
		@sys_results = ( @crtSysParams ? $this->{PROC_INFO}->getSystemData(\@crtSysParams, $prevRawData) : () );
		if(@sys_results){
			ApMon::Common::directSendParameters($dest, $this->{BG_MONITOR_CLUSTER}, $this->{BG_MONITOR_NODE}, -1, \@sys_results);
			$this->{LAST_VALUES}->{BG_MON_VALUES} = {} if ! $this->{LAST_VALUES}->{BG_MON_VALUES};
			$this->update_hash($this->{LAST_VALUES}->{BG_MON_VALUES}, \@sys_results);
		}
		for my $pid (keys %{$this->{JOBS}}){
			@job_results = ( @crtJobParams ? $this->{PROC_INFO}->getJobData($pid, \@crtJobParams) : () );
			if(@job_results){
				ApMon::Common::directSendParameters($dest, $this->{JOBS}->{$pid}->{CLUSTER},$this->{JOBS}->{$pid}->{NODE},-1,\@job_results);
				$this->{LAST_VALUES}->{JOBS}->{$pid}->{BG_MON_VALUES} = {} if ! $this->{LAST_VALUES}->{JOBS}->{$pid}->{BG_MON_VALUES};
				$this->update_hash($this->{LAST_VALUES}->{JOBS}->{$pid}->{BG_MON_VALUES}, \@job_results);
			}
		}
        }
	if(open(F, ">$this->{LAST_VALUES_FILE}")){
		print F Dumper($this->{LAST_VALUES});
		close F;
		chmod(0600, $this->{LAST_VALUES_FILE});
	}else{
		logger("WARNING", "Cannot save last BgMonitored values to $this->{LAST_VALUES_FILE}");
	}
}

# update in the given hash the rest of pa
sub update_hash {
	my $this = shift;
	my $hash = shift || {} ;
	my $params = shift;
	@$params & 1 and logger("WARNING", "Odd number of parameters in update_hash") and return;
	while(@$params){
		my $key = shift(@$params);
		my $val = shift(@$params);
		$hash->{$key} = $val;
	}
}

1;



================================================
FILE: ApMon/perl/ApMon/ApMon/Common.pm
================================================
package ApMon::Common;

use strict;
use warnings;

require Exporter;
use Carp qw(cluck);
use Socket;
use ApMon::XDRUtils;
use Data::Dumper;
use Sys::Hostname;

use vars qw(@ISA @EXPORT @EXPORT_OK $APMON_DEFAULT_PORT $VERSION %defaultOptions $KSI2K $CpuMHz);

push @ISA, qw(Exporter);
push @EXPORT, qw(logger);
push @EXPORT_OK, qw($APMON_DEFAULT_PORT %defaultOptions);

$VERSION = "2.2.18";
$APMON_DEFAULT_PORT = 8884;

my @LOG_LEVELS = ("DEBUG", "NOTICE", "INFO", "WARNING", "ERROR", "FATAL");
my $CRT_LOGLEVEL = 2;	# index in the array above

my $MAX_MSG_RATE = 20;	# Default value for max nr. of messages that user is allowed to send, per second

$KSI2K = undef;		# kilo spec ints 2k for this machine

$CpuMHz = undef;	# Cpu Speed when taking the speed for KSI2k

# Default options for background monitoring
%defaultOptions = (
        'job_monitoring' => 1,          # perform (or not) job monitoring
        'job_interval' => 60,           # at this interval (in seconds)
        'job_data_sent' => 0,           # time from Epoch when job information was sent; don't touch!

        'job_cpu_time' => 1,            # processor time spent running this job in seconds
	'job_cpu_ksi2k' => 1,		# used CPU power in ksi2k units (see SpecInt2000 for details);
        'job_run_time' => 1,            # elapsed time from the start of this job in seconds
	'job_run_ksi2k' => 1,		# elapsed time in ksi2k units
        'job_cpu_usage' => 1,           # current percent of the processor used for this job, as reported by ps
        'job_virtualmem' => 1,          # size in JB of the virtual memory occupied by the job, as reported by ps
        'job_rss' => 1,                 # size in KB of the resident image size of the job, as reported by ps
        'job_mem_usage' => 1,           # percent of the memory occupied by the job, as reported by ps
        'job_workdir_size' => 1,        # size in MB of the working directory of the job
        'job_disk_total' => 1,          # size in MB of the total size of the disk partition containing the working directory
        'job_disk_used' => 1,           # size in MB of the used disk partition containing the working directory
        'job_disk_free' => 1,           # size in MB of the free disk partition containing the working directory
        'job_disk_usage' => 1,          # percent of the used disk partition containing the working directory
	'job_open_files' => 1,		# number of open file descriptors
	'job_page_faults_min' => 1,	# number of minor page faults in the job
	'job_page_faults_maj' => 1,	# number of major page faults in the job


        'sys_monitoring' => 1,          # perform (or not) system monitoring
        'sys_interval' => 60,           # at this interval (in seconds)
        'sys_data_sent' => 0,           # time from Epoch when system information was sent; don't touch!

        'sys_cpu_usr' => 1,             # cpu-usage information
        'sys_cpu_sys' => 1,             # all these will produce coresponding paramas without "sys_"
        'sys_cpu_nice' => 1,
        'sys_cpu_idle' => 1,
	'sys_cpu_iowait' => 1,
	'sys_cpu_irq' => 1,
	'sys_cpu_softirq' => 1,
	'sys_cpu_steal' => 1,
	'sys_cpu_guest' => 1,
        'sys_cpu_usage' => 1,
	'sys_interrupts' => 1,
	'sys_context_switches' => 1,
        'sys_load1' => 1,               # system load information
        'sys_load5' => 1,
        'sys_load15' => 1,
        'sys_mem_used' => 1,            # memory usage information
        'sys_mem_free' => 1,
	'sys_mem_actualfree' => 1,	# actually free memory: free + cached + buffers
        'sys_mem_usage' => 1,
	'sys_mem_buffers' => 1,
	'sys_mem_cached' => 1,
        'sys_blocks_in' => 1,
        'sys_blocks_out' => 1,
        'sys_swap_used' => 1,           # swap usage information
        'sys_swap_free' => 1,
        'sys_swap_usage' => 1,
        'sys_swap_in' => 1,
        'sys_swap_out' => 1,
        'sys_net_in' => 1,              # network transfer in kBps
        'sys_net_out' => 1,             # these will produce params called ethX_in, ethX_out, ethX_errs
        'sys_net_errs' => 1,            # for each eth interface
	'sys_net_sockets' => 1,		# number of opened sockets for each proto => sockets_tcp/udp/unix ...
	'sys_net_tcp_details' => 1,	# number of tcp sockets in each state => sockets_tcp_LISTEN, ...
        'sys_processes' => 1,		# total processes and processs in each state (R, S, D ...)
	'sys_uptime' => 1,		# uptime of the machine, in days (float number)


        'general_info' => 1,            # send (or not) general host information once every 2 $sys_interval seconds
        'general_data_sent' => 0,       # time from Epoch when general information was sent; don't touch!

        'hostname' => 1,
        'ip' => 1,                      # will produce <ifname>_ip params for each physical interface
	'ipv6' => 1,                    # will produce <ifname>_ipv6 params for each physical interface
	'kernel_version' => 1,
	'eos_rpm_version' => 1,
        'xrootd_rpm_version' => 1, 
	'platform' => 1,
	'os_type' => 1,
        'cpu_MHz' => 1,
        'no_CPUs' => 1,                 # number of CPUs
	'ksi2k_factor' => 1,		# system's ksi2k factor, if known
        'total_mem' => 1,
        'total_swap' => 1,
	'cpu_vendor_id' => 1,
	'cpu_family' => 1,
	'cpu_model' => 1,
	'cpu_model_name' => 1,
	'cpu_cache' => 1,
	'bogomips' => 1);


# Create a UDP socket through which all information is sent
if(! socket(SOCKET, PF_INET, SOCK_DGRAM, getprotobyname("udp"))){
        logger("FATAL", "Cannot create UDP socket $@");
	die;
}

# Simple logger
sub logger {
        my ($level, $msg) = @_;
        my $i = 0;
        $i++ while (! ($LOG_LEVELS[$i] eq $level) and ($i < @LOG_LEVELS));
        if($CRT_LOGLEVEL <= $i and $i < @LOG_LEVELS){
		my $now =localtime();
		$now =~ s/^\S+\s((\S+\s+){3}).*$/$1/;
                print $now."ApMon[$LOG_LEVELS[$i]]: $msg\n";
        }
}

# Sets the CRT_LOGLEVEL
sub setLogLevel {
	my $level = shift;
	logger("NOTICE", "Setting loglevel to $level");
	if(! defined $level){
		cluck("got undefined level from");
		return;
	}
	my $i = 0;
	$i++ while (! ($LOG_LEVELS[$i] eq $level) and ($i < @LOG_LEVELS));
	if($i < @LOG_LEVELS){
		$CRT_LOGLEVEL = $i;
	}else{
		logger("WARNING", "Unknown log level \"$level\" - ignoring.\n");
	}
}

# Sets the maximum rate for sending messages (see shouldSend subroutine)
sub setMaxMsgRate {
	my $rate = shift;
	
	$MAX_MSG_RATE = $rate;
	logger("INFO", "Setting maxMsgRate to $rate");
}

# For each destination, we'll keep a pair (instance_id, seq_nr) that will identify us
my $senderRef = {};
my $instance_id = getInstanceID();

# This is used internally to send a set of parameters to a given destination.
sub directSendParameters {
        my ($destination, $clusterName, $nodeName, $time, $paramsRef) = @_;

        my @params;
	if(! defined($paramsRef)){
		logger("WARNING", "Not sending undefined parameters!");
		return;
	}
	if(! defined($time)){
		logger("WARNING", "Not sending the parameters for an undefined time!");
		return;
	}

	if(! shouldSend()){
		#logger("WARNING", "Not sending since the messages are too often!");
		return;
	}
	
        if(ref($paramsRef->[0]) eq "ARRAY"){
                @params = @{$paramsRef->[0]};
        }elsif(ref($paramsRef->[0]) eq "HASH"){
                @params = %{$paramsRef->[0]};
        }else{
                @params = @$paramsRef;
        }

        if(@params == 0){
                return;
        }
	
	$senderRef->{$destination} = {INSTANCE_ID => $instance_id, SEQ_NR => 0} if ! $senderRef->{$destination};
	my $sender = $senderRef->{$destination};
	$sender->{INSTANCE_ID} = ($$ << 16) | ($sender->{INSTANCE_ID} && 0xffff);
	$sender->{SEQ_NR} = ($sender->{SEQ_NR} + 1) % 2_000_000_000; # wrap around 2 mld
	
        my ($host, $port, $pass) = split(/:/, $destination);
        logger("NOTICE", "====> $host|$port|$pass/$clusterName/$nodeName".($time != -1 ? " @ $time" : "")." [$sender->{SEQ_NR} # $sender->{INSTANCE_ID}]");
        for(my $i = 0; $i < @params; $i += 2){
		if(defined($params[$i]) && defined($params[$i+1])){
	                logger("NOTICE", "  ==> $params[$i] = $params[$i+1]");
		}else{
			logger("NOTICE", "  ==> ".(defined($params[$i]) ? $params[$i] : "undef name")." = ".(defined($params[$i+1]) ? $params[$i+1] : "undef value")." <== ignoring pair");
			splice(@params, $i, 2);
			$i-=2;
		}
        }
        my $header = "v:${VERSION}_plp:$pass";
        my $msg = ApMon::XDRUtils::encodeString($header)
		. ApMon::XDRUtils::encodeINT32($sender->{INSTANCE_ID})
		. ApMon::XDRUtils::encodeINT32($sender->{SEQ_NR})
		. ApMon::XDRUtils::encodeParameters($clusterName, $nodeName, $time, @params);
        my $in_addr = inet_aton($host);
        my $in_paddr = sockaddr_in($port, $in_addr);
	my $msg_len = length($msg);
        if(send(SOCKET, $msg, 0, $in_paddr) != $msg_len){
                logger("ERROR", "Could not send UDP datagram to $host:$port");
        }else{
		logger("NOTICE", "~~~~> Packet sent successfully; total size=$msg_len bytes.");
	}
}

# This is called by child processes to read messages (if they exist) from the parent.
sub readMessage {
        my $PIPE = shift;

        my ($rin, $win, $ein, $rout, $wout, $eout) = ('', '', '');
        my $retMsg = "";
        vec($rin,fileno($PIPE),1) = 1;
        $ein = $rin | $win;
        my ($nfound,$timeleft) = select($rout=$rin, $wout=$win, $eout=$ein, 0);
        if($nfound){
                sysread($PIPE, $retMsg, 1024);
                logger("DEBUG", "readMessage: $retMsg");
	}
	return $retMsg;
}

# This is called by main process to send a message to a child that reads form the given pipe
sub writeMessage {
	my ($PIPE, $msg) = @_;

	if(defined $PIPE){
		logger("DEBUG", "writeMessage: $msg");
                syswrite($PIPE, $msg);
        }else{
                logger("ERROR", "Trying to send '$msg' to child, but the pipe is not defined!");
        }
}

# copy the time when last data was sent
sub updateLastSentTime {
	my ($srcOpts, $dstOpts) = @_;

	$dstOpts->{'general_data_sent'} = $srcOpts->{'general_data_sent'} if $srcOpts->{'general_data_sent'};
	$dstOpts->{'sys_data_sent'} = $srcOpts->{'sys_data_sent'} if $srcOpts->{'sys_data_sent'};
	$dstOpts->{'job_data_sent'} = $srcOpts->{'job_data_sent'} if $srcOpts->{'job_data_sent'};
}

# This is used to update the configuration for an object that has in it's base hash the following elements
# DESTINATIONS, CONF_RECHECK, LAST_CONF_CHECK_TIME, CONF_CHECK_INTERVAL and CONF_FILE.
# In practice, both ApMon and BgMonitor use it to update their configuration.
sub updateConfig {
        my $this = shift;

	if(! $this->{ALLOW_BG_PROCESSES}){
		$this->{DESTINATIONS} = $this->{CONFIG_LOADER}->{DESTINATIONS};
		return;
	}
        my $now = time;
        if((scalar(keys %{$this->{DESTINATIONS}}) > 0 and $this->{CONF_RECHECK} == 0)
                        or ($this->{LAST_CONF_CHECK_TIME} + $this->{CONF_CHECK_INTERVAL} > $now)){
                return;
        }
        logger("DEBUG", "Updating configuration from $this->{CONF_FILE}");
        if(open(CONF, "<$this->{CONF_FILE}")){
		my $prevDest = $this->{DESTINATIONS} || {};
                $this->{DESTINATIONS} = {};     # clear old destinations first
                my ($crtDest, $line);
                while($line = <CONF>){
                        chomp $line;
                        if($line =~ /^(\S+):(\S+):(\S*)$/){
                                # reading a new destination
                                $crtDest = $line;
                                my %defOpts = %defaultOptions;  #get a copy of the default options
                                $this->{DESTINATIONS}->{$crtDest}->{OPTS} = \%defOpts;
				updateLastSentTime($prevDest->{$crtDest}->{OPTS}, $this->{DESTINATIONS}->{$crtDest}->{OPTS});
				$this->{DESTINATIONS}->{$crtDest}->{PREV_RAW_DATA} = 
					($prevDest->{$crtDest}->{PREV_RAW_DATA} ? $prevDest->{$crtDest}->{PREV_RAW_DATA} : {});
                                logger("DEBUG", "Adding destination $line");
                        }elsif($line =~ /^\s(\S+)=(\S+)/) {
                                # reading an attribute for the current destination and modify the current options
                                my ($name, $value) = ($1, $2);
                                logger("DEBUG", "Adding $name=$value");
				if($name eq 'loglevel'){
					$this->setLogLevel($value);
                                }elsif($name eq 'conf_recheck'){
                                        $this->{CONF_RECHECK} = $value;
                                }elsif($name eq 'recheck_interval'){
                                        $this->{CONF_CHECK_INTERVAL} = $value;
				}elsif($name eq 'maxMsgRate'){
                                        $this->setMaxMsgRate($value);
				}else{
                                        $this->{DESTINATIONS}->{$crtDest}->{OPTS}->{$name} = $value;
                                }
                        }else{
                                logger("WARNING", "Unknown line in conf file: $line");
                        }
                }
                close CONF;
        }else{
                logger("ERROR", "Error opening temporary config file $this->{CONF_FILE}. Current config is unchanged.");
                return;
        }
        $this->{LAST_CONF_CHECK_TIME} = time;
}

# don't allow a user to send more than MAX_MSG messages per second, in average
my $prvTime = 0;
my $prvSent = 0;
my $prvDrop = 0;
my $crtTime = 0;
my $crtSent = 0;
my $crtDrop = 0;
my $hWeight = 0.92;

# Decide if the current datagram should be sent.
# This decision is based on the number of messages previously sent.
sub shouldSend {
	my $now = time;

	if($now != $crtTime){
		# new time
		# update previous counters;
		$prvSent = $hWeight * $prvSent + (1 - $hWeight) * $crtSent / ($now - $crtTime); 
		$prvTime = $crtTime;
		logger("DEBUG", "previously sent: $crtSent; dropped: $crtDrop");
		# reset current counter
		$crtTime = $now;
		$crtSent = 0;
		$crtDrop = 0;
	}
	my $valSent = $prvSent * $hWeight + $crtSent * (1 - $hWeight); # compute the history
	
	my $doSend = 1;
	my $level = $MAX_MSG_RATE - $MAX_MSG_RATE / 10; # when we should start dropping messages
	
	if($valSent > $MAX_MSG_RATE - $level){
		$doSend = rand($MAX_MSG_RATE / 10) < ($MAX_MSG_RATE - $valSent);
	}
	
	# counting sent and dropped messages
	if($doSend){
		$crtSent++;
	}else{
		$crtDrop++;
	}
	
	return $doSend;
}

# Try to generate a more random instance id. It takes the process ID and
# combines it with the last digit from the IP addess and a random number
sub getInstanceID {
	my $pid = $$;
	my $ip = int(rand(256));  # last digit of the ip address
	my $host = hostname();    # from Sys::Hostname
	if($host){
		my $addr = inet_ntoa(scalar gethostbyname($host));
		$ip = $1 if $addr =~ /(\d+)$/;
	}
	my $rnd = int(rand(256));
	my $iid = ($pid << 16) | ($ip << 8) | $rnd; # from all this, generate the instance id
	return $iid;
}

# Try to determine the CPU type. Returns a hash with: cpu_model_name, cpu_MHz, cpu_cache (in KB)
# TODO: make this work also for Mac.
sub getCpuType {
	my $cpu_type = {};
	if(-r "/proc/cpuinfo"){
		if(open(CPU_INFO, "</proc/cpuinfo")){
			my $line;
			while($line = <CPU_INFO>){
				if($line =~ /cpu MHz\s+:\s+(\d+\.?\d*)/){
					$cpu_type->{"cpu_MHz"} = $1;
					$CpuMHz = $1;
				}
				$cpu_type->{"cpu_model_name"} = $1 if($line =~ /model name\s+:\s+(.+)/ || $line =~ /family\s+:\s+(.+)/);
				$cpu_type->{"cpu_cache"} = $1 if($line =~ /cache size\s+:\s+(\d+)/);
			}
			close(CPU_INFO);
		}else{
			logger("NOTICE", "Cannot open /proc/cpuinfo");
		}
	}
	if(-r "/proc/pal/cpu0/cache_info"){
		if(open(CACHE_INFO, "</proc/pal/cpu0/cache_info")){
			my $line;
			my $level3params = 0;
			while($line = <CACHE_INFO>){
				$level3params = 1 if($line =~/Cache level 3/);
				$cpu_type->{"cpu_cache"} = $1 / 1024 if ($level3params && $line =~ /Size\s+:\s+(\d+)/);
			}
			close(CACHE_INFO);
		}else{
			logger("NOTICE", "Cannot open /proc/pal/cpu0/cache_info");
		}
	}
	if(! scalar(keys(%$cpu_type))){
		logger("INFO", "Cannot get cpu type");
		return undef;
	}
	return $cpu_type;
}

# Set the SI2K performance meter for this machine. If this function is called then parameter
# cpu_ksi2k will also be reported for the job monitoring with a value computed this way:
# cpu_ksi2k(job) = cpu_time(job) * ( si2k / 1000)
sub setCpuSI2k {
	my $si2k = shift;
	$KSI2K = $si2k / 1000.0 if($si2k);
}

1;



================================================
FILE: ApMon/perl/ApMon/ApMon/ConfigLoader.pm
================================================
package ApMon::ConfigLoader;

use strict;
use warnings;

use ApMon::Common qw(logger $APMON_DEFAULT_PORT %defaultOptions);
use Socket;
use Data::Dumper;
use Carp qw(cluck);


# Config Loader constructor
sub new {
        my ($type, $cmdPipe, $confFile) = @_;
        my $this = {};
        bless $this;
        $this->{CMD_PIPE} = $cmdPipe;
        $this->{CONF_FILE} = $confFile;
	$this->{LAST_CONF_CHECK_TIME} = 0;
        $this->{CONF_RECHECK} = 1;
        $this->{CONF_CHECK_INTERVAL} = 30;
	$this->{DEST_LOCATIONS} = ();		# http/file locations from where to read the config
	$this->{DESTINATIONS} = {};
	return $this;
}

# This call will never return!
# It should be a used just from a child process whose role is only configuration refreshing.
sub run {
	my $this = shift;
	my ($wasSuccess, $userMsg) = (0, undef);
	while(1) {
		$userMsg = ApMon::Common::readMessage($this->{CMD_PIPE});
		$this->parseParentMessage($userMsg) if $userMsg;
		$wasSuccess = $this->refreshConfig($wasSuccess) if $this->{CONF_RECHECK};
		sleep($this->{CONF_CHECK_INTERVAL});
	}
}

# This allows setting the configuration. It can be used with several arguments:
# - list of strings (URLs and/or files) - the configuration will be read from all
# - reference to an ARRAY - each element is a destination ML service; for each destination
#   the default options will be used
# - reference to a HASH - each key is a destination ML service; for each destination you can
#   define a set of additional options that will overwrite the default ones.
sub setDestinations {
	my ($this, @destLocations) = @_;
	
	my $prevDest = $this->{DESTINATIONS};
	$this->{DESTINATIONS} = {};
        # determine the way we were instantiated and initalize accordingly
        if(ref($destLocations[0]) eq "ARRAY"){
                # user gave a reference to an array, each element being a destination (host[:port][ pass])
                # we will send datagrams to all valid destinations (i.e. host can be resolved), with default options
                $this->{CONF_RECHECK} = 0;
                my ($destStr, $dest);
                for $destStr (@{$destLocations[0]}) {
                        $dest = $this->parseDestination($destStr);
                        if($dest){
                                my %defOptsCopy = %defaultOptions;
                                logger("INFO", "Added destination $dest with default options.");
                                $this->{DESTINATIONS}->{$dest}->{OPTS} = \%defOptsCopy;
				ApMon::Common::updateLastSentTime($prevDest->{$dest}->{OPTS}, $this->{DESTINATIONS}->{$dest}->{OPTS});
				$this->{DESTINATIONS}->{$dest}->{PREV_RAW_DATA} = 
					($prevDest->{$dest}->{PREV_RAW_DATA} ? $prevDest->{$dest}->{PREV_RAW_DATA} : {});
				$this->{DESTINATIONS}->{$dest}->{OPTS}->{'conf_recheck'} = 0;
                        }
                }
		$this->writeDestinations();
        }elsif(ref($destLocations[0]) eq "HASH"){
                # user gave a reference to a hash, each key being a destination (host[:port][ pass])
                # we will send datagrams to all valid destinations (i.e. host can be resolved), overwritting the
                # default options with the ones passed by user. Options will be named as in the %defaultOptions.
                $this->{CONF_RECHECK} = 0;
                my ($destStr, $dest);
                for $destStr (keys %{$destLocations[0]}){
                        $dest = $this->parseDestination($destStr);
                        if($dest){
                                my %defOptsCopy = %defaultOptions;
                                $this->{DESTINATIONS}->{$dest}->{OPTS} = \%defOptsCopy;
				ApMon::Common::updateLastSentTime($prevDest->{$dest}->{OPTS}, $this->{DESTINATIONS}->{$dest}->{OPTS});
				$this->{DESTINATIONS}->{$dest}->{PREV_RAW_DATA} = 
					($prevDest->{$dest}->{PREV_RAW_DATA} ? $prevDest->{$dest}->{PREV_RAW_DATA} : {});
				$this->{DESTINATIONS}->{$dest}->{OPTS}->{'conf_recheck'} = 0;
                                logger("INFO", "Added destination $dest with the following additional options:");
                                # now we have to modify default options with the ones given by user
                                my ($key, $value);
                                for $key (keys %{$destLocations[0]->{$destStr}}){
                                        $value = $destLocations[0]->{$destStr}->{$key};
                                        logger("INFO", " -> $key = $value");
                                        $this->{DESTINATIONS}->{$dest}->{OPTS}->{$key} = $value;
                                }
                        }
                }
		$this->writeDestinations();
        }else{
		# we got a list of URLs and/or files. Fetch them and get the configuration
		$this->{DEST_LOCATIONS} = ();
		push(@{$this->{DEST_LOCATIONS}}, @destLocations);
		$this->refreshConfig();
	}
}

# This will fetch all the configuration files and then, if this part was succesful, it 
# will call parseConfig to build the temporary configuration file from which both Main
# and BgMonitor will read the destinations
sub refreshConfig {
	my $this = shift;
	my $wasSuccess = shift || 0;

	if(! $this->{DEST_LOCATIONS} || (! @{$this->{DEST_LOCATIONS}})){
		logger("NOTICE", "No configuration file was given.");
		return $wasSuccess;
	}
	my ($error, $linesRef);
	logger("DEBUG", "Refreshing config from pid $$");
	($error, $linesRef) = $this->fetchConfig(@{$this->{DEST_LOCATIONS}});
	if(! $error){ # or ($error and ($wasSuccess < @$linesRef))){
		# it reading destinations worked ok, or if we had a partial error reading files,
		# but the configuration size is bigger than earlier, apply those new changes
		$wasSuccess = @$linesRef;
		$this->parseConfig($linesRef);
	}else{
		logger("WARNING", "Failed reading destination files/urls. Configuration will remain unchanged.");
	}
	return $wasSuccess;
}
	
# fetch the configuration form all given files/URLs. It returns a pair ($error, $linesRef) where
# $error contains the number of locations from where the retrieval of the configuration failed.
# $linesRef is a reference to an array containing all the lines.
sub fetchConfig {
        my ($this, @dests) = @_;

        my @lines = ();
        my $error = 1;
        for my $dest (@dests){
                if ( $dest =~ /^http:\/\// ) {
                        logger("INFO", "Reading config from url: $dest");
			require LWP::UserAgent;
                        my $ua = LWP::UserAgent->new();
                        $ua->timeout(5);
                        $ua->env_proxy();
                        my $response = $ua->get($dest);
                        if($response->is_success){
                                push(@lines, split("\n", $response->content . "\nEND_PART\n"));
				$error = 0;
                        }else{
                                logger("WARNING", "Error reading url: $dest");
				logger("WARNING", "Got: ".$response->status_line);
                        }
                }else{
                        logger("INFO", "Reading config from file: $dest");
                        if(open(INFILE, "<$dest")){
                                my @newlines = <INFILE>;
                                push(@lines, @newlines);
                                close(INFILE);
                                push(@lines, split("\n", "\nEND_PART\n"));
				$error = 0;
                        }else{
                                logger("WARNING", "Error reading file: $dest");
                        }
                }
        }
        return ($error, \@lines);
}

# This will parse the config lines brought by fetchConfig, creating the local temporary config file
sub parseConfig {
        my ($this, $linesRef) = @_;

        my @lines = @$linesRef;
        my @dests = ();
        my %opts = ();
		
	my $prevDest = $this->{DESTINATIONS};
	$this->{DESTINATIONS} = {};
        for my $line (@lines) {
                chomp $line;
                next if $line =~ /^\s*$/;       # skip empty lines
                next if $line =~ /^\s*#/;       # skip comments
                $line =~ s/\s+/ /g;             # eliminate multiple spaces
                $line =~ s/^ //;                # remove space at the beginning
                $line =~ s/ $//;                # remove space at the end
                if($line =~ /^xApMon_(.*)/){
                        # set an option for the current destinations
                        my $opt = $1;
                        if($opt =~ /(\S+)\s?=\s?(\S+)/){
                                my ($name, $value) = ($1, $2);
                                $value = $value =~ /off/i ? 0 : $value;
                                $value = $value =~ /on/i ? 1 : $value;
                                $opts{$name} = $value;
				$this->setLogLevel($value) if $name eq "loglevel";
				$this->setMaxMsgRate($value) if $name eq "maxMsgRate";
                                $this->{CONF_RECHECK} = $value if $name eq "conf_recheck";
                                $this->{CONF_CHECK_INTERVAL} = $value if $name eq "recheck_interval";
                                #logger("DEBUG", "set option $name <- $value");
                        }
                }elsif($line =~ /END_PART/){
                        #logger("DEBUG", "Storing options into the temp conf file");
                        for my $dest (@dests){
				my %optsCopy = %opts;
				$this->{DESTINATIONS}->{$dest}->{OPTS} = \%optsCopy;
				ApMon::Common::updateLastSentTime($prevDest->{$dest}->{OPTS}, $this->{DESTINATIONS}->{$dest}->{OPTS});
				$this->{DESTINATIONS}->{$dest}->{PREV_RAW_DATA} = 
					($prevDest->{$dest}->{PREV_RAW_DATA} ? $prevDest->{$dest}->{PREV_RAW_DATA} : {});
                        }
                        @dests = ();
                        %opts = ();
                }else{
                        # parse a new destination
			my $dest = $this->parseDestination($line);
                        push(@dests, $dest) if $dest;
                }
        }
	$this->writeDestinations();
}

# Write the destinations to the temporary config file, to be able to get them also from the
# other processes
sub writeDestinations {
	my $this = shift;

        if(open(CONF, ">".$this->{CONF_FILE}.".tmp")) {
        	logger("DEBUG", "Writting config to $this->{CONF_FILE}");
		my ($dest, $opt, $val);
	        for $dest (keys %{$this->{DESTINATIONS}}) {
			print CONF "$dest\n";
			for $opt (keys %{$this->{DESTINATIONS}->{$dest}->{OPTS}}) {
				$val = $this->{DESTINATIONS}->{$dest}->{OPTS}->{$opt};
				print CONF " $opt=$val\n";
			}
		}
		close(CONF);
		chmod(0600, $this->{CONF_FILE}.'.tmp');
	        # this is done in order to keep the interference between the processes as small as possible
        	rename($this->{CONF_FILE}.'.tmp', $this->{CONF_FILE});
	}else{
		logger("ERROR", "Cannot write destinations to file $this->{CONF_FILE}");
	}
}

# Given a destination line (i.e. host[:port][ passwd]), it returns an array containing at most one
# string of the following form: "ip:port:passwd"
# This is what will be used as a destination in sending the directSendParameters.
sub parseDestination {
        my ($this, $line) = @_;

        my $dest = "";
        if($line =~ /([\.\-a-zA-Z0-9]+)\s*:?\s*(\d+)?\s*(.*)?/){
                my ($host, $port, $pass) = ($1, $2, $3);
                $port = (! defined($port) || $port eq "") ? $APMON_DEFAULT_PORT : $port;
                my ($name,$aliases,$type,$len,$addr) = gethostbyname($host);
                if (defined($len) and $len == 4) {
                        my $ip = inet_ntoa($addr);
                        logger("DEBUG", "found destination i=$ip, P=$port, p=$pass");
                        $dest = "$ip:$port:$pass";
                }else{
                        logger("WARNING", "Error resolving host $host");
                }
        }
        return $dest;
}

# This will parse the options sent by functions in ApMon
sub parseParentMessage {
	my ($this, $msg) = @_;
	my @msgs = split(/\n/, $msg);
	my @dests = ();
	logger("DEBUG", "Reading messages from user");
	for $msg (@msgs){
		$this->setLogLevel($1) if $msg =~ /loglevel:(.*)/;
		$this->setMaxMsgRate($1) if $msg =~ /maxMsgRate:(.*)/;
		$this->{CONF_RECHECK} = $1 if $msg =~ /conf_recheck:(.*)/;
		$this->{CONF_CHECK_INTERVAL} = $1 if $msg =~ /recheck_interval:(.*)/;
		push(@dests, $1) if $msg =~/dest:(.*)/;
	}
	$this->setDestinations(@dests) if @dests;
}

# Sets the log level for CONFIG_LOADER
sub setLogLevel {
        my ($this, $level) = @_;

	ApMon::Common::setLogLevel($level);
}

# Sets the maximum rate for the messages sent by user
sub setMaxMsgRate {
	my ($this, $rate) = @_;

	ApMon::Common::setMaxMsgRate($rate);
}

1;



================================================
FILE: ApMon/perl/ApMon/ApMon/ProcInfo.pm
================================================
package ApMon::ProcInfo;

use strict;
use warnings;

use ApMon::Common qw(logger);
use Data::Dumper;
use Net::Domain;
use Time::Local;
use Config;

# See the end of this file for a set of interesting methods for other modules.

# ProcInfo constructor
sub new {
	my $this = {};
	$this->{DATA} = {};		# monitored data that is going to be reported
	$this->{JOBS} = {};		# jobs that will be monitored 
	$this->{NETWORKINTERFACES} = {};# network interface names
	# names of the months for ps start time of a process
	$this->{MONTHS} = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
	$this->{readGI} = 0;	# used to read generic information less often
	bless $this;
	return $this;
}

# this has to be run twice (with the $lastUpdateTime updated) to get some useful results
sub readStat {
	my $this = shift;
	
	if ($Config{osname} eq "solaris"){
	    if (open(VMSTAT, "vmstat -s |")){
		my $line;
		
		while ($line = <VMSTAT>){
		    if ($line =~ /(\d+)\s+user\s+cpu/ ){
			$this->{DATA}->{"raw_cpu_usr"} = $1;
		    }
		
		    if ($line =~ /(\d+)\s+system\s+cpu/){
			$this->{DATA}->{"raw_cpu_sys"} = $1;
		    }
		
		    if ($line =~ /(\d+)\s+idle\s+cpu/){
			$this->{DATA}->{"raw_cpu_idle"} = $1;
		    }
		    
		    if ($line =~ /(\d+)\s+wait\s+cpu/){
			$this->{DATA}->{"raw_cpu_iowait"} = $1;
		    }
		
		    if ($line =~ /(\d+)\s+pages\s+swapped\s+in/){
			$this->{DATA}->{"raw_swap_in"} = $1;
		    }
		
		    if ($line =~ /(\d+)\s+pages\s+swapped\s+out/){
			$this->{DATA}->{"raw_swap_out"} = $1;
		    }
		    
		    if ($line =~ /(\d+)\s+device\s+interrupts/){
			$this->{DATA}->{"raw_interrupts"} = $1;
		    }
		
		    if ($line =~ /(\d+)\s+cpu\s+context\s+switches/){
			$this->{DATA}->{"raw_context_switches"} = $1;
		    }
		    
		}
		
		close VMSTAT;
	    }

	    $this->{DATA}->{"raw_blocks_in"} = $this->{DATA}->{"raw_blocks_out"} = 0;
	
	    if (open(IOSTAT, "iostat -xnI |")){
		my $line = <IOSTAT>;
		$line = <IOSTAT>;
		
		my $kbR = 0;
		my $kbW = 0;
		
		while ($line = <IOSTAT>){
		    (undef, $kbR, $kbW) = split(/\s+/, $line);
		    
		    $this->{DATA}->{"raw_blocks_in"} += $kbR;
		    $this->{DATA}->{"raw_blocks_out"} += $kbW;
		}
		
		close IOSTAT;
	    }
	
	    return;
	}
	
	if(open(STAT, "</proc/stat")){
		my $line;
		while($line = <STAT>){
			if($line =~ /^cpu\s/) {
				(undef, $this->{DATA}->{"raw_cpu_usr"}, $this->{DATA}->{"raw_cpu_nice"}, 
				        $this->{DATA}->{"raw_cpu_sys"}, $this->{DATA}->{"raw_cpu_idle"},
					$this->{DATA}->{"raw_cpu_iowait"}, $this->{DATA}->{"raw_cpu_irq"},
					$this->{DATA}->{"raw_cpu_softirq"}, $this->{DATA}->{"raw_cpu_steal"},
					$this->{DATA}->{"raw_cpu_guest"}
				) = split(/ +/, $line);
			}
			if($line =~ /^page/) { # this doesn't work for kernel >2.5
				(undef, $this->{DATA}->{"raw_blocks_in"}, $this->{DATA}->{"raw_blocks_out"}) = split(/ +/, $line);
			}
			if($line =~/^swap/) { # this also doesn't work in >2.5
				(undef, $this->{DATA}->{"raw_swap_in"}, $this->{DATA}->{"raw_swap_out"}) = split(/ +/, $line);
			}
			$this->{DATA}->{"raw_interrupts"} = $1 if($line =~ /^intr\s(\d+)/);
			$this->{DATA}->{"raw_context_switches"} = $1 if($line =~ /^ctxt\s(\d+)/);
		}
		close STAT;
	}else{
		logger("NOTICE", "ProcInfo: cannot open /proc/stat");
		#disable ..?
	}
	# blocks_in/out and swap_in/out are moved to /proc/vmstat in >2.5 kernels
	if(-r "/proc/vmstat"){
		if(open(VMSTAT, "</proc/vmstat")){
			my $line;
			while($line = <VMSTAT>){
				$this->{DATA}->{"raw_blocks_in"} = $1 if($line =~ /^pgpgin\s(\d+)/);
				$this->{DATA}->{"raw_blocks_out"}= $1 if($line =~ /^pgpgout\s(\d+)/);
				$this->{DATA}->{"raw_swap_in"}  = $1 if($line =~ /^pswpin\s(\d+)/);
				$this->{DATA}->{"raw_swap_out"} = $1 if($line =~ /^pswpout\s(\d+)/);
			}
			close VMSTAT;
		}else{
			logger("NOTICE", "Procinfo: cannot open /proc/vmstat");
		}
	}
}

# sizes are reported in MB (except _usage that is in percent).
sub readMemInfo {
	my $this = shift;
	
	if ($Config{osname} eq "solaris"){
	    if (open(MEM_INFO, "prtconf |")){
		my $line;
		
		while ($line = <MEM_INFO>){
		    if ($line =~ /^Memory size: (\d+) (\w)/){
			$this->{DATA}->{"total_mem"} = $1;
			
			if ($2 eq "G"){
			    $this->{DATA}->{"total_mem"} *= 1024;
			}
		    }
		}
		
		close MEM_INFO;
	    }
	    
	    if (open(MEM_INFO, "vmstat |")){
		my $line;

		# first header line
		$line = <MEM_INFO>;
		# second header line
		$line = <MEM_INFO>;
		# and the contents 
		$line = <MEM_INFO>;
		
		if ($line =~ /^\s*\d+\s+\d+\s+\d+\s+\d+\s+(\d+)/){
		    my $memfree = $1 / 1024;
		
		    $this->{DATA}->{"mem_free"} = $memfree;
		    $this->{DATA}->{"mem_actual_free"} = $memfree;
		    $this->{DATA}->{"mem_used"} = $this->{DATA}->{"total_mem"} - $memfree;
		    $this->{DATA}->{"mem_usage"} = $this->{DATA}->{"mem_used"} * 100 / $this->{DATA}->{"total_mem"} if  $this->{DATA}->{"total_mem"};
		}		
		
		close MEM_INFO;
	    }
	    
	    if (open(MEM_INFO, "swap -l |")){
		my $line;
		
		$line = <MEM_INFO>;
		
		$this->{DATA}->{"total_swap"} = 0;
		$this->{DATA}->{"swap_free"} = 0;
		
		while ($line = <MEM_INFO>){
		    if ($line =~ /(\d+)\s+(\d+)$/){
			$this->{DATA}->{"total_swap"} += $1 / 2048;
			$this->{DATA}->{"swap_free"} += $2 / 2048;
		    }
		}
		
		$this->{DATA}->{"swap_used"} = $this->{DATA}->{"total_swap"} - $this->{DATA}->{"swap_free"};
		
		$this->{DATA}->{"swap_usage"} = 100.0 * $this->{DATA}->{"swap_used"} / $this->{DATA}->{"total_swap"} if $this->{DATA}->{"total_swap"};
	    }
	
	    return;
	}
	
	if(open(MEM_INFO, "</proc/meminfo")){
		my $line;
		while($line = <MEM_INFO>){
			if($line =~ /^MemFree:/){
				my (undef, $mem_free) = split(/ +/, $line);
				$this->{DATA}->{"mem_free"} = $mem_free / 1024.0;
			}
			if($line =~ /^MemTotal:/){
				my (undef, $mem_total) = split(/ +/, $line);
				$this->{DATA}->{"total_mem"} = $mem_total / 1024.0;
			}
			if($line =~ /^SwapFree:/){
				my (undef, $swap_free) = split(/ +/, $line);
				$this->{DATA}->{"swap_free"} = $swap_free / 1024.0;
			}
			if($line =~ /^SwapTotal:/){
				my (undef, $swap_total) = split(/ +/, $line);
				$this->{DATA}->{"total_swap"} = $swap_total / 1024.0;
			}
			if($line =~ /^Buffers:/){
				my (undef, $buffers) = split(/ +/, $line);
				$this->{DATA}->{"mem_buffers"} = $buffers / 1024.0;
			}
			if($line =~ /^Cached:/){
				my (undef, $cached) = split(/ +/, $line);
				$this->{DATA}->{"mem_cached"} = $cached / 1024.0;
			}
		}
		close MEM_INFO;
		$this->{DATA}->{"mem_actualfree"} = $this->{DATA}->{"mem_free"} + $this->{DATA}->{"mem_buffers"} + $this->{DATA}->{"mem_cached"}
			if ($this->{DATA}->{"mem_free"} && $this->{DATA}->{"mem_buffers"} && $this->{DATA}->{"mem_cached"});
		$this->{DATA}->{"mem_used"} = $this->{DATA}->{"total_mem"} - $this->{DATA}->{"mem_actualfree"} 
			if ($this->{DATA}->{"total_mem"} && $this->{DATA}->{"mem_actualfree"});
		$this->{DATA}->{"swap_used"} = $this->{DATA}->{"total_swap"} - $this->{DATA}->{"swap_free"} if $this->{DATA}->{"total_swap"};
		$this->{DATA}->{"mem_usage"} = 100.0 * $this->{DATA}->{"mem_used"} / $this->{DATA}->{"total_mem"} 
			if ($this->{DATA}->{"total_mem"} && $this->{DATA}->{"mem_used"});
		$this->{DATA}->{"swap_usage"} = 100.0 * $this->{DATA}->{"swap_used"} / $this->{DATA}->{"total_swap"} if $this->{DATA}->{"total_swap"};
	}else{
		logger("NOTICE", "ProcInfo: cannot open /proc/meminfo");
	}
}

# read the number of processes currently running on the system
# count also the number of runnable, sleeping, zombie, io blocked and traced processes
# works on Darwin
sub countProcesses {
	my $this = shift;
	
	my $total = 0;
	my %states = ('D' => 0, 'R' => 0, 'S' => 0, 'T' => 0, 'Z' => 0);
	
	my $command = "ps -A -o state |";
	
	if ($Config{osname} eq "solaris"){
	    $command = "ps -A -o s |";
	}
	
	if(open(PROC, $command)){
		my $state = <PROC>;      # ignore the first line - it's the header
		while(<PROC>){
			$state = substr($_, 0, 1);
			$states{$state}++;
			$total++;
		}

		close PROC;
		
		$this->{DATA}->{"processes"} = $total;
		for $state (keys %states){
			next if (($state eq '') || ($state =~ /\s+/));
			$this->{DATA}->{"processes_$state"} = $states{$state};
		}
	}
	else{
		logger("NOTICE", "ProcInfo: cannot count the processes using ps.");
	}
}

#Read information about CPU.
sub readCPUInfo {
	my $this = shift;
	
	if ($Config{osname} eq "solaris"){
	    chomp ($this->{DATA}->{"no_CPUs"} = `psrinfo -p`);

	    return;
	}
	
	if(-r "/proc/cpuinfo"){
		if(open(CPU_INFO, "</proc/cpuinfo")){
			my ($line, $no_cpus);
			while($line = <CPU_INFO>){
				if($line =~ /cpu MHz\s+:\s+(\d+\.?\d*)/){
					$this->{DATA}->{"cpu_MHz"} = $1;
					$no_cpus ++;
				}
				if($line =~ /vendor_id\s+:\s+(.+)/ || $line =~ /vendor\s+:\s+(.+)/){
					$this->{DATA}->{"cpu_vendor_id"} = $1;
				}
				if($line =~ /cpu family\s+:\s+(.+)/ || $line =~ /revision\s+:\s+(.+)/){
					$this->{DATA}->{"cpu_family"} = $1;
				}
				if($line =~ /model\s+:\s+(.+)/) {
					$this->{DATA}->{"cpu_model"} = $1;
				}
				if($line =~ /model name\s+:\s+(.+)/ || $line =~ /family\s+:\s+(.+)/){
					$this->{DATA}->{"cpu_model_name"} = $1;
				}
				if($line =~ /bogomips\s+:\s+(\d+\.?\d*)/ || $line =~ /BogoMIPS\s+:\s+(\d+\.?\d*)/){
					$this->{DATA}->{"bogomips"} = $1;
				}
				if($line =~ /cache size\s+:\s+(\d+)/){
					$this->{DATA}->{"cpu_cache"} = $1;
				}
			}
			close CPU_INFO;
			$this->{DATA}->{"no_CPUs"} = $no_cpus;
		}
	}
	# this is for Itanium
	if(-r "/proc/pal/cpu0/cache_info"){
		if(open(CACHE_INFO, "</proc/pal/cpu0/cache_info")){
			my $line;
			my $level3params = 0;
			while($line = <CACHE_INFO>){
				$level3params = 1 if ($line =~ /Cache level 3/);
				$this->{DATA}->{"cpu_cache"} = $1 / 1024 if ($level3params && $line =~ /Size\s+:\s+(\d+)/);
			}
			close(CACHE_INFO);
		}
	}
	# also put the ksi2k factor, if known
	$this->{DATA}->{"ksi2k_factor"} = $ApMon::Common::KSI2K if $ApMon::Common::KSI2K;
}

# reads the IP, hostname, cpu_MHz, kernel_version, os_version, platform
sub readGenericInfo {
	my $this = shift;

	my $hostname = Net::Domain::hostfqdn();

	$this->{DATA}->{"hostname"} = $hostname;
	
	if ($Config{osname} eq "solaris"){
	    chomp ($this->{DATA}->{"os_type"} = `uname -sr`);
	    $this->{DATA}->{"platform"} = "solaris";
	    $this->{DATA}->{"kernel_version"} = $Config{osvers};
	
	    if (open(IF_CFG, "ifconfig -a4 |")){
		my ($eth, $ip, $line);
		
		while ($line = <IF_CFG>){
		    if ($line =~ /^(\w+\d):/){
			$eth = $1;
		    }
		    
		    if (defined($eth) and ($line =~ /\s+inet\s+(\d+\.\d+\.\d+\.\d+)/)){
			$ip = $1;
			
			next if ($eth =~ /^lo/);

			$this->{DATA}->{$eth."_ip"} = $ip;

			# fake eth0 on solaris
			$this->{DATA}->{"eth0_ip"} = $ip unless $this->{DATA}->{"eth0_ip"};
		    }
		}
	    }
	
	    return;
	}
	
	if(open(IF_CFG, "/sbin/ifconfig -a |")){
		my ($eth, $ip, $ipv6, $line);
		while($line = <IF_CFG>){
			if($line =~ /^(\w+):?\s+/ ){
				undef $ip;
				if (exists($this->{NETWORKINTERFACES}->{$1})){
				    $eth = $1;
				    undef $ip;
				    undef $ipv6;
				}
				else{
				    undef $eth;
				}
				next;
			}
			
			if ($line =~ /^\w/){
			    undef $eth;
			    undef $ip;
			    undef $ipv6;
			    next;
			}
			
			if(defined($eth) and ($line =~ /\s+inet( addr:)?\s*(\d+\.\d+\.\d+\.\d+)/) and ! defined($ip)){
				$ip = $2;
				$this->{DATA}->{$eth."_ip"} = $ip;
				undef $ipv6;
			}

			if(defined($eth) and ($line =~ /\s+inet6( addr:)?\s*([0-9a-fA-F:]+).*(Scope:Global|scopeid.*global)/) and ! defined($ipv6)){
				$ipv6 = $2;
				$this->{DATA}->{$eth."_ipv6"} = $ipv6;
			}
		}
		close IF_CFG;
	}else{
		logger("NOTICE", "ProcInfo: couldn't get output from /sbin/ifconfig -a");
	}
	# determine the kernel version
	my $line = `uname -r`;
	chomp $line;
	$this->{DATA}->{"kernel_version"} = $line;
	
	# determine the platform
	$line = `uname -m 2>/dev/null || uname`;
	chomp $line;
	$this->{DATA}->{"platform"} = $line;
	
	# try to determine the OS type
	my $osType = "";
	if(open(LSB_RELEASE, 'env PATH=$PATH:/bin:/usr/bin lsb_release -d 2>/dev/null |')){
		my $line = <LSB_RELEASE>;
		$osType = $1 if ($line && $line =~ /Description:\s*(.*)/);
		close LSB_RELEASE;
	}
	if(! $osType){
		for my $f ("/etc/redhat-release", "/etc/debian_version", "/etc/SuSE-release", 
			   "/etc/slackware-version", "/etc/gentoo-release", "/etc/mandrake-release", 
			   "/etc/mandriva-release", "/etc/issue"){
			if(open(VERF, "$f")){
				$osType = <VERF>;
				chomp $osType;
				close VERF;
				last;
			}
		}
	}
	if(! $osType){
		$osType = `uname -s`;
		chomp $osType;
	}
	$this->{DATA}->{"os_type"} = $osType;
}

# read system's uptime and load average. Time is reported as a floating number, in days.
# It uses the 'uptime' command which's output looks like these:
# 19:55:37 up 11 days, 18:57,  1 user,  load average: 0.00, 0.00, 0.00
# 18:42:31 up 87 days, 18:10,  9 users,  load average: 0.64, 0.84, 0.80
# 6:42pm  up 7 days  3:08,  7 users,  load average: 0.18, 0.14, 0.10
# 6:42pm  up 33 day(s),  1:54,  1 user,  load average: 0.01, 0.00, 0.00
# 18:42  up 7 days,  3:45, 2 users, load averages: 1.10 1.11 1.06
# 18:47:41  up 7 days,  4:35, 19 users,  load average: 0.66, 0.44, 0.41
# 15:10  up 8 days, 12 mins, 2 users, load averages: 1.46 1.27 1.18
# 11:57am  up   2:21,  22 users,  load average: 0.59, 0.93, 0.73
sub readUptimeAndLoadAvg {
	my $this = shift;

	my $line = `uptime`;
	chomp $line;
	if($line =~ /up\s+((\d+)\s+day[ (s),]+)?(\d+)(:(\d+))?[^\d]+(\d+)[^\d]+([\d\.]+)[^\d]+([\d\.]+)[^\d]+([\d\.]+)/){
		my ($days, $hour, $min, $users, $load1, $load5, $load15) = ($2, $3, $5, $6, $7, $8, $9);
		if(! $min){
			$min = $hour;
			$hour = 0;
		}
		$days = 0 if ! $days;
		my $uptime = $days + $hour / 24.0 + $min / 1440.0;
		$this->{DATA}->{"uptime"} = $uptime;
		$this->{DATA}->{"logged_users"} = $users;   # this is currently not reported!
		$this->{DATA}->{"load1"} = $load1;
		$this->{DATA}->{"load5"} = $load5;
		$this->{DATA}->{"load15"}= $load15;
	}
	else{
		logger("NOTICE", "ProcInfo: got unparsable output from uptime: $line");
	}
}


sub readEosDiskValues {
    my $this = shift;
    my $storagepath=$ENV{"APMON_STORAGEPATH"};

    if ( "$storagepath" eq "" ) {
        $storagepath = "data";
    }

    if (open IN, "df -P -B 1 | grep $storagepath | grep -v Filesystem | awk '{a+=\$2;b+=\$3;c+=\$4;print a,b,c}' | tail -1|") {
        my $all = <IN>;
        if ($all) {
            my @vals = split (" ",$all);
            $this->{DATA}->{"eos_disk_space"} = sprintf "%.03f",$vals[0]/1024.0/1024.0/1024.0/1024.0;
            $this->{DATA}->{"eos_disk_used"}  = sprintf "%.03f",$vals[1]/1024.0/1024.0/1024.0/1024.0;
            $this->{DATA}->{"eos_disk_free"}  = sprintf "%.03f",$vals[2]/1024.0/1024.0/1024.0/1024.0;
            $this->{DATA}->{"eos_disk_usage"} = sprintf "%d",100.0 *$vals[1]/$vals[0];
        }
        close(IN);
    }
}

sub readEosRpmValues {
    my $this = shift;
    if (open IN, "rpm -qa eos-xrootd | cut -d '-' -f3 |") {
        my $all = <IN>;
        if ($all) {
            chomp $all;
            $all =~ s/xrootd-//;
            $this->{DATA}->{"xrootd_rpm_version"} = 'v'.$all;
        }
        close(IN);
    }

    if (open IN, "rpm -qa eos-server |") {
        my $all = <IN>;
        if ($all) {
            chomp $all;
            $all =~ s/eos-server-//;
            $this->{DATA}->{"eos_rpm_version"} = $all;
        }
        close(IN);
    }
}

sub show_call_stack {  
    my ( $path, $line, $subr );  
    my $max_depth = 30; 
    my $i = 1;  

    while ( (my @call_details = (caller($i++))) && ($i<$max_depth) ) {
	print "$call_details[1] line $call_details[2] in function $call_details[3]\n";
    }
}

# do a difference with overflow check and repair
# the counter is unsigned 32 or 64 bit
sub diffWithOverflowCheck {
	my ($this, $new, $old) = @_;

	if($new >= $old){
		return $new - $old;
	}
	else{
		return $new;
	}
}

# read network information like transfered kBps and nr. of errors on each interface
# TODO: find an alternative for MAC OS X
sub readNetworkInfo {
	my $this = shift;

	$this->{NETWORKINTERFACES} = {};
	
	if ($Config{osname} eq "solaris"){
	    my $ifname;
	    my $line; 
	
	    if (open(NET_DEV, "ifconfig -a4 |")){
	    	while ($line = <NET_DEV>){
		    next if ($ifname);
		    
		    if ($line =~ /^(\w+\d):\s+/){
			next if ($line =~ /^lo/);
		    
			$ifname = $1;
		    }
		}
		
		close NET_DEV;
	    }
	    
	    
	    my $bytesIn = 0;
	    my $bytesOut = 0;
	    
	    if (open(NET_DEV,"netstat -P tcp -s |")){
		while ($line = <NET_DEV>){
		    if ($line =~ /tcpOut\w+Bytes\s*=\s*(\d+)/){
			$bytesOut += $1;
		    }
		    
		    if ($line =~ /tcpRetransBytes\s*=\s*(\d+)/){
			$bytesOut += $1;
		    }
		    
		    if ($line =~ /tcpIn\w+Bytes\s*=\s*(\d+)/){
			$bytesIn += $1;
		    }
		}
		
		close NET_DEV;
		
		$this->{DATA}->{"raw_net_".$ifname."_in"} = $bytesIn;
		$this->{DATA}->{"raw_net_".$ifname."_out"} = $bytesOut;
		$this->{DATA}->{"raw_net_".$ifname."_err"} = 0;
		
		#fake eth0 traffic, even if on Solaris the interfaces have weird names
		#and moreover we cannot tell the traffic per each interface...
		$this->{DATA}->{"raw_net_eth0_in"} = $bytesIn;
		$this->{DATA}->{"raw_net_eth0_out"} = $bytesOut;
		$this->{DATA}->{"raw_net_eth0_err"} = 0;

		$this->{DATA}->{"raw_net_total_traffic_in"} = $bytesIn;
		$this->{DATA}->{"raw_net_total_traffic_out"} = $bytesOut;

		$this->{NETWORKINTERFACES}->{"eth0"} = "eth0";
		$this->{NETWORKINTERFACES}->{"total_traffic"} = "total_traffic";
	    }
	    
	    return;
	}

	if (opendir my $dh, "/sys/class/net"){
	    my @things = grep {$_ ne '.' and $_ ne '..' } readdir $dh;
	    foreach my $thing (@things) {
		my $link = readlink("/sys/class/net/".$thing);
		if (defined($link) && index($link, "/virtual/")<0){
		    $this->{NETWORKINTERFACES}->{$thing} = $thing;
		}
	    }
	}

	my $total_traffic_in=0;
	my $total_traffic_out=0;

	if(open(NET_DEV, "</proc/net/dev")){
		while (my $line = <NET_DEV>) {
			if($line =~ /\s*(\w+):\s*(\d+)\s+\d+\s+(\d+)\s+\d+\s+\d+\s+\d+\s+\d+\s+\d+\s+(\d+)\s+\d+\s+(\d+)/){
				if ( exists($this->{NETWORKINTERFACES}->{$1}) ){
				    $this->{DATA}->{"raw_net_$1"."_in"} = $2;
				    $this->{DATA}->{"raw_net_$1"."_out"} = $4;
				    $this->{DATA}->{"raw_net_$1"."_errs"} = $3 + $5; # in and out errors

				    $total_traffic_in += $2;
				    $total_traffic_out += $4;
				}
			}
		}
		close NET_DEV;
	}else{
		logger("NOTICE", "ProcInfo: cannot open /proc/net/dev");
	}

	$this->{DATA}->{"raw_net_total_traffic_in" } = $total_traffic_in;
	$this->{DATA}->{"raw_net_total_traffic_out"} = $total_traffic_out;

	$this->{NETWORKINTERFACES}->{"total_traffic"} = "total_traffic";
}

# run nestat 
# Note: this works on MAC OS X
sub readNetStat {
	my $this = shift;

	if(open(NETSTAT, 'env PATH=$PATH:/usr/sbin netstat -an 2>/dev/null |')){
	    my %sockets = map { +"sockets_$_" => 0 } ('tcp', 'udp', 'unix'); #icm will be auto added on mac
	    my %tcp_details = map { +"sockets_tcp_$_" => 0 } 
			('ESTABLISHED', 'SYN_SENT', 'SYN_RECV', 'FIN_WAIT1', 
			 'FIN_WAIT2', 'TIME_WAIT', 'CLOSED', 'CLOSE_WAIT', 
			 'LAST_ACK', 'LISTEN', 'CLOSING', 'UNKNOWN');
	
	    if ($Config{osname} eq "solaris"){
		my $sockclass;
		
		while (my $line = <NETSTAT>){
		    if ($line =~ /^UDP:/){
			$sockclass = "udp";
			$line = <NETSTAT>;
			$line = <NETSTAT>;
			next;
		    }
		    
		    if ($line =~ /^TCP:/){
			$sockclass = "tcp";
			$line = <NETSTAT>;
			$line = <NETSTAT>;
			next;
		    }
		    
		    if ($line =~ /^SCTP:/){
			$sockclass = "sctp";
			$line = <NETSTAT>;
			$line = <NETSTAT>;
			next;
		    }
		    
		    if ($line =~ /^Active UNIX domain sockets/){
			$sockclass = "unix";
			$line = <NETSTAT>;
			next;
		    }
		    
		    chomp ($line);
		    
		    if (length($line) == 0){
			undef $sockclass;
			next;
		    }
		    
		    if (defined($sockclass)){
			if ($sockclass eq "tcp"){
			    if ($line =~ /\s+(\w+)\s*$/){
				$sockets{"sockets_tcp"}++;

				my $state = uc($1);
				
				if (not defined($tcp_details{"sockets_tcp_".$state})){
				    $tcp_details{"sockets_tcp_".$state} = 0;
				}
				
				$tcp_details{"sockets_tcp_".$state}++;
			    }
			}
			else{
			    if (not defined($sockets{"sockets_$sockclass"})){
				$sockets{"sockets_$sockclass"} = 0;
			    }
			    
			    $sockets{"sockets_$sockclass"}++;
			}
		    }
		}
	    }
	    else{
		while (my $line = <NETSTAT>) {
			$line =~ s/\s+$//;
			my $proto = ($line =~ /^([^\s]+)/ ? $1 : "");
			my $state = ($line =~ /([^\s]+)$/ ? $1 : "");
			$proto = "unix" if $line =~ /stream/i || $line =~ /dgram/i;
			if($proto =~ /tcp/){
				$sockets{"sockets_tcp"}++;
				$tcp_details{"sockets_tcp_".$state}++;
			}elsif($proto =~ /udp/){
				$sockets{"sockets_udp"}++;
			}elsif($proto =~ /icm/){
				$sockets{"sockets_icm"}++;
			}elsif($proto =~ /unix/){
				$sockets{"sockets_unix"}++;
			}
		}
	    }
	
	    close NETSTAT;
	    while(my ($key, $value) = each(%sockets)){ $this->{DATA}->{$key} = $value; }
	    while(my ($key, $value) = each(%tcp_details)){ $this->{DATA}->{$key} = $value; }
	}
	else{
		logger("NOTICE", "ProcInfo: cannot run netstat");
	}
}

# internal function that gets the full list of children (pids) for a process (pid)
# it returns an empty list if the process has died
# Note: This works on MAC OS X
sub getChildren {
	my ($this, $parent) = @_;
	my @children = ();
	my %pidmap = ();
	if(open(PIDS, 'ps -A -o "pid ppid" |')){
		$_ = <PIDS>; # skip header
		while(<PIDS>){
			if(/\s*(\d+)\s+(\d+)/){
				$pidmap{$1} = $2;
				push(@children, $parent) if $1 == $parent;
			}
		}
		close(PIDS);
	}else{
		logger("NOTICE", "ProcInfo: cannot execute ps -A -o \"pid ppid\"");
	}
	for(my $i = 0; $i < @children; $i++){
		my $prnt = $children[$i];
		while( my ($pid, $ppid) = each %pidmap ){
			if($ppid == $prnt){
				push(@children, $pid);
			}
		}
	}
	return @children;
}

# internal function that parses a time formatted like "days-hours:min:sec" and returns the corresponding
# number of seconds.
sub parsePSElapsedTime {
	my ($this, $time) = @_;
	if($time =~ /(\d+)-(\d+):(\d+):(\d+)/){
		return $1 * 24 * 3600 + $2 * 3600 + $3 * 60 + $4;
	}elsif($time =~ /(\d+):(\d+):(\d+)/){
		return $1 * 3600 + $2 * 60 + $3;
	}elsif($time =~ /(\d+):(\d+)/){
		return $1 * 60 + $2;
	}else{
		return 0;
	}
}

# internal function that parses time formatted like "Tue Feb  7 17:13:17 2006" and the returns the
# corresponding number of seconds from EPOCH
sub parsePSStartTime {
	my ($this, $strTime) = @_;
	
	if($strTime !~ /\S+\s+(\S+)\s+(\d+)\s+(\d+):(\d+):(\d+)\s+(\d+)/){
		return 0;
	}else{
		my ($strMonth, $mday, $hour, $min, $sec, $year) = ($1, $2, $3, $4, $5, $6);
		my $mon = 0;
		for my $month (@{$this->{MONTHS}}){
			last if $month eq $strMonth;
			$mon++;
		}
		return timelocal($sec, $min, $hour, $mday, $mon, $year);
	}
}

# read information about this the JOB_PID process
# memory sizes are given in KB
# Note: This works on MAC OS X
sub readJobInfo {
	my ($this, $pid) = @_;
	return unless $pid;
	my @children = $this->getChildren($pid);
	logger("DEBUG", "ProcInfo: Children for pid=$pid; are @children.");
	if(@children == 0){
		logger("INFO", "ProcInfo: Job with pid=$pid terminated; removing it from monitored jobs.");
		$this->removeJobToMonitor($pid);
		return;
	}
	if(open(J_STATUS, 'ps -A -o "pid lstart time %cpu %mem rsz vsz command" |')){
		my $line = <J_STATUS>; # skip header
		my ($etime, $cputime, $pcpu, $pmem, $rsz, $vsz, $comm, $fd, $minflt, $majflt) = (0, 0, 0, 0, 0, 0, 0, undef, 0, 0);
		my $cputime_offset = $this->{JOBS}->{$pid}->{DATA}->{'cpu_time_offset'} || 0;
		my %mem_cmd_map = ();  # this contains all $rsz_$vsz_$command as keys for every pid
		# it is used to avoid adding several times processes that have multiple threads and appear in
		# ps as sepparate processes, occupying exacly the same amount of memory. The reason for not adding
		# them multiple times is that that memory is shared as they are threads.
		my $crtTime = time();
		while($line = <J_STATUS>){
			chomp $line; 
			$line =~ s/\s+/ /g; $line =~ s/^\s+//; $line =~ s/\s+$//;
			# line looks like: 
			# "PID              STARTED     TIME    %CPU %MEM RSZ VSZ COMMAND"
			# "6157 Tue Feb 7 22:15:30 2006 00:00:00 0.0 0.0 428 1452 g++ -O -pipe..."
			if($line =~ /(\S+) (\S+ \S+ \S+ \S+ \S+) (\S+) (\S+) (\S+) (\S+) (\S+) (.+)/){
				my($apid, $stime1, $cputime1, $pcpu1, $pmem1, $rsz1, $vsz1, $comm1) 
					= ($1, $2, $3, abs($4), abs($5), $6, $7, $8); # % can be negative on mac!?!
				my $isChild = 0;
				for my $childPid (@children){
					if($apid == $childPid){
						$isChild = 1;
						last;
					}
				}
				next if(! $isChild);
				my $sec = $crtTime - $this->parsePSStartTime($stime1);
				$etime = $sec if $sec > $etime;		# the elapsed time is the maximum of all elapsed
				$sec = $this->parsePSElapsedTime($cputime1);   # times corespornding to all child processes.
				$cputime += $sec; # total cputime is the sum of cputimes for all processes.
				$pcpu += $pcpu1; # total %cpu is the sum of all children %cpu.
				if(! $mem_cmd_map{"$pmem1 $rsz1 $vsz1 $comm1"} ++){
					# it's the first thread/process with this memory footprint; add it.
					$pmem += $pmem1; $rsz += $rsz1; $vsz += $vsz1;
					# the same is true for the number of opened files
					my $thisFD = $this->countOpenFD($apid);
					$fd += $thisFD if (defined $thisFD);
				} # else not adding memory usage.
				# Get the number of minor and major page faults
				if(open(STAT, "/proc/$apid/stat")){
					my $line = <STAT>;
					my($pid, $exec, $status, $ppid, $pgrp, $sid, $tty, $tty_grp, $flags, $mflt, $cmflt, $jflt, $cjflt)
						= split(/\s+/, $line);
					$minflt += $mflt;
					$majflt += $jflt;
				}
				close(STAT);
			}
		}
		close(J_STATUS);
		$cputime += $cputime_offset;
		my $cputime_delta = ($this->{JOBS}->{$pid}->{DATA}->{'cpu_time'} || 0) - $cputime; # note this is the other way around!
		if($cputime_delta > 0){
			# Current time is lower than previous - one of the forked processes finished and
			# its contribution to the cpu_time disappeared.
			# We have to recalculate the cputime_offset. Note that in this case, we lose the 
			# cpu_time of the other processes, consumed between these two reports.
			$cputime_offset += $cputime_delta;
			$cputime += $cputime_delta;
		}
		$cputime_delta = $cputime - ($this->{JOBS}->{$pid}->{DATA}->{'cpu_time'} || 0);	# real cpu time delta
		my $etime_delta = $etime - ($this->{JOBS}->{$pid}->{DATA}->{'run_time'} || 0);	# real elapsed time delta
		my $crtCpuSpeed = $this->{DATA}->{'cpu_MHz'} || 1;
		my $orgCpuSpeed = $ApMon::Common::CpuMHz || $crtCpuSpeed;
		#my $freqFact = $crtCpuSpeed / $orgCpuSpeed; # if Cpu speed varies in time, adjust ksi2k factor
		my $freqFact = 1;		
		$this->{JOBS}->{$pid}->{DATA}->{'run_time'} += $etime_delta;
		$this->{JOBS}->{$pid}->{DATA}->{'run_ksi2k'} += $etime_delta * $freqFact * $ApMon::Common::KSI2K if $ApMon::Common::KSI2K;
		$this->{JOBS}->{$pid}->{DATA}->{'cpu_time'} += $cputime_delta;
		$this->{JOBS}->{$pid}->{DATA}->{'cpu_ksi2k'} += $cputime_delta * $freqFact * $ApMon::Common::KSI2K if $ApMon::Common::KSI2K;
		$this->{JOBS}->{$pid}->{DATA}->{'cpu_time_offset'} = $cputime_offset;
		$this->{JOBS}->{$pid}->{DATA}->{'cpu_usage'} = $pcpu;
		$this->{JOBS}->{$pid}->{DATA}->{'mem_usage'} = $pmem;
		$this->{JOBS}->{$pid}->{DATA}->{'rss'} = $rsz;
		$this->{JOBS}->{$pid}->{DATA}->{'virtualmem'} = $vsz;
		$this->{JOBS}->{$pid}->{DATA}->{'open_files'} = $fd if (defined $fd);
		$this->{JOBS}->{$pid}->{DATA}->{'page_faults_min'} = $minflt;
		$this->{JOBS}->{$pid}->{DATA}->{'page_faults_maj'} = $majflt;
	}else{
		logger("NOTICE", "ProcInfo: cannot run ps to see job's status for job $pid");
	}
}

# count the number of open files for the given pid
# TODO: find an equivalent for MAC OS X
sub countOpenFD {
	my ($this, $pid) = @_;
	
	if ($Config{osname} eq "solaris"){
	    return undef;
	}

	if(opendir(DIR, "/proc/$pid/fd")){
		my @list = readdir(DIR);
		closedir DIR;
		my $open_files = ($pid == $$ ? @list - 4 : @list - 2);
		logger("DEBUG", "Counting open_files for $pid: |@list| => $open_files");
		return $open_files;
	}else{
		logger("NOTICE", "ProcInfo: cannot count the number of opened files for job $pid");
	}
	return undef;
}

# if there is an work directory defined, then compute the used space in that directory
# and the free disk space on the partition to which that directory belongs
# sizes are given in MB
# Note: this works on MAC OS X
sub readJobDiskUsage {
	my ($this, $pid) = @_;
	
	my $workDir = $this->{JOBS}->{$pid}->{WORKDIR};
	return unless $workDir and -d $workDir;
	if(open(DU, "du -Lsck $workDir | tail -1 | cut -f 1 |")){
		my $line = <DU>;
		if($line){
			chomp $line;
			$this->{JOBS}->{$pid}->{DATA}->{'workdir_size'} = $line / 1024.0;
		}else{
			logger("NOTICE", "ProcInfo: cannot get du output for job $pid");
		}
		close(DU);
	}else{
		logger("NOTICE", "ProcInfo: cannot run du to get job's disk usage for job $pid");
	}
	if(open(DF, "df -k $workDir | tail -1 |")){
		my $line = <DF>;
		if($line){
			chomp $line;
			if($line =~ /\S+\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)%/){
				$this->{JOBS}->{$pid}->{DATA}->{'disk_total'} = $1 / 1024.0;
				$this->{JOBS}->{$pid}->{DATA}->{'disk_used'} = $2 / 1024.0;
				$this->{JOBS}->{$pid}->{DATA}->{'disk_free'} = $3 / 1024.0;
				$this->{JOBS}->{$pid}->{DATA}->{'disk_usage'} = $4;
			}
		}else{
			logger("NOTICE", "ProcInfo: cannot get df output for job $pid");
		}
		close(DF);
	}else{
		logger("NOTICE", "ProcInfo: cannot run df to get job's disk usage for job $pid");
	}
}

# create cummulative parameters based on raw params like cpu_, blocks_, swap_, or ethX_
sub computeCummulativeParams {
	my ($this, $dataRef, $prevDataRef) = @_;

	if(scalar(keys %$prevDataRef) == 0){
		for my $param (keys %$dataRef){
			next if $param !~ /^raw_/;
			$prevDataRef->{$param} = $dataRef->{$param};
		}
		$prevDataRef->{'TIME'} = $dataRef->{'TIME'};
		return;
	}

	# cpu -related params
	if(defined($dataRef->{'raw_cpu_usr'}) && defined($prevDataRef->{'raw_cpu_usr'})){
		my %diff = ();
		my $cpu_sum = 0;
		for my $param ('cpu_usr', 'cpu_nice', 'cpu_sys', 'cpu_idle', 'cpu_iowait', 'cpu_irq', 'cpu_softirq', 'cpu_steal', 'cpu_guest') {
		    if (defined($dataRef->{"raw_$param"}) && defined($prevDataRef->{"raw_$param"})){
			$diff{$param} = $this->diffWithOverflowCheck($dataRef->{"raw_$param"}, $prevDataRef->{"raw_$param"});
			$cpu_sum += $diff{$param};
		    }
		}
		for my $param ('cpu_usr', 'cpu_nice', 'cpu_sys', 'cpu_idle', 'cpu_iowait', 'cpu_irq', 'cpu_softirq', 'cpu_steal', 'cpu_guest') {
		    if (defined($dataRef->{"raw_$param"}) && defined($prevDataRef->{"raw_$param"})){
			if($cpu_sum != 0){
				$dataRef->{$param} = 100.0 * $diff{$param} / $cpu_sum;
			}else{
				delete $dataRef->{$param};
			}
		    }
		}
		
		if($cpu_sum != 0){
			$dataRef->{'cpu_usage'} = 100.0 * ($cpu_sum - $diff{'cpu_idle'}) / $cpu_sum;
		}else{
			delete $dataRef->{'cpu_usage'};
		}
		# add the other parameters
		for my $param ('interrupts', 'context_switches'){
			if(defined($dataRef->{"raw_$param"}) && defined($prevDataRef->{"raw_$param"})){
				$dataRef->{$param} = $this->diffWithOverflowCheck($dataRef->{"raw_$param"}, $prevDataRef->{"raw_$param"});
			}
		}
	}

	# interrupts, context switches, swap & blocks - related params
	my $interval = $dataRef->{TIME} - $prevDataRef->{TIME};
	for my $param ('blocks_in', 'blocks_out', 'swap_in', 'swap_out', 'interrupts', 'context_switches') {
		if(defined($dataRef->{"raw_$param"}) && defined($prevDataRef->{"raw_$param"}) && ($interval != 0)){
			my $diff = $this->diffWithOverflowCheck($dataRef->{"raw_$param"}, $prevDataRef->{"raw_$param"});
			$dataRef->{$param."_R"} = $diff / $interval;
		}else{
			delete $dataRef->{$param."_R"};
		}
	}

	# physical network interfaces - related params
	for my $rawParam (keys %$dataRef){
		next if $rawParam !~ /^raw_net_/;
		next if ! defined($prevDataRef->{$rawParam});
		my $param = $1 if($rawParam =~ /raw_net_(.*)/);

		if($interval != 0){
			$dataRef->{$param} = $this->diffWithOverflowCheck($dataRef->{$rawParam}, $prevDataRef->{$rawParam}); # absolute difference
			$dataRef->{$param} = $dataRef->{$param} / $interval / 1024.0 if($param !~ /_errs$/); # if it's _in or _out, compute in KB/sec
		}else{
			delete $dataRef->{$param};
		}
	}

	# copy contents of the current data values to the 
	for my $param (keys %$dataRef){
		next if $param !~ /^raw_/;
		$prevDataRef->{$param} = $dataRef->{$param};
	}
	$prevDataRef->{'TIME'} = $dataRef->{'TIME'};
}


# Return the array image of a hash with the requested parameters (from paramsRef)
# sorted alphabetically
# The cummulative parameters are computed based on $prevDataRef
# As a side effect, prevDataRef is updated to have the values in dataRef.
sub getFilteredData {
	my ($this, $dataRef, $paramsRef, $prevDataRef, $networkInterfaces) = @_;

	# we don't do this for jobs
	$this->computeCummulativeParams($dataRef, $prevDataRef)	if($prevDataRef);

	my %result = ();
	for my $param (@$paramsRef) {
		if($param eq "net_sockets"){
			for my $key (keys %$dataRef) {
				$result{$key} = $dataRef->{$key} if $key =~ /sockets_[^_]+$/;
			}
		}elsif($param eq "net_tcp_details"){
			for my $key (keys %$dataRef) {
				$result{$key} = $dataRef->{$key} if $key =~ /sockets_tcp_/;
			}
		}elsif($param =~ /^net_(.*)$/ or $param =~ /^(ip)$/){
			my $net_param = $1;
			for my $key (k
Download .txt
gitextract_gne0gw27/

├── .clang-format
├── .clang-tidy
├── .codeclimate.yml
├── .ctest/
│   └── config.cmake
├── .git-blame-ignore-revs
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .ignore
├── .mailmap
├── .pre-commit-config.yaml
├── AUDIT.md
├── ApMon/
│   ├── AUTHORS
│   ├── COPYING
│   ├── ChangeLog
│   ├── INSTALL
│   ├── Makefile
│   ├── NEWS
│   ├── README
│   ├── eos-apmon.spec
│   ├── etc/
│   │   └── logrotate.d/
│   │       └── eosapmond
│   ├── jenkins-build.sh
│   ├── maketar.sh
│   ├── opt/
│   │   └── eos/
│   │       └── apmon/
│   │           └── eosapmond
│   ├── perl/
│   │   └── ApMon/
│   │       ├── ApMon/
│   │       │   ├── BgMonitor.pm
│   │       │   ├── Common.pm
│   │       │   ├── ConfigLoader.pm
│   │       │   ├── ProcInfo.pm
│   │       │   └── XDRUtils.pm
│   │       ├── ApMon.pm
│   │       ├── sendToML.sh
│   │       └── servMon.sh
│   ├── run.sh
│   └── usr/
│       └── lib/
│           └── systemd/
│               └── system/
│                   └── eosapmond.service
├── CMakeLists.txt
├── CTestConfig.cmake
├── License
├── README.md
├── archive/
│   ├── CMakeLists.txt
│   ├── eosarch/
│   │   ├── __init__.py
│   │   ├── archivefile.py
│   │   ├── asynchandler.py
│   │   ├── configuration.py
│   │   ├── exceptions.py
│   │   ├── processinfo.py
│   │   ├── tests/
│   │   │   ├── __init__.py
│   │   │   ├── env.py
│   │   │   └── test_archivefile.py
│   │   ├── transfer.py
│   │   └── utils.py
│   ├── eosarch_reconstruct.py
│   ├── eosarch_run.py
│   ├── eosarchived.conf
│   ├── eosarchived.py
│   ├── eosarchived.service
│   ├── eosarchived_env.sysconfig
│   └── opt-eos-xrootd.pth
├── auth_plugin/
│   ├── CMakeLists.txt
│   ├── EosAuthOfs.cc
│   ├── EosAuthOfs.hh
│   ├── EosAuthOfsDirectory.cc
│   ├── EosAuthOfsDirectory.hh
│   ├── EosAuthOfsFile.cc
│   ├── EosAuthOfsFile.hh
│   ├── Namespace.hh
│   ├── ProtoUtils.cc
│   ├── ProtoUtils.hh
│   └── proto/
│       ├── Chksum.proto
│       ├── Chmod.proto
│       ├── DirClose.proto
│       ├── DirFname.proto
│       ├── DirOpen.proto
│       ├── DirRead.proto
│       ├── Exists.proto
│       ├── FS_ctl.proto
│       ├── FileClose.proto
│       ├── FileFname.proto
│       ├── FileOpen.proto
│       ├── FileRead.proto
│       ├── FileStat.proto
│       ├── FileWrite.proto
│       ├── Fsctl.proto
│       ├── GetStats.proto
│       ├── Mkdir.proto
│       ├── Prepare.proto
│       ├── Rem.proto
│       ├── Remdir.proto
│       ├── Rename.proto
│       ├── Request.proto
│       ├── Response.proto
│       ├── Stat.proto
│       ├── Truncate.proto
│       ├── XrdOucErrInfo.proto
│       ├── XrdSecEntity.proto
│       ├── XrdSfsFSctl.proto
│       └── XrdSfsPrep.proto
├── client/
│   ├── CMakeLists.txt
│   ├── Namespace.hh
│   └── grpc/
│       ├── Find.cc
│       ├── GrpcClient.cc
│       ├── GrpcClient.hh
│       ├── GrpcClientAuthProcessor.hh
│       ├── Insert.cc
│       ├── Md.cc
│       ├── Ns.cc
│       ├── NsStat.cc
│       └── Ping.cc
├── cmake/
│   ├── CPUArchFlags.cmake
│   ├── DownloadProject.CMakeLists.cmake.in
│   ├── DownloadProject.cmake
│   ├── EosCompileFlags.cmake
│   ├── EosCoverage.cmake
│   ├── EosFindLibs.cmake
│   ├── EosGraphviz.cmake
│   ├── EosOSDefaults.cmake
│   ├── EosSummary.cmake
│   ├── EosTui.cmake
│   ├── EosTuiInstall.cmake.in
│   ├── EosUtils.cmake
│   ├── FindActiveMQCPP.cmake
│   ├── FindAtomic.cmake
│   ├── FindEosGrpcGateway.cmake
│   ├── FindGRPC.cmake
│   ├── FindGlobus.cmake
│   ├── FindLibevent.cmake
│   ├── FindProtobuf3.cmake
│   ├── FindPythonSitePkg.cmake
│   ├── FindRocksDB.cmake
│   ├── FindScitokens.cmake
│   ├── FindSnappy.cmake
│   ├── FindSparseHash.cmake
│   ├── FindSphinx.cmake
│   ├── FindXRootD.cmake
│   ├── FindZMQ.cmake
│   ├── Findabsl.cmake
│   ├── Findbz2.cmake
│   ├── Finddavix.cmake
│   ├── Findeosfolly.cmake
│   ├── Findfuse.cmake
│   ├── Findfuse3.cmake
│   ├── Findglibc.cmake
│   ├── Findhelp2man.cmake
│   ├── Findisal.cmake
│   ├── Findisal_crypto.cmake
│   ├── Findjemalloc.cmake
│   ├── Findjsoncpp.cmake
│   ├── Findkrb5.cmake
│   ├── Findldap.cmake
│   ├── Findlibbfd.cmake
│   ├── Findlibproc2.cmake
│   ├── Findlibunwind.cmake
│   ├── Findlz4.cmake
│   ├── Findncurses.cmake
│   ├── Findnfs.cmake
│   ├── Findprocps.cmake
│   ├── Findreadline.cmake
│   ├── Finduuid.cmake
│   ├── Findxfs.cmake
│   ├── Findxxhash.cmake
│   ├── Findzstd.cmake
│   ├── cmake_uninstall.cmake.in
│   └── config_spec.cmake.in
├── common/
│   ├── Assert.hh
│   ├── AssistedThread.hh
│   ├── Audit.cc
│   ├── Audit.hh
│   ├── BehaviourConfig.cc
│   ├── BehaviourConfig.hh
│   ├── BufferManager.cc
│   ├── BufferManager.hh
│   ├── CLI11.hpp
│   ├── CMakeLists.txt
│   ├── CloExec.hh
│   ├── ClockGetTime.cc
│   ├── ClockGetTime.hh
│   ├── CommentLog.cc
│   ├── CommentLog.hh
│   ├── ConcurrentQueue.hh
│   ├── Config.cc
│   ├── Config.hh
│   ├── Constants.hh
│   ├── CopyProcess.hh
│   ├── Counter.hh
│   ├── CtaCommon.hh
│   ├── DBG.hh
│   ├── Definitions.hh
│   ├── EosLayoutPrint.cc
│   ├── ErrnoToString.cc
│   ├── ErrnoToString.hh
│   ├── ExpiryCache.hh
│   ├── FileId.hh
│   ├── FileMap.hh
│   ├── FileSystem.cc
│   ├── FileSystem.hh
│   ├── Fmd.cc
│   ├── Fmd.hh
│   ├── FutureWrapper.hh
│   ├── Glob.cc
│   ├── Glob.hh
│   ├── IRWMutex.hh
│   ├── InodeTranslator.hh
│   ├── InstanceName.cc
│   ├── InstanceName.hh
│   ├── IntervalStopwatch.cc
│   ├── IntervalStopwatch.hh
│   ├── IoPipe.hh
│   ├── JeMallocHandler.cc
│   ├── JeMallocHandler.hh
│   ├── LOGGING.md
│   ├── LRU.hh
│   ├── LayoutId.hh
│   ├── LinuxFds.hh
│   ├── LinuxMemConsumption.hh
│   ├── LinuxStat.hh
│   ├── LinuxTotalMem.hh
│   ├── Locators.cc
│   ├── Locators.hh
│   ├── Logging.cc
│   ├── Logging.hh
│   ├── Macros.hh
│   ├── Mapping.cc
│   ├── Mapping.hh
│   ├── Murmur3.hh
│   ├── MutexLatencyWatcher.cc
│   ├── MutexLatencyWatcher.hh
│   ├── Namespace.hh
│   ├── OAuth.cc
│   ├── OAuth.hh
│   ├── ObserverMgr.hh
│   ├── Parallel.hh
│   ├── ParseUtils.hh
│   ├── PasswordHandler.hh
│   ├── Path.hh
│   ├── PthreadRWMutex.cc
│   ├── PthreadRWMutex.hh
│   ├── QuarkDBHealthParser.hh
│   ├── RWMutex.cc
│   ├── RWMutex.hh
│   ├── RateLimit.cc
│   ├── RateLimit.hh
│   ├── RegexWrapper.cc
│   ├── RegexWrapper.hh
│   ├── Report.cc
│   ├── Report.hh
│   ├── SecEntity.hh
│   ├── ShardedCache.hh
│   ├── SharedCallbackList.hh
│   ├── SharedMutex.cc
│   ├── SharedMutex.hh
│   ├── ShellCmd.cc
│   ├── ShellCmd.hh
│   ├── ShellExecutor.cc
│   ├── ShellExecutor.hh
│   ├── StackTrace.hh
│   ├── StacktraceHere.cc
│   ├── StacktraceHere.hh
│   ├── Statfs.cc
│   ├── Statfs.hh
│   ├── Statistics.hh
│   ├── Status.hh
│   ├── SteadyClock.hh
│   ├── Strerror_r_wrapper.cc
│   ├── Strerror_r_wrapper.hh
│   ├── StringConversion.cc
│   ├── StringConversion.hh
│   ├── StringSplit.hh
│   ├── StringTokenizer.cc
│   ├── StringTokenizer.hh
│   ├── StringUtils.hh
│   ├── SymKeys.cc
│   ├── SymKeys.hh
│   ├── SyncAll.hh
│   ├── SystemClock.hh
│   ├── ThreadPool.hh
│   ├── Timing.hh
│   ├── UnixGroupsFetcher.cc
│   ├── UnixGroupsFetcher.hh
│   ├── Untraceable.hh
│   ├── UriCapCipher.cc
│   ├── UriCapCipher.hh
│   ├── Utils.cc
│   ├── Utils.hh
│   ├── VirtualIdentity.cc
│   ├── VirtualIdentity.hh
│   ├── WFEClient.hh
│   ├── WaitInterval.hh
│   ├── WebNotify.cc
│   ├── WebNotify.hh
│   ├── XattrCompat.hh
│   ├── XrdConnPool.cc
│   ├── XrdConnPool.hh
│   ├── XrdErrorMap.cc
│   ├── XrdErrorMap.hh
│   ├── async/
│   │   ├── ExecutorMgr.hh
│   │   └── OpaqueFuture.hh
│   ├── blake3/
│   │   ├── README.md
│   │   ├── blake3.c
│   │   ├── blake3.h
│   │   ├── blake3_avx2.c
│   │   ├── blake3_avx2_x86-64_unix.S
│   │   ├── blake3_avx512.c
│   │   ├── blake3_avx512_x86-64_unix.S
│   │   ├── blake3_dispatch.c
│   │   ├── blake3_impl.h
│   │   ├── blake3_neon.c
│   │   ├── blake3_portable.c
│   │   ├── blake3_sse2.c
│   │   ├── blake3_sse2_x86-64_unix.S
│   │   ├── blake3_sse41.c
│   │   ├── blake3_sse41_x86-64_unix.S
│   │   └── main.c
│   ├── concurrency/
│   │   ├── AlignMacros.hh
│   │   ├── AlignedArray.hh
│   │   ├── AtomicUniquePtr.h
│   │   ├── RCULite.hh
│   │   ├── ThreadEpochCounter.cc
│   │   └── ThreadEpochCounter.hh
│   ├── config/
│   │   ├── ConfigParsing.cc
│   │   ├── ConfigParsing.hh
│   │   └── ConfigStore.hh
│   ├── crc32c/
│   │   ├── crc32c.cc
│   │   ├── crc32c.h
│   │   ├── crc32ctables.cc
│   │   └── crc32ctables.h
│   ├── doxygen.hh
│   ├── eos_cta_pb/
│   │   ├── CMakeLists.txt
│   │   └── EosCtaAlertHandler.hh
│   ├── exception/
│   │   ├── Exception.cc
│   │   └── Exception.hh
│   ├── highwayhash/
│   │   ├── arch_specific.h
│   │   ├── c_bindings.h
│   │   ├── compiler_specific.h
│   │   ├── data_parallel.h
│   │   ├── endianess.h
│   │   ├── hh_avx2.h
│   │   ├── hh_buffer.h
│   │   ├── hh_neon.h
│   │   ├── hh_portable.h
│   │   ├── hh_sse41.h
│   │   ├── hh_types.h
│   │   ├── hh_vsx.h
│   │   ├── highwayhash.h
│   │   ├── highwayhash_target.h
│   │   ├── highwayhash_test_target.h
│   │   ├── iaca.h
│   │   ├── instruction_sets.h
│   │   ├── load3.h
│   │   ├── nanobenchmark.h
│   │   ├── os_mac.h
│   │   ├── os_specific.h
│   │   ├── profiler.h
│   │   ├── robust_statistics.h
│   │   ├── scalar.h
│   │   ├── scalar_sip_tree_hash.h
│   │   ├── sip_hash.h
│   │   ├── sip_tree_hash.h
│   │   ├── state_helpers.h
│   │   ├── tsc_timer.h
│   │   ├── vector128.h
│   │   ├── vector256.h
│   │   ├── vector_neon.h
│   │   └── vector_test_target.h
│   ├── hopscotch_hash.hh
│   ├── hopscotch_map.hh
│   ├── http/
│   │   ├── HttpHandler.hh
│   │   ├── HttpRequest.cc
│   │   ├── HttpRequest.hh
│   │   ├── HttpResponse.cc
│   │   ├── HttpResponse.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── MimeTypes.hh
│   │   ├── OwnCloud.hh
│   │   ├── PlainHttpResponse.hh
│   │   ├── ProtocolHandler.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   └── s3/
│   │       ├── S3Handler.cc
│   │       ├── S3Handler.hh
│   │       └── S3Response.hh
│   ├── json/
│   │   ├── Json.hh
│   │   ├── JsonCppJsonifier.hh
│   │   ├── Jsonifiable.hh
│   │   └── Jsonifier.hh
│   ├── mq/
│   │   ├── FsChangeListener.cc
│   │   ├── FsChangeListener.hh
│   │   ├── GlobalConfigChangeListener.cc
│   │   ├── GlobalConfigChangeListener.hh
│   │   ├── LocalHash.cc
│   │   ├── LocalHash.hh
│   │   ├── MessagingRealm.cc
│   │   ├── MessagingRealm.hh
│   │   ├── Namespace.hh
│   │   ├── QdbListener.cc
│   │   ├── QdbListener.hh
│   │   ├── SharedDequeProvider.cc
│   │   ├── SharedDequeProvider.hh
│   │   ├── SharedHashProvider.cc
│   │   ├── SharedHashProvider.hh
│   │   ├── SharedHashWrapper.cc
│   │   ├── SharedHashWrapper.hh
│   │   └── XrdMqTiming.hh
│   ├── mutextest/
│   │   └── RWMutexTest.cc
│   ├── plugin_manager/
│   │   ├── DynamicLibrary.cc
│   │   ├── DynamicLibrary.hh
│   │   ├── Plugin.hh
│   │   ├── PluginManager.cc
│   │   └── PluginManager.hh
│   ├── shaping/
│   │   ├── IoStatsKey.hh
│   │   └── SlidingWindowStats.hh
│   ├── shellexectest/
│   │   └── shell_exec_test.cc
│   ├── stringencoders/
│   │   ├── modp_numtoa.c
│   │   └── modp_numtoa.h
│   ├── table_formatter/
│   │   ├── TableCell.cc
│   │   ├── TableCell.hh
│   │   ├── TableFormatterBase.cc
│   │   ├── TableFormatterBase.hh
│   │   └── TableFormatting.hh
│   ├── thread_id.hh
│   ├── token/
│   │   ├── EosTok.cc
│   │   ├── EosTok.hh
│   │   ├── SciToken.cc
│   │   ├── SciToken.hh
│   │   ├── Token.hh
│   │   ├── eosscitokenmodule.c
│   │   ├── example/
│   │   │   └── eossci.py
│   │   ├── scitoken.h
│   │   └── setup.py
│   ├── ulib/
│   │   ├── hash_align.h
│   │   ├── hash_align_prot.h
│   │   ├── ulib.c
│   │   ├── util_algo.h
│   │   └── util_class.h
│   └── utils/
│       ├── BackOffInvoker.hh
│       ├── BindArguments.hh
│       ├── ContainerUtils.hh
│       ├── RandUtils.hh
│       ├── TypeTraits.hh
│       ├── XrdUtils.cc
│       └── XrdUtils.hh
├── console/
│   ├── CMakeLists.txt
│   ├── CommandFramework.cc
│   ├── CommandFramework.hh
│   ├── ConsoleArgParser.cc
│   ├── ConsoleArgParser.hh
│   ├── ConsoleCliCommand.cc
│   ├── ConsoleCliCommand.hh
│   ├── ConsoleCompletion.cc
│   ├── ConsoleCompletion.hh
│   ├── ConsoleMain.cc
│   ├── ConsoleMain.hh
│   ├── ConsoleMainExecutable.cc
│   ├── GlobalOptions.hh
│   ├── ICommand.hh
│   ├── README.md
│   ├── RegexUtil.cc
│   ├── RegexUtil.hh
│   ├── commands/
│   │   ├── HealthCommand.cc
│   │   ├── HealthCommand.hh
│   │   ├── coms/
│   │   │   └── unused/
│   │   │       ├── com_access.cc
│   │   │       ├── com_accounting.cc
│   │   │       ├── com_archive.cc
│   │   │       ├── com_attr.cc
│   │   │       ├── com_backup.cc
│   │   │       ├── com_cd.cc
│   │   │       ├── com_chmod.cc
│   │   │       ├── com_chown.cc
│   │   │       ├── com_clear.cc
│   │   │       ├── com_cp.cc
│   │   │       ├── com_daemon.cc
│   │   │       ├── com_debug.cc
│   │   │       ├── com_du.cc
│   │   │       ├── com_evict.cc
│   │   │       ├── com_file.cc
│   │   │       ├── com_fuse.cc
│   │   │       ├── com_fusex.cc
│   │   │       ├── com_geosched.cc
│   │   │       ├── com_health.cc
│   │   │       ├── com_info.cc
│   │   │       ├── com_inspector.cc
│   │   │       ├── com_json.cc
│   │   │       ├── com_license.cc
│   │   │       ├── com_ln.cc
│   │   │       ├── com_map.cc
│   │   │       ├── com_member.cc
│   │   │       ├── com_mkdir.cc
│   │   │       ├── com_motd.cc
│   │   │       ├── com_mv.cc
│   │   │       ├── com_old_find.cc
│   │   │       ├── com_print.cc
│   │   │       ├── com_proto_access.cc
│   │   │       ├── com_proto_acl.cc
│   │   │       ├── com_proto_config.cc
│   │   │       ├── com_proto_convert.cc
│   │   │       ├── com_proto_debug.cc
│   │   │       ├── com_proto_devices.cc
│   │   │       ├── com_proto_df.cc
│   │   │       ├── com_proto_find.cc
│   │   │       ├── com_proto_fs.cc
│   │   │       ├── com_proto_fsck.cc
│   │   │       ├── com_proto_group.cc
│   │   │       ├── com_proto_io.cc
│   │   │       ├── com_proto_node.cc
│   │   │       ├── com_proto_ns.cc
│   │   │       ├── com_proto_quota.cc
│   │   │       ├── com_proto_recycle.cc
│   │   │       ├── com_proto_register.cc
│   │   │       ├── com_proto_rm.cc
│   │   │       ├── com_proto_route.cc
│   │   │       ├── com_proto_sched.cc
│   │   │       ├── com_proto_space.cc
│   │   │       ├── com_proto_token.cc
│   │   │       ├── com_pwd.cc
│   │   │       ├── com_quit.cc
│   │   │       ├── com_quota.cc
│   │   │       ├── com_rclone.cc
│   │   │       ├── com_reconnect.cc
│   │   │       ├── com_report.cc
│   │   │       ├── com_rm.cc
│   │   │       ├── com_rmdir.cc
│   │   │       ├── com_role.cc
│   │   │       ├── com_rtlog.cc
│   │   │       ├── com_scitoken.cc
│   │   │       ├── com_silent.cc
│   │   │       ├── com_squash.cc
│   │   │       ├── com_stat.cc
│   │   │       ├── com_status.cc
│   │   │       ├── com_test.cc
│   │   │       ├── com_timing.cc
│   │   │       ├── com_touch.cc
│   │   │       ├── com_tracker.cc
│   │   │       ├── com_version.cc
│   │   │       ├── com_vid.cc
│   │   │       ├── com_who.cc
│   │   │       └── com_whoami.cc
│   │   ├── helpers/
│   │   │   ├── AclHelper.cc
│   │   │   ├── AclHelper.hh
│   │   │   ├── FsHelper.cc
│   │   │   ├── FsHelper.hh
│   │   │   ├── FsckHelper.cc
│   │   │   ├── FsckHelper.hh
│   │   │   ├── ICmdHelper.cc
│   │   │   ├── ICmdHelper.hh
│   │   │   ├── NewfindHelper.cc
│   │   │   ├── NewfindHelper.hh
│   │   │   ├── NodeHelper.cc
│   │   │   ├── NodeHelper.hh
│   │   │   ├── RecycleHelper.cc
│   │   │   ├── RecycleHelper.hh
│   │   │   ├── TokenHelper.cc
│   │   │   ├── TokenHelper.hh
│   │   │   └── jwk_generator/
│   │   │       ├── c_resource.hpp
│   │   │       ├── errors.hpp
│   │   │       ├── jwk_generator.hpp
│   │   │       ├── keyspecs/
│   │   │       │   ├── ec_key.hpp
│   │   │       │   └── rsa_key.hpp
│   │   │       ├── libs/
│   │   │       │   ├── base64_url.hpp
│   │   │       │   ├── json.hpp
│   │   │       │   └── uuid.hpp
│   │   │       └── openssl_wrapper.hpp
│   │   └── native/
│   │       ├── CoreNativeCommands.cc
│   │       ├── LegacySymbols.cc
│   │       ├── access-proto-native.cc
│   │       ├── accounting-cmd-native.cc
│   │       ├── acl-proto-native.cc
│   │       ├── archive-cmd-native.cc
│   │       ├── attr-cmd-native.cc
│   │       ├── backup-cmd-native.cc
│   │       ├── cat-com-native.cc
│   │       ├── cd-cmd-native.cc
│   │       ├── chmod-cmd-native.cc
│   │       ├── chown-cmd-native.cc
│   │       ├── clear-cmd-native.cc
│   │       ├── config-proto-native.cc
│   │       ├── convert-proto-native.cc
│   │       ├── cp-cmd-native.cc
│   │       ├── daemon-native.cc
│   │       ├── debug-cmd-native.cc
│   │       ├── devices-proto-native.cc
│   │       ├── df-proto-native.cc
│   │       ├── du-native.cc
│   │       ├── du-proto-native.cc
│   │       ├── evict-cmd-native.cc
│   │       ├── file-cmd-native.cc
│   │       ├── fileinfo-alias.cc
│   │       ├── find-proto-native.cc
│   │       ├── fs-proto-native.cc
│   │       ├── fsck-proto-native.cc
│   │       ├── fuse-native.cc
│   │       ├── fusex-cmd-native.cc
│   │       ├── geosched-cmd-native.cc
│   │       ├── group-proto-native.cc
│   │       ├── health-native.cc
│   │       ├── info-alias.cc
│   │       ├── info-native.cc
│   │       ├── inspector-proto-native.cc
│   │       ├── io-proto-native.cc
│   │       ├── license-native.cc
│   │       ├── ln-cmd-native.cc
│   │       ├── ls-cmd-native.cc
│   │       ├── ls-compat.cc
│   │       ├── map-cmd-native.cc
│   │       ├── member-cmd-native.cc
│   │       ├── mkdir-cmd-native.cc
│   │       ├── motd-cmd-native.cc
│   │       ├── mv-alias.cc
│   │       ├── node-proto-native.cc
│   │       ├── ns-proto-native.cc
│   │       ├── oldfind-cmd-native.cc
│   │       ├── pwd-native.cc
│   │       ├── quota-proto-native.cc
│   │       ├── rclone-cmd-native.cc
│   │       ├── reconnect-native.cc
│   │       ├── recycle-proto-native.cc
│   │       ├── register-proto-native.cc
│   │       ├── report-native.cc
│   │       ├── rm-proto-native.cc
│   │       ├── rmdir-cmd-native.cc
│   │       ├── role-native.cc
│   │       ├── route-proto-native.cc
│   │       ├── rtlog-cmd-native.cc
│   │       ├── sched-proto-native.cc
│   │       ├── scitoken-native.cc
│   │       ├── space-proto-native.cc
│   │       ├── squash-cmd-native.cc
│   │       ├── stat-native.cc
│   │       ├── status-native.cc
│   │       ├── test-native.cc
│   │       ├── token-proto-native.cc
│   │       ├── touch-cmd-native.cc
│   │       ├── tracker-proto-native.cc
│   │       ├── tui-native.cc
│   │       ├── version-cmd-native.cc
│   │       ├── vid-cmd-native.cc
│   │       ├── who-cmd-native.cc
│   │       └── whoami-cmd-native.cc
│   ├── eos-iam-mapfile
│   ├── eosadmin
│   └── eosreport
├── coverage/
│   └── eoslcov.rc
├── debian/
│   ├── compat
│   ├── control.template
│   ├── copyright
│   ├── eos-client.install
│   ├── eos-fusex.install
│   ├── eos-fusex.postinst
│   ├── eos-test.install
│   ├── eos-testkeytab.install
│   ├── eos-testkeytab.postinst
│   ├── rules
│   └── source/
│       └── format
├── doc/
│   ├── _themes/
│   │   ├── solar_theme/
│   │   │   ├── __init__.py
│   │   │   ├── layout.html
│   │   │   ├── static/
│   │   │   │   ├── solar.css
│   │   │   │   └── solarized-dark.css
│   │   │   └── theme.conf
│   │   └── sphinx13/
│   │       ├── layout.html
│   │       └── theme.conf
│   ├── citrine/
│   │   ├── Doxyfile
│   │   ├── backup_clone.rst
│   │   ├── backup_clone.txt
│   │   ├── clicommands/
│   │   │   ├── accounting.rst
│   │   │   ├── acl.rst
│   │   │   ├── archive.rst
│   │   │   ├── attr.rst
│   │   │   ├── backup.rst
│   │   │   ├── cd.rst
│   │   │   ├── chmod.rst
│   │   │   ├── chown.rst
│   │   │   ├── clear.rst
│   │   │   ├── config.rst
│   │   │   ├── console.rst
│   │   │   ├── cp.rst
│   │   │   ├── debug.rst
│   │   │   ├── evict.rst
│   │   │   ├── exit.rst
│   │   │   ├── file.rst
│   │   │   ├── fileinfo.rst
│   │   │   ├── find.rst
│   │   │   ├── fs.rst
│   │   │   ├── fsck.rst
│   │   │   ├── fuse.rst
│   │   │   ├── fusex.rst
│   │   │   ├── geosched.rst
│   │   │   ├── group.rst
│   │   │   ├── health.rst
│   │   │   ├── help.rst
│   │   │   ├── info.rst
│   │   │   ├── inspector.rst
│   │   │   ├── io.rst
│   │   │   ├── json.rst
│   │   │   ├── license.rst
│   │   │   ├── ln.rst
│   │   │   ├── ls.rst
│   │   │   ├── map.rst
│   │   │   ├── member.rst
│   │   │   ├── mkdir.rst
│   │   │   ├── motd.rst
│   │   │   ├── mv.rst
│   │   │   ├── newfind.rst
│   │   │   ├── node.rst
│   │   │   ├── ns.rst
│   │   │   ├── pointq.rst
│   │   │   ├── pwd.rst
│   │   │   ├── question.rst
│   │   │   ├── quit.rst
│   │   │   ├── quota.rst
│   │   │   ├── reconnect.rst
│   │   │   ├── recycle.rst
│   │   │   ├── rm.rst
│   │   │   ├── rmdir.rst
│   │   │   ├── role.rst
│   │   │   ├── route.rst
│   │   │   ├── rtlog.rst
│   │   │   ├── silent.rst
│   │   │   ├── space.rst
│   │   │   ├── squash.rst
│   │   │   ├── stat.rst
│   │   │   ├── test.rst
│   │   │   ├── timing.rst
│   │   │   ├── token.rst
│   │   │   ├── touch.rst
│   │   │   ├── tracker.rst
│   │   │   ├── transfer.rst
│   │   │   ├── version.rst
│   │   │   ├── vid.rst
│   │   │   ├── who.rst
│   │   │   └── whoami.rst
│   │   ├── clicommands.rst
│   │   ├── conf.py
│   │   ├── configuration/
│   │   │   ├── archive.rst
│   │   │   ├── balancing.rst
│   │   │   ├── converter.rst
│   │   │   ├── converter_engine.rst
│   │   │   ├── draining.rst
│   │   │   ├── egi.rst
│   │   │   ├── fsck.rst
│   │   │   ├── fuse.rst
│   │   │   ├── fusex.rst
│   │   │   ├── geobalancer.rst
│   │   │   ├── geoscheduling.rst
│   │   │   ├── geotags.rst
│   │   │   ├── groupbalancer.rst
│   │   │   ├── groupdrainer.rst
│   │   │   ├── http.rst
│   │   │   ├── http_tpc.rst
│   │   │   ├── import.rst
│   │   │   ├── inspector.rst
│   │   │   ├── kinetic.rst
│   │   │   ├── logicalpath.rst
│   │   │   ├── lru.rst
│   │   │   ├── master.rst
│   │   │   ├── master_quarkdb.rst
│   │   │   ├── namespace.rst
│   │   │   ├── permission.rst
│   │   │   ├── proxys.rst
│   │   │   ├── qos.rst
│   │   │   ├── quarkdb.rst
│   │   │   ├── quota.rst
│   │   │   ├── recyclebin.rst
│   │   │   ├── route.rst
│   │   │   ├── s3.rst
│   │   │   ├── scheduler.rst
│   │   │   ├── tracker.rst
│   │   │   ├── transfer.rst
│   │   │   ├── tty.rst
│   │   │   └── wfe.rst
│   │   ├── configuration.rst
│   │   ├── contents.rst
│   │   ├── develop.rst
│   │   ├── generate_docs.py
│   │   ├── index.rst
│   │   ├── install.rst
│   │   ├── intro.rst
│   │   ├── quickstart/
│   │   │   ├── admin/
│   │   │   │   ├── configure.rst
│   │   │   │   └── krb5.rst
│   │   │   ├── boxed.rst
│   │   │   ├── client/
│   │   │   │   └── configure.rst
│   │   │   ├── docker_image.rst
│   │   │   ├── install.rst
│   │   │   ├── kubernetes.rst
│   │   │   ├── ns_quarkdb.rst
│   │   │   ├── setup_repo.rst
│   │   │   ├── uboxed.rst
│   │   │   ├── ubuntu.rst
│   │   │   └── update_eos4to5.rst
│   │   ├── quickstart.rst
│   │   ├── releases/
│   │   │   ├── amber.rst
│   │   │   ├── beryl-release.rst
│   │   │   ├── beryl.rst
│   │   │   ├── citrine-release.rst
│   │   │   ├── citrine.rst
│   │   │   ├── diopside-release.rst
│   │   │   └── diopside.rst
│   │   ├── releases.rst
│   │   ├── restapi/
│   │   │   ├── fileinfo.rst
│   │   │   ├── format.rst
│   │   │   ├── fs.rst
│   │   │   ├── group.rst
│   │   │   ├── grpc.rst
│   │   │   ├── node.rst
│   │   │   ├── ns.rst
│   │   │   ├── putrange.rst
│   │   │   ├── space.rst
│   │   │   ├── version.rst
│   │   │   └── who.rst
│   │   ├── restapi.rst
│   │   ├── taperestapi/
│   │   │   └── configuration.rst
│   │   ├── taperestapi.rst
│   │   ├── using/
│   │   │   ├── archive.rst
│   │   │   ├── attributelocks.rst
│   │   │   ├── eos_services.rst
│   │   │   ├── fusex.rst
│   │   │   ├── oauth2.rst
│   │   │   ├── policies.rst
│   │   │   ├── priorities.rst
│   │   │   ├── rain.rst
│   │   │   ├── reports.rst
│   │   │   ├── sharedfs.rst
│   │   │   ├── squashfs.rst
│   │   │   ├── systemd.rst
│   │   │   ├── tokens.rst
│   │   │   └── versions.rst
│   │   └── using.rst
│   └── diopside/
│       ├── architecture/
│       │   └── index.rst
│       ├── blog/
│       │   └── features.rst
│       ├── conf.py
│       ├── configuration.rst
│       ├── faq/
│       │   ├── exotic.rst
│       │   └── index.rst
│       ├── index.rst
│       ├── introduction/
│       │   └── index.rst
│       ├── manual/
│       │   ├── configuration.rst
│       │   ├── develop.rst
│       │   ├── egi.rst
│       │   ├── formats.rst
│       │   ├── getting-started.rst
│       │   ├── hardware-installation.rst
│       │   ├── index.rst
│       │   ├── interfaces.rst
│       │   ├── microservices.rst
│       │   ├── protocols.rst
│       │   └── using.rst
│       ├── my-changes.patch
│       └── releases/
│           ├── #diopside-release.rst#
│           ├── 5.4.0/
│           │   └── recycle_bin_config.rst
│           ├── amber.rst
│           ├── beryl-release.rst
│           ├── beryl.rst
│           ├── citrine-release.rst
│           ├── citrine.rst
│           ├── diopside-release.rst
│           ├── diopside.rst
│           └── index.rst
├── elrepopackage.spec
├── eos.spec.in
├── fst/
│   ├── CMakeLists.txt
│   ├── Config.cc
│   ├── Config.hh
│   ├── Deletion.hh
│   ├── Health.cc
│   ├── Health.hh
│   ├── Load.cc
│   ├── Load.hh
│   ├── Namespace.hh
│   ├── ScanDir.cc
│   ├── ScanDir.hh
│   ├── Verify.hh
│   ├── XrdFstOfs.cc
│   ├── XrdFstOfs.hh
│   ├── XrdFstOfsFile.cc
│   ├── XrdFstOfsFile.hh
│   ├── XrdFstOss.cc
│   ├── XrdFstOss.hh
│   ├── XrdFstOssFile.cc
│   ├── XrdFstOssFile.hh
│   ├── checksum/
│   │   ├── Adler.cc
│   │   ├── Adler.hh
│   │   ├── BLAKE3.hh
│   │   ├── CRC32.hh
│   │   ├── CRC32C.hh
│   │   ├── CRC64.hh
│   │   ├── CheckSum.cc
│   │   ├── CheckSum.hh
│   │   ├── ChecksumGroup.hh
│   │   ├── ChecksumPlugins.hh
│   │   ├── HWH64.hh
│   │   ├── MD5.hh
│   │   ├── SHA1.hh
│   │   ├── SHA256.hh
│   │   ├── XXHASH64.hh
│   │   └── cycletimer.h
│   ├── eoscp.cc
│   ├── filemd/
│   │   ├── FmdAttr.cc
│   │   ├── FmdAttr.hh
│   │   ├── FmdHandler.cc
│   │   ├── FmdHandler.hh
│   │   ├── FmdMgm.cc
│   │   └── FmdMgm.hh
│   ├── http/
│   │   ├── HttpHandler.cc
│   │   ├── HttpHandler.hh
│   │   ├── HttpHandlerFstFileCache.cc
│   │   ├── HttpHandlerFstFileCache.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   ├── s3/
│   │   │   ├── S3Handler.cc
│   │   │   └── S3Handler.hh
│   │   └── xrdhttp/
│   │       ├── EosFstHttpHandler.cc
│   │       ├── EosFstHttpHandler.hh
│   │       └── README.md
│   ├── io/
│   │   ├── AsyncMetaHandler.cc
│   │   ├── AsyncMetaHandler.hh
│   │   ├── ChunkHandler.cc
│   │   ├── ChunkHandler.hh
│   │   ├── FileIo.cc
│   │   ├── FileIo.hh
│   │   ├── FileIoPlugin-Server.cc
│   │   ├── FileIoPlugin.cc
│   │   ├── FileIoPlugin.hh
│   │   ├── FileIoPluginCommon.hh
│   │   ├── SimpleHandler.cc
│   │   ├── SimpleHandler.hh
│   │   ├── VectChunkHandler.cc
│   │   ├── VectChunkHandler.hh
│   │   ├── davix/
│   │   │   ├── DavixIo.cc
│   │   │   └── DavixIo.hh
│   │   ├── local/
│   │   │   ├── FsIo.cc
│   │   │   ├── FsIo.hh
│   │   │   ├── LocalIo.cc
│   │   │   └── LocalIo.hh
│   │   ├── nfs/
│   │   │   ├── NfsIo.cc
│   │   │   └── NfsIo.hh
│   │   └── xrd/
│   │       ├── ResponseCollector.cc
│   │       ├── ResponseCollector.hh
│   │       ├── XrdIo.cc
│   │       └── XrdIo.hh
│   ├── layout/
│   │   ├── HeaderCRC.cc
│   │   ├── HeaderCRC.hh
│   │   ├── Layout.cc
│   │   ├── Layout.hh
│   │   ├── LayoutPlugin.cc
│   │   ├── LayoutPlugin.hh
│   │   ├── PlainLayout.cc
│   │   ├── PlainLayout.hh
│   │   ├── RaidDpLayout.cc
│   │   ├── RaidDpLayout.hh
│   │   ├── RainBlock.cc
│   │   ├── RainBlock.hh
│   │   ├── RainGroup.cc
│   │   ├── RainGroup.hh
│   │   ├── RainMetaLayout.cc
│   │   ├── RainMetaLayout.hh
│   │   ├── ReedSLayout.cc
│   │   ├── ReedSLayout.hh
│   │   ├── ReplicaParLayout.cc
│   │   ├── ReplicaParLayout.hh
│   │   ├── gf-complete/
│   │   │   ├── .gitignore
│   │   │   ├── AUTHORS
│   │   │   ├── COPYING
│   │   │   ├── ChangeLog
│   │   │   ├── License.txt
│   │   │   ├── Makefile.am
│   │   │   ├── NEWS
│   │   │   ├── README
│   │   │   ├── README.txt
│   │   │   ├── autogen.sh
│   │   │   ├── configure.ac
│   │   │   ├── examples/
│   │   │   │   ├── Makefile.am
│   │   │   │   ├── gf_example_1.c
│   │   │   │   ├── gf_example_2.c
│   │   │   │   ├── gf_example_3.c
│   │   │   │   ├── gf_example_4.c
│   │   │   │   ├── gf_example_5.c
│   │   │   │   ├── gf_example_6.c
│   │   │   │   └── gf_example_7.c
│   │   │   ├── include/
│   │   │   │   ├── gf_complete.h
│   │   │   │   ├── gf_general.h
│   │   │   │   ├── gf_int.h
│   │   │   │   ├── gf_method.h
│   │   │   │   ├── gf_rand.h
│   │   │   │   ├── gf_w16.h
│   │   │   │   ├── gf_w32.h
│   │   │   │   ├── gf_w4.h
│   │   │   │   ├── gf_w64.h
│   │   │   │   └── gf_w8.h
│   │   │   ├── m4/
│   │   │   │   ├── ax_check_compile_flag.m4
│   │   │   │   ├── ax_ext.m4
│   │   │   │   ├── ax_gcc_x86_avx_xgetbv.m4
│   │   │   │   ├── ax_gcc_x86_cpuid.m4
│   │   │   │   ├── ltoptions.m4
│   │   │   │   ├── ltsugar.m4
│   │   │   │   └── lt~obsolete.m4
│   │   │   ├── manual/
│   │   │   │   ├── gf-complete.html
│   │   │   │   └── style.css
│   │   │   ├── src/
│   │   │   │   ├── Makefile.am
│   │   │   │   ├── gf.c
│   │   │   │   ├── gf_general.c
│   │   │   │   ├── gf_method.c
│   │   │   │   ├── gf_rand.c
│   │   │   │   ├── gf_w128.c
│   │   │   │   ├── gf_w16.c
│   │   │   │   ├── gf_w32.c
│   │   │   │   ├── gf_w4.c
│   │   │   │   ├── gf_w64.c
│   │   │   │   ├── gf_w8.c
│   │   │   │   ├── gf_wgen.c
│   │   │   │   └── neon/
│   │   │   │       ├── gf_w16_neon.c
│   │   │   │       ├── gf_w32_neon.c
│   │   │   │       ├── gf_w4_neon.c
│   │   │   │       ├── gf_w64_neon.c
│   │   │   │       └── gf_w8_neon.c
│   │   │   ├── test/
│   │   │   │   ├── Makefile.am
│   │   │   │   └── gf_unit.c
│   │   │   └── tools/
│   │   │       ├── Makefile.am
│   │   │       ├── gf_add.c
│   │   │       ├── gf_div.c
│   │   │       ├── gf_inline_time.c
│   │   │       ├── gf_methods.c
│   │   │       ├── gf_mult.c
│   │   │       ├── gf_poly.c
│   │   │       ├── gf_time.c
│   │   │       └── time_tool.sh
│   │   └── jerasure/
│   │       ├── .gitattributes
│   │       ├── .gitignore
│   │       ├── AUTHORS
│   │       ├── COPYING
│   │       ├── ChangeLog
│   │       ├── Examples/
│   │       │   ├── .gitignore
│   │       │   ├── Makefile.am
│   │       │   ├── cauchy_01.c
│   │       │   ├── cauchy_02.c
│   │       │   ├── cauchy_03.c
│   │       │   ├── cauchy_04.c
│   │       │   ├── decoder.c
│   │       │   ├── encode_decode.sh
│   │       │   ├── encoder.c
│   │       │   ├── jerasure_01.c
│   │       │   ├── jerasure_02.c
│   │       │   ├── jerasure_03.c
│   │       │   ├── jerasure_04.c
│   │       │   ├── jerasure_05.c
│   │       │   ├── jerasure_06.c
│   │       │   ├── jerasure_07.c
│   │       │   ├── jerasure_08.c
│   │       │   ├── liberation_01.c
│   │       │   ├── reed_sol_01.c
│   │       │   ├── reed_sol_02.c
│   │       │   ├── reed_sol_03.c
│   │       │   ├── reed_sol_04.c
│   │       │   ├── reed_sol_test_gf.c
│   │       │   ├── reed_sol_time_gf.c
│   │       │   ├── test_all_gfs.sh
│   │       │   ├── test_galois.c
│   │       │   └── time_all_gfs_argv_init.sh
│   │       ├── License.txt
│   │       ├── Makefile.am
│   │       ├── NEWS
│   │       ├── PERF.txt
│   │       ├── README
│   │       ├── configure.ac
│   │       ├── include/
│   │       │   ├── cauchy.h
│   │       │   ├── galois.h
│   │       │   ├── jerasure.h
│   │       │   ├── liberation.h
│   │       │   ├── reed_sol.h
│   │       │   └── timing.h
│   │       ├── m4/
│   │       │   ├── ax_check_compile_flag.m4
│   │       │   ├── ax_ext.m4
│   │       │   ├── ax_gcc_x86_avx_xgetbv.m4
│   │       │   ├── ax_gcc_x86_cpuid.m4
│   │       │   └── ax_require_defined.m4
│   │       └── src/
│   │           ├── Makefile.am
│   │           ├── cauchy.c
│   │           ├── cauchy_best_r6.c
│   │           ├── galois.c
│   │           ├── jerasure.c
│   │           ├── liberation.c
│   │           ├── reed_sol.c
│   │           └── timing.c
│   ├── storage/
│   │   ├── Communicator.cc
│   │   ├── ErrorReport.cc
│   │   ├── FileSystem.cc
│   │   ├── FileSystem.hh
│   │   ├── MgmSyncer.cc
│   │   ├── MonitorVarPartition.hh
│   │   ├── Publish.cc
│   │   ├── Remover.cc
│   │   ├── Report.cc
│   │   ├── Scrub.cc
│   │   ├── Storage.cc
│   │   ├── Storage.hh
│   │   ├── Supervisor.cc
│   │   ├── TrafficShaping.cc
│   │   ├── TrafficShaping.hh
│   │   └── Verify.cc
│   ├── tools/
│   │   ├── Adler32.cc
│   │   ├── CheckBlockXS.cc
│   │   ├── CheckSum.cc
│   │   ├── ComputeBlockXS.cc
│   │   ├── ConvertFileMD.cc
│   │   ├── IoPing.c
│   │   ├── RainCheck.cc
│   │   ├── RainHdrDump.cc
│   │   ├── RecoverRaidDP.cc
│   │   ├── ScanXS.cc
│   │   ├── eosfstinfo
│   │   └── eosfstregister
│   ├── utils/
│   │   ├── CheckFileReadWithPattern.cc
│   │   ├── CreateFileWithPattern.cc
│   │   ├── DiskMeasurements.cc
│   │   ├── DiskMeasurements.hh
│   │   ├── DiskMeasurementsMain.cc
│   │   ├── FSPathHandler.cc
│   │   ├── FSPathHandler.hh
│   │   ├── FTSWalkTree.hh
│   │   ├── IoPriority.cc
│   │   ├── IoPriority.hh
│   │   ├── OpenFileTracker.cc
│   │   ├── OpenFileTracker.hh
│   │   ├── ScanRate.cc
│   │   ├── ScanRate.hh
│   │   ├── StdFSWalkTree.hh
│   │   ├── TpcInfo.hh
│   │   ├── TransformAttr.hh
│   │   ├── XrdOfsPathHandler.cc
│   │   └── XrdOfsPathHandler.hh
│   └── xrdcl_plugins/
│       ├── CMakeLists.txt
│       ├── RainFile.cc
│       ├── RainFile.hh
│       ├── RainPlugin.cc
│       └── RainPlugin.hh
├── fusex/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── auth/
│   │   ├── AuthenticationGroup.cc
│   │   ├── AuthenticationGroup.hh
│   │   ├── BoundIdentityProvider.cc
│   │   ├── BoundIdentityProvider.hh
│   │   ├── CMakeLists.txt
│   │   ├── CredentialCache.hh
│   │   ├── CredentialFinder.cc
│   │   ├── CredentialFinder.hh
│   │   ├── CredentialValidator.cc
│   │   ├── CredentialValidator.hh
│   │   ├── DirectoryIterator.cc
│   │   ├── DirectoryIterator.hh
│   │   ├── EnvironmentReader.cc
│   │   ├── EnvironmentReader.hh
│   │   ├── FileDescriptor.hh
│   │   ├── JailIdentifier.cc
│   │   ├── JailIdentifier.hh
│   │   ├── Logbook.cc
│   │   ├── Logbook.hh
│   │   ├── LoginIdentifier.cc
│   │   ├── LoginIdentifier.hh
│   │   ├── ProcessCache.cc
│   │   ├── ProcessCache.hh
│   │   ├── ProcessInfo.cc
│   │   ├── ProcessInfo.hh
│   │   ├── README.md
│   │   ├── RmInfo.cc
│   │   ├── RmInfo.hh
│   │   ├── ScopedEUidSetter.hh
│   │   ├── ScopedFsUidSetter.hh
│   │   ├── SecurityChecker.cc
│   │   ├── SecurityChecker.hh
│   │   ├── UnixAuthenticator.cc
│   │   ├── UnixAuthenticator.hh
│   │   ├── UserCredentialFactory.cc
│   │   ├── UserCredentialFactory.hh
│   │   ├── UserCredentials.hh
│   │   ├── Utils.cc
│   │   ├── Utils.hh
│   │   ├── UuidStore.cc
│   │   └── UuidStore.hh
│   ├── backend/
│   │   ├── backend.cc
│   │   └── backend.hh
│   ├── benchmark/
│   │   ├── CMakeLists.txt
│   │   ├── eos-fusex-certify
│   │   └── fusex-benchmark.cc
│   ├── cap/
│   │   ├── cap.cc
│   │   └── cap.hh
│   ├── data/
│   │   ├── bufferll.hh
│   │   ├── cache.cc
│   │   ├── cache.hh
│   │   ├── cacheconfig.hh
│   │   ├── cachehandler.hh
│   │   ├── cachelock.hh
│   │   ├── cachesyncer.cc
│   │   ├── cachesyncer.hh
│   │   ├── data.cc
│   │   ├── data.hh
│   │   ├── dircleaner.cc
│   │   ├── dircleaner.hh
│   │   ├── diskcache.cc
│   │   ├── diskcache.hh
│   │   ├── interval_tree.hh
│   │   ├── io.hh
│   │   ├── journalcache.cc
│   │   ├── journalcache.hh
│   │   ├── memorycache.cc
│   │   ├── memorycache.hh
│   │   ├── rbtree.hh
│   │   ├── xrdclproxy.cc
│   │   └── xrdclproxy.hh
│   ├── eoscfsd/
│   │   ├── README.md
│   │   ├── cfs.sh
│   │   ├── cfskey.hh
│   │   ├── cfslogin.cc
│   │   ├── cfslogin.hh
│   │   ├── cfsmapping.hh
│   │   ├── cfsquota.hh
│   │   ├── cfsrecycle.cc
│   │   ├── cfsrecycle.hh
│   │   ├── cfsutil.hh
│   │   ├── cfsvattr.hh
│   │   ├── eoscfsd.cc
│   │   ├── eoscfsd.hh
│   │   ├── keychange.hh
│   │   ├── obfuscate.hh
│   │   └── overlay.hh
│   ├── eosfusebind
│   ├── eosxd/
│   │   ├── eosfuse.cc
│   │   ├── eosfuse.hh
│   │   ├── llfusexx.hh
│   │   └── main.cc
│   ├── fuse.conf.example
│   ├── fuse.example.stats.json
│   ├── fusex.proto
│   ├── kv/
│   │   ├── NoKV.cc
│   │   ├── NoKV.hh
│   │   ├── RocksKV.cc
│   │   ├── RocksKV.hh
│   │   └── kv.hh
│   ├── md/
│   │   ├── kernelcache.hh
│   │   ├── md.cc
│   │   └── md.hh
│   ├── misc/
│   │   ├── ConcurrentMount.cc
│   │   ├── ConcurrentMount.hh
│   │   ├── FuseException.hh
│   │   ├── FuseId.hh
│   │   ├── MacOSXHelper.hh
│   │   ├── RunningPidScanner.cc
│   │   ├── RunningPidScanner.hh
│   │   ├── SyncQueue.hh
│   │   ├── ThreadPool.hh
│   │   ├── Track.hh
│   │   ├── filename.hh
│   │   ├── fusexrdlogin.cc
│   │   ├── fusexrdlogin.hh
│   │   ├── longstring.cc
│   │   ├── longstring.hh
│   │   ├── richacl.hh
│   │   └── stringTS.hh
│   ├── stat/
│   │   ├── Stat.cc
│   │   └── Stat.hh
│   ├── submount/
│   │   ├── SubMount.cc
│   │   └── SubMount.hh
│   ├── tests/
│   │   ├── CMakeLists.txt
│   │   ├── auth/
│   │   │   ├── credential-finder.cc
│   │   │   ├── environment-reader.cc
│   │   │   ├── logbook.cc
│   │   │   ├── login-identifier.cc
│   │   │   ├── process-cache.cc
│   │   │   ├── process-info.cc
│   │   │   ├── rm-info.cc
│   │   │   ├── security-checker.cc
│   │   │   ├── test-utils.cc
│   │   │   ├── test-utils.hh
│   │   │   └── utils.cc
│   │   ├── eos-fusex-git-annex
│   │   ├── eos-fusex-recovery
│   │   ├── eos-test-fusex-messaging
│   │   ├── eos-test-fusex-producer-consumer
│   │   ├── interval-tree.cc
│   │   ├── ioverify.cc
│   │   ├── journal-cache.cc
│   │   ├── lru-test.cc
│   │   ├── rb-tree.cc
│   │   ├── rocks-kv.cc
│   │   └── stress/
│   │       └── xrdcl-proxy.cc
│   └── tsan/
│       └── suppressions.tsan
├── genversion.sh
├── git/
│   └── bin/
│       └── enable-hooks.sh
├── gitlab-ci/
│   ├── .gitlab-ci-build-macos.yml
│   ├── .gitlab-ci-build-ubuntu.yml
│   ├── .gitlab-ci-test-dock_include.yml
│   ├── .gitlab-ci-test-helm-server-multigroup-values.yml
│   ├── .gitlab-ci-test-helm_fusex_values.yml
│   ├── .gitlab-ci-test-helm_include.yml
│   ├── .gitlab-ci-test-helm_kuberos_values.yml
│   ├── .gitlab-ci-test-helm_server_values.yml
│   ├── .gitlab-ci-test-k8s_include.yml
│   ├── after_script_docker_test.sh
│   ├── after_script_k8s_test.sh
│   ├── before_script_docker_test.sh
│   ├── before_script_k8s_test.sh
│   ├── export_codename.sh
│   ├── export_commit-type.sh
│   ├── generate_debian_metadata.sh
│   ├── prebuild_OSbase/
│   │   ├── prebuild-cc7.Dockerfile
│   │   ├── prebuild-cc7_exotic.Dockerfile
│   │   ├── prebuild-el10.Dockerfile
│   │   ├── prebuild-el8.Dockerfile
│   │   ├── prebuild-el9-arm64.Dockerfile
│   │   └── prebuild-el9.Dockerfile
│   ├── publish_deb.sh
│   ├── remove_old_artifacts.sh
│   ├── remove_old_artifacts_debian.sh
│   ├── setup_ccache.sh
│   ├── setup_ccache_deb.sh
│   ├── setup_ccache_fc.sh
│   ├── sign_debian_repository.sh
│   ├── store_artifacts.sh
│   ├── store_artifacts_debian.sh
│   ├── store_stable_artifacts.sh
│   └── utilities_func_for_tests.sh
├── icons/
│   └── EOS.icns
├── man/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── create_eos_cmds.pl
│   └── create_man.sh
├── mgm/
│   ├── #Iostat.cc#
│   ├── CMakeLists.txt
│   ├── CtaUtils.cc
│   ├── CtaUtils.hh
│   ├── EosCtaReporter.cc
│   ├── EosCtaReporter.hh
│   ├── FuseServer/
│   │   ├── Caps.cc
│   │   ├── Caps.hh
│   │   ├── Clients.cc
│   │   ├── Clients.hh
│   │   ├── Flush.cc
│   │   ├── Flush.hh
│   │   ├── FusexCastBatch.hh
│   │   ├── Locks.cc
│   │   ├── Locks.hh
│   │   ├── Namespace.hh
│   │   ├── Server.cc
│   │   └── Server.hh
│   ├── Namespace.hh
│   ├── README.md
│   ├── access/
│   │   ├── Access.cc
│   │   └── Access.hh
│   ├── acl/
│   │   ├── Acl.cc
│   │   ├── Acl.hh
│   │   └── README.md
│   ├── adminsocket/
│   │   ├── AdminSocket.cc
│   │   └── AdminSocket.hh
│   ├── auth/
│   │   ├── AccessChecker.cc
│   │   └── AccessChecker.hh
│   ├── authz/
│   │   ├── XrdMgmAuthz.cc
│   │   └── XrdMgmAuthz.hh
│   ├── balancer/
│   │   ├── FsBalancer.cc
│   │   ├── FsBalancer.hh
│   │   ├── FsBalancerStats.cc
│   │   └── FsBalancerStats.hh
│   ├── bulk-request/
│   │   ├── BulkRequest.cc
│   │   ├── BulkRequest.hh
│   │   ├── BulkRequestFactory.cc
│   │   ├── BulkRequestFactory.hh
│   │   ├── BulkRequestHelper.hh
│   │   ├── File.hh
│   │   ├── FileCollection.hh
│   │   ├── README.md
│   │   ├── business/
│   │   │   ├── BulkRequestBusiness.cc
│   │   │   └── BulkRequestBusiness.hh
│   │   ├── dao/
│   │   │   ├── IBulkRequestDAO.hh
│   │   │   ├── factories/
│   │   │   │   ├── AbstractDAOFactory.hh
│   │   │   │   ├── ProcDirectoryDAOFactory.cc
│   │   │   │   └── ProcDirectoryDAOFactory.hh
│   │   │   └── proc/
│   │   │       ├── ProcDirBulkRequestFile.cc
│   │   │       ├── ProcDirBulkRequestFile.hh
│   │   │       ├── ProcDirectoryBulkRequestDAO.cc
│   │   │       ├── ProcDirectoryBulkRequestDAO.hh
│   │   │       ├── ProcDirectoryBulkRequestLocations.cc
│   │   │       ├── ProcDirectoryBulkRequestLocations.hh
│   │   │       └── cleaner/
│   │   │           ├── BulkRequestProcCleaner.cc
│   │   │           ├── BulkRequestProcCleaner.hh
│   │   │           ├── BulkRequestProcCleanerConfig.cc
│   │   │           └── BulkRequestProcCleanerConfig.hh
│   │   ├── exception/
│   │   │   ├── BulkRequestException.hh
│   │   │   └── PersistencyException.hh
│   │   ├── interface/
│   │   │   ├── IMgmFileSystemInterface.hh
│   │   │   ├── RealMgmFileSystemInterface.cc
│   │   │   └── RealMgmFileSystemInterface.hh
│   │   ├── prepare/
│   │   │   ├── CancellationBulkRequest.hh
│   │   │   ├── EvictBulkRequest.hh
│   │   │   ├── PrepareUtils.cc
│   │   │   ├── PrepareUtils.hh
│   │   │   ├── StageBulkRequest.hh
│   │   │   ├── manager/
│   │   │   │   ├── BulkRequestPrepareManager.cc
│   │   │   │   ├── BulkRequestPrepareManager.hh
│   │   │   │   ├── PrepareManager.cc
│   │   │   │   └── PrepareManager.hh
│   │   │   └── query-prepare/
│   │   │       ├── QueryPrepareResult.cc
│   │   │       └── QueryPrepareResult.hh
│   │   ├── response/
│   │   │   └── QueryPrepareResponse.hh
│   │   └── utils/
│   │       ├── PrepareArgumentsWrapper.hh
│   │       └── json/
│   │           └── QueryPrepareResponseJson.hh
│   ├── commandmap/
│   │   ├── CommandMap.cc
│   │   └── CommandMap.hh
│   ├── config/
│   │   ├── IConfigEngine.cc
│   │   ├── IConfigEngine.hh
│   │   ├── QuarkConfigHandler.cc
│   │   ├── QuarkConfigHandler.hh
│   │   ├── QuarkDBConfigEngine.cc
│   │   ├── QuarkDBConfigEngine.hh
│   │   └── eos-config-inspect.cc
│   ├── convert/
│   │   ├── ConversionInfo.cc
│   │   ├── ConversionInfo.hh
│   │   ├── ConversionJob.cc
│   │   ├── ConversionJob.hh
│   │   ├── ConversionTag.hh
│   │   ├── ConverterEngine.cc
│   │   └── ConverterEngine.hh
│   ├── devices/
│   │   ├── Devices.cc
│   │   └── Devices.hh
│   ├── drain/
│   │   ├── DrainFs.cc
│   │   ├── DrainFs.hh
│   │   ├── DrainTransferJob.cc
│   │   ├── DrainTransferJob.hh
│   │   ├── Drainer.cc
│   │   └── Drainer.hh
│   ├── egroup/
│   │   ├── Egroup.cc
│   │   └── Egroup.hh
│   ├── eos-repair-tool
│   ├── features/
│   │   ├── Features.cc
│   │   └── Features.hh
│   ├── filesystem/
│   │   ├── FileSystem.cc
│   │   └── FileSystem.hh
│   ├── fsck/
│   │   ├── Fsck.cc
│   │   ├── Fsck.hh
│   │   ├── FsckEntry.cc
│   │   └── FsckEntry.hh
│   ├── fsview/
│   │   ├── FsView.cc
│   │   └── FsView.hh
│   ├── fuse-locks/
│   │   ├── LockTracker.cc
│   │   └── LockTracker.hh
│   ├── geobalancer/
│   │   ├── GeoBalancer.cc
│   │   └── GeoBalancer.hh
│   ├── geotree/
│   │   ├── SchedulingFastTree.hh
│   │   ├── SchedulingSlowTree.cc
│   │   ├── SchedulingSlowTree.hh
│   │   ├── SchedulingTreeCommon.cc
│   │   ├── SchedulingTreeCommon.hh
│   │   ├── SchedulingTreeTest.cc
│   │   └── SchedulingTreeTest.cc.testfile
│   ├── geotreeengine/
│   │   ├── GeoTreeEngine.cc
│   │   └── GeoTreeEngine.hh
│   ├── groupbalancer/
│   │   ├── BalancerEngine.cc
│   │   ├── BalancerEngine.hh
│   │   ├── BalancerEngineFactory.hh
│   │   ├── BalancerEngineTypes.hh
│   │   ├── BalancerEngineUtils.hh
│   │   ├── ConverterUtils.cc
│   │   ├── ConverterUtils.hh
│   │   ├── FreeSpaceBalancerEngine.cc
│   │   ├── FreeSpaceBalancerEngine.hh
│   │   ├── GroupBalancer.cc
│   │   ├── GroupBalancer.hh
│   │   ├── GroupsInfoFetcher.cc
│   │   ├── GroupsInfoFetcher.hh
│   │   ├── MinMaxBalancerEngine.cc
│   │   ├── MinMaxBalancerEngine.hh
│   │   ├── StdDevBalancerEngine.cc
│   │   ├── StdDevBalancerEngine.hh
│   │   ├── StdDrainerEngine.cc
│   │   └── StdDrainerEngine.hh
│   ├── groupdrainer/
│   │   ├── DrainProgressTracker.cc
│   │   ├── DrainProgressTracker.hh
│   │   ├── GroupDrainer.cc
│   │   ├── GroupDrainer.hh
│   │   └── RetryTracker.hh
│   ├── grpc/
│   │   ├── GrpcNsInterface.cc
│   │   ├── GrpcNsInterface.hh
│   │   ├── GrpcRestGwInterface.cc
│   │   ├── GrpcRestGwInterface.hh
│   │   ├── GrpcRestGwServer.cc
│   │   ├── GrpcRestGwServer.hh
│   │   ├── GrpcServer.cc
│   │   ├── GrpcServer.hh
│   │   ├── GrpcWncInterface.cc
│   │   ├── GrpcWncInterface.hh
│   │   ├── GrpcWncServer.cc
│   │   └── GrpcWncServer.hh
│   ├── http/
│   │   ├── HttpHandler.cc
│   │   ├── HttpHandler.hh
│   │   ├── HttpServer.cc
│   │   ├── HttpServer.hh
│   │   ├── ProtocolHandlerFactory.hh
│   │   ├── rapidxml/
│   │   │   ├── license.txt
│   │   │   ├── rapidxml.hpp
│   │   │   ├── rapidxml_print.hpp
│   │   │   └── rapidxml_utils.hpp
│   │   ├── rest-api/
│   │   │   ├── Constants.hh
│   │   │   ├── README.md
│   │   │   ├── action/
│   │   │   │   ├── Action.hh
│   │   │   │   └── tape/
│   │   │   │       ├── TapeAction.hh
│   │   │   │       ├── TapeActions.hh
│   │   │   │       ├── archiveinfo/
│   │   │   │       │   ├── GetArchiveInfo.cc
│   │   │   │       │   └── GetArchiveInfo.hh
│   │   │   │       ├── release/
│   │   │   │       │   ├── CreateReleaseBulkRequest.cc
│   │   │   │       │   └── CreateReleaseBulkRequest.hh
│   │   │   │       └── stage/
│   │   │   │           ├── CancelStageBulkRequest.cc
│   │   │   │           ├── CancelStageBulkRequest.hh
│   │   │   │           ├── CreateStageBulkRequest.cc
│   │   │   │           ├── CreateStageBulkRequest.hh
│   │   │   │           ├── DeleteStageBulkRequest.cc
│   │   │   │           ├── DeleteStageBulkRequest.hh
│   │   │   │           ├── GetStageBulkRequest.cc
│   │   │   │           └── GetStageBulkRequest.hh
│   │   │   ├── business/
│   │   │   │   └── tape/
│   │   │   │       ├── ITapeRestApiBusiness.hh
│   │   │   │       ├── TapeRestApiBusiness.cc
│   │   │   │       └── TapeRestApiBusiness.hh
│   │   │   ├── config/
│   │   │   │   └── tape/
│   │   │   │       ├── TapeRestApiConfig.cc
│   │   │   │       └── TapeRestApiConfig.hh
│   │   │   ├── exception/
│   │   │   │   ├── Exceptions.hh
│   │   │   │   ├── JsonValidationException.hh
│   │   │   │   └── RestException.hh
│   │   │   ├── handler/
│   │   │   │   ├── RestHandler.cc
│   │   │   │   ├── RestHandler.hh
│   │   │   │   ├── tape/
│   │   │   │   │   ├── TapeRestHandler.cc
│   │   │   │   │   └── TapeRestHandler.hh
│   │   │   │   └── wellknown/
│   │   │   │       ├── WellKnownHandler.cc
│   │   │   │       └── WellKnownHandler.hh
│   │   │   ├── json/
│   │   │   │   ├── builder/
│   │   │   │   │   ├── JsonModelBuilder.hh
│   │   │   │   │   ├── ValidationError.hh
│   │   │   │   │   └── jsoncpp/
│   │   │   │   │       ├── JsonCppModelBuilder.hh
│   │   │   │   │       └── JsonCppValidator.hh
│   │   │   │   └── tape/
│   │   │   │       ├── TapeJsonifiers.hh
│   │   │   │       ├── TapeModelBuilders.hh
│   │   │   │       ├── TapeRestApiJsonifier.hh
│   │   │   │       └── model-builders/
│   │   │   │           └── validators/
│   │   │   │               └── TapeJsonCppValidator.hh
│   │   │   ├── manager/
│   │   │   │   ├── RestApiManager.cc
│   │   │   │   └── RestApiManager.hh
│   │   │   ├── model/
│   │   │   │   ├── tape/
│   │   │   │   │   ├── archiveinfo/
│   │   │   │   │   │   └── GetArchiveInfoResponseModel.hh
│   │   │   │   │   ├── common/
│   │   │   │   │   │   ├── ErrorModel.cc
│   │   │   │   │   │   ├── ErrorModel.hh
│   │   │   │   │   │   └── FilesContainer.hh
│   │   │   │   │   └── stage/
│   │   │   │   │       ├── CreateStageBulkRequestModel.hh
│   │   │   │   │       ├── CreatedStageBulkRequestResponseModel.hh
│   │   │   │   │       ├── GetStageBulkRequestResponseModel.hh
│   │   │   │   │       └── PathsModel.hh
│   │   │   │   └── wellknown/
│   │   │   │       └── tape/
│   │   │   │           └── GetTapeWellKnownModel.hh
│   │   │   ├── response/
│   │   │   │   ├── ErrorHandling.hh
│   │   │   │   ├── RestApiResponse.hh
│   │   │   │   ├── RestApiResponseFactory.hh
│   │   │   │   ├── RestResponseFactory.cc
│   │   │   │   └── RestResponseFactory.hh
│   │   │   ├── router/
│   │   │   │   └── Router.hh
│   │   │   ├── utils/
│   │   │   │   ├── URLBuilder.cc
│   │   │   │   ├── URLBuilder.hh
│   │   │   │   ├── URLParser.cc
│   │   │   │   └── URLParser.hh
│   │   │   └── wellknown/
│   │   │       └── tape/
│   │   │           ├── TapeRestApiEndpoint.cc
│   │   │           ├── TapeRestApiEndpoint.hh
│   │   │           ├── TapeWellKnownInfos.cc
│   │   │           └── TapeWellKnownInfos.hh
│   │   ├── s3/
│   │   │   ├── S3Handler.cc
│   │   │   ├── S3Handler.hh
│   │   │   ├── S3Store.cc
│   │   │   └── S3Store.hh
│   │   ├── webdav/
│   │   │   ├── LockResponse.cc
│   │   │   ├── LockResponse.hh
│   │   │   ├── PropFindResponse.cc
│   │   │   ├── PropFindResponse.hh
│   │   │   ├── PropPatchResponse.cc
│   │   │   ├── PropPatchResponse.hh
│   │   │   ├── WebDAVHandler.cc
│   │   │   ├── WebDAVHandler.hh
│   │   │   ├── WebDAVResponse.cc
│   │   │   └── WebDAVResponse.hh
│   │   └── xrdhttp/
│   │       ├── EosMgmHttpHandler.cc
│   │       ├── EosMgmHttpHandler.hh
│   │       └── README.md
│   ├── imaster/
│   │   ├── IMaster.cc
│   │   └── IMaster.hh
│   ├── inflighttracker/
│   │   ├── InFlightTracker.cc
│   │   └── InFlightTracker.hh
│   ├── inspector/
│   │   ├── FileInspector.cc
│   │   ├── FileInspector.hh
│   │   ├── FileInspectorStats.cc
│   │   └── FileInspectorStats.hh
│   ├── iostat/
│   │   ├── Iostat.cc
│   │   └── Iostat.hh
│   ├── lru/
│   │   ├── LRU.cc
│   │   └── LRU.hh
│   ├── macros/
│   │   ├── Macros.cc
│   │   └── Macros.hh
│   ├── misc/
│   │   ├── AuditHelpers.hh
│   │   ├── Constants.hh
│   │   └── IdTrackerWithValidity.hh
│   ├── namespacestats/
│   │   ├── NamespaceStats.cc
│   │   └── NamespaceStats.hh
│   ├── ofs/
│   │   ├── XrdMgmOfs.cc
│   │   ├── XrdMgmOfs.hh
│   │   ├── XrdMgmOfsConfigure.cc
│   │   ├── XrdMgmOfsDirectory.cc
│   │   ├── XrdMgmOfsDirectory.hh
│   │   ├── XrdMgmOfsFile.cc
│   │   ├── XrdMgmOfsFile.hh
│   │   ├── XrdMgmOfsSecurity.hh
│   │   ├── XrdMgmOfsTrace.hh
│   │   ├── cmds/
│   │   │   ├── Access.inc
│   │   │   ├── Attr.inc
│   │   │   ├── Auth.inc
│   │   │   ├── Chksum.inc
│   │   │   ├── Chmod.inc
│   │   │   ├── Chown.inc
│   │   │   ├── Coverage.inc
│   │   │   ├── DeleteExternal.inc
│   │   │   ├── DropReplica.inc
│   │   │   ├── ErrorLogListener.inc
│   │   │   ├── Exists.inc
│   │   │   ├── FAttr.inc
│   │   │   ├── Find.inc
│   │   │   ├── FsConfigListener.inc
│   │   │   ├── Fsctl.inc
│   │   │   ├── Link.inc
│   │   │   ├── Mkdir.inc
│   │   │   ├── PathMap.inc
│   │   │   ├── Remdir.inc
│   │   │   ├── Rename.inc
│   │   │   ├── Rm.inc
│   │   │   ├── SharedPath.inc
│   │   │   ├── ShouldRedirect.inc
│   │   │   ├── ShouldRoute.inc
│   │   │   ├── ShouldStall.inc
│   │   │   ├── Shutdown.inc
│   │   │   ├── Stacktrace.inc
│   │   │   ├── Stat.inc
│   │   │   ├── Stripes.inc
│   │   │   ├── Touch.inc
│   │   │   ├── Utimes.inc
│   │   │   └── Version.inc
│   │   └── fsctl/
│   │       ├── Access.cc
│   │       ├── AdjustReplica.cc
│   │       ├── Checksum.cc
│   │       ├── Chmod.cc
│   │       ├── Chown.cc
│   │       ├── Commit.cc
│   │       ├── CommitHelper.cc
│   │       ├── CommitHelper.hh
│   │       ├── Drop.cc
│   │       ├── Event.cc
│   │       ├── Fusex.cc
│   │       ├── GetFusex.cc
│   │       ├── Getfmd.cc
│   │       ├── Mkdir.cc
│   │       ├── Open.cc
│   │       ├── Readlink.cc
│   │       ├── Redirect.cc
│   │       ├── Stat.cc
│   │       ├── Statvfs.cc
│   │       ├── Symlink.cc
│   │       ├── Utimes.cc
│   │       └── Version.cc
│   ├── pathrouting/
│   │   ├── PathRouting.cc
│   │   └── PathRouting.hh
│   ├── placement/
│   │   ├── ClusterDataTypes.hh
│   │   ├── ClusterMap.cc
│   │   ├── ClusterMap.hh
│   │   ├── FlatScheduler.cc
│   │   ├── FlatScheduler.hh
│   │   ├── FsScheduler.cc
│   │   ├── FsScheduler.hh
│   │   ├── PlacementStrategy.cc
│   │   ├── PlacementStrategy.hh
│   │   ├── RRSeed.hh
│   │   ├── RoundRobinPlacementStrategy.cc
│   │   ├── RoundRobinPlacementStrategy.hh
│   │   ├── ThreadLocalRRSeed.cc
│   │   ├── ThreadLocalRRSeed.hh
│   │   ├── WeightedRandomStrategy.cc
│   │   ├── WeightedRandomStrategy.hh
│   │   ├── WeightedRoundRobinStrategy.cc
│   │   └── WeightedRoundRobinStrategy.hh
│   ├── policy/
│   │   ├── Policy.cc
│   │   └── Policy.hh
│   ├── proc/
│   │   ├── IProcCommand.cc
│   │   ├── IProcCommand.hh
│   │   ├── ProcCommand.cc
│   │   ├── ProcCommand.hh
│   │   ├── ProcInterface.cc
│   │   ├── ProcInterface.hh
│   │   ├── admin/
│   │   │   ├── Access.cc
│   │   │   ├── AccessCmd.cc
│   │   │   ├── AccessCmd.hh
│   │   │   ├── Backup.cc
│   │   │   ├── Backup.hh
│   │   │   ├── ConfigCmd.cc
│   │   │   ├── ConfigCmd.hh
│   │   │   ├── ConvertCmd.cc
│   │   │   ├── ConvertCmd.hh
│   │   │   ├── DebugCmd.cc
│   │   │   ├── DebugCmd.hh
│   │   │   ├── DevicesCmd.cc
│   │   │   ├── DevicesCmd.hh
│   │   │   ├── EvictCmd.cc
│   │   │   ├── EvictCmd.hh
│   │   │   ├── FileRegisterCmd.cc
│   │   │   ├── FileRegisterCmd.hh
│   │   │   ├── FsCmd.cc
│   │   │   ├── FsCmd.hh
│   │   │   ├── FsckCmd.cc
│   │   │   ├── FsckCmd.hh
│   │   │   ├── Fusex.cc
│   │   │   ├── GeoSched.cc
│   │   │   ├── GroupCmd.cc
│   │   │   ├── GroupCmd.hh
│   │   │   ├── IoCmd.cc
│   │   │   ├── IoCmd.hh
│   │   │   ├── IoShapingCmd.cc
│   │   │   ├── NodeCmd.cc
│   │   │   ├── NodeCmd.hh
│   │   │   ├── NsCmd.cc
│   │   │   ├── NsCmd.hh
│   │   │   ├── Quota.cc
│   │   │   ├── QuotaCmd.cc
│   │   │   ├── QuotaCmd.hh
│   │   │   ├── Rtlog.cc
│   │   │   ├── SchedCmd.cc
│   │   │   ├── SchedCmd.hh
│   │   │   ├── SpaceCmd.cc
│   │   │   ├── SpaceCmd.hh
│   │   │   └── Vid.cc
│   │   ├── proc_fs.cc
│   │   ├── proc_fs.hh
│   │   └── user/
│   │       ├── Accounting.cc
│   │       ├── AclCmd.cc
│   │       ├── AclCmd.hh
│   │       ├── Archive.cc
│   │       ├── Attr.cc
│   │       ├── Cd.cc
│   │       ├── Chmod.cc
│   │       ├── Chown.cc
│   │       ├── DfCmd.cc
│   │       ├── DfCmd.hh
│   │       ├── File.cc
│   │       ├── Fileinfo.cc
│   │       ├── Find.cc
│   │       ├── Fuse.cc
│   │       ├── FuseX.cc
│   │       ├── Ls.cc
│   │       ├── Map.cc
│   │       ├── Member.cc
│   │       ├── Mkdir.cc
│   │       ├── Motd.cc
│   │       ├── NewfindCmd.cc
│   │       ├── NewfindCmd.hh
│   │       ├── Quota.cc
│   │       ├── RecycleCmd.cc
│   │       ├── RecycleCmd.hh
│   │       ├── Rm.cc
│   │       ├── RmCmd.cc
│   │       ├── RmCmd.hh
│   │       ├── Rmdir.cc
│   │       ├── RouteCmd.cc
│   │       ├── RouteCmd.hh
│   │       ├── TokenCmd.cc
│   │       ├── TokenCmd.hh
│   │       ├── Version.cc
│   │       ├── Who.cc
│   │       └── Whoami.cc
│   ├── qdbmaster/
│   │   ├── QdbMaster.cc
│   │   └── QdbMaster.hh
│   ├── quota/
│   │   ├── #Quota.cc#
│   │   ├── Quota.cc
│   │   └── Quota.hh
│   ├── recycle/
│   │   ├── Recycle.cc
│   │   ├── Recycle.hh
│   │   ├── RecycleEntry.cc
│   │   ├── RecycleEntry.hh
│   │   ├── RecyclePolicy.cc
│   │   └── RecyclePolicy.hh
│   ├── routeendpoint/
│   │   ├── RouteEndpoint.cc
│   │   └── RouteEndpoint.hh
│   ├── scheduler/
│   │   ├── Scheduler.cc
│   │   └── Scheduler.hh
│   ├── shaping/
│   │   ├── TrafficShaping.cc
│   │   └── TrafficShaping.hh
│   ├── stat/
│   │   ├── Stat.cc
│   │   └── Stat.hh
│   ├── tgc/
│   │   ├── AsyncResult.hh
│   │   ├── AsyncUint64ShellCmd.cc
│   │   ├── AsyncUint64ShellCmd.hh
│   │   ├── BlockingFlag.hh
│   │   ├── CachedValue.hh
│   │   ├── Constants.hh
│   │   ├── DummyClock.hh
│   │   ├── DummyTapeGcMgm.cc
│   │   ├── DummyTapeGcMgm.hh
│   │   ├── FreedBytesHistogram.cc
│   │   ├── FreedBytesHistogram.hh
│   │   ├── IClock.cc
│   │   ├── IClock.hh
│   │   ├── ITapeGcMgm.cc
│   │   ├── ITapeGcMgm.hh
│   │   ├── Lru.cc
│   │   ├── Lru.hh
│   │   ├── MaxLenExceeded.cc
│   │   ├── MaxLenExceeded.hh
│   │   ├── MultiSpaceTapeGc.cc
│   │   ├── MultiSpaceTapeGc.hh
│   │   ├── RealClock.cc
│   │   ├── RealClock.hh
│   │   ├── RealTapeGcMgm.cc
│   │   ├── RealTapeGcMgm.hh
│   │   ├── SmartSpaceStats.cc
│   │   ├── SmartSpaceStats.hh
│   │   ├── SpaceConfig.hh
│   │   ├── SpaceNotFound.cc
│   │   ├── SpaceNotFound.hh
│   │   ├── SpaceStats.hh
│   │   ├── SpaceToTapeGcMap.cc
│   │   ├── SpaceToTapeGcMap.hh
│   │   ├── TapeGc.cc
│   │   ├── TapeGc.hh
│   │   ├── TapeGcStats.hh
│   │   └── TestingTapeGc.hh
│   ├── tracker/
│   │   ├── ReplicationTracker.cc
│   │   └── ReplicationTracker.hh
│   ├── utils/
│   │   ├── AttrHelper.cc
│   │   ├── AttrHelper.hh
│   │   ├── FileSystemRegistry.cc
│   │   ├── FileSystemRegistry.hh
│   │   ├── FileSystemStatusUtils.cc
│   │   ├── FileSystemStatusUtils.hh
│   │   ├── FilesystemUuidMapper.cc
│   │   └── FilesystemUuidMapper.hh
│   ├── vid/
│   │   ├── Vid.cc
│   │   └── Vid.hh
│   ├── wfe/
│   │   ├── WFE.cc
│   │   └── WFE.hh
│   ├── wfe.proto
│   ├── workflow/
│   │   ├── Workflow.cc
│   │   └── Workflow.hh
│   ├── xattr/
│   │   ├── XattrLock.hh
│   │   └── XattrSet.hh
│   └── zmq/
│       ├── ZMQ.cc
│       └── ZMQ.hh
├── misc/
│   ├── CMakeLists.txt
│   ├── cmake/
│   │   ├── cmake-3.15.5-Linux-x86_64.sh
│   │   └── cmake-3.19.7-Linux-x86_64.sh
│   ├── egi/
│   │   ├── CMakeLists.txt
│   │   ├── eos-info-provider.py
│   │   └── eos-star-accounting.py
│   ├── etc/
│   │   ├── CMakeLists.txt
│   │   ├── auto.cfsd
│   │   ├── auto.master.d/
│   │   │   └── cfsd.autofs
│   │   ├── bash_completion.d/
│   │   │   └── eos
│   │   ├── cron.d/
│   │   │   ├── eos-health
│   │   │   ├── eos-logs
│   │   │   ├── eos-mgm-monitoring
│   │   │   ├── eos-reports
│   │   │   └── xrd-alive
│   │   ├── eos/
│   │   │   ├── cfsd/
│   │   │   │   └── eoscfsd.conf
│   │   │   └── config/
│   │   │       ├── fst/
│   │   │       │   └── fst
│   │   │       ├── generic/
│   │   │       │   └── all
│   │   │       ├── mgm/
│   │   │       │   ├── auth
│   │   │       │   ├── mgm
│   │   │       │   └── mgm.modules
│   │   │       ├── modules/
│   │   │       │   └── alice
│   │   │       └── qdb/
│   │   │           └── qdb
│   │   ├── eos.client.keytab
│   │   ├── eos.keytab
│   │   ├── fuse.conf
│   │   ├── fuse.conf.eos
│   │   ├── logrotate.d/
│   │   │   ├── eos-fuse-logs
│   │   │   ├── eos-fusex-logs
│   │   │   └── eos-logs
│   │   ├── profile.d/
│   │   │   └── eos-completion.sh
│   │   ├── sysconfig/
│   │   │   └── eos_env.example
│   │   ├── systemd/
│   │   │   └── system/
│   │   │       ├── eos.service
│   │   │       ├── eos.target
│   │   │       ├── eos5-fst@.service
│   │   │       ├── eos5-mgm@.service
│   │   │       ├── eos5-qdb@.service
│   │   │       ├── eos5.service
│   │   │       ├── eos@.service
│   │   │       ├── eos@.socket
│   │   │       ├── eos@master.service
│   │   │       └── eos@slave.service
│   │   ├── xrd.cf.auth
│   │   ├── xrd.cf.fed
│   │   ├── xrd.cf.fst
│   │   ├── xrd.cf.mgm
│   │   ├── xrd.cf.prefix
│   │   ├── xrd.cf.quarkdb
│   │   ├── xrd.cf.sync
│   │   └── zsh/
│   │       └── site-functions/
│   │           └── _eos
│   ├── sbin/
│   │   ├── CMakeLists.txt
│   │   ├── eos-diagnostic-tool
│   │   ├── eos-inspectorreport
│   │   ├── eos-inspectorstat
│   │   ├── eos-jwk-https
│   │   ├── eos-jwker.readme
│   │   ├── eos-mdreport
│   │   ├── eos-mdstat
│   │   ├── eos-prom-push
│   │   ├── eos-reportstat
│   │   ├── eos-status
│   │   ├── eos_start.sh
│   │   ├── eos_start_pre.sh
│   │   ├── mount.eoscfs
│   │   ├── mount.eosx
│   │   ├── mount.eosx3
│   │   └── umount.fuse
│   ├── selinux/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── choose_selinux.sh
│   │   ├── eosfuse-7.pp
│   │   └── eosfuse.te
│   ├── usr/
│   │   ├── CMakeLists.txt
│   │   ├── eos-fusex-core.conf
│   │   └── eosd.conf
│   └── var/
│       ├── CMakeLists.txt
│       └── eos/
│           ├── test/
│           │   ├── LeakSanitizer.supp
│           │   └── fuse/
│           │       └── untar/
│           │           ├── untar.tgz
│           │           └── xrootd.tgz
│           └── wfe/
│               └── bash/
│                   └── shell
├── namespace/
│   ├── CMakeLists.txt
│   ├── Constants.cc
│   ├── Constants.hh
│   ├── MDException.cc
│   ├── MDException.hh
│   ├── MDLocking.cc
│   ├── MDLocking.hh
│   ├── Namespace.hh
│   ├── PermissionHandler.cc
│   ├── PermissionHandler.hh
│   ├── Prefetcher.cc
│   ├── Prefetcher.hh
│   ├── Resolver.cc
│   ├── Resolver.hh
│   ├── interface/
│   │   ├── ContainerIterators.hh
│   │   ├── IContainerMD.hh
│   │   ├── IContainerMDSvc.hh
│   │   ├── IFileMD.hh
│   │   ├── IFileMDSvc.hh
│   │   ├── IFsView.hh
│   │   ├── INamespaceGroup.hh
│   │   ├── INamespaceStats.hh
│   │   ├── IQuota.hh
│   │   ├── IView.hh
│   │   ├── Identifiers.hh
│   │   ├── LockableNSObject.hh
│   │   └── Misc.hh
│   ├── locking/
│   │   ├── BulkNsObjectLocker.hh
│   │   ├── NSObjectLocker.hh
│   │   └── RawPtr.hh
│   ├── ns_quarkdb/
│   │   ├── CMakeLists.txt
│   │   ├── CacheRefreshListener.cc
│   │   ├── CacheRefreshListener.hh
│   │   ├── ConfigurationParser.hh
│   │   ├── Constants.hh
│   │   ├── ContainerMD.cc
│   │   ├── ContainerMD.hh
│   │   ├── FileMD.cc
│   │   ├── FileMD.hh
│   │   ├── LRU.hh
│   │   ├── NamespaceGroup.cc
│   │   ├── NamespaceGroup.hh
│   │   ├── NsQuarkdbPlugin.cc
│   │   ├── NsQuarkdbPlugin.hh
│   │   ├── QClPerformance.cc
│   │   ├── QClPerformance.hh
│   │   ├── QdbContactDetails.hh
│   │   ├── VersionEnforcement.cc
│   │   ├── VersionEnforcement.hh
│   │   ├── accounting/
│   │   │   ├── ContainerAccounting.cc
│   │   │   ├── ContainerAccounting.hh
│   │   │   ├── FileSystemHandler.cc
│   │   │   ├── FileSystemHandler.hh
│   │   │   ├── FileSystemView.cc
│   │   │   ├── FileSystemView.hh
│   │   │   ├── QuotaNodeCore.cc
│   │   │   ├── QuotaNodeCore.hh
│   │   │   ├── QuotaStats.cc
│   │   │   ├── QuotaStats.hh
│   │   │   ├── SetChangeList.hh
│   │   │   ├── SyncTimeAccounting.cc
│   │   │   └── SyncTimeAccounting.hh
│   │   ├── explorer/
│   │   │   ├── NamespaceExplorer.cc
│   │   │   └── NamespaceExplorer.hh
│   │   ├── flusher/
│   │   │   ├── MetadataFlusher.cc
│   │   │   └── MetadataFlusher.hh
│   │   ├── inspector/
│   │   │   ├── AttributeExtraction.cc
│   │   │   ├── AttributeExtraction.hh
│   │   │   ├── ContainerScanner.cc
│   │   │   ├── ContainerScanner.hh
│   │   │   ├── FileMetadataFilter.cc
│   │   │   ├── FileMetadataFilter.hh
│   │   │   ├── FileScanner.cc
│   │   │   ├── FileScanner.hh
│   │   │   ├── Inspector.cc
│   │   │   ├── Inspector.hh
│   │   │   ├── OutputSink.cc
│   │   │   ├── OutputSink.hh
│   │   │   ├── Printing.cc
│   │   │   └── Printing.hh
│   │   ├── persistency/
│   │   │   ├── ContainerMDSvc.cc
│   │   │   ├── ContainerMDSvc.hh
│   │   │   ├── FileMDSvc.cc
│   │   │   ├── FileMDSvc.hh
│   │   │   ├── FileSystemIterator.cc
│   │   │   ├── FileSystemIterator.hh
│   │   │   ├── MetadataFetcher.cc
│   │   │   ├── MetadataFetcher.hh
│   │   │   ├── MetadataProvider.cc
│   │   │   ├── MetadataProvider.hh
│   │   │   ├── MetadataProviderShard.cc
│   │   │   ├── MetadataProviderShard.hh
│   │   │   ├── NextInodeProvider.cc
│   │   │   ├── NextInodeProvider.hh
│   │   │   ├── RequestBuilder.cc
│   │   │   ├── RequestBuilder.hh
│   │   │   ├── Serialization.cc
│   │   │   ├── Serialization.hh
│   │   │   ├── UnifiedInodeProvider.cc
│   │   │   └── UnifiedInodeProvider.hh
│   │   ├── tests/
│   │   │   ├── CMakeLists.txt
│   │   │   ├── ContainerMDSvcTest.cc
│   │   │   ├── EosNamespaceBenchmark.cc
│   │   │   ├── FileMDSvcTest.cc
│   │   │   ├── FileSystemViewTest.cc
│   │   │   ├── HierarchicalViewTest.cc
│   │   │   ├── LruBenchmark.cc
│   │   │   ├── Main.cc
│   │   │   ├── MetadataFiltering.cc
│   │   │   ├── MetadataTests.cc
│   │   │   ├── MockContainerMD.hh
│   │   │   ├── MockContainerMDSvc.hh
│   │   │   ├── MockFileMDSvc.hh
│   │   │   ├── Namespace.hh
│   │   │   ├── NextInodeProviderTest.cc
│   │   │   ├── NsTests.cc
│   │   │   ├── NsTests.hh
│   │   │   ├── OtherTests.cc
│   │   │   ├── README.md
│   │   │   ├── TestUtils.hh
│   │   │   ├── VariousTests.cc
│   │   │   └── utils/
│   │   │       └── break-file.py
│   │   ├── tools/
│   │   │   ├── EosConvertToLocalityHashes.cc
│   │   │   ├── Fid2PathTool.cc
│   │   │   ├── InodeToFidTool.cc
│   │   │   └── InspectionTool.cc
│   │   ├── utils/
│   │   │   ├── FutureVectorIterator.hh
│   │   │   ├── QuotaRecomputer.cc
│   │   │   └── QuotaRecomputer.hh
│   │   └── views/
│   │       ├── HierarchicalView.cc
│   │       └── HierarchicalView.hh
│   └── utils/
│       ├── Attributes.hh
│       ├── BalanceCalculator.hh
│       ├── Buffer.hh
│       ├── Checksum.hh
│       ├── DataHelper.cc
│       ├── DataHelper.hh
│       ├── Descriptor.cc
│       ├── Descriptor.hh
│       ├── Etag.cc
│       ├── Etag.hh
│       ├── FileListRandomPicker.cc
│       ├── FileListRandomPicker.hh
│       ├── LocalityHint.hh
│       ├── Mode.hh
│       ├── PathProcessor.hh
│       ├── RenameSafetyCheck.hh
│       ├── RmrfHelper.hh
│       ├── Stat.hh
│       └── StringConvertion.hh
├── nginx/
│   ├── README
│   ├── etc/
│   │   ├── init.d/
│   │   │   └── nginx.init
│   │   ├── logrotate.d/
│   │   │   └── nginx.logrotate
│   │   ├── nginx/
│   │   │   └── nginx.eos.conf.template
│   │   ├── sysconfig/
│   │   │   ├── nginx.sysconfig
│   │   │   └── nginx.sysconfig.systemd
│   │   └── systemd/
│   │       └── nginx.service
│   ├── jenkins-build.sh
│   ├── makesrpm.sh
│   ├── nginx-allow-proxy-certs.patch
│   ├── nginx-allow-put-redirect.patch
│   ├── nginx-no-body-before-redirect.patch
│   └── nginx.spec
├── proto/
│   ├── Audit.proto
│   ├── CMakeLists.txt
│   ├── eos_rest_gateway/
│   │   ├── eos_rest_gateway_service.proto
│   │   └── google/
│   │       └── api/
│   │           ├── annotations.proto
│   │           └── http.proto
│   ├── fst/
│   │   ├── Delete.proto
│   │   └── FmdBase.proto
│   └── namespace/
│       └── ns_quarkdb/
│           ├── ChangelogEntry.proto
│           ├── ContainerMd.proto
│           └── FileMd.proto
├── repo/
│   ├── eos-el7-dev.repo
│   ├── eos-el7.repo
│   ├── eos-el8-dev.repo
│   ├── eos-el8.repo
│   ├── eos-el8s-dev.repo
│   ├── eos-el8s.repo
│   ├── eos-el9s-dev.repo
│   └── eos-el9s.repo
├── test/
│   ├── CMakeLists.txt
│   ├── EosChecksumBenchmark.cc
│   ├── EosCryptoTimingTest.cc
│   ├── EosHashBenchmark.cc
│   ├── EosIdMapBenchmark.cc
│   ├── EosLoggingBenchmark.cc
│   ├── EosMmap.cc
│   ├── EosOpenTruncUpdate.cc
│   ├── EosUdpDumper.cc
│   ├── TestHmacSha256.cc
│   ├── ThreadPoolTest.cc
│   ├── XrdCpAbort.cc
│   ├── XrdCpAppend.cc
│   ├── XrdCpAppendOverlap.cc
│   ├── XrdCpBackward.cc
│   ├── XrdCpDownloadRandom.cc
│   ├── XrdCpExtend.cc
│   ├── XrdCpHoles.cc
│   ├── XrdCpNonStreaming.cc
│   ├── XrdCpPartial.cc
│   ├── XrdCpPgRead.cc
│   ├── XrdCpPosixCache.cc
│   ├── XrdCpRandom.cc
│   ├── XrdCpShrink.cc
│   ├── XrdCpSlowWriter.cc
│   ├── XrdCpTruncate.cc
│   ├── XrdCpUpdate.cc
│   ├── XrdStress.cc
│   ├── XrdStress.hh
│   ├── benchmark/
│   │   ├── CMakeLists.txt
│   │   ├── ConfigProto.proto
│   │   ├── Configuration.cc
│   │   ├── Configuration.hh
│   │   ├── DirEos.cc
│   │   ├── DirEos.hh
│   │   ├── FileEos.cc
│   │   ├── FileEos.hh
│   │   ├── Namespace.hh
│   │   ├── ProtoIo.cc
│   │   ├── ProtoIo.hh
│   │   ├── Result.cc
│   │   ├── Result.hh
│   │   ├── ResultProto.proto
│   │   ├── eosbenchmark.cc
│   │   └── eosbenchmark.hh
│   ├── eos-accounting-test
│   ├── eos-acl-concurrent
│   ├── eos-altxs-test
│   ├── eos-backup
│   ├── eos-backup-browser
│   ├── eos-balance-test
│   ├── eos-bash
│   ├── eos-convert-test
│   ├── eos-defaultcc-test
│   ├── eos-drain-test
│   ├── eos-file-cont-detached-test
│   ├── eos-fsck-test
│   ├── eos-fst-close-test
│   ├── eos-groupdrain-test
│   ├── eos-grpc-test
│   ├── eos-http-upload-test
│   ├── eos-https-functional-test
│   ├── eos-instance-test
│   ├── eos-instance-test-ci
│   ├── eos-io-test
│   ├── eos-lru-test
│   ├── eos-macaroon-init
│   ├── eos-manila-test
│   ├── eos-oc-test
│   ├── eos-quota-test
│   ├── eos-rain-test
│   ├── eos-rclone-test
│   ├── eos-recycle-test
│   ├── eos-rename-test
│   ├── eos-squash-test
│   ├── eos-synctime-test
│   ├── eos-test-utils
│   ├── eos-timestamp-test
│   ├── eos-token-test
│   ├── eos-traffic-shaping-test
│   ├── eos_io_tool.cc
│   ├── eoscp-rain-test
│   ├── fuse/
│   │   └── eos-fuse-test
│   ├── fusex/
│   │   ├── eos-fusex-functional-test
│   │   └── eos-test-credential-bindings
│   ├── microbenchmarks/
│   │   ├── CMakeLists.txt
│   │   ├── README.md
│   │   ├── common/
│   │   │   ├── BM_AtomicPtr.cc
│   │   │   ├── BM_IdMap.cc
│   │   │   ├── BM_Random.cc
│   │   │   ├── BM_StringUtils.cc
│   │   │   ├── BM_ThreadId.cc
│   │   │   └── BM_XrdString.cc
│   │   ├── main.cc
│   │   ├── mgm/
│   │   │   ├── BM_FlatScheduler.cc
│   │   │   └── BM_RRSeed.cc
│   │   └── namespace/
│   │       └── ns_quarkdb/
│   │           ├── BM_NSLocking.cc
│   │           └── README.md
│   ├── mq/
│   │   ├── SharedHashLoadTest.cc
│   │   ├── XrdMqClientMaster.cc
│   │   ├── XrdMqClientTest.cc
│   │   ├── XrdMqClientWorker.cc
│   │   ├── XrdMqQueueDumper.cc
│   │   ├── XrdMqQueueFeeder.cc
│   │   ├── XrdMqQueueInjection.cc
│   │   ├── XrdMqSharedObjectBroadCastClient.cc
│   │   ├── XrdMqSharedObjectClient.cc
│   │   └── XrdMqSharedObjectQueueClient.cc
│   ├── test-eos-iam-mapfile.py
│   └── xrdstress
├── test.cmake
├── unit_tests/
│   ├── CMakeLists.txt
│   ├── README.md
│   ├── auth_plugin/
│   │   ├── AuthFsTest.cc
│   │   ├── Namespace.hh
│   │   ├── TestEnv.cc
│   │   └── TestEnv.hh
│   ├── common/
│   │   ├── AuditTests.cc
│   │   ├── BackOffInvokerTests.cc
│   │   ├── BufferManagerTests.cc
│   │   ├── ConcurrentQueueTests.cc
│   │   ├── ConfigStoreTests.cc
│   │   ├── ConfigTests.cc
│   │   ├── ContainerUtilsTests.cc
│   │   ├── CounterTests.cc
│   │   ├── EosTokenTests.cc
│   │   ├── FileIdTests.cc
│   │   ├── FileMapTests.cc
│   │   ├── FutureWrapperTests.cc
│   │   ├── GlobTests.cc
│   │   ├── InodeTests.cc
│   │   ├── LoggingTests.cc
│   │   ├── LoggingTestsUtils.cc
│   │   ├── MappingTestFixture.hh
│   │   ├── MappingTests.cc
│   │   ├── MemConfigStore.hh
│   │   ├── Namespace.hh
│   │   ├── ObserverMgrTests.cc
│   │   ├── PathTests.cc
│   │   ├── RWMutexTest.cc
│   │   ├── RandTests.cc
│   │   ├── RateLimitTests.cc
│   │   ├── RegexWrapperTests.cc
│   │   ├── SciTokensTests.cc
│   │   ├── ShardedCacheTests.cc
│   │   ├── StringConversionTests.cc
│   │   ├── StringSplitTests.cc
│   │   ├── StringTokenizerTests.cc
│   │   ├── StringUtilsTests.cc
│   │   ├── SymKeysTests.cc
│   │   ├── ThreadPoolTest.cc
│   │   ├── TimingTests.cc
│   │   ├── UriCapCipherTests.cc
│   │   ├── UtilsTests.cc
│   │   ├── VariousTests.cc
│   │   ├── WebNotifyTests.cc
│   │   ├── XrdConnPoolTests.cc
│   │   ├── async/
│   │   │   ├── ExecutorMgrTests.cc
│   │   │   ├── FollyExecutorFixture.hh
│   │   │   └── OpaqueFutureTests.cc
│   │   └── concurrency/
│   │       ├── AlignedAtomicArrayTests.cc
│   │       ├── AtomicUniquePtrTests.cc
│   │       ├── RCUTests.cc
│   │       └── ThreadEpochCounterTests.cc
│   ├── console/
│   │   ├── AclCmdTest.cc
│   │   ├── CmdsTests.cc
│   │   ├── ConsoleCompletionTest.cc
│   │   ├── ConsoleUtilTests.cc
│   │   ├── ParseCommentTest.cc
│   │   └── RegexUtilTest.cc
│   ├── fst/
│   │   ├── HealthTest.cc
│   │   ├── HttpHandlerFstFileCacheTests.cc
│   │   ├── LoadTests.cc
│   │   ├── MonitorVarPartitionTest.cc
│   │   ├── Namespace.hh
│   │   ├── NfsIoTests.cc
│   │   ├── ResponseCollectorTests.cc
│   │   ├── ScanDirTests.cc
│   │   ├── TestEnv.cc
│   │   ├── TestEnv.hh
│   │   ├── TmpDirTree.hh
│   │   ├── UtilsTest.cc
│   │   ├── WalkDirTreeTests.cc
│   │   ├── XrdFstOfsFileInternalTest.cc
│   │   ├── XrdFstOfsFileTest.cc
│   │   ├── XrdFstOfsTests.cc
│   │   ├── XrdFstOssFileTest.cc
│   │   ├── XrdIoTests.cc
│   │   └── main_fst.cc
│   ├── fusex/
│   │   └── StatTests.cc
│   ├── mgm/
│   │   ├── AccessTests.cc
│   │   ├── AclCmdTests.cc
│   │   ├── CapsTests.cc
│   │   ├── CommitHelperTests.cc
│   │   ├── ConversionInfoTests.cc
│   │   ├── CtaUtilsTests.cc
│   │   ├── EgroupTests.cc
│   │   ├── FileSystemRegistryTests.cc
│   │   ├── FsViewTests.cc
│   │   ├── FsckEntryTests.cc
│   │   ├── FusexCastBatchTests.cc
│   │   ├── HttpTests.cc
│   │   ├── IdTrackerTests.cc
│   │   ├── IostatTests.cc
│   │   ├── LRUTests.cc
│   │   ├── LockTrackerTests.cc
│   │   ├── PolicyTests.cc
│   │   ├── ProcFsTests.cc
│   │   ├── QuarkDBConfigTests.cc
│   │   ├── RecyclePolicyTests.cc
│   │   ├── RecycleTests.cc
│   │   ├── RoutingTests.cc
│   │   ├── XrdMgmOfsFileTests.cc
│   │   ├── XrdMgmOfsTests.cc
│   │   ├── bulk-request/
│   │   │   ├── BulkRequestPrepareManagerTest.cc
│   │   │   ├── MockPrepareMgmFSInterface.cc
│   │   │   ├── MockPrepareMgmFSInterface.hh
│   │   │   ├── PrepareManagerTest.cc
│   │   │   └── PrepareManagerTest.hh
│   │   ├── groupbalancer/
│   │   │   ├── BalancerEngineTypeTests.cc
│   │   │   ├── FreeSpaceBalancerTests.cc
│   │   │   ├── GroupBalancerUtilsTests.cc
│   │   │   ├── GroupsInfoFetcherTests.cc
│   │   │   ├── MinMaxBalancerEngineTests.cc
│   │   │   ├── StdDevBalancerEngineTests.cc
│   │   │   └── StdDrainerTests.cc
│   │   ├── groupdrainer/
│   │   │   ├── DrainProgressTrackerTests.cc
│   │   │   ├── GroupDrainerRetry.cc
│   │   │   └── GroupDrainerTests.cc
│   │   ├── http/
│   │   │   ├── HttpServerTests.cc
│   │   │   └── rest-api/
│   │   │       └── tape/
│   │   │           ├── JsonCPPTapeModelBuilderTest.cc
│   │   │           ├── JsonCPPTapeModelBuilderTest.hh
│   │   │           ├── RestApiTest.cc
│   │   │           └── RestApiTest.hh
│   │   ├── placement/
│   │   │   ├── ClusterMapFixture.hh
│   │   │   ├── ClusterMapTests.cc
│   │   │   ├── FsSchedulerTests.cc
│   │   │   ├── PlacementStrategyTests.cc
│   │   │   ├── RRSeedTests.cc
│   │   │   ├── SchedulerTests.cc
│   │   │   └── ThreadLocalRRSeedTests.cc
│   │   ├── tgc/
│   │   │   ├── CachedValueTests.cc
│   │   │   ├── FreedBytesHistogramTests.cc
│   │   │   ├── LruTests.cc
│   │   │   ├── MultiSpaceTapeGcTests.cc
│   │   │   ├── SmartSpaceStatsTests.cc
│   │   │   ├── SpaceToTapeGcMapTests.cc
│   │   │   └── TapeGcTests.cc
│   │   └── utils/
│   │       └── AttrHelperTests.cc
│   └── with_qdb/
│       ├── Main.cc
│       ├── TestUtils.cc
│       ├── TestUtils.hh
│       └── configuration.cc
└── utils/
    ├── CMakeLists.txt
    ├── README.osx
    ├── astylerc
    ├── centos7-dev-environment.sh
    ├── centos8-dev-environment.sh
    ├── clang-format-diff.py
    ├── el7-packages.sh
    ├── el9-dev-environment.sh
    ├── eos-cdmi-setup.sh
    ├── eos-fst-clean
    ├── eos-log-clean
    ├── eos-mgm-clean
    ├── eos-osx-package-prepare.sh
    ├── eos-osx-package.sh
    ├── eos-ports-block
    ├── eos-tty-broadcast
    ├── eos-uninstall
    ├── eos-xrootd-install.sh
    ├── eosx
    ├── filter-trace/
    │   ├── .gitignore
    │   ├── eos-filter-stacktrace
    │   └── test-eos-filter-stacktrace.py
    ├── flamegraph/
    │   ├── eos-make-flamegraph
    │   ├── eos-util-flamegraph
    │   └── eos-util-stackcollapse
    ├── get-xrootd-git-master.sh
    ├── make-keytab
    ├── replace-in-sources
    ├── route-http
    └── zstdtail.cc
Download .txt
Showing preview only (825K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (9990 symbols across 1501 files)

FILE: archive/eosarch/archivefile.py
  class ArchiveFile (line 36) | class ArchiveFile(object):
    method __init__ (line 47) | def __init__(self, path, d2t):
    method __del__ (line 88) | def __del__(self):
    method dirs (line 96) | def dirs(self):
    method files (line 115) | def files(self):
    method entries (line 134) | def entries(self):
    method get_fs (line 147) | def get_fs(self, url):
    method get_endpoints (line 163) | def get_endpoints(self, rel_path):
    method del_entry (line 188) | def del_entry(self, rel_path, is_dir, tape_delete):
    method del_subtree (line 231) | def del_subtree(self, rel_path, tape_delete):
    method make_mutable (line 267) | def make_mutable(self):
    method check_root_dir (line 335) | def check_root_dir(self):
    method verify (line 402) | def verify(self, best_effort, tx_check_only=False):
    method _verify_entry (line 438) | def _verify_entry(self, entry, tx_check_only):
    method mkdir (line 592) | def mkdir(self, dentry):

FILE: archive/eosarch/asynchandler.py
  class _MkDirHandler (line 31) | class _MkDirHandler(object):
    method __init__ (line 38) | def __init__(self, path, meta_handler):
    method __call__ (line 43) | def __call__(self, status, response, hostlist):
  class _PrepareHandler (line 47) | class _PrepareHandler(object):
    method __init__ (line 54) | def __init__(self, path, meta_handler):
    method __call__ (line 59) | def __call__(self, status, response, hostlist):
  class _QueryHandler (line 63) | class _QueryHandler(object):
    method __init__ (line 70) | def __init__(self, path, meta_handler):
    method __call__ (line 75) | def __call__(self, status, response, hostlist):
  class MetaHandler (line 79) | class MetaHandler(object):
    method __init__ (line 90) | def __init__(self):
    method register (line 106) | def register(self, op, path):
    method handle (line 114) | def handle(self, op, status, path):
    method wait (line 130) | def wait(self, op):

FILE: archive/eosarch/configuration.py
  class Configuration (line 34) | class Configuration(object):
    method __init__ (line 37) | def __init__(self):
    method start_logging (line 123) | def start_logging(self, logger_name, log_file, timed_rotating = False):
    method display (line 158) | def display(self):
    method __setattr__ (line 174) | def __setattr__(self, name, value):

FILE: archive/eosarch/exceptions.py
  class NoErrorException (line 25) | class NoErrorException(Exception):
  class CheckEntryException (line 32) | class CheckEntryException(Exception):
  class NotOnTapeException (line 37) | class NotOnTapeException(Exception):

FILE: archive/eosarch/processinfo.py
  class ProcessInfo (line 33) | class ProcessInfo(object):
    method __init__ (line 47) | def __init__(self, req_json = None):
    method update (line 74) | def update(self, dict_info):
    method is_alive (line 99) | def is_alive(self):

FILE: archive/eosarch/tests/test_archivefile.py
  function test_exec_cmd (line 32) | def test_exec_cmd():
  class TestArchiveFile (line 44) | class TestArchiveFile(unittest.TestCase):
    method setUp (line 47) | def setUp(self):
    method tearDown (line 53) | def tearDown(self):
    method test_list_dirs (line 57) | def test_list_dirs(self):
    method test_list_files (line 69) | def test_list_files(self):
    method test_list_entries (line 81) | def test_list_entries(self):
    method test_get_endpoints (line 92) | def test_get_endpoints(self):

FILE: archive/eosarch/transfer.py
  class ThreadJob (line 45) | class ThreadJob(threading.Thread):
    method __init__ (line 56) | def __init__(self, jobs, retry=0):
    method run (line 68) | def run(self):
  class ThreadStatus (line 92) | class ThreadStatus(threading.Thread):
    method __init__ (line 96) | def __init__(self, transfer):
    method run (line 109) | def run(self):
    method do_finish (line 169) | def do_finish(self):
    method keep_running (line 176) | def keep_running(self):
  class Transfer (line 188) | class Transfer(object):
    method __init__ (line 196) | def __init__(self, req_json, config):
    method get_status (line 219) | def get_status(self):
    method set_status (line 230) | def set_status(self, msg):
    method run (line 240) | def run(self):
    method archive_prepare (line 266) | def archive_prepare(self):
    method do_delete (line 305) | def do_delete(self, tape_delete):
    method do_transfer (line 344) | def do_transfer(self):
    method do_retry_transfer (line 393) | def do_retry_transfer(self):
    method tx_clean (line 461) | def tx_clean(self, check_ok):
    method backup_tx_clean (line 469) | def backup_tx_clean(self):
    method archive_tx_clean (line 500) | def archive_tx_clean(self, check_ok):
    method copy_files (line 584) | def copy_files(self, err_entry=None, found_checkpoint=False):
    method flush_files (line 692) | def flush_files(self, wait_all):
    method update_file_access (line 800) | def update_file_access(self, err_entry=None, found_checkpoint=False):
    method check_previous_tx (line 897) | def check_previous_tx(self):
    method prepare2get (line 936) | def prepare2get(self, err_entry=None, found_checkpoint=False):
    method evict_disk_cache (line 1039) | def evict_disk_cache(self):
    method wait_on_tape (line 1074) | def wait_on_tape(self):
    method backup_prepare (line 1119) | def backup_prepare(self):
    method do_backup (line 1163) | def do_backup(self):
    method backup_write_status (line 1203) | def backup_write_status(self, lst_failed, check_ok):

FILE: archive/eosarch/utils.py
  function seal_path (line 32) | def seal_path(path, seal_dict={'&': "#AND#"}):
  function unseal_path (line 49) | def unseal_path(path, seal_dict={"#AND#": '&'}):
  function is_version_file (line 65) | def is_version_file(path):
  function is_atomic_version_file (line 77) | def is_atomic_version_file(path):
  function exec_cmd (line 89) | def exec_cmd(cmd):
  function get_entry_info (line 148) | def get_entry_info(url, rel_path, tags, is_dir):
  function set_dir_info (line 244) | def set_dir_info(surl, dict_dinfo, excl_xattr):

FILE: archive/eosarch_reconstruct.py
  class EosAccessException (line 53) | class EosAccessException(Exception):
  class TapeAccessException (line 59) | class TapeAccessException(Exception):
  class ArchReconstruct (line 66) | class ArchReconstruct(object):
    method __init__ (line 70) | def __init__(self, surl, durl, args):
    method __del__ (line 94) | def __del__(self):
    method breadth_first (line 101) | def breadth_first(self):
    method upload_archive (line 227) | def upload_archive(self):
  function check_eos_access (line 253) | def check_eos_access(url):
  function main (line 307) | def main():

FILE: archive/eosarchived.py
  class Dispatcher (line 42) | class Dispatcher(object):
    method __init__ (line 49) | def __init__(self, config):
    method run (line 56) | def run(self):
    method get_orphans (line 119) | def get_orphans(self):
    method num_processes (line 159) | def num_processes(self):
    method update_status (line 193) | def update_status(self):
    method start_transfer (line 242) | def start_transfer(self, req_json):
    method do_show_transfers (line 281) | def do_show_transfers(self, req_json):
    method do_kill (line 318) | def do_kill(self, req_json):
    method get_stats (line 360) | def get_stats(self, req_json):
  function main (line 377) | def main():

FILE: auth_plugin/EosAuthOfs.cc
  function XrdSfsFileSystem (line 72) | XrdSfsFileSystem*
  function XrdSfsFileSystem (line 110) | XrdSfsFileSystem*
  function XrdSfsDirectory (line 559) | XrdSfsDirectory*
  function XrdSfsFile (line 569) | XrdSfsFile*
  type stat (line 601) | struct stat
  type stat (line 633) | struct stat
  type stat (line 635) | struct stat

FILE: auth_plugin/EosAuthOfs.hh
  class EosAuthOfsDirectory (line 34) | class EosAuthOfsDirectory
  class EosAuthOfsFile (line 35) | class EosAuthOfsFile
  type eos (line 37) | namespace eos
    type auth (line 39) | namespace auth
      class ResponseProto (line 41) | class ResponseProto
  type google (line 45) | namespace google
    type protobuf (line 47) | namespace protobuf
      class Message (line 49) | class Message
  type stat (line 140) | struct stat

FILE: auth_plugin/EosAuthOfsFile.cc
  function XrdSfsXferSize (line 115) | XrdSfsXferSize
  function XrdSfsXferSize (line 165) | XrdSfsXferSize
  type stat (line 262) | struct stat
  type stat (line 288) | struct stat
  type stat (line 290) | struct stat
  type stat (line 296) | struct stat

FILE: auth_plugin/EosAuthOfsFile.hh
  type stat (line 86) | struct stat

FILE: auth_plugin/ProtoUtils.cc
  function EOSAUTHNAMESPACE_BEGIN (line 35) | EOSAUTHNAMESPACE_BEGIN
  function XrdSecEntity (line 164) | XrdSecEntity*
  function XrdSfsPrep (line 206) | XrdSfsPrep*
  function XrdOucErrInfo (line 289) | XrdOucErrInfo*
  function XrdSfsFSctl (line 301) | XrdSfsFSctl*
  function RequestProto (line 376) | RequestProto*
  function RequestProto (line 405) | RequestProto*
  function RequestProto (line 427) | RequestProto*
  function RequestProto (line 450) | RequestProto*
  function RequestProto (line 478) | RequestProto*
  function RequestProto (line 517) | RequestProto*
  function RequestProto (line 543) | RequestProto*
  function RequestProto (line 572) | RequestProto*
  function RequestProto (line 598) | RequestProto*
  function RequestProto (line 624) | RequestProto*
  function RequestProto (line 657) | RequestProto*
  function RequestProto (line 678) | RequestProto*
  function RequestProto (line 706) | RequestProto*
  function RequestProto (line 736) | RequestProto*
  function RequestProto (line 750) | RequestProto*
  function RequestProto (line 764) | RequestProto*
  function RequestProto (line 778) | RequestProto*
  function RequestProto (line 812) | RequestProto*
  function RequestProto (line 826) | RequestProto*
  function RequestProto (line 840) | RequestProto*
  function RequestProto (line 858) | RequestProto*
  function RequestProto (line 878) | RequestProto*

FILE: auth_plugin/ProtoUtils.hh
  class XrdSecEntity (line 37) | class XrdSecEntity
  class XrdOucErrInfo (line 38) | class XrdOucErrInfo
  type XrdSfsFSctl (line 39) | struct XrdSfsFSctl
  function EOSAUTHNAMESPACE_BEGIN (line 41) | EOSAUTHNAMESPACE_BEGIN

FILE: client/grpc/Find.cc
  function usage (line 7) | int usage(const char* prog)
  function main (line 56) | int main(int argc, const char* argv[])

FILE: client/grpc/GrpcClient.cc
  type timespec (line 389) | struct timespec
  type timespec (line 468) | struct timespec

FILE: client/grpc/GrpcClient.hh
  function EOSCLIENTNAMESPACE_BEGIN (line 33) | EOSCLIENTNAMESPACE_BEGIN

FILE: client/grpc/GrpcClientAuthProcessor.hh
  function EOSCLIENTNAMESPACE_BEGIN (line 35) | EOSCLIENTNAMESPACE_BEGIN

FILE: client/grpc/Insert.cc
  function usage (line 8) | int usage(const char* prog)
  function main (line 30) | int main(int argc, const char* argv[])

FILE: client/grpc/Md.cc
  function usage (line 7) | int usage(const char* prog)
  function main (line 17) | int main(int argc, const char* argv[])

FILE: client/grpc/Ns.cc
  function usage (line 10) | int usage(const char* prog)
  function ParseRecycleCommand (line 52) | int ParseRecycleCommand(int argc, const char* argv[], int arg_index,
  function main (line 83) | int main(int argc, const char* argv[])

FILE: client/grpc/NsStat.cc
  function usage (line 25) | int usage(const char* name)
  function main (line 38) | int main(int argc, char* argv[])

FILE: client/grpc/Ping.cc
  function usage (line 7) | int usage(const char* prog)
  function main (line 20) | int main(int argc, const char* argv[])

FILE: common/AssistedThread.hh
  class AssistedThread (line 62) | class AssistedThread
    method AssistedThread (line 195) | AssistedThread() :
    method AssistedThread (line 204) | AssistedThread(Args&& ... args) :
    method AssistedThread (line 210) | AssistedThread& operator=(const AssistedThread&) = delete;
    method AssistedThread (line 213) | AssistedThread(AssistedThread&& other)
    method reset (line 222) | void reset(Args&& ... args)
    method stop (line 235) | void stop()
    method join (line 244) | void join()
    method blockUntilThreadJoins (line 256) | void blockUntilThreadJoins()
    method registerCallback (line 266) | void registerCallback(std::function<void()> callable)
    method dropCallbacks (line 271) | void dropCallbacks()
    method setName (line 279) | void setName(const std::string& threadName)
  class ThreadAssistant (line 67) | class ThreadAssistant
    method reset (line 70) | void reset()
    method requestTermination (line 76) | void requestTermination()
    method registerCallback (line 90) | void registerCallback(std::function<void()> callable)
    method dropCallbacks (line 107) | void dropCallbacks()
    method terminationRequested (line 113) | bool terminationRequested()
    method wait_for (line 119) | void wait_for(T duration)
    method wait_until (line 131) | void wait_until(T duration)
    method setSelfThreadName (line 172) | static void setSelfThreadName(std::string name) {
    method ThreadAssistant (line 181) | ThreadAssistant(bool flag) : stopFlag(flag) {}
  class AssistedThread (line 189) | class AssistedThread
    method AssistedThread (line 195) | AssistedThread() :
    method AssistedThread (line 204) | AssistedThread(Args&& ... args) :
    method AssistedThread (line 210) | AssistedThread& operator=(const AssistedThread&) = delete;
    method AssistedThread (line 213) | AssistedThread(AssistedThread&& other)
    method reset (line 222) | void reset(Args&& ... args)
    method stop (line 235) | void stop()
    method join (line 244) | void join()
    method blockUntilThreadJoins (line 256) | void blockUntilThreadJoins()
    method registerCallback (line 266) | void registerCallback(std::function<void()> callable)
    method dropCallbacks (line 271) | void dropCallbacks()
    method setName (line 279) | void setName(const std::string& threadName)

FILE: common/Audit.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 44) | EOSCOMMONNAMESPACE_BEGIN
  type stat (line 419) | struct stat

FILE: common/Audit.hh
  type eos (line 41) | namespace eos { namespace audit { class AuditRecord; } }
    type audit (line 41) | namespace audit { class AuditRecord; }
      class AuditRecord (line 41) | class AuditRecord
  function EOSCOMMONNAMESPACE_BEGIN (line 43) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/BehaviourConfig.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 25) | EOSCOMMONNAMESPACE_BEGIN
  function BehaviourType (line 44) | BehaviourType

FILE: common/BehaviourConfig.hh
  class BehaviourConfig (line 39) | class BehaviourConfig: public eos::common::LogId
    method BehaviourConfig (line 66) | BehaviourConfig() = default;
    method IsEmpty (line 78) | bool IsEmpty() const

FILE: common/BufferManager.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 26) | EOSCOMMONNAMESPACE_BEGIN
  function GetSystemMemorySize (line 46) | uint64_t GetSystemMemorySize()
  function GetAlignedBuffer (line 62) | std::unique_ptr<char, void(*)(void*)>

FILE: common/BufferManager.hh
  class Buffer (line 65) | class Buffer
    method Buffer (line 72) | Buffer(uint64_t size):
  class BufferSlot (line 100) | class BufferSlot
    method BufferSlot (line 109) | BufferSlot(uint64_t size):
    method BufferSlot (line 125) | BufferSlot& operator =(BufferSlot&& other) noexcept
    method BufferSlot (line 140) | BufferSlot(BufferSlot&& other) noexcept
    method GetBuffer (line 148) | std::pair<std::shared_ptr<Buffer>, bool> GetBuffer()
    method Recycle (line 170) | void Recycle(std::shared_ptr<Buffer> buffer, bool keep)
    method Pop (line 183) | bool Pop()
    method GetBufferSize (line 201) | uint64_t GetBufferSize() const
  class BufferManager (line 217) | class BufferManager: public eos::common::LogId
    method BufferManager (line 233) | BufferManager(uint64_t max_size = 256 * 1024 * 1024, uint32_t slots = 6,
    method GetBuffer (line 255) | std::shared_ptr<Buffer> GetBuffer(uint64_t size)
    method Recycle (line 297) | void Recycle(std::shared_ptr<Buffer> buffer)
    method GetSortedSlotSizes (line 370) | std::vector< std::pair<uint32_t, uint64_t> >
    method GetNumSlots (line 393) | uint32_t GetNumSlots() const
    method GetMaxSize (line 401) | uint64_t GetMaxSize() const
  class ManagedBuffer (line 420) | class ManagedBuffer
    method ManagedBuffer (line 426) | ManagedBuffer(BufferManager& mgr, uint64_t size):
    method GetBuffer (line 435) | inline std::shared_ptr<Buffer> GetBuffer()

FILE: common/CLI11.hpp
  type CLI (line 173) | namespace CLI
    type enums (line 232) | namespace enums
    type detail (line 257) | namespace detail
      function split (line 262) | inline std::vector<std::string> split(const std::string& s, char delim)
      function as_string (line 282) | inline std::string as_string(const T& v)
      function as_string (line 290) | inline auto as_string(T && v) -> decltype(std::forward<T>(v))
      function join (line 296) | std::string join(const T& v, std::string delim = ",")
      function join (line 318) | std::string join(const T& v, Callable func, std::string delim = ",")
      function rjoin (line 336) | std::string rjoin(const T& v, std::string delim = ",")
      function trim_copy (line 407) | inline std::string trim_copy(const std::string& str)
      function trim_copy (line 414) | inline std::string trim_copy(const std::string& str, const std::stri...
      function valid_first_char (line 445) | bool valid_first_char(T c)
      function valid_later_char (line 451) | bool valid_later_char(T c)
      function valid_name_string (line 457) | inline bool valid_name_string(const std::string& str)
      function isalpha (line 472) | inline bool isalpha(const std::string& str)
      function to_lower (line 480) | inline std::string to_lower(std::string str)
      function remove_underscore (line 490) | inline std::string remove_underscore(std::string str)
      function find_and_replace (line 497) | inline std::string find_and_replace(std::string str, std::string from,
      function has_default_flag_values (line 511) | inline bool has_default_flag_values(const std::string& flags)
      function remove_default_flag_values (line 516) | inline void remove_default_flag_values(std::string& flags)
      function find_member (line 535) | inline std::ptrdiff_t find_member(std::string name,
      function find_and_modify (line 571) | inline std::string find_and_modify(std::string str,
      function split_up (line 585) | inline std::vector<std::string> split_up(std::string str)
      function fix_newlines (line 644) | inline std::string fix_newlines(std::string leader, std::string input)
      function escape_detect (line 664) | inline size_t escape_detect(std::string& str, size_t offset)
    type ExitCodes (line 723) | enum class ExitCodes {
    class Error (line 752) | class Error : public std::runtime_error
      method get_exit_code (line 758) | int get_exit_code() const
      method get_name (line 763) | std::string get_name() const
      method Error (line 768) | Error(std::string name, std::string msg,
      method Error (line 773) | Error(std::string name, std::string msg, ExitCodes exit_code) : Erro...
    function namespace (line 780) | class ConstructionError : public Error
    type CLI (line 7946) | namespace CLI
  type CLI (line 227) | namespace CLI
    type enums (line 232) | namespace enums
    type detail (line 257) | namespace detail
      function split (line 262) | inline std::vector<std::string> split(const std::string& s, char delim)
      function as_string (line 282) | inline std::string as_string(const T& v)
      function as_string (line 290) | inline auto as_string(T && v) -> decltype(std::forward<T>(v))
      function join (line 296) | std::string join(const T& v, std::string delim = ",")
      function join (line 318) | std::string join(const T& v, Callable func, std::string delim = ",")
      function rjoin (line 336) | std::string rjoin(const T& v, std::string delim = ",")
      function trim_copy (line 407) | inline std::string trim_copy(const std::string& str)
      function trim_copy (line 414) | inline std::string trim_copy(const std::string& str, const std::stri...
      function valid_first_char (line 445) | bool valid_first_char(T c)
      function valid_later_char (line 451) | bool valid_later_char(T c)
      function valid_name_string (line 457) | inline bool valid_name_string(const std::string& str)
      function isalpha (line 472) | inline bool isalpha(const std::string& str)
      function to_lower (line 480) | inline std::string to_lower(std::string str)
      function remove_underscore (line 490) | inline std::string remove_underscore(std::string str)
      function find_and_replace (line 497) | inline std::string find_and_replace(std::string str, std::string from,
      function has_default_flag_values (line 511) | inline bool has_default_flag_values(const std::string& flags)
      function remove_default_flag_values (line 516) | inline void remove_default_flag_values(std::string& flags)
      function find_member (line 535) | inline std::ptrdiff_t find_member(std::string name,
      function find_and_modify (line 571) | inline std::string find_and_modify(std::string str,
      function split_up (line 585) | inline std::vector<std::string> split_up(std::string str)
      function fix_newlines (line 644) | inline std::string fix_newlines(std::string leader, std::string input)
      function escape_detect (line 664) | inline size_t escape_detect(std::string& str, size_t offset)
    type ExitCodes (line 723) | enum class ExitCodes {
    class Error (line 752) | class Error : public std::runtime_error
      method get_exit_code (line 758) | int get_exit_code() const
      method get_name (line 763) | std::string get_name() const
      method Error (line 768) | Error(std::string name, std::string msg,
      method Error (line 773) | Error(std::string name, std::string msg, ExitCodes exit_code) : Erro...
    function namespace (line 780) | class ConstructionError : public Error
    type CLI (line 7946) | namespace CLI
  type CLI (line 702) | namespace CLI
    type enums (line 232) | namespace enums
    type detail (line 257) | namespace detail
      function split (line 262) | inline std::vector<std::string> split(const std::string& s, char delim)
      function as_string (line 282) | inline std::string as_string(const T& v)
      function as_string (line 290) | inline auto as_string(T && v) -> decltype(std::forward<T>(v))
      function join (line 296) | std::string join(const T& v, std::string delim = ",")
      function join (line 318) | std::string join(const T& v, Callable func, std::string delim = ",")
      function rjoin (line 336) | std::string rjoin(const T& v, std::string delim = ",")
      function trim_copy (line 407) | inline std::string trim_copy(const std::string& str)
      function trim_copy (line 414) | inline std::string trim_copy(const std::string& str, const std::stri...
      function valid_first_char (line 445) | bool valid_first_char(T c)
      function valid_later_char (line 451) | bool valid_later_char(T c)
      function valid_name_string (line 457) | inline bool valid_name_string(const std::string& str)
      function isalpha (line 472) | inline bool isalpha(const std::string& str)
      function to_lower (line 480) | inline std::string to_lower(std::string str)
      function remove_underscore (line 490) | inline std::string remove_underscore(std::string str)
      function find_and_replace (line 497) | inline std::string find_and_replace(std::string str, std::string from,
      function has_default_flag_values (line 511) | inline bool has_default_flag_values(const std::string& flags)
      function remove_default_flag_values (line 516) | inline void remove_default_flag_values(std::string& flags)
      function find_member (line 535) | inline std::ptrdiff_t find_member(std::string name,
      function find_and_modify (line 571) | inline std::string find_and_modify(std::string str,
      function split_up (line 585) | inline std::vector<std::string> split_up(std::string str)
      function fix_newlines (line 644) | inline std::string fix_newlines(std::string leader, std::string input)
      function escape_detect (line 664) | inline size_t escape_detect(std::string& str, size_t offset)
    type ExitCodes (line 723) | enum class ExitCodes {
    class Error (line 752) | class Error : public std::runtime_error
      method get_exit_code (line 758) | int get_exit_code() const
      method get_name (line 763) | std::string get_name() const
      method Error (line 768) | Error(std::string name, std::string msg,
      method Error (line 773) | Error(std::string name, std::string msg, ExitCodes exit_code) : Erro...
    function namespace (line 780) | class ConstructionError : public Error
    type CLI (line 7946) | namespace CLI

FILE: common/CloExec.hh
  class CloExec (line 48) | class CloExec {
    method Set (line 55) | static int Set(int fd) {

FILE: common/ClockGetTime.cc
  function _clock_gettime (line 26) | int _clock_gettime(clockid_t clk_id, struct timespec* t)

FILE: common/ClockGetTime.hh
  type timespec (line 36) | struct timespec

FILE: common/CommentLog.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 43) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Config.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Config.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/CopyProcess.hh
  class CopyProcess (line 47) | class CopyProcess {
    method CopyProcess (line 49) | CopyProcess(size_t initialProcesses = 1, size_t jobsPerProc = 8192)
    method XRootDStatus (line 57) | XRootDStatus AddJob(const PropertyList &properties, PropertyList *resu...
    method XRootDStatus (line 77) | XRootDStatus Prepare() {
    method XRootDStatus (line 90) | XRootDStatus Run(CopyProgressHandler *handler) {
    method Jobs (line 102) | const size_t Jobs() {

FILE: common/Counter.hh
  type eos::common (line 29) | namespace eos::common
    class Counter (line 32) | class Counter
      method Counter (line 35) | Counter() = default;
      method Counter (line 37) | Counter(SteadyClock* clock): mCounter(0), mSteadyClock(clock) {}
      method Init (line 40) | void Init()
      method Increment (line 47) | void Increment(uint64_t value = 1)
      method GetFrequency (line 65) | double
      method GetLastFrequency (line 71) | double
      method GetStartTime (line 77) | std::chrono::steady_clock::time_point GetStartTime()
      method GetSecondsSinceStart (line 82) | uint64_t GetSecondsSinceStart()
      method GetCurrentTime (line 89) | std::chrono::steady_clock::time_point GetCurrentTime()

FILE: common/CtaCommon.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN
  function ctaResponseCodeToString (line 74) | static std::string ctaResponseCodeToString(cta::xrd::Response::ResponseT...

FILE: common/DBG.hh
  type dbg_macro (line 55) | namespace dbg_macro {
    function isColorizedOutputEnabled (line 58) | inline bool isColorizedOutputEnabled() {
    function isColorizedOutputEnabled (line 62) | inline bool isColorizedOutputEnabled() {
    type pretty_function (line 67) | namespace pretty_function {
    type type_tag (line 101) | struct type_tag {}
    function get_type_name (line 104) | std::string get_type_name(type_tag<T>) {
    function type_name (line 113) | std::string type_name() {
    function get_type_name (line 140) | inline std::string get_type_name(type_tag<short>) {
    function get_type_name (line 144) | inline std::string get_type_name(type_tag<unsigned short>) {
    function get_type_name (line 148) | inline std::string get_type_name(type_tag<long>) {
    function get_type_name (line 152) | inline std::string get_type_name(type_tag<unsigned long>) {
    function get_type_name (line 156) | inline std::string get_type_name(type_tag<std::string>) {
    function get_type_name (line 161) | std::string get_type_name(type_tag<std::vector<T, std::allocator<T>>>) {
    type detail_detector (line 167) | namespace detail_detector {
      type nonesuch (line 169) | struct nonesuch {
        method nonesuch (line 170) | nonesuch() = delete;
        method nonesuch (line 172) | nonesuch(nonesuch const&) = delete;
      type detector (line 184) | struct detector {
    type detail (line 201) | namespace detail {
      function size (line 208) | constexpr auto size(const T& c) -> decltype(c.size()) {
      function size (line 212) | constexpr std::size_t size(const T (&)[N]) {
      type has_begin_end_size (line 230) | struct has_begin_end_size {
      type has_ostream_operator (line 241) | struct has_ostream_operator {
    function pretty_print (line 250) | inline void pretty_print(std::ostream& stream, const T& value, std::tr...
    function pretty_print (line 255) | inline void pretty_print(std::ostream&, const T&, std::false_type) {
    function pretty_print (line 261) | inline typename std::enable_if<!detail::has_begin_end_size<const T&>::...
    function pretty_print (line 272) | inline bool pretty_print(std::ostream& stream, const bool& value) {
    function pretty_print (line 277) | inline bool pretty_print(std::ostream& stream, const char& value) {
    function pretty_print (line 283) | inline bool pretty_print(std::ostream& stream, P* const& value) {
    function pretty_print (line 293) | inline bool pretty_print(std::ostream& stream,
    function pretty_print (line 300) | inline bool pretty_print(std::ostream& stream, std::shared_ptr<T>& val...
    function pretty_print (line 308) | inline bool pretty_print(std::ostream& stream, const char (&value)[N]) {
    function pretty_print (line 314) | inline bool pretty_print(std::ostream& stream, const char* const& valu...
    type pretty_print_tuple (line 320) | struct pretty_print_tuple {
      method print (line 322) | static void print(std::ostream& stream, const std::tuple<Ts...>& tup...
    type pretty_print_tuple<0> (line 330) | struct pretty_print_tuple<0> {
      method print (line 332) | static void print(std::ostream& stream, const std::tuple<Ts...>& tup...
    function pretty_print (line 338) | inline bool pretty_print(std::ostream& stream, const std::tuple<Ts...>...
    function pretty_print (line 347) | inline bool pretty_print(std::ostream& stream, const std::tuple<>&) {
    function pretty_print (line 354) | inline
    function pretty_print (line 381) | inline typename std::enable_if<std::is_enum<Enum>::value, bool>::type
    function pretty_print (line 389) | inline bool pretty_print(std::ostream& stream, const std::string& valu...
    function pretty_print (line 397) | inline bool pretty_print(std::ostream& stream, const std::optional<T>&...
    function pretty_print (line 410) | inline bool pretty_print(std::ostream& stream,
    class DebugOutput (line 421) | class DebugOutput {
      method DebugOutput (line 423) | DebugOutput(const char* filepath,
      method T (line 440) | T&& print(const std::string& type, T&& value) const {
    function T (line 491) | T&& identity(T&& t) {
  type detector<Default, void_t<Op<Args...>>, Op, Args...> (line 190) | struct detector<Default, void_t<Op<Args...>>, Op, Args...> {

FILE: common/EosLayoutPrint.cc
  function main (line 28) | int main(int argc, char* argv[])

FILE: common/ErrnoToString.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 28) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/ExpiryCache.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 32) | EOSCOMMONNAMESPACE_BEGIN
  class ExpiryCache (line 45) | class ExpiryCache {
    method IsUpdateNeeded (line 61) | bool IsUpdateNeeded(bool forceUpdate, bool& isInvalidRet) {
    method ExpiryCache (line 87) | explicit ExpiryCache(std::chrono::seconds expiredAfter, std::chrono::s...
    method SetExpiredAfter (line 93) | void SetExpiredAfter(std::chrono::seconds expiredAfter) {
    method SetInvalidAfter (line 100) | void SetInvalidAfter(std::chrono::seconds invalidAfter) {
    method getCachedObject (line 113) | typename std::remove_reference<T>::type getCachedObject(bool forceUpda...

FILE: common/FileId.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/FileMap.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 46) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/FileSystem.cc
  function FileSystemLocator (line 312) | const FileSystemLocator& FileSystemCoreParams::getLocator() const
  function GroupLocator (line 320) | const GroupLocator& FileSystemCoreParams::getGroupLocator() const
  function ConfigStatus (line 352) | ConfigStatus FileSystemCoreParams::getConfigStatus() const
  function SharedHashLocator (line 520) | SharedHashLocator FileSystem::getHashLocator() const
  function BootStatus (line 668) | BootStatus
  function ConfigStatus (line 706) | ConfigStatus
  function DrainStatus (line 755) | DrainStatus
  function printOntoTable (line 1001) | static void printOntoTable(mq::SharedHashWrapper& hash,
  function FileSystemCoreParams (line 1140) | FileSystemCoreParams FileSystem::getCoreParams()
  function ConfigStatus (line 1261) | ConfigStatus
  function BootStatus (line 1283) | BootStatus

FILE: common/FileSystem.hh
  type eos (line 43) | namespace eos
    type mq (line 45) | namespace mq
      class MessagingRealm (line 47) | class MessagingRealm
  type DrainStatus (line 70) | enum class DrainStatus : int8_t {
  type ActiveStatus (line 83) | enum class ActiveStatus : int8_t {
  type ConfigStatus (line 93) | enum class ConfigStatus : int8_t {
  class FileSystemUpdateBatch (line 131) | class FileSystemUpdateBatch
  class FstLocator (line 210) | class FstLocator
  class GroupLocator (line 258) | class GroupLocator
  class FileSystemCoreParams (line 302) | class FileSystemCoreParams
  class FileSystem (line 386) | class FileSystem
    type fs_snapshot_t (line 403) | struct fs_snapshot_t {
    type eBootConfig (line 507) | enum eBootConfig {
    method SetId (line 593) | bool SetId(fsid_t fsid)
    method SetDouble (line 601) | bool SetDouble(const char* key, double f)
    method SetLongLong (line 609) | bool SetLongLong(const char* key, long long l, bool broadcast = true)
    method SetStatus (line 617) | bool SetStatus(BootStatus status, bool broadcast = true)
    method SetDrainStatus (line 626) | bool SetDrainStatus(DrainStatus status)
    method ActiveStatus (line 644) | inline ActiveStatus GetActiveStatus() const
    method fsid_t (line 672) | fsid_t GetId()
    method GetQueuePath (line 680) | std::string GetQueuePath()
    method GetHost (line 688) | std::string GetHost()
    method GetQueue (line 696) | std::string GetQueue()
    method GetPath (line 704) | std::string GetPath()
    method BootStatus (line 717) | BootStatus GetInternalBootStatus()
    method DrainStatus (line 725) | DrainStatus GetDrainStatus()

FILE: common/Fmd.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 24) | EOSCOMMONNAMESPACE_BEGIN
  function FsckErr (line 39) | FsckErr ConvertToFsckErr(const std::string& serr)
  function FsckErrToString (line 69) | std::string FsckErrToString(const FsckErr& err)
  function EnvToFstFmd (line 99) | bool EnvToFstFmd(XrdOucEnv& env, FmdHelper& fmd)
  function CollectInconsistencies (line 205) | void

FILE: common/Fmd.hh
  class FmdHelper (line 39) | class FmdHelper : public eos::common::LogId
    method FmdHelper (line 47) | FmdHelper(eos::common::FileId::fileid_t fid = 0, int fsid = 0)
    method FmdHelper (line 57) | FmdHelper(eos::fst::FmdBase&& _mProtoFmd): mProtoFmd(std::move(_mProto...
    method FmdHelper (line 62) | FmdHelper(const eos::fst::FmdBase& _mProtoFmd): mProtoFmd(_mProtoFmd) {}
    method Replicate (line 111) | void
  type FsckErr (line 137) | enum class FsckErr {

FILE: common/FutureWrapper.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 28) | EOSCOMMONNAMESPACE_BEGIN
  function FutureWrapper (line 66) | FutureWrapper(folly::Promise<T>& promise) : mFut(promise.getFuture()) {}
  function ready (line 73) | bool ready()
  function T (line 90) | T& get()
  function T (line 107) | T* operator->()
  function T (line 118) | const T* operator->() const
  function hasException (line 133) | bool hasException()
  function wait (line 142) | void wait() const

FILE: common/Glob.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 42) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/IRWMutex.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 27) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/InodeTranslator.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/InstanceName.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/IntervalStopwatch.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 27) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/IntervalStopwatch.hh
  class IntervalStopwatch (line 44) | class IntervalStopwatch {

FILE: common/IoPipe.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 54) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/JeMallocHandler.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/LRU.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/LayoutId.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 36) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/LinuxFds.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 38) | EOSCOMMONNAMESPACE_BEGIN
  function GetFdUsage (line 52) | static bool GetFdUsage(linux_fds_t& result)

FILE: common/LinuxMemConsumption.hh
  class LinuxMemConsumption (line 44) | class LinuxMemConsumption {
    method GetMemoryFootprint (line 50) | static bool GetMemoryFootprint(linux_mem_t& result)

FILE: common/LinuxStat.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 38) | EOSCOMMONNAMESPACE_BEGIN
  function GetStat (line 98) | static bool GetStat(linux_stat_t& result) {

FILE: common/LinuxTotalMem.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 43) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Locators.cc
  function SharedHashLocator (line 282) | SharedHashLocator SharedHashLocator::makeForSpace(const std::string& name)
  function SharedHashLocator (line 287) | SharedHashLocator SharedHashLocator::makeForGroup(const std::string& name)
  function SharedHashLocator (line 292) | SharedHashLocator SharedHashLocator::makeForNode(const std::string& name)
  function SharedHashLocator (line 297) | SharedHashLocator SharedHashLocator::makeForGlobalHash()

FILE: common/Locators.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN
  class SharedHashLocator (line 131) | class SharedHashLocator
    type Type (line 134) | enum class Type {
    method getType (line 203) | inline SharedHashLocator::Type getType() const
    method GetName (line 211) | inline std::string GetName() const

FILE: common/Logging.cc
  function DisableGrpcLogging (line 48) | void
  function EnableGrpcLogging (line 64) | void
  type ZstdLogState (line 83) | struct ZstdLogState {
  function Logging (line 115) | Logging&
  function cmpPtr (line 254) | static int cmpPtr(const void* a, const void* b)
  function check_log_buffer_chain (line 259) | static void
  type log_buffer (line 343) | struct log_buffer
  type log_buffer (line 343) | struct log_buffer
  type LogBuffer::log_buffer (line 670) | struct LogBuffer::log_buffer
  type timeval (line 687) | struct timeval
  type timezone (line 688) | struct timezone
  type timeval (line 842) | struct timeval
  type timeval (line 849) | struct timeval
  function write_all (line 960) | static void write_all(int fd, const void* buf, size_t len)
  type tm (line 1125) | struct tm
  function ZstdLogState (line 1150) | ZstdLogState* Logging::zstdGetStateLocked(const std::string& tag)
  type stat (line 1241) | struct stat

FILE: common/Logging.hh
  type ZstdLogState (line 78) | struct ZstdLogState
  class LogId (line 254) | class LogId
    method LogId (line 260) | LogId()
    method GenerateLogId (line 281) | static std::string GenerateLogId()
    method SetSingleShotLogId (line 294) | void
    method SetLogId (line 304) | void
    method SetLogId (line 317) | void
    method SetLogId (line 333) | void
    method SetLogId (line 352) | void
  class LogBuffer (line 376) | class LogBuffer
    method LogBuffer (line 383) | LogBuffer()
    method suspend (line 398) | void suspend()
    method resume (line 404) | void resume()
    method resume_int (line 410) | void resume_int()
    method shutDown (line 419) | void
    type log_buffer (line 474) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer_hdr (line 475) | struct log_buffer_hdr {
      type log_buffer (line 476) | struct log_buffer
    type log_buffer (line 491) | struct log_buffer {
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 496) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 497) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 498) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 520) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 521) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
    type log_buffer (line 522) | struct log_buffer
      type log_buffer_hdr (line 492) | struct log_buffer_hdr
      type log_buffer_hdr (line 493) | struct log_buffer_hdr
  class Logging (line 530) | class Logging
    method shutDown (line 574) | void
    method EnableRateLimiter (line 586) | void
    method GetLogMask (line 595) | int
    method SetUnit (line 609) | void
    method SetSysLog (line 615) | void
    method SetIndexSize (line 624) | void
    method SetFilter (line 640) | void
    method GetPriorityByString (line 719) | int
    method AddFanOut (line 764) | void
    method AddFanOutAlias (line 773) | void
    type timeval (line 861) | struct timeval
    method IsZstdEnabled (line 869) | bool IsZstdEnabled() const
    method ResolveZstdTag (line 880) | std::string ResolveZstdTag(const char* sourceTag, const char* fanOutTa...
    type ZstdLogState (line 907) | struct ZstdLogState
    type ZstdLogState (line 908) | struct ZstdLogState
  type LoggingInitializer (line 939) | struct LoggingInitializer {

FILE: common/Macros.hh
  function h_tonll (line 37) | inline unsigned long long h_tonll(unsigned long long n)
  function n_tohll (line 46) | inline unsigned long long n_tohll(unsigned long long n)

FILE: common/Mapping.cc
  type stat (line 821) | struct stat
  type passwd (line 1483) | struct passwd
  type passwd (line 1484) | struct passwd
  type passwd (line 1491) | struct passwd
  type passwd (line 1492) | struct passwd
  type group (line 1549) | struct group
  type group (line 1550) | struct group
  function uid_t (line 1592) | uid_t
  function gid_t (line 1654) | gid_t
  function VirtualIdentity (line 1986) | VirtualIdentity Mapping::Someone(const std::string& name)
  function VirtualIdentity (line 2006) | VirtualIdentity Mapping::Someone(uid_t uid, gid_t gid)
  function uid_t (line 2047) | uid_t
  type passwd (line 2102) | struct passwd
  type passwd (line 2167) | struct passwd
  type passwd (line 2183) | struct passwd
  type passwd (line 2245) | struct passwd

FILE: common/Mapping.hh
  class XrdSecEntity (line 39) | class XrdSecEntity
  function EOSCOMMONNAMESPACE_BEGIN (line 40) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Murmur3.hh
  type Murmur3 (line 4) | namespace Murmur3
    type MurmurHasher (line 9) | struct MurmurHasher {
    type MurmurHasher<uint64_t> (line 14) | struct MurmurHasher<uint64_t> {
    type MurmurHasher<std::string> (line 28) | struct MurmurHasher<std::string> {

FILE: common/MutexLatencyWatcher.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/OAuth.hh
  class OAuth (line 41) | class OAuth {
    method OAuth (line 47) | OAuth() { cache_validity_time = 600; }

FILE: common/ObserverMgr.hh
  type eos::common (line 29) | namespace eos::common
    class ObserverMgr (line 40) | class ObserverMgr
      method ObserverMgr (line 44) | ObserverMgr() : mThreadPool(2) {}
      method ObserverMgr (line 46) | ObserverMgr(size_t min_threads,
      method syncAllNotifications (line 57) | void syncAllNotifications()
      method observer_tag_t (line 76) | [[nodiscard]] observer_tag_t
      method rmObserver (line 82) | void
      method notifyChangeSync (line 95) | void
      method notifyChange (line 112) | void

FILE: common/Parallel.hh
  class Parallel (line 44) | class Parallel
    method For (line 50) | static void For(Index start, Index end, Callable func)
    method SequentialFor (line 92) | static void SequentialFor(Index start, Index end, Callable func)

FILE: common/ParseUtils.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 37) | EOSCOMMONNAMESPACE_BEGIN
  function ParseUInt64 (line 61) | inline bool ParseUInt64(const std::string& str, uint64_t& ret, int base ...
  function ParseLongLong (line 78) | inline long long ParseLongLong(const std::string& str)
  function ParseDouble (line 95) | inline double ParseDouble(const std::string& str)
  function ParseHostNamePort (line 114) | inline bool ParseHostNamePort(const std::string& input, std::string& host,
  function ValidHostnameOrIP (line 146) | inline bool ValidHostnameOrIP(const std::string& input)

FILE: common/PasswordHandler.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 33) | EOSCOMMONNAMESPACE_BEGIN
  function rightTrimWhitespace (line 62) | static void rightTrimWhitespace(std::string &src)
  function readPasswordFile (line 72) | static bool readPasswordFile(const std::string &path, std::string &conte...

FILE: common/Path.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 46) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/PthreadRWMutex.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 28) | EOSCOMMONNAMESPACE_BEGIN
  type timespec (line 97) | struct timespec
  type timespec (line 160) | struct timespec

FILE: common/PthreadRWMutex.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 27) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/RWMutex.cc
  function RWMutex (line 210) | RWMutex&
  type timespec (line 803) | struct timespec

FILE: common/RWMutex.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 82) | EOSCOMMONNAMESPACE_BEGIN
  class RWMutex (line 94) | class RWMutex
    method IRWMutex (line 110) | IRWMutex* GetRawPtr()
    method RWMutex (line 128) | RWMutex(const RWMutex&) = delete;
    method RWMutex (line 133) | RWMutex& operator=(const RWMutex&) = delete;
    method SetBlocking (line 140) | inline void SetBlocking(bool block)
    method SetBlockedForMsInterval (line 150) | inline void SetBlockedForMsInterval(int64_t blockedfor)
    method BlockedForMsInterval (line 155) | int64_t BlockedForMsInterval() const
    method SetBlockedStackTracing (line 164) | inline void SetBlockedStackTracing(bool onoff)
    method BlockedStackTracing (line 169) | bool BlockedStackTracing() const
    method GetReadLockCounter (line 229) | inline uint64_t GetReadLockCounter()
    method GetWriteLockCounter (line 237) | inline uint64_t GetWriteLockCounter()
    method GetReadLockTime (line 245) | inline uint64_t GetReadLockTime()
    method GetWriteLockTime (line 255) | inline uint64_t GetWriteLockTime()
    method GetReadLockLeadTime (line 265) | inline uint64_t GetReadLockLeadTime()
    method GetWriteLockLeadTime (line 275) | inline uint64_t GetWriteLockLeadTime()
    method AddReadLockTime (line 285) | inline void AddReadLockTime(uint64_t t)
    method AddWriteLockTime (line 293) | inline void AddWriteLockTime(uint64_t t)
    type LOCK_T (line 298) | enum class LOCK_T { eNone, eWantLockRead, eWantUnLockRead, eLockRead, ...
    method getName (line 318) | std::string getName() const
    method addBlockingTimeInfos (line 323) | void addBlockingTimeInfos(std::chrono::system_clock::time_point acquir...
    method getNbMsMutexWriteLockedPenultimateSecond (line 369) | const std::chrono::milliseconds
    type TimingStats (line 387) | struct TimingStats {
    method SetTimingGlobal (line 408) | inline static void SetTimingGlobal(bool on)
    method GetTimingGlobal (line 416) | inline static bool GetTimingGlobal()
    method SetOrderCheckingGlobal (line 424) | inline static void SetOrderCheckingGlobal(bool on)
    method GetOrderCheckingGlobal (line 432) | inline static bool GetOrderCheckingGlobal()
    method SetDeadlockCheckingGlobal (line 440) | inline static void SetDeadlockCheckingGlobal(bool on)
    method GetDeadlockCheckingGlobal (line 448) | inline static bool GetDeadlockCheckingGlobal()
    method GetTimingCompensation (line 524) | inline static size_t GetTimingCompensation()
    method GetOrderCheckingLatency (line 529) | inline static size_t GetOrderCheckingLatency()
    method GetTimingLatency (line 534) | inline static size_t GetTimingLatency()
    method GetLockUnlockDuration (line 539) | static size_t GetLockUnlockDuration()
    method SetTiming (line 568) | inline void SetTiming(bool on)
    method GetTiming (line 576) | inline bool GetTiming()
    method SetDebugName (line 584) | inline void SetDebugName(const std::string& name)
    method SetDeadlockCheck (line 635) | inline void SetDeadlockCheck(bool status)
    type timespec (line 672) | struct timespec
  class RWMutexWriteLock (line 778) | class RWMutexWriteLock
    method RWMutexWriteLock (line 784) | RWMutexWriteLock():
  class RWMutexReadLock (line 845) | class RWMutexReadLock
    method RWMutexReadLock (line 851) | RWMutexReadLock():
  class RWMutexR (line 909) | class RWMutexR : public RWMutex
    method RWMutexR (line 912) | RWMutexR() : RWMutex(true) { }
  class RWMutexW (line 919) | class RWMutexW : public RWMutex
    method RWMutexW (line 922) | RWMutexW() : RWMutex(false) { }

FILE: common/RateLimit.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/RateLimit.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 32) | EOSCOMMONNAMESPACE_BEGIN
  class RequestRateLimit (line 97) | class RequestRateLimit: public IRateLimit, public LogId
    method RequestRateLimit (line 103) | RequestRateLimit(bool fake_clock = false):
    method SetRatePerSecond (line 115) | void SetRatePerSecond(unsigned long long rate)
    method Allow (line 136) | uint64_t Allow(uint64_t permits = 1)

FILE: common/RegexWrapper.cc
  function regex_t (line 52) | regex_t* eos_get_regex(const std::string& in_regex)
  function EOSCOMMONNAMESPACE_BEGIN (line 77) | EOSCOMMONNAMESPACE_BEGIN
  function eos_regex_search (line 112) | bool eos_regex_search(const std::string& input, const std::string& regex)
  function eos_regex_valid (line 137) | bool eos_regex_valid(const std::string& regex)

FILE: common/Report.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 35) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Report.hh
  class XrdOucEnv (line 33) | class XrdOucEnv
  class XrdOucString (line 34) | class XrdOucString
  function EOSCOMMONNAMESPACE_BEGIN (line 36) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/SecEntity.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 33) | EOSCOMMONNAMESPACE_BEGIN
  function ToString (line 82) | static std::string ToString(const XrdSecEntity* entity, const char* app)
  function KeyToMap (line 122) | static std::map<std::string, std::string> KeyToMap(std::string entitystr...
  function ToEnv (line 145) | static std::string ToEnv(const char* s, bool is_tpc = false)

FILE: common/ShardedCache.hh
  type IdentityHash (line 64) | struct IdentityHash {
    method hash (line 65) | static uint64_t hash(const Key& key)
  type DefaultHash (line 72) | struct DefaultHash {
    method hash (line 73) | static uint64_t hash(const Key& key)
  class ShardedCache (line 81) | class ShardedCache
    class ShardGuard (line 84) | class ShardGuard
      method ShardGuard (line 87) | ShardGuard(ShardedCache* cache, const Key& key)
      method getShard (line 94) | int64_t getShard() const
    type CacheEntry (line 108) | struct CacheEntry {
      method CacheEntry (line 112) | CacheEntry() = default;
      method CacheEntry (line 114) | explicit CacheEntry(Value value_) : value(std::make_shared<Value>(va...
    method calculateShard (line 129) | int64_t calculateShard(const Key& key) const
    method ShardedCache (line 135) | explicit ShardedCache(uint8_t shardBits_) : mNumShards(1UL << shardBit...
    method ShardedCache (line 142) | ShardedCache(uint8_t shardBits_, Milliseconds ttl_,
    method reset_cleanup_thread (line 151) | void reset_cleanup_thread(Milliseconds ttl_,
    method retrieve (line 165) | std::shared_ptr<Value> retrieve(const Key& key)
    method contains (line 179) | bool contains(const Key& key)
    method store (line 189) | bool store(const Key& key, std::unique_ptr<Value> value, std::shared_p...
    method store (line 210) | bool store(const Key& key, std::unique_ptr<Value> value, bool replace ...
    method store (line 217) | bool store(const Key& key, std::unique_ptr<Value> value,
    method Value (line 237) | Value fetch_add(const Key& key, Value inc_val)
    method invalidate (line 255) | bool invalidate(const Key& key)
    method clear (line 268) | void clear()
    method num_shards (line 278) | size_t num_shards() const
    method num_entries (line 283) | size_t num_entries() const
    method num_content_shards (line 295) | size_t num_content_shards() const
    method get_shard (line 307) | MapT<Key, Value> get_shard(size_t shard) const
    method set_force_expiry (line 324) | void set_force_expiry(bool force_expiry, uint16_t force_expiry_cycles ...
    method collectorPass (line 343) | void collectorPass()
    method garbageCollector (line 364) | void garbageCollector(ThreadAssistant& assistant)

FILE: common/SharedCallbackList.hh
  class SharedRetCallbackList (line 44) | class SharedRetCallbackList
    method shared_callback_slot_t (line 59) | [[nodiscard]] shared_callback_slot_t
    method getCallbacks (line 79) | std::vector<std::weak_ptr<callable_t>>
    method rmCallback (line 100) | void

FILE: common/SharedMutex.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 25) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/SharedMutex.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 28) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/ShellCmd.cc
  function cmd_status (line 199) | cmd_status
  function cmd_status (line 211) | cmd_status

FILE: common/ShellCmd.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN
  class ShellCmd (line 54) | class ShellCmd
    method pid_t (line 91) | pid_t get_pid()

FILE: common/ShellExecutor.cc
  function pid_t (line 96) | pid_t
  type sigaction (line 151) | struct sigaction
  type sigaction (line 157) | struct sigaction
  function pid_t (line 203) | pid_t

FILE: common/ShellExecutor.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN
  class ShellCmd (line 63) | class ShellCmd
  class ShellExecutor (line 68) | class ShellExecutor
    method ShellExecutor (line 81) | static ShellExecutor& instance()
    type msg_t (line 136) | struct msg_t {

FILE: common/StackTrace.hh
  class StackTrace (line 43) | class StackTrace
    method constructGdbCommand (line 49) | static std::string constructGdbCommand()
    method GdbTrace (line 71) | static void GdbTrace(const char* executable, pid_t pid, const char* what,
    method GdbSignaledTrace (line 139) | static void GdbSignaledTrace(std::string& trace)

FILE: common/StacktraceHere.cc
  function getStacktrace (line 44) | std::string getStacktrace()
  function getStacktrace (line 49) | std::string getStacktrace()
  function handleSignal (line 125) | void handleSignal(int sig, siginfo_t* si, void* ctx)
  function handleSignal (line 129) | void handleSignal(int sig, siginfo_t* si, void* ctx)

FILE: common/Statfs.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 39) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Statistics.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN
  function avg (line 49) | static double avg(std::multiset<float>& s)
  function sig (line 61) | static double sig(std::multiset<float>& s)
  function nperc (line 71) | static double nperc(std::multiset<float>& s, double perc=99.0)

FILE: common/Status.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 28) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/SteadyClock.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 29) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/Strerror_r_wrapper.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/StringConversion.cc
  function XrdOucString (line 785) | XrdOucString
  type timespec (line 931) | struct timespec
  function CURL (line 1194) | CURL* StringConversion::tlCurlInit()

FILE: common/StringConversion.hh
  class StringConversion (line 68) | class StringConversion
    method integral_to_hex (line 154) | static std::string integral_to_hex(const T input)
    method GetSizeFromString (line 272) | static unsigned long long
    method GetSizeFromString (line 278) | static unsigned long long
    method GetDataSizeFromString (line 302) | static unsigned long long
    method GetDataSizeFromString (line 308) | static unsigned long long
    method GetSizeString (line 322) | static std::string GetSizeString(T insize)
    method ReplaceMapKey (line 452) | static bool
    method UnQuote (line 654) | static std::string
    method ToLower (line 676) | static std::string
    method ToLower (line 691) | static std::string
    method IntToOctal (line 707) | static std::string
    method InitLookupTables (line 717) | static void InitLookupTables()
    method FastUnsignedToAsciiHex (line 769) | static std::string
    method FastAsciiHexToUnsigned (line 801) | static void
    method stringify (line 936) | static std::string stringify(const T& elem)
    method ReplaceStringInPlace (line 944) | static void ReplaceStringInPlace(std::string& subject,
    method Replace (line 964) | static void Replace(std::string& subject,
    method DecodeInvalidUTF8 (line 992) | static std::string DecodeInvalidUTF8(const std::string& string)
    method ReduceString (line 1081) | static std::string ReduceString(const std::string& input, size_t max =...
    method StringConversion (line 1097) | StringConversion() = default;
  type CurlGlobalInitializer (line 1121) | struct CurlGlobalInitializer {

FILE: common/StringSplit.hh
  type eos::common (line 31) | namespace eos::common
    type detail (line 33) | namespace detail
      type has_const_iter (line 37) | struct has_const_iter : std::false_type {}
      function get_delim_p (line 55) | auto get_delim_p(const str_t& str, const delim_t& delim,
      function get_delim_p (line 64) | auto get_delim_p(const str_t& str, char delim,
      type has_emplace_back (line 75) | struct has_emplace_back : std::false_type {}
    class LazySplit (line 116) | class LazySplit
      method LazySplit (line 119) | LazySplit(str_type s, delim_type d) : str(s), delim(d) {}
      class iterator (line 121) | class iterator
        method iterator (line 141) | iterator(str_type s, delim_type d): str(s), delim(d), segment(next...
        method iterator (line 142) | iterator(size_type sz) : pos(sz) {}
        method iterator (line 144) | iterator& operator++()
        method iterator (line 150) | iterator operator++(int)
        method reference (line 157) | reference operator*()
        method pointer (line 161) | pointer operator->()
        method base_string_type (line 183) | base_string_type next(size_type start_pos)
      method iterator (line 208) | iterator begin() const
        method iterator (line 141) | iterator(str_type s, delim_type d): str(s), delim(d), segment(next...
        method iterator (line 142) | iterator(size_type sz) : pos(sz) {}
        method iterator (line 144) | iterator& operator++()
        method iterator (line 150) | iterator operator++(int)
        method reference (line 157) | reference operator*()
        method pointer (line 161) | pointer operator->()
        method base_string_type (line 183) | base_string_type next(size_type start_pos)
      method const_iterator (line 212) | const_iterator cbegin() const
      method iterator (line 217) | iterator end() const
        method iterator (line 141) | iterator(str_type s, delim_type d): str(s), delim(d), segment(next...
        method iterator (line 142) | iterator(size_type sz) : pos(sz) {}
        method iterator (line 144) | iterator& operator++()
        method iterator (line 150) | iterator operator++(int)
        method reference (line 157) | reference operator*()
        method pointer (line 161) | pointer operator->()
        method base_string_type (line 183) | base_string_type next(size_type start_pos)
      method const_iterator (line 221) | const_iterator cend() const
    function StringSplit (line 247) | auto StringSplit(std::string_view input, std::string_view delim)
    function StringSplit (line 263) | auto StringSplit(std::string_view input, std::string_view delim)
    function C (line 277) | C SplitPath(std::string_view input)
    function GetRootPath (line 282) | inline std::string
  type has_const_iter<T, std::void_t<decltype(std::declval<T>().cbegin(),
    std::declval<T>().cend())>> (line 40) | struct has_const_iter<T, std::void_t<decltype(std::declval<T>().cbegin(),
  type has_emplace_back<T, std::void_t<decltype(std::declval<T>().emplace_back())>> (line 78) | struct has_emplace_back<T, std::void_t<decltype(std::declval<T>().emplac...

FILE: common/StringTokenizer.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN
  function C (line 171) | C StringTokenizer::split(std::string_view str, char delimiter)

FILE: common/StringUtils.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 39) | EOSCOMMONNAMESPACE_BEGIN
  function endsWith (line 56) | inline bool endsWith(std::string_view str, std::string_view suffix)
  function ltrim (line 65) | static inline void ltrim(std::string& s)
  function rtrim (line 75) | static inline void rtrim(std::string& s)
  function trim (line 85) | static inline void trim(std::string& s)
  function boolToString (line 94) | static inline std::string boolToString(bool b)
  function joinMap (line 106) | static inline std::string joinMap(const std::map<std::string, std::strin...
  function stringToHex (line 124) | static inline std::string stringToHex(const std::string& in,
  function hexToString (line 138) | static inline std::string hexToString(const std::string& in)
  function StringToNumeric (line 185) | auto StringToNumeric(const StrT& key, NumT& value,
  function StringToNumeric (line 225) | auto StringToNumeric(const StrT& key, NumT& value,
  function replace_all (line 273) | static inline void replace_all(std::string& str,

FILE: common/SymKeys.cc
  function UriCapCipher (line 58) | UriCapCipher&
  function HMAC_CTX (line 79) | static HMAC_CTX* HMAC_CTX_new(void)
  function HMAC_CTX_free (line 90) | static void HMAC_CTX_free(HMAC_CTX* ctx)
  function openssl3provider (line 100) | static void openssl3provider()
  function SymKey (line 679) | SymKey*
  function SymKey (line 706) | SymKey*
  function SymKey (line 740) | SymKey*
  function SymKey (line 752) | SymKey*

FILE: common/SymKeys.hh
  type UriCapCipherDeleter (line 49) | struct UriCapCipherDeleter {
  class SymKey (line 56) | class SymKey
    type hmac_t (line 268) | struct hmac_t {
      method set (line 269) | void set(const std::string& secret, const std::string& key)
      method hmac_t (line 279) | hmac_t(const std::string& secret, const std::string& key)
      method hmac_t (line 283) | hmac_t() {}
    method RandomCipher (line 304) | static std::string RandomCipher(const std::string& key)
    method Print (line 360) | void
    method time_t (line 412) | inline time_t GetValidity()
    method IsValid (line 420) | bool
    method SymKey (line 433) | static SymKey*
  class SymKeyStore (line 455) | class SymKeyStore
    method SymKeyStore (line 465) | SymKeyStore(): currentKey(nullptr) {}

FILE: common/SyncAll.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 36) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/SystemClock.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 29) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/ThreadPool.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 35) | EOSCOMMONNAMESPACE_BEGIN
  function PushTask (line 195) | std::future<Ret> PushTask(std::function<Ret(void)> func)
  function PushTask (line 208) | std::future<Ret> PushTask(std::shared_ptr<std::packaged_task<Ret(void)>>...
  function Stop (line 222) | void Stop()
  function GetInfo (line 258) | std::string GetInfo() const
  function SetMinThreads (line 275) | void SetMinThreads(unsigned int num)
  function SetMaxThreads (line 290) | void SetMaxThreads(unsigned int num)
  function GetMaxThreads (line 306) | unsigned int GetMaxThreads() const
  function GetSize (line 314) | unsigned int GetSize()
  function GetQueueSize (line 322) | size_t GetQueueSize() const
  function setSelfThreadName (line 327) | static void setSelfThreadName(const std::string& name)
  function ThreadPool (line 335) | ThreadPool(const ThreadPool&) = delete;
  function ThreadPool (line 336) | ThreadPool(ThreadPool&&) = delete;

FILE: common/Timing.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 40) | EOSCOMMONNAMESPACE_BEGIN
  function getEpochInMilliseconds (line 56) | inline std::chrono::milliseconds getEpochInMilliseconds()
  class Timing (line 76) | class Timing
    type timeval (line 79) | struct timeval
    method Timing (line 88) | Timing(const char* name, struct timeval& i_tv):
    method Timing (line 98) | Timing(const char* i_maintag):
    method GetTagTimelapse (line 107) | float
    method GetCurrentYear (line 143) | static std::string GetCurrentYear()
    method GetNowInNs (line 155) | static long long
    method GetNowInSec (line 166) | static long long
    method GetAgeInNs (line 177) | static long long
    method GetCoarseAgeInNs (line 193) | static long long
    method GetAgeInNs (line 210) | static long long
    method GetCoarseAgeInNs (line 226) | static long long
    method Print (line 242) | void
    method Dump (line 248) | std::string
    method RealTime (line 300) | double
    method UnixTimestamp_to_Day (line 332) | static std::string
    method time_t (line 351) | static time_t
    method GetTimeSpec (line 365) | static void
    method Timespec_from_TimespecStr (line 397) | static int
    method TimespecToString (line 433) | static std::string
    method Ns_from_TimespecStr (line 449) | static long long
    method UnixTimestamp_to_ISO8601 (line 460) | static std::string
    method time_t (line 480) | static time_t
    method utctime (line 497) | static
    method ltime (line 524) | static
    method gtime (line 546) | static
    method ToLsFormat (line 568) | static

FILE: common/UnixGroupsFetcher.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 23) | EOSCOMMONNAMESPACE_BEGIN
  function populateGroups (line 77) | void populateGroups(const std::string& username, gid_t gid,

FILE: common/UnixGroupsFetcher.hh
  type UnixGroupsFetcher (line 34) | struct UnixGroupsFetcher
  class UnixGrentFetcher (line 40) | class UnixGrentFetcher: public UnixGroupsFetcher {
  type UnixGroupListFetcher (line 47) | struct UnixGroupListFetcher: public UnixGroupsFetcher {

FILE: common/Untraceable.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 36) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/UriCapCipher.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 38) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/UriCapCipher.hh
  type PasswordTag (line 61) | struct PasswordTag {
    method PasswordTag (line 62) | explicit PasswordTag() = default;
  type FixedSaltTag (line 64) | struct FixedSaltTag {
    method FixedSaltTag (line 65) | explicit FixedSaltTag() = default;

FILE: common/Utils.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN
  function SanitizeGeoTag (line 56) | std::string SanitizeGeoTag(const std::string& geotag)
  function GetFileAdlerXs (line 108) | bool
  function GetFileBinarySha1 (line 136) | bool
  function GetFileHexSha1 (line 162) | bool
  function ComputeSize (line 186) | void ComputeSize(uint64_t & size, int64_t delta) {
  function AddEosApp (line 195) | void AddEosApp(std::string & pathOrOpaque, const std::string & protocol)

FILE: common/VirtualIdentity.cc
  function GetNobodyUidGid (line 34) | std::pair<uid_t, gid_t> GetNobodyUidGid()
  function VirtualIdentity (line 68) | VirtualIdentity VirtualIdentity::Root()
  function VirtualIdentity (line 87) | VirtualIdentity VirtualIdentity::Nobody()

FILE: common/VirtualIdentity.hh
  type VirtualIdentity (line 40) | struct VirtualIdentity {
    method hasUid (line 88) | inline bool hasUid(uid_t uid) const
    method hasGid (line 96) | bool hasGid(gid_t gid) const
    method isGateway (line 109) | bool isGateway() { return gateway; }

FILE: common/WFEClient.hh
  class WFEClient (line 34) | class WFEClient {
  class WFEGrpcClient (line 40) | class WFEGrpcClient : public WFEClient {
    method WFEGrpcClient (line 42) | WFEGrpcClient(const std::string& endpoint_str, std::optional<std::stri...
    method send (line 68) | cta::xrd::Response::ResponseType send(const cta::xrd::Request& request...
  class WFEXrdClient (line 148) | class WFEXrdClient : public WFEClient {
    method WFEXrdClient (line 150) | WFEXrdClient(std::string endpoint, std::string resource, XrdSsiPb::Con...
    method send (line 151) | cta::xrd::Response::ResponseType send(const cta::xrd::Request& request...
  function CreateRequestSender (line 165) | std::unique_ptr<WFEClient>

FILE: common/WaitInterval.hh
  class WaitInterval (line 57) | class WaitInterval
    method WaitInterval (line 60) | WaitInterval(const uint64_t interval_sec) : mIntervalSec(
    method WaitInterval (line 65) | WaitInterval(const WaitInterval&) = delete;
    method WaitInterval (line 67) | WaitInterval(WaitInterval&&) noexcept = delete;
    method WaitInterval (line 69) | WaitInterval& operator=(const WaitInterval&) = delete;
    method WaitInterval (line 71) | WaitInterval& operator=(WaitInterval&&) noexcept = delete;
    method get (line 73) | uint64_t get() const
    method set (line 79) | void set(const uint64_t new_value_sec)
    method wait (line 102) | void wait(ThreadAssistant& assistant, const bool zero_forever = false)...
    method wait_if_zero (line 117) | bool wait_if_zero(ThreadAssistant& assistant) const
    method random_wait (line 138) | void random_wait(ThreadAssistant& assistant,
    method registerNotifyCallback (line 163) | void registerNotifyCallback(ThreadAssistant& assistant) const
    method wait_time (line 172) | void wait_time(ThreadAssistant& assistant, std::unique_lock<std::mutex...

FILE: common/WebNotify.cc
  type curl_slist (line 119) | struct curl_slist

FILE: common/WebNotify.hh
  class WebNotify (line 41) | class WebNotify {
    method WebNotify (line 45) | WebNotify() { }
    method NoOpCallback (line 55) | static size_t NoOpCallback(void* contents, size_t size, size_t nmemb, ...

FILE: common/XrdConnPool.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN
  class XrdConnIdHelper (line 90) | class XrdConnIdHelper final
    method XrdConnIdHelper (line 96) | XrdConnIdHelper(XrdConnPool& pool, XrdCl::URL& url):
    method HasNewConnection (line 116) | bool HasNewConnection() const
    method GetId (line 124) | uint32_t GetId() const

FILE: common/XrdErrorMap.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/async/ExecutorMgr.hh
  type eos::common (line 33) | namespace eos::common
    type detail (line 36) | namespace detail
      function execVia (line 44) | auto
      function execVia (line 71) | auto
      function ShutdownExecutor (line 80) | inline void ShutdownExecutor(folly::ThreadPoolExecutor* executor)
      function ShutdownExecutor (line 85) | inline void ShutdownExecutor(eos::common::ThreadPool* threadpool)
      function GetQueueSize (line 90) | inline size_t GetQueueSize(folly::ThreadPoolExecutor* executor)
      function GetQueueSize (line 95) | inline size_t GetQueueSize(eos::common::ThreadPool* threadpool)
    type ExecutorType (line 102) | enum class ExecutorType {
    function ExecutorType (line 108) | inline constexpr ExecutorType
    class ExecutorMgr (line 134) | class ExecutorMgr
      method PushTask (line 142) | auto
      method Shutdown (line 157) | void Shutdown()
      method GetQueueSize (line 164) | size_t GetQueueSize() const
      method holdsType (line 172) | constexpr bool holdsType() const
      method IsFollyExecutor (line 177) | constexpr bool IsFollyExecutor() const
      method IsThreadPool (line 182) | constexpr bool IsThreadPool() const
      method ExecutorMgr (line 187) | ExecutorMgr(ExecutorType type, size_t num_threads)
      method ExecutorMgr (line 205) | ExecutorMgr(ExecutorType type, size_t min_threads, Args... args)
      method ExecutorMgr (line 218) | ExecutorMgr(std::string_view executor_type, size_t num_threads, Args...
      method ExecutorMgr (line 221) | ExecutorMgr(std::shared_ptr<folly::ThreadPoolExecutor> executor) :
      method ExecutorMgr (line 224) | ExecutorMgr(std::shared_ptr<eos::common::ThreadPool> threadpool) :

FILE: common/async/OpaqueFuture.hh
  type eos::common (line 30) | namespace eos::common
    type detail (line 33) | namespace detail
      type has_isReady (line 36) | struct has_isReady : std::false_type {}
      type has_cancel (line 43) | struct has_cancel : std::false_type {}
    class OpaqueFuture (line 65) | class OpaqueFuture
      method T (line 68) | T
      method ready (line 74) | bool ready()
      method valid (line 79) | bool valid()
      method wait (line 84) | void wait()
      method cancel (line 89) | void cancel()
      method OpaqueFuture (line 95) | OpaqueFuture(F&& fut) : fut_holder(std::make_unique<future_holder<F>...
      type base_future_holder (line 99) | struct base_future_holder {
      type future_holder (line 109) | struct future_holder : public base_future_holder {
        method future_holder (line 110) | future_holder(F&& f) : fut_(std::move(f)) {}
        method T (line 111) | T getValue() override
        method valid (line 123) | bool valid() override
        method wait (line 128) | void wait() override
        method ready (line 134) | bool ready() override
        method cancel (line 143) | void cancel() override
  type has_isReady<Fut, std::void_t<decltype(std::declval<Fut>().isReady())>> (line 39) | struct has_isReady<Fut, std::void_t<decltype(std::declval<Fut>().isReady...
  type has_cancel<Fut, std::void_t<decltype(std::declval<Fut>().cancel())>> (line 46) | struct has_cancel<Fut, std::void_t<decltype(std::declval<Fut>().cancel()...

FILE: common/blake3/blake3.c
  function INLINE (line 10) | INLINE void chunk_state_init(blake3_chunk_state *self, const uint32_t ke...
  function INLINE (line 20) | INLINE void chunk_state_reset(blake3_chunk_state *self, const uint32_t k...
  function INLINE (line 29) | INLINE size_t chunk_state_len(const blake3_chunk_state *self) {
  function INLINE (line 34) | INLINE size_t chunk_state_fill_buf(blake3_chunk_state *self,
  function INLINE (line 46) | INLINE uint8_t chunk_state_maybe_start_flag(const blake3_chunk_state *se...
  type output_t (line 54) | typedef struct {
  function INLINE (line 62) | INLINE output_t make_output(const uint32_t input_cv[8],
  function INLINE (line 81) | INLINE void output_chaining_value(const output_t *self, uint8_t cv[32]) {
  function INLINE (line 89) | INLINE void output_root_bytes(const output_t *self, uint64_t seek, uint8...
  function INLINE (line 112) | INLINE void chunk_state_update(blake3_chunk_state *self, const uint8_t *...
  function INLINE (line 142) | INLINE output_t chunk_state_output(const blake3_chunk_state *self) {
  function INLINE (line 149) | INLINE output_t parent_output(const uint8_t block[BLAKE3_BLOCK_LEN],
  function INLINE (line 157) | INLINE size_t left_len(size_t content_len) {
  function INLINE (line 168) | INLINE size_t compress_chunks_parallel(const uint8_t *input, size_t inpu...
  function INLINE (line 212) | INLINE size_t compress_parents_parallel(const uint8_t *child_chaining_va...
  function blake3_compress_subtree_wide (line 264) | static size_t blake3_compress_subtree_wide(const uint8_t *input,
  function INLINE (line 333) | INLINE void compress_subtree_to_parent_node(
  function INLINE (line 356) | INLINE void hasher_init_base(blake3_hasher *self, const uint32_t key[8],
  function blake3_hasher_init (line 363) | void blake3_hasher_init(blake3_hasher *self) { hasher_init_base(self, IV...
  function blake3_hasher_init_keyed (line 365) | void blake3_hasher_init_keyed(blake3_hasher *self,
  function blake3_hasher_init_derive_key_raw (line 372) | void blake3_hasher_init_derive_key_raw(blake3_hasher *self, const void *...
  function blake3_hasher_init_derive_key (line 384) | void blake3_hasher_init_derive_key(blake3_hasher *self, const char *cont...
  function INLINE (line 398) | INLINE void hasher_merge_cv_stack(blake3_hasher *self, uint64_t total_le...
  function INLINE (line 441) | INLINE void hasher_push_cv(blake3_hasher *self, uint8_t new_cv[BLAKE3_OU...
  function blake3_hasher_update (line 449) | void blake3_hasher_update(blake3_hasher *self, const void *input,
  function blake3_hasher_finalize (line 558) | void blake3_hasher_finalize(const blake3_hasher *self, uint8_t *out,
  function blake3_hasher_finalize_seek (line 563) | void blake3_hasher_finalize_seek(const blake3_hasher *self, uint64_t seek,

FILE: common/blake3/blake3.h
  type blake3_chunk_state (line 20) | typedef struct {
  type blake3_hasher (line 29) | typedef struct {

FILE: common/blake3/blake3_avx2.c
  function INLINE (line 7) | INLINE __m256i loadu(const uint8_t src[32]) {
  function INLINE (line 11) | INLINE void storeu(__m256i src, uint8_t dest[16]) {
  function INLINE (line 15) | INLINE __m256i addv(__m256i a, __m256i b) { return _mm256_add_epi32(a, b...
  function INLINE (line 18) | INLINE __m256i xorv(__m256i a, __m256i b) { return _mm256_xor_si256(a, b...
  function INLINE (line 20) | INLINE __m256i set1(uint32_t x) { return _mm256_set1_epi32((int32_t)x); }
  function INLINE (line 22) | INLINE __m256i rot16(__m256i x) {
  function INLINE (line 28) | INLINE __m256i rot12(__m256i x) {
  function INLINE (line 32) | INLINE __m256i rot8(__m256i x) {
  function INLINE (line 38) | INLINE __m256i rot7(__m256i x) {
  function INLINE (line 42) | INLINE void round_fn(__m256i v[16], __m256i m[16], size_t r) {
  function INLINE (line 158) | INLINE void transpose_vecs(__m256i vecs[DEGREE]) {
  function INLINE (line 192) | INLINE void transpose_msg_vecs(const uint8_t *const *inputs,
  function INLINE (line 217) | INLINE void load_counters(uint64_t counter, bool increment_counter,
  function blake3_hash8_avx2 (line 230) | void blake3_hash8_avx2(const uint8_t *const *inputs, size_t blocks,
  function blake3_hash_many_avx2 (line 302) | void blake3_hash_many_avx2(const uint8_t *const *inputs, size_t num_inputs,

FILE: common/blake3/blake3_avx512.c
  function INLINE (line 9) | INLINE __m128i loadu_128(const uint8_t src[16]) {
  function INLINE (line 13) | INLINE __m256i loadu_256(const uint8_t src[32]) {
  function INLINE (line 17) | INLINE __m512i loadu_512(const uint8_t src[64]) {
  function INLINE (line 21) | INLINE void storeu_128(__m128i src, uint8_t dest[16]) {
  function INLINE (line 25) | INLINE void storeu_256(__m256i src, uint8_t dest[16]) {
  function INLINE (line 29) | INLINE __m128i add_128(__m128i a, __m128i b) { return _mm_add_epi32(a, b...
  function INLINE (line 31) | INLINE __m256i add_256(__m256i a, __m256i b) { return _mm256_add_epi32(a...
  function INLINE (line 33) | INLINE __m512i add_512(__m512i a, __m512i b) { return _mm512_add_epi32(a...
  function INLINE (line 35) | INLINE __m128i xor_128(__m128i a, __m128i b) { return _mm_xor_si128(a, b...
  function INLINE (line 37) | INLINE __m256i xor_256(__m256i a, __m256i b) { return _mm256_xor_si256(a...
  function INLINE (line 39) | INLINE __m512i xor_512(__m512i a, __m512i b) { return _mm512_xor_si512(a...
  function INLINE (line 41) | INLINE __m128i set1_128(uint32_t x) { return _mm_set1_epi32((int32_t)x); }
  function INLINE (line 43) | INLINE __m256i set1_256(uint32_t x) { return _mm256_set1_epi32((int32_t)...
  function INLINE (line 45) | INLINE __m512i set1_512(uint32_t x) { return _mm512_set1_epi32((int32_t)...
  function INLINE (line 47) | INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
  function INLINE (line 51) | INLINE __m128i rot16_128(__m128i x) { return _mm_ror_epi32(x, 16); }
  function INLINE (line 53) | INLINE __m256i rot16_256(__m256i x) { return _mm256_ror_epi32(x, 16); }
  function INLINE (line 55) | INLINE __m512i rot16_512(__m512i x) { return _mm512_ror_epi32(x, 16); }
  function INLINE (line 57) | INLINE __m128i rot12_128(__m128i x) { return _mm_ror_epi32(x, 12); }
  function INLINE (line 59) | INLINE __m256i rot12_256(__m256i x) { return _mm256_ror_epi32(x, 12); }
  function INLINE (line 61) | INLINE __m512i rot12_512(__m512i x) { return _mm512_ror_epi32(x, 12); }
  function INLINE (line 63) | INLINE __m128i rot8_128(__m128i x) { return _mm_ror_epi32(x, 8); }
  function INLINE (line 65) | INLINE __m256i rot8_256(__m256i x) { return _mm256_ror_epi32(x, 8); }
  function INLINE (line 67) | INLINE __m512i rot8_512(__m512i x) { return _mm512_ror_epi32(x, 8); }
  function INLINE (line 69) | INLINE __m128i rot7_128(__m128i x) { return _mm_ror_epi32(x, 7); }
  function INLINE (line 71) | INLINE __m256i rot7_256(__m256i x) { return _mm256_ror_epi32(x, 7); }
  function INLINE (line 73) | INLINE __m512i rot7_512(__m512i x) { return _mm512_ror_epi32(x, 7); }
  function INLINE (line 81) | INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 91) | INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 104) | INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 110) | INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 116) | INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],
  function blake3_compress_xof_avx512 (line 287) | void blake3_compress_xof_avx512(const uint32_t cv[8],
  function blake3_compress_in_place_avx512 (line 299) | void blake3_compress_in_place_avx512(uint32_t cv[8],
  function INLINE (line 315) | INLINE void round_fn4(__m128i v[16], __m128i m[16], size_t r) {
  function INLINE (line 431) | INLINE void transpose_vecs_128(__m128i vecs[4]) {
  function INLINE (line 452) | INLINE void transpose_msg_vecs4(const uint8_t *const *inputs,
  function INLINE (line 479) | INLINE void load_counters4(uint64_t counter, bool increment_counter,
  function blake3_hash4_avx512 (line 491) | void blake3_hash4_avx512(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 558) | INLINE void round_fn8(__m256i v[16], __m256i m[16], size_t r) {
  function INLINE (line 674) | INLINE void transpose_vecs_256(__m256i vecs[8]) {
  function INLINE (line 708) | INLINE void transpose_msg_vecs8(const uint8_t *const *inputs,
  function INLINE (line 733) | INLINE void load_counters8(uint64_t counter, bool increment_counter,
  function blake3_hash8_avx512 (line 745) | void blake3_hash8_avx512(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 809) | INLINE void round_fn16(__m512i v[16], __m512i m[16], size_t r) {
  function INLINE (line 928) | INLINE __m512i unpack_lo_128(__m512i a, __m512i b) {
  function INLINE (line 935) | INLINE __m512i unpack_hi_128(__m512i a, __m512i b) {
  function INLINE (line 939) | INLINE void transpose_vecs_512(__m512i vecs[16]) {
  function INLINE (line 1021) | INLINE void transpose_msg_vecs16(const uint8_t *const *inputs,
  function INLINE (line 1045) | INLINE void load_counters16(uint64_t counter, bool increment_counter,
  function blake3_hash16_avx512 (line 1057) | void blake3_hash16_avx512(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 1139) | INLINE void hash_one_avx512(const uint8_t *input, size_t blocks,
  function blake3_hash_many_avx512 (line 1159) | void blake3_hash_many_avx512(const uint8_t *const *inputs, size_t num_in...

FILE: common/blake3/blake3_dispatch.c
  function xgetbv (line 20) | static uint64_t xgetbv() {
  function cpuid (line 30) | static void cpuid(uint32_t out[4], uint32_t id) {
  function cpuidex (line 46) | static void cpuidex(uint32_t out[4], uint32_t id, uint32_t sid) {
  type cpu_feature (line 64) | enum cpu_feature {
  type cpu_feature (line 79) | enum cpu_feature
  function get_cpu_features (line 84) | enum cpu_feature
  function blake3_compress_in_place (line 136) | void blake3_compress_in_place(uint32_t cv[8],
  function blake3_compress_xof (line 165) | void blake3_compress_xof(const uint32_t cv[8],
  function blake3_hash_many (line 194) | void blake3_hash_many(const uint8_t *const *inputs, size_t num_inputs,
  function blake3_simd_degree (line 248) | size_t blake3_simd_degree(void) {

FILE: common/blake3/blake3_impl.h
  type blake3_flags (line 13) | enum blake3_flags {
  function highest_one (line 76) | static unsigned int highest_one(uint64_t x) {
  function popcnt (line 106) | INLINE unsigned int popcnt(uint64_t x) {
  function INLINE (line 121) | INLINE uint64_t round_down_to_power_of_2(uint64_t x) {
  function INLINE (line 125) | INLINE uint32_t counter_low(uint64_t counter) { return (uint32_t)counter; }
  function INLINE (line 127) | INLINE uint32_t counter_high(uint64_t counter) {
  function INLINE (line 131) | INLINE uint32_t load32(const void *src) {
  function INLINE (line 137) | INLINE void load_key_words(const uint8_t key[BLAKE3_KEY_LEN],
  function INLINE (line 149) | INLINE void store32(void *dst, uint32_t w) {
  function INLINE (line 157) | INLINE void store_cv_words(uint8_t bytes_out[32], uint32_t cv_words[8]) {

FILE: common/blake3/blake3_neon.c
  function INLINE (line 6) | INLINE uint32x4_t loadu_128(const uint8_t src[16]) {
  function INLINE (line 13) | INLINE void storeu_128(uint32x4_t src, uint8_t dest[16]) {
  function INLINE (line 18) | INLINE uint32x4_t add_128(uint32x4_t a, uint32x4_t b) {
  function INLINE (line 22) | INLINE uint32x4_t xor_128(uint32x4_t a, uint32x4_t b) {
  function INLINE (line 26) | INLINE uint32x4_t set1_128(uint32_t x) { return vld1q_dup_u32(&x); }
  function INLINE (line 28) | INLINE uint32x4_t set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
  function INLINE (line 33) | INLINE uint32x4_t rot16_128(uint32x4_t x) {
  function INLINE (line 37) | INLINE uint32x4_t rot12_128(uint32x4_t x) {
  function INLINE (line 41) | INLINE uint32x4_t rot8_128(uint32x4_t x) {
  function INLINE (line 45) | INLINE uint32x4_t rot7_128(uint32x4_t x) {
  function INLINE (line 59) | INLINE void round_fn4(uint32x4_t v[16], uint32x4_t m[16], size_t r) {
  function INLINE (line 175) | INLINE void transpose_vecs_128(uint32x4_t vecs[4]) {
  function INLINE (line 191) | INLINE void transpose_msg_vecs4(const uint8_t *const *inputs,
  function INLINE (line 215) | INLINE void load_counters4(uint64_t counter, bool increment_counter,
  function blake3_hash4_neon (line 226) | void blake3_hash4_neon(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 298) | INLINE void hash_one_neon(const uint8_t *input, size_t blocks,
  function blake3_hash_many_neon (line 321) | void blake3_hash_many_neon(const uint8_t *const *inputs, size_t num_inputs,

FILE: common/blake3/blake3_portable.c
  function INLINE (line 4) | INLINE uint32_t rotr32(uint32_t w, uint32_t c) {
  function INLINE (line 8) | INLINE void g(uint32_t *state, size_t a, size_t b, size_t c, size_t d,
  function INLINE (line 20) | INLINE void round_fn(uint32_t state[16], const uint32_t *msg, size_t rou...
  function INLINE (line 37) | INLINE void compress_pre(uint32_t state[16], const uint32_t cv[8],
  function blake3_compress_in_place_portable (line 84) | void blake3_compress_in_place_portable(uint32_t cv[8],
  function blake3_compress_xof_portable (line 100) | void blake3_compress_xof_portable(const uint32_t cv[8],
  function INLINE (line 125) | INLINE void hash_one_portable(const uint8_t *input, size_t blocks,
  function blake3_hash_many_portable (line 145) | void blake3_hash_many_portable(const uint8_t *const *inputs, size_t num_...

FILE: common/blake3/blake3_sse2.c
  function INLINE (line 11) | INLINE __m128i loadu(const uint8_t src[16]) {
  function INLINE (line 15) | INLINE void storeu(__m128i src, uint8_t dest[16]) {
  function INLINE (line 19) | INLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }
  function INLINE (line 22) | INLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); }
  function INLINE (line 24) | INLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); }
  function INLINE (line 26) | INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
  function INLINE (line 30) | INLINE __m128i rot16(__m128i x) {
  function INLINE (line 34) | INLINE __m128i rot12(__m128i x) {
  function INLINE (line 38) | INLINE __m128i rot8(__m128i x) {
  function INLINE (line 42) | INLINE __m128i rot7(__m128i x) {
  function INLINE (line 46) | INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 56) | INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 69) | INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 75) | INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 81) | INLINE __m128i blend_epi16(__m128i a, __m128i b, const int imm8) {
  function INLINE (line 89) | INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],
  function blake3_compress_in_place_sse2 (line 260) | void blake3_compress_in_place_sse2(uint32_t cv[8],
  function blake3_compress_xof_sse2 (line 270) | void blake3_compress_xof_sse2(const uint32_t cv[8],
  function INLINE (line 282) | INLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) {
  function INLINE (line 398) | INLINE void transpose_vecs(__m128i vecs[DEGREE]) {
  function INLINE (line 419) | INLINE void transpose_msg_vecs(const uint8_t *const *inputs,
  function INLINE (line 446) | INLINE void load_counters(uint64_t counter, bool increment_counter,
  function blake3_hash4_sse2 (line 459) | void blake3_hash4_sse2(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 520) | INLINE void hash_one_sse2(const uint8_t *input, size_t blocks,
  function blake3_hash_many_sse2 (line 540) | void blake3_hash_many_sse2(const uint8_t *const *inputs, size_t num_inputs,

FILE: common/blake3/blake3_sse41.c
  function INLINE (line 11) | INLINE __m128i loadu(const uint8_t src[16]) {
  function INLINE (line 15) | INLINE void storeu(__m128i src, uint8_t dest[16]) {
  function INLINE (line 19) | INLINE __m128i addv(__m128i a, __m128i b) { return _mm_add_epi32(a, b); }
  function INLINE (line 22) | INLINE __m128i xorv(__m128i a, __m128i b) { return _mm_xor_si128(a, b); }
  function INLINE (line 24) | INLINE __m128i set1(uint32_t x) { return _mm_set1_epi32((int32_t)x); }
  function INLINE (line 26) | INLINE __m128i set4(uint32_t a, uint32_t b, uint32_t c, uint32_t d) {
  function INLINE (line 30) | INLINE __m128i rot16(__m128i x) {
  function INLINE (line 35) | INLINE __m128i rot12(__m128i x) {
  function INLINE (line 39) | INLINE __m128i rot8(__m128i x) {
  function INLINE (line 44) | INLINE __m128i rot7(__m128i x) {
  function INLINE (line 48) | INLINE void g1(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 58) | INLINE void g2(__m128i *row0, __m128i *row1, __m128i *row2, __m128i *row3,
  function INLINE (line 71) | INLINE void diagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 77) | INLINE void undiagonalize(__m128i *row0, __m128i *row2, __m128i *row3) {
  function INLINE (line 83) | INLINE void compress_pre(__m128i rows[4], const uint32_t cv[8],
  function blake3_compress_in_place_sse41 (line 254) | void blake3_compress_in_place_sse41(uint32_t cv[8],
  function blake3_compress_xof_sse41 (line 264) | void blake3_compress_xof_sse41(const uint32_t cv[8],
  function INLINE (line 276) | INLINE void round_fn(__m128i v[16], __m128i m[16], size_t r) {
  function INLINE (line 392) | INLINE void transpose_vecs(__m128i vecs[DEGREE]) {
  function INLINE (line 413) | INLINE void transpose_msg_vecs(const uint8_t *const *inputs,
  function INLINE (line 440) | INLINE void load_counters(uint64_t counter, bool increment_counter,
  function blake3_hash4_sse41 (line 453) | void blake3_hash4_sse41(const uint8_t *const *inputs, size_t blocks,
  function INLINE (line 514) | INLINE void hash_one_sse41(const uint8_t *input, size_t blocks,
  function blake3_hash_many_sse41 (line 534) | void blake3_hash_many_sse41(const uint8_t *const *inputs, size_t num_inp...

FILE: common/blake3/main.c
  function hex_char_value (line 21) | static void hex_char_value(uint8_t c, uint8_t *value, bool *valid) {
  function parse_key (line 33) | static int parse_key(char *hex_key, uint8_t out[BLAKE3_KEY_LEN]) {
  type cpu_feature (line 58) | enum cpu_feature {
  type cpu_feature (line 70) | enum cpu_feature
  type cpu_feature (line 71) | enum cpu_feature
  function main (line 73) | int main(int argc, char **argv) {

FILE: common/concurrency/AlignedArray.hh
  type eos::common (line 29) | namespace eos::common {
    type AlignedAtomic (line 32) | struct alignas(hardware_destructive_interference_size) AlignedAtomic

FILE: common/concurrency/AtomicUniquePtr.h
  function namespace (line 29) | namespace eos::common {

FILE: common/concurrency/RCULite.hh
  type eos::common (line 32) | namespace eos::common
    class TicketLock (line 38) | class TicketLock {
      method lock (line 40) | void lock() noexcept {
      method unlock (line 57) | void unlock() noexcept {
    class RCUDomain (line 120) | class RCUDomain : public detail::stateful_trait_base<CounterT>
      method RCUDomain (line 124) | RCUDomain() = default;
      method get_current_epoch (line 126) | inline uint64_t get_current_epoch(std::memory_order order
      method rcu_read_lock (line 133) | inline size_t rcu_read_lock(uint64_t epoch) noexcept
      method rcu_read_lock (line 138) | inline size_t rcu_read_lock() noexcept
      method rcu_read_unlock (line 144) | inline void rcu_read_unlock(uint64_t epoch, uint64_t tag) noexcept
      method rcu_read_unlock (line 151) | inline auto
      method rcu_read_unlock (line 158) | inline auto rcu_read_unlock(uint64_t tag) noexcept
      method rcu_write_lock (line 164) | inline void rcu_write_lock() noexcept
      method rcu_write_unlock (line 171) | inline void rcu_write_unlock() noexcept
      method rcu_synchronize (line 180) | inline void rcu_synchronize() noexcept
    type RCUWriteLock (line 199) | struct RCUWriteLock {
      method RCUWriteLock (line 200) | RCUWriteLock(RCUDomain& _rcu_domain): rcu_domain(_rcu_domain)
    class RCUMutexT (line 219) | class RCUMutexT {
      method lock_shared (line 224) | void lock_shared() {
      method unlock_shared (line 228) | void unlock_shared() {
      method lock (line 232) | void lock() {
      method unlock (line 236) | void unlock() {
    class ScopedRCUWrite (line 246) | class ScopedRCUWrite {
      method ScopedRCUWrite (line 248) | ScopedRCUWrite(RCUMutexT& _rcu_mutex,
    type detail (line 269) | namespace detail {
      type StatefulStorage (line 271) | struct StatefulStorage {
      type StatelessStorage (line 277) | struct StatelessStorage {}
    class RCUReadLock (line 286) | class RCUReadLock : private detail::ReadLockStorage<T> {
      method RCUReadLock (line 288) | explicit RCUReadLock(T& lockable) : m_lockable(lockable) {
      method lock_impl (line 297) | std::enable_if_t<detail::is_stateful_v<U>> lock_impl() {
      method lock_impl (line 303) | std::enable_if_t<!detail::is_stateful_v<U>> lock_impl() {
      method unlock_impl (line 314) | std::enable_if_t<detail::is_stateful_v<U>> unlock_impl() {
      method unlock_impl (line 319) | std::enable_if_t <!detail::is_stateful_v<U>> unlock_impl() {

FILE: common/concurrency/ThreadEpochCounter.cc
  type eos::common (line 22) | namespace eos::common {

FILE: common/concurrency/ThreadEpochCounter.hh
  type eos::common (line 33) | namespace eos::common {
    type detail (line 35) | namespace detail {
      type is_stateful (line 38) | struct is_stateful : std::false_type {}
      type is_stateful<T,
                   std::void_t<typename T::is_stateful>> (line 41) | struct is_stateful<T,
      type stateful_trait_base (line 48) | struct stateful_trait_base {}
      type stateful_trait_base <T, std::void_t<typename T::is_stateful>> (line 51) | struct stateful_trait_base <T, std::void_t<typename T::is_stateful>> {
    type experimental (line 57) | namespace experimental {
      class VersionEpochCounter (line 62) | class VersionEpochCounter {
        method getEpochIndex (line 65) | inline uint64_t getEpochIndex(uint64_t epoch) noexcept {
        method increment (line 76) | inline size_t increment(uint64_t epoch, uint16_t count=1) noexcept {
        method decrement (line 82) | inline void decrement(uint64_t epoch) noexcept {
        method decrement (line 87) | inline void decrement(uint64_t epoch, uint64_t index) noexcept {
        method getReaders (line 91) | inline size_t getReaders(uint64_t epoch) noexcept {
        method epochHasReaders (line 95) | bool epochHasReaders(uint64_t epoch) noexcept {
    type ThreadID (line 112) | struct ThreadID {
      method get (line 117) | size_t get() {
    type ThreadEpoch (line 138) | struct alignas(hardware_destructive_interference_size) ThreadEpoch {
      method get (line 139) | auto get(std::memory_order order = std::memory_order_acquire) {
      method get_counter (line 143) | auto get_counter(std::memory_order order = std::memory_order_acquire) {
    class ThreadEpochCounter (line 150) | class ThreadEpochCounter {
      method increment (line 155) | size_t increment(uint64_t epoch, uint16_t count=1) noexcept {
      method decrement (line 167) | inline void decrement(uint64_t epoch, size_t tid) {
      method decrement (line 172) | inline void decrement() {
      method getReaders (line 177) | size_t getReaders(size_t tid) noexcept {
      method epochHasReaders (line 182) | bool epochHasReaders(uint64_t epoch) noexcept {

FILE: common/config/ConfigParsing.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 29) | EOSCOMMONNAMESPACE_BEGIN
  function Status (line 95) | Status ConfigParsing::relocateFilesystem(const std::string& newFstHost,

FILE: common/config/ConfigParsing.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 33) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/config/ConfigStore.hh
  type eos::common (line 28) | namespace eos::common
    class ConfigStore (line 38) | class ConfigStore: public eos::common::LogId
      method get (line 53) | std::string get(const std::string& key, const std::string& default_val)
      method get (line 69) | auto get(const std::string& key, NumT default_val) noexcept

FILE: common/crc32c/crc32c.cc
  type checksum (line 14) | namespace checksum
    function crc32c_CPUDetection (line 17) | static uint32_t crc32c_CPUDetection(uint32_t crc, const void* data,
    function cpuid (line 28) | static uint32_t cpuid(uint32_t functionInput)
    function CRC32CFunctionPtr (line 57) | CRC32CFunctionPtr detectBestCRC32C()
    function crc32cSarwate (line 102) | uint32_t crc32cSarwate(uint32_t crc, const void* data, size_t length)
    function crc32cSlicingBy4 (line 114) | uint32_t crc32cSlicingBy4(uint32_t crc, const void* data, size_t length)
    function crc32cSlicingBy8 (line 151) | uint32_t crc32cSlicingBy8(uint32_t crc, const void* data, size_t length)
    function crc32cHardware32 (line 196) | uint32_t crc32cHardware32(uint32_t crc, const void* data, size_t length)
    function crc32cHardware64 (line 240) | uint32_t crc32cHardware64(uint32_t crc, const void* data, size_t length)

FILE: common/crc32c/crc32c.h
  function namespace (line 11) | namespace checksum

FILE: common/crc32c/crc32ctables.cc
  type checksum (line 21) | namespace checksum

FILE: common/crc32c/crc32ctables.h
  function namespace (line 10) | namespace checksum

FILE: common/eos_cta_pb/EosCtaAlertHandler.hh
  type XrdSsiPb (line 32) | namespace XrdSsiPb {

FILE: common/exception/Exception.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/highwayhash/arch_specific.h
  function namespace (line 47) | namespace highwayhash

FILE: common/highwayhash/data_parallel.h
  function namespace (line 40) | namespace highwayhash
  function RunTasks (line 129) | void RunTasks(const std::vector<std::function<void(void)>>& tasks)
  function WorkersReadyBarrier (line 171) | void WorkersReadyBarrier()
  function StartWorkers (line 182) | void StartWorkers(const WorkerCommand worker_command)
  function RunRange (line 193) | static void RunRange(ThreadPool* self, const WorkerCommand command)
  function ThreadFunc (line 224) | static void ThreadFunc(ThreadPool* self)
  function std (line 268) | alignas(64) std::atomic<int> num_reserved_{0};
  function T (line 334) | static T& Reduce()
  function Destroy (line 363) | static void Destroy()

FILE: common/highwayhash/endianess.h
  function namespace (line 76) | namespace highwayhash

FILE: common/highwayhash/hh_avx2.h
  function namespace (line 35) | namespace highwayhash

FILE: common/highwayhash/hh_buffer.h
  function namespace (line 35) | namespace highwayhash

FILE: common/highwayhash/hh_neon.h
  function namespace (line 34) | namespace highwayhash

FILE: common/highwayhash/hh_portable.h
  function namespace (line 29) | namespace highwayhash

FILE: common/highwayhash/hh_sse41.h
  function namespace (line 34) | namespace highwayhash

FILE: common/highwayhash/hh_types.h
  function namespace (line 28) | namespace highwayhash

FILE: common/highwayhash/hh_vsx.h
  function namespace (line 37) | namespace highwayhash

FILE: common/highwayhash/highwayhash.h
  function namespace (line 57) | namespace highwayhash

FILE: common/highwayhash/highwayhash_target.h
  function namespace (line 30) | namespace highwayhash

FILE: common/highwayhash/highwayhash_test_target.h
  function namespace (line 34) | namespace highwayhash

FILE: common/highwayhash/iaca.h
  function namespace (line 35) | namespace highwayhash

FILE: common/highwayhash/instruction_sets.h
  function namespace (line 30) | namespace highwayhash

FILE: common/highwayhash/load3.h
  function namespace (line 30) | namespace highwayhash

FILE: common/highwayhash/nanobenchmark.h
  function namespace (line 82) | namespace highwayhash

FILE: common/highwayhash/os_mac.h
  type cpu_mask (line 31) | typedef unsigned long int cpu_mask;
  type cpu_set_t (line 37) | struct cpu_set_t {
  function CPU_ZERO (line 41) | static inline void CPU_ZERO(cpu_set_t* set)
  function CPU_ISSET (line 46) | static inline int CPU_ISSET(int cpu, const cpu_set_t* set)
  function CPU_SET (line 55) | static inline void CPU_SET(int cpu, cpu_set_t* set)

FILE: common/highwayhash/os_specific.h
  function namespace (line 20) | namespace highwayhash

FILE: common/highwayhash/profiler.h
  function namespace (line 83) | namespace highwayhash
  function ComputeOverhead (line 738) | inline void ThreadSpecific::ComputeOverhead()

FILE: common/highwayhash/robust_statistics.h
  function namespace (line 30) | namespace highwayhash

FILE: common/highwayhash/scalar.h
  function namespace (line 29) | namespace highwayhash
  function FillWithByte (line 158) | void FillWithByte(const unsigned char value)
  function CopyTo (line 167) | void CopyTo(unsigned char* HH_RESTRICT to_bytes) const
  function count (line 233) | int count)
  function count (line 240) | int count)
  function Store (line 356) | void Store(const Scalar<T>& v, T* const HH_RESTRICT to)
  function StoreUnaligned (line 362) | void StoreUnaligned(const Scalar<T>& v, T* const HH_RESTRICT to)
  function Stream (line 368) | void Stream(const Scalar<T>& v, T* const HH_RESTRICT to)

FILE: common/highwayhash/scalar_sip_tree_hash.h
  function namespace (line 23) | namespace highwayhash

FILE: common/highwayhash/sip_hash.h
  function namespace (line 28) | namespace highwayhash

FILE: common/highwayhash/sip_tree_hash.h
  function namespace (line 21) | namespace highwayhash

FILE: common/highwayhash/state_helpers.h
  function namespace (line 27) | namespace highwayhash

FILE: common/highwayhash/tsc_timer.h
  function namespace (line 33) | namespace highwayhash

FILE: common/highwayhash/vector128.h
  function namespace (line 53) | namespace highwayhash
  function HH_INLINE (line 247) | HH_INLINE V128() {}
  function HH_INLINE (line 250) | HH_INLINE V128(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 254) | HH_INLINE explicit V128(T i) : v_(_mm_set1_epi32(i)) {}
  function HH_INLINE (line 257) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 259) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 267) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 346) | HH_INLINE V128() {}
  function HH_INLINE (line 349) | HH_INLINE V128(T p_1, T p_0) : v_(_mm_set_epi64x(p_1, p_0)) {}
  function HH_INLINE (line 352) | HH_INLINE explicit V128(T i) : v_(_mm_set_epi64x(i, i)) {}
  function HH_INLINE (line 355) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 357) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 365) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 444) | HH_INLINE V128() {}
  function HH_INLINE (line 447) | HH_INLINE V128(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 451) | HH_INLINE explicit V128(T f) : v_(_mm_set1_ps(f)) {}
  function HH_INLINE (line 454) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 456) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 464) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 538) | HH_INLINE V128() {}
  function HH_INLINE (line 541) | HH_INLINE V128(T p_1, T p_0) : v_(_mm_set_pd(p_1, p_0)) {}
  function HH_INLINE (line 544) | HH_INLINE explicit V128(T f) : v_(_mm_set1_pd(f)) {}
  function HH_INLINE (line 547) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 549) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 557) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function count (line 674) | int count)
  function count (line 681) | int count)
  function Store (line 800) | void Store(const V128<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 804) | HH_INLINE void Store(const V128<float>& v, float* const HH_RESTRICT to)
  function HH_INLINE (line 808) | HH_INLINE void Store(const V128<double>& v, double* const HH_RESTRICT to)
  function StoreUnaligned (line 814) | void StoreUnaligned(const V128<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 818) | HH_INLINE void StoreUnaligned(const V128<float>& v,
  function HH_INLINE (line 823) | HH_INLINE void StoreUnaligned(const V128<double>& v,
  function Stream (line 832) | void Stream(const V128<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 836) | HH_INLINE void Stream(const V128<float>& v, float* const HH_RESTRICT to)
  function HH_INLINE (line 840) | HH_INLINE void Stream(const V128<double>& v, double* const HH_RESTRICT to)
  function HH_INLINE (line 872) | HH_INLINE V4x32F Select(const V4x32F& a, const V4x32F& b, const V4x32F& ...
  function HH_INLINE (line 877) | HH_INLINE V2x64F Select(const V2x64F& a, const V2x64F& b, const V2x64F& ...
  function HH_INLINE (line 884) | HH_INLINE V16x8U Min(const V16x8U& v0, const V16x8U& v1)
  function HH_INLINE (line 889) | HH_INLINE V16x8U Max(const V16x8U& v0, const V16x8U& v1)
  function HH_INLINE (line 894) | HH_INLINE V8x16U Min(const V8x16U& v0, const V8x16U& v1)
  function HH_INLINE (line 899) | HH_INLINE V8x16U Max(const V8x16U& v0, const V8x16U& v1)
  function HH_INLINE (line 904) | HH_INLINE V4x32U Min(const V4x32U& v0, const V4x32U& v1)
  function HH_INLINE (line 909) | HH_INLINE V4x32U Max(const V4x32U& v0, const V4x32U& v1)
  function HH_INLINE (line 914) | HH_INLINE V4x32F Min(const V4x32F& v0, const V4x32F& v1)
  function HH_INLINE (line 919) | HH_INLINE V4x32F Max(const V4x32F& v0, const V4x32F& v1)
  function HH_INLINE (line 924) | HH_INLINE V2x64F Min(const V2x64F& v0, const V2x64F& v1)
  function HH_INLINE (line 929) | HH_INLINE V2x64F Max(const V2x64F& v0, const V2x64F& v1)

FILE: common/highwayhash/vector256.h
  function namespace (line 47) | namespace highwayhash
  function HH_INLINE (line 235) | HH_INLINE V256() {}
  function HH_INLINE (line 238) | HH_INLINE V256(T p_7, T p_6, T p_5, T p_4, T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 242) | HH_INLINE explicit V256(T i)
  function HH_INLINE (line 246) | HH_INLINE explicit V256(const V256& other) : v_(other.v_) {}
  function explicit (line 248) | explicit V256(const V256<U>& other) : v_(other) {}
  function HH_INLINE (line 256) | HH_INLINE V256(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 325) | HH_INLINE V256() {}
  function HH_INLINE (line 328) | HH_INLINE V256(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 332) | HH_INLINE explicit V256(T i)
  function HH_INLINE (line 336) | HH_INLINE explicit V256(const V256& other) : v_(other.v_) {}
  function explicit (line 338) | explicit V256(const V256<U>& other) : v_(other) {}
  function HH_INLINE (line 346) | HH_INLINE V256(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 415) | HH_INLINE V256() {}
  function HH_INLINE (line 418) | HH_INLINE V256(T p_7, T p_6, T p_5, T p_4, T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 422) | HH_INLINE explicit V256(T f) : v_(_mm256_set1_ps(f)) {}
  function HH_INLINE (line 425) | HH_INLINE explicit V256(const V256& other) : v_(other.v_) {}
  function explicit (line 427) | explicit V256(const V256<U>& other) : v_(other) {}
  function HH_INLINE (line 435) | HH_INLINE V256(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 509) | HH_INLINE V256() {}
  function HH_INLINE (line 512) | HH_INLINE V256(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 516) | HH_INLINE explicit V256(T f) : v_(_mm256_set1_pd(f)) {}
  function HH_INLINE (line 519) | HH_INLINE explicit V256(const V256& other) : v_(other.v_) {}
  function explicit (line 521) | explicit V256(const V256<U>& other) : v_(other) {}
  function HH_INLINE (line 529) | HH_INLINE V256(const Intrinsic& v) : v_(v) {}
  function count (line 646) | int count)
  function count (line 653) | int count)
  function V32x8U (line 683) | V32x8U Load(const V32x8U::T* const HH_RESTRICT from)
  function V16x16U (line 689) | V16x16U Load(const V16x16U::T* const HH_RESTRICT from)
  function V8x32U (line 695) | V8x32U Load(const V8x32U::T* const HH_RESTRICT from)
  function V4x64U (line 701) | V4x64U Load(const V4x64U::T* const HH_RESTRICT from)
  function V8x32F (line 707) | V8x32F Load(const V8x32F::T* const HH_RESTRICT from)
  function V4x64F (line 712) | V4x64F Load(const V4x64F::T* const HH_RESTRICT from)
  function V32x8U (line 718) | V32x8U LoadUnaligned(const V32x8U::T* const HH_RESTRICT from)
  function V16x16U (line 724) | V16x16U LoadUnaligned(const V16x16U::T* const HH_RESTRICT from)
  function V8x32U (line 730) | V8x32U LoadUnaligned(const V8x32U::T* const HH_RESTRICT from)
  function V4x64U (line 736) | V4x64U LoadUnaligned(const V4x64U::T* const HH_RESTRICT from)
  function V8x32F (line 742) | V8x32F LoadUnaligned(const V8x32F::T* const HH_RESTRICT from)
  function V4x64F (line 747) | V4x64F LoadUnaligned(const V4x64F::T* const HH_RESTRICT from)
  function Store (line 754) | void Store(const V256<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 758) | HH_INLINE void Store(const V256<float>& v, float* const HH_RESTRICT to)
  function HH_INLINE (line 762) | HH_INLINE void Store(const V256<double>& v, double* const HH_RESTRICT to)
  function StoreUnaligned (line 768) | void StoreUnaligned(const V256<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 772) | HH_INLINE void StoreUnaligned(const V256<float>& v,
  function HH_INLINE (line 777) | HH_INLINE void StoreUnaligned(const V256<double>& v,
  function Stream (line 786) | void Stream(const V256<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 790) | HH_INLINE void Stream(const V256<float>& v, float* const HH_RESTRICT to)
  function HH_INLINE (line 794) | HH_INLINE void Stream(const V256<double>& v, double* const HH_RESTRICT to)
  function HH_INLINE (line 826) | HH_INLINE V8x32F Select(const V8x32F& a, const V8x32F& b, const V8x32F& ...
  function HH_INLINE (line 831) | HH_INLINE V4x64F Select(const V4x64F& a, const V4x64F& b, const V4x64F& ...
  function HH_INLINE (line 838) | HH_INLINE V32x8U Min(const V32x8U& v0, const V32x8U& v1)
  function HH_INLINE (line 843) | HH_INLINE V32x8U Max(const V32x8U& v0, const V32x8U& v1)
  function HH_INLINE (line 848) | HH_INLINE V16x16U Min(const V16x16U& v0, const V16x16U& v1)
  function HH_INLINE (line 853) | HH_INLINE V16x16U Max(const V16x16U& v0, const V16x16U& v1)
  function HH_INLINE (line 858) | HH_INLINE V8x32U Min(const V8x32U& v0, const V8x32U& v1)
  function HH_INLINE (line 863) | HH_INLINE V8x32U Max(const V8x32U& v0, const V8x32U& v1)
  function HH_INLINE (line 868) | HH_INLINE V8x32F Min(const V8x32F& v0, const V8x32F& v1)
  function HH_INLINE (line 873) | HH_INLINE V8x32F Max(const V8x32F& v0, const V8x32F& v1)
  function HH_INLINE (line 878) | HH_INLINE V4x64F Min(const V4x64F& v0, const V4x64F& v1)
  function HH_INLINE (line 883) | HH_INLINE V4x64F Max(const V4x64F& v0, const V4x64F& v1)

FILE: common/highwayhash/vector_neon.h
  function namespace (line 43) | namespace highwayhash
  function HH_INLINE (line 383) | HH_INLINE V128() {}
  function HH_INLINE (line 386) | HH_INLINE V128(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 395) | HH_INLINE explicit V128(T i) : v_(vdupq_n_u32(i)) {}
  function HH_INLINE (line 398) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 400) | explicit V128(const V128<U>& other) : v_((const uint32x4_t)other) {}
  function HH_INLINE (line 408) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 480) | HH_INLINE V128& ShiftRightInsert(const Intrinsic& value, const int count)
  function HH_INLINE (line 489) | HH_INLINE V128& AndNot(const Intrinsic& neg_mask)
  function HH_INLINE (line 507) | HH_INLINE V128() {}
  function HH_INLINE (line 510) | HH_INLINE V128(T p_1, T p_0)
  function HH_INLINE (line 519) | HH_INLINE explicit V128(T i) : v_(vdupq_n_u64(i)) {}
  function HH_INLINE (line 522) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 524) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 532) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 609) | HH_INLINE V128& AndNot(const Intrinsic& neg_mask)
  function HH_INLINE (line 615) | HH_INLINE V128& ShiftRightInsert(const Intrinsic& value, const int count)
  function HH_INLINE (line 642) | HH_INLINE V128() {}
  function HH_INLINE (line 645) | HH_INLINE V128(T p_3, T p_2, T p_1, T p_0)
  function HH_INLINE (line 652) | HH_INLINE explicit V128(T f) : v_(vdupq_n_f32(f)) {}
  function HH_INLINE (line 655) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 657) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 665) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function HH_INLINE (line 742) | HH_INLINE V128() {}
  function HH_INLINE (line 745) | HH_INLINE V128(T p_1, T p_0)
  function HH_INLINE (line 752) | HH_INLINE explicit V128(T f) : v_(vdupq_n_f64(f)) {}
  function HH_INLINE (line 755) | HH_INLINE explicit V128(const V128& other) : v_(other.v_) {}
  function explicit (line 757) | explicit V128(const V128<U>& other) : v_(other) {}
  function HH_INLINE (line 765) | HH_INLINE V128(const Intrinsic& v) : v_(v) {}
  function count (line 886) | int count)
  function count (line 893) | int count)
  function HH_RESTRICT (line 1023) | HH_RESTRICT to)
  function HH_RESTRICT (line 1031) | HH_RESTRICT to)
  function HH_RESTRICT (line 1039) | HH_RESTRICT to)
  function HH_RESTRICT (line 1047) | HH_RESTRICT to)
  function HH_INLINE (line 1051) | HH_INLINE void Store(const V128<double>& v, double* const HH_RESTRICT to)
  function HH_RESTRICT (line 1061) | HH_RESTRICT to)
  function HH_RESTRICT (line 1068) | HH_RESTRICT to)
  function HH_RESTRICT (line 1075) | HH_RESTRICT to)
  function HH_RESTRICT (line 1082) | HH_RESTRICT to)
  function HH_RESTRICT (line 1088) | HH_RESTRICT to)
  function HH_INLINE (line 1092) | HH_INLINE void StoreUnaligned(const V128<double>& v,
  function Stream (line 1104) | void Stream(const V128<T>& v, T* const HH_RESTRICT to)
  function HH_INLINE (line 1108) | HH_INLINE void Stream(const V128<float>& v, float* const HH_RESTRICT to)
  function HH_INLINE (line 1112) | HH_INLINE void Stream(const V128<double>& v, double* const HH_RESTRICT to)
  function HH_INLINE (line 1148) | HH_INLINE V4x32U Select(const V4x32U& a, const V4x32U& b, const V4x32U& ...
  function HH_INLINE (line 1153) | HH_INLINE V2x64U Select(const V2x64U& a, const V2x64U& b, const V2x64U& ...
  function HH_INLINE (line 1160) | HH_INLINE V16x8U Min(const V16x8U& v0, const V16x8U& v1)
  function HH_INLINE (line 1165) | HH_INLINE V16x8U Max(const V16x8U& v0, const V16x8U& v1)
  function HH_INLINE (line 1170) | HH_INLINE V8x16U Min(const V8x16U& v0, const V8x16U& v1)
  function HH_INLINE (line 1175) | HH_INLINE V8x16U Max(const V8x16U& v0, const V8x16U& v1)
  function HH_INLINE (line 1180) | HH_INLINE V4x32U Min(const V4x32U& v0, const V4x32U& v1)
  function HH_INLINE (line 1185) | HH_INLINE V4x32U Max(const V4x32U& v0, const V4x32U& v1)
  function HH_INLINE (line 1192) | HH_INLINE V4x32F Min(const V4x32F& v0, const V4x32F& v1)
  function HH_INLINE (line 1197) | HH_INLINE V4x32F Max(const V4x32F& v0, const V4x32F& v1)
  function HH_INLINE (line 1202) | HH_INLINE V2x64F Min(const V2x64F& v0, const V2x64F& v1)
  function HH_INLINE (line 1207) | HH_INLINE V2x64F Max(const V2x64F& v0, const V2x64F& v1)

FILE: common/highwayhash/vector_test_target.h
  function namespace (line 26) | namespace highwayhash

FILE: common/hopscotch_hash.hh
  type tsl (line 67) | namespace tsl
    class power_of_two_growth_policy (line 74) | class power_of_two_growth_policy
      method power_of_two_growth_policy (line 81) | power_of_two_growth_policy(std::size_t& min_bucket_count_in_out)
      method bucket_for_hash (line 97) | std::size_t bucket_for_hash(std::size_t hash) const
      method next_bucket_count (line 105) | std::size_t next_bucket_count() const
      method max_bucket_count (line 117) | std::size_t max_bucket_count() const
      method round_up_to_power_of_two (line 123) | static std::size_t round_up_to_power_of_two(std::size_t value)
      method is_power_of_two (line 142) | static constexpr bool is_power_of_two(std::size_t value)
    class mod_growth_policy (line 158) | class mod_growth_policy
      method mod_growth_policy (line 161) | mod_growth_policy(std::size_t& min_bucket_count_in_out)
      method bucket_for_hash (line 173) | std::size_t bucket_for_hash(std::size_t hash) const
      method next_bucket_count (line 179) | std::size_t next_bucket_count() const
      method max_bucket_count (line 199) | std::size_t max_bucket_count() const
    type detail_hopscotch_hash (line 221) | namespace detail_hopscotch_hash
      function mod (line 233) | static std::size_t mod(std::size_t hash)
      type make_void (line 309) | struct make_void {
      type has_is_transparent (line 315) | struct has_is_transparent : std::false_type {
      type has_is_transparent<T, typename make_void<typename T::is_transparent>::type> (line 319) | struct has_is_transparent<T, typename make_void<typename T::is_trans...
      type has_key_compare (line 325) | struct has_key_compare : std::false_type {
      type has_key_compare<T, typename make_void<typename T::key_compare>::type> (line 329) | struct has_key_compare<T, typename make_void<typename T::key_compare...
      class smallest_type_for_min_bits (line 342) | class smallest_type_for_min_bits
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 0)&& (MinBits <= 8) >::type > (line 347) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 8)&& (MinBits <= 16) >::type > (line 355) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 16)&& (MinBits <= 32) >::type > (line 363) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 32)&& (MinBits <= 64) >::type > (line 371) | class smallest_type_for_min_bits < MinBits,
      class hopscotch_bucket_hash (line 399) | class hopscotch_bucket_hash
        method bucket_hash_equal (line 404) | bool bucket_hash_equal(std::size_t /*hash*/) const noexcept
        method truncated_bucket_hash (line 409) | std::size_t truncated_bucket_hash() const noexcept
        method copy_hash (line 416) | void copy_hash(const hopscotch_bucket_hash&) noexcept
        method set_hash (line 420) | void set_hash(std::size_t /*hash*/) noexcept
      class hopscotch_bucket_hash<true> (line 426) | class hopscotch_bucket_hash<true>
        method bucket_hash_equal (line 432) | bool bucket_hash_equal(std::size_t hash) const noexcept
        method truncated_bucket_hash (line 437) | std::size_t truncated_bucket_hash() const noexcept
        method copy_hash (line 443) | void copy_hash(const hopscotch_bucket_hash& bucket) noexcept
        method set_hash (line 448) | void set_hash(std::size_t hash) noexcept
      class hopscotch_bucket (line 458) | class hopscotch_bucket: public hopscotch_bucket_hash<StoreHash>
        method hopscotch_bucket (line 489) | hopscotch_bucket() noexcept: bucket_hash(), m_neighborhood_infos(0)
        method hopscotch_bucket (line 495) | hopscotch_bucket(const hopscotch_bucket& bucket)
        method hopscotch_bucket (line 507) | hopscotch_bucket(hopscotch_bucket&& bucket)
        method hopscotch_bucket (line 520) | hopscotch_bucket& operator=(const hopscotch_bucket& bucket)
        method hopscotch_bucket (line 537) | hopscotch_bucket& operator=(hopscotch_bucket&&) = delete;
        method neighborhood_bitmap (line 546) | neighborhood_bitmap neighborhood_infos() const noexcept
        method set_overflow (line 552) | void set_overflow(bool has_overflow) noexcept
        method has_overflow (line 561) | bool has_overflow() const noexcept
        method empty (line 566) | bool empty() const noexcept
        method toggle_neighbor_presence (line 571) | void toggle_neighbor_presence(std::size_t ineighbor) noexcept
        method check_neighbor_presence (line 579) | bool check_neighbor_presence(std::size_t ineighbor) const noexcept
        method value_type (line 591) | value_type& value() noexcept
        method value_type (line 597) | const value_type& value() const noexcept
        method set_value_of_empty_bucket (line 604) | void set_value_of_empty_bucket(std::size_t hash, Args&& ... value_...
        method swap_value_into_empty_bucket (line 613) | void swap_value_into_empty_bucket(hopscotch_bucket& empty_bucket)
        method remove_value (line 627) | void remove_value() noexcept
        method clear (line 635) | void clear() noexcept
        method max_size (line 645) | static std::size_t max_size() noexcept
        method set_empty (line 655) | void set_empty(bool is_empty) noexcept
        method destroy_value (line 664) | void destroy_value() noexcept
      class hopscotch_hash (line 706) | class hopscotch_hash: private Hash, private KeyEqual, private Growth...
        class hopscotch_iterator (line 715) | class hopscotch_iterator
          method hopscotch_iterator (line 779) | hopscotch_iterator(iterator_bucket buckets_iterator,
          method hopscotch_iterator (line 796) | hopscotch_iterator() noexcept
          method hopscotch_iterator (line 800) | hopscotch_iterator(const hopscotch_iterator<false>& other) noexc...
          method value (line 817) | typename std::conditional <
          method reference (line 829) | reference operator*() const
          method pointer (line 838) | pointer operator->() const
          method hopscotch_iterator (line 847) | hopscotch_iterator& operator++()
          method hopscotch_iterator (line 862) | hopscotch_iterator operator++(int)
        class hopscotch_iterator (line 767) | class hopscotch_iterator
          method hopscotch_iterator (line 779) | hopscotch_iterator(iterator_bucket buckets_iterator,
          method hopscotch_iterator (line 796) | hopscotch_iterator() noexcept
          method hopscotch_iterator (line 800) | hopscotch_iterator(const hopscotch_iterator<false>& other) noexc...
          method value (line 817) | typename std::conditional <
          method reference (line 829) | reference operator*() const
          method pointer (line 838) | pointer operator->() const
          method hopscotch_iterator (line 847) | hopscotch_iterator& operator++()
          method hopscotch_iterator (line 862) | hopscotch_iterator operator++(int)
        method hopscotch_hash (line 893) | hopscotch_hash(size_type bucket_count,
        method hopscotch_hash (line 914) | hopscotch_hash(size_type bucket_count,
        method hopscotch_hash (line 937) | hopscotch_hash(const hopscotch_hash& other) = default;
        method hopscotch_hash (line 939) | hopscotch_hash(hopscotch_hash&& other)
        method hopscotch_hash (line 960) | hopscotch_hash& operator=(const hopscotch_hash& other) = default;
        method hopscotch_hash (line 962) | hopscotch_hash& operator=(hopscotch_hash&& other)
        method allocator_type (line 969) | allocator_type get_allocator() const
        method iterator (line 978) | iterator begin() noexcept
        method const_iterator (line 989) | const_iterator begin() const noexcept
        method const_iterator (line 994) | const_iterator cbegin() const noexcept
        method iterator (line 1005) | iterator end() noexcept
        method const_iterator (line 1010) | const_iterator end() const noexcept
        method const_iterator (line 1015) | const_iterator cend() const noexcept
        method empty (line 1025) | bool empty() const noexcept
        method size_type (line 1030) | size_type size() const noexcept
        method size_type (line 1035) | size_type max_size() const noexcept
        method clear (line 1043) | void clear() noexcept
        method insert (line 1054) | std::pair<iterator, bool> insert(const value_type& value)
        method insert (line 1061) | std::pair<iterator, bool> insert(P && value)
        method insert (line 1066) | std::pair<iterator, bool> insert(value_type&& value)
        method iterator (line 1072) | iterator insert(const_iterator hint, const value_type& value)
        method iterator (line 1083) | iterator insert(const_iterator hint, P && value)
        method iterator (line 1088) | iterator insert(const_iterator hint, value_type&& value)
        method insert (line 1099) | void insert(InputIt first, InputIt last)
        method insert_or_assign (line 1123) | std::pair<iterator, bool> insert_or_assign(const key_type& k, M&& ...
        method insert_or_assign (line 1129) | std::pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj)
        method iterator (line 1136) | iterator insert_or_assign(const_iterator hint, const key_type& k, ...
        method iterator (line 1148) | iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj)
        method emplace (line 1161) | std::pair<iterator, bool> emplace(Args&& ... args)
        method iterator (line 1167) | iterator emplace_hint(const_iterator hint, Args&& ... args)
        method try_emplace (line 1173) | std::pair<iterator, bool> try_emplace(const key_type& k, Args&& .....
        method try_emplace (line 1179) | std::pair<iterator, bool> try_emplace(key_type&& k, Args&& ... args)
        method iterator (line 1185) | iterator try_emplace(const_iterator hint, const key_type& k, Args&...
        method iterator (line 1195) | iterator try_emplace(const_iterator hint, key_type&& k, Args&& ......
        method iterator (line 1206) | iterator erase(iterator pos)
        method iterator (line 1211) | iterator erase(const_iterator pos)
        method iterator (line 1227) | iterator erase(const_iterator first, const_iterator last)
        method size_type (line 1243) | size_type erase(const K& key)
        method size_type (line 1249) | size_type erase(const K& key, std::size_t hash)
        method swap (line 1271) | void swap(hopscotch_hash& other)
        method size_type (line 1344) | size_type count(const K& key) const
        method size_type (line 1350) | size_type count(const K& key, std::size_t hash) const
        method iterator (line 1357) | iterator find(const K& key)
        method iterator (line 1363) | iterator find(const K& key, std::size_t hash)
        method const_iterator (line 1370) | const_iterator find(const K& key) const
        method const_iterator (line 1376) | const_iterator find(const K& key, std::size_t hash) const
        method equal_range (line 1383) | std::pair<iterator, iterator> equal_range(const K& key)
        method equal_range (line 1389) | std::pair<iterator, iterator> equal_range(const K& key, std::size_...
        method equal_range (line 1397) | std::pair<const_iterator, const_iterator> equal_range(const K& key...
        method equal_range (line 1403) | std::pair<const_iterator, const_iterator> equal_range(const K& key,
        method size_type (line 1413) | size_type bucket_count() const
        method size_type (line 1423) | size_type max_bucket_count() const
        method load_factor (line 1434) | float load_factor() const
        method max_load_factor (line 1439) | float max_load_factor() const
        method max_load_factor (line 1444) | void max_load_factor(float ml)
        method rehash (line 1452) | void rehash(size_type count)
        method reserve (line 1459) | void reserve(size_type count)
        method hasher (line 1468) | hasher hash_function() const
        method key_equal (line 1473) | key_equal key_eq() const
        method iterator (line 1481) | iterator mutable_iterator(const_iterator pos)
        method size_type (line 1495) | size_type overflow_size() const noexcept
        method key_comp (line 1501) | typename U::key_compare key_comp() const
        method hash_key (line 1509) | std::size_t hash_key(const K& key) const
        method compare_keys (line 1515) | bool compare_keys(const K1& key1, const K2& key2) const
        method bucket_for_hash (line 1520) | std::size_t bucket_for_hash(std::size_t hash) const
        method rehash_impl (line 1532) | void rehash_impl(size_type count)
        method rehash_impl (line 1593) | void rehash_impl(size_type count)
        method iterator_overflow (line 1619) | iterator_overflow mutable_overflow_iterator(const_iterator_overflo...
        method iterator_overflow (line 1625) | iterator_overflow mutable_overflow_iterator(const_iterator_overflo...
        method iterator_overflow (line 1632) | iterator_overflow erase_from_overflow(const_iterator_overflow pos,
        method erase_from_bucket (line 1658) | void erase_from_bucket(iterator_buckets pos,
        method insert_or_assign_impl (line 1672) | std::pair<iterator, bool> insert_or_assign_impl(K&& key, M&& obj)
        method try_emplace_impl (line 1684) | std::pair<iterator, bool> try_emplace_impl(P&& key, Args&& ... arg...
        method insert_impl (line 1701) | std::pair<iterator, bool> insert_impl(P&& value)
        method insert_impl (line 1717) | std::pair<iterator, bool> insert_impl(std::size_t ibucket_for_hash,
        method will_neighborhood_change_on_rehash (line 1764) | bool will_neighborhood_change_on_rehash(size_t ibucket_neighborhoo...
        method find_empty_bucket (line 1791) | std::size_t find_empty_bucket(std::size_t ibucket_start) const
        method iterator_buckets (line 1811) | iterator_buckets insert_in_bucket(std::size_t ibucket_empty,
        method swap_empty_bucket_closer (line 1832) | bool swap_empty_bucket_closer(std::size_t& ibucket_empty_in_out)
        method size_type (line 1905) | size_type count_impl(const K& key, std::size_t hash,
        method iterator (line 1919) | iterator find_impl(const K& key, std::size_t hash, iterator_bucket...
        method const_iterator (line 1935) | const_iterator find_impl(const K& key, std::size_t hash,
        method iterator_buckets (line 1953) | iterator_buckets find_in_buckets(const K& key, std::size_t hash,
        method const_iterator_buckets (line 1963) | const_iterator_buckets find_in_buckets(const K& key, std::size_t h...
        method iterator_overflow (line 1994) | iterator_overflow find_in_overflow(const K& key)
        method const_iterator_overflow (line 2004) | const_iterator_overflow find_in_overflow(const K& key) const
        method iterator_overflow (line 2014) | iterator_overflow find_in_overflow(const K& key)
        method const_iterator_overflow (line 2020) | const_iterator_overflow find_in_overflow(const K& key) const
        method iterator_overflow (line 2029) | iterator_overflow insert_in_overflow(Args && ... value_type_args)
        method iterator_overflow (line 2036) | iterator_overflow insert_in_overflow(Args && ... value_type_args)
        method hopscotch_hash (line 2046) | hopscotch_hash new_hopscotch_hash(size_type bucket_count)
        method hopscotch_hash (line 2054) | hopscotch_hash new_hopscotch_hash(size_type bucket_count)
    class prime_growth_policy (line 255) | class prime_growth_policy
      method prime_growth_policy (line 258) | prime_growth_policy(std::size_t& min_bucket_count_in_out)
      method bucket_for_hash (line 272) | std::size_t bucket_for_hash(std::size_t hash) const
      method next_bucket_count (line 277) | std::size_t next_bucket_count() const
      method max_bucket_count (line 286) | std::size_t max_bucket_count() const
      method bucket_for_hash_iprime (line 292) | std::size_t bucket_for_hash_iprime(std::size_t hash, unsigned int ip...
    type detail_hopscotch_hash (line 303) | namespace detail_hopscotch_hash
      function mod (line 233) | static std::size_t mod(std::size_t hash)
      type make_void (line 309) | struct make_void {
      type has_is_transparent (line 315) | struct has_is_transparent : std::false_type {
      type has_is_transparent<T, typename make_void<typename T::is_transparent>::type> (line 319) | struct has_is_transparent<T, typename make_void<typename T::is_trans...
      type has_key_compare (line 325) | struct has_key_compare : std::false_type {
      type has_key_compare<T, typename make_void<typename T::key_compare>::type> (line 329) | struct has_key_compare<T, typename make_void<typename T::key_compare...
      class smallest_type_for_min_bits (line 342) | class smallest_type_for_min_bits
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 0)&& (MinBits <= 8) >::type > (line 347) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 8)&& (MinBits <= 16) >::type > (line 355) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 16)&& (MinBits <= 32) >::type > (line 363) | class smallest_type_for_min_bits < MinBits,
      class smallest_type_for_min_bits < MinBits,
        typename std::enable_if < (MinBits > 32)&& (MinBits <= 64) >::type > (line 371) | class smallest_type_for_min_bits < MinBits,
      class hopscotch_bucket_hash (line 399) | class hopscotch_bucket_hash
        method bucket_hash_equal (line 404) | bool bucket_hash_equal(std::size_t /*hash*/) const noexcept
        method truncated_bucket_hash (line 409) | std::size_t truncated_bucket_hash() const noexcept
        method copy_hash (line 416) | void copy_hash(const hopscotch_bucket_hash&) noexcept
        method set_hash (line 420) | void set_hash(std::size_t /*hash*/) noexcept
      class hopscotch_bucket_hash<true> (line 426) | class hopscotch_bucket_hash<true>
        method bucket_hash_equal (line 432) | bool bucket_hash_equal(std::size_t hash) const noexcept
        method truncated_bucket_hash (line 437) | std::size_t truncated_bucket_hash() const noexcept
        method copy_hash (line 443) | void copy_hash(const hopscotch_bucket_hash& bucket) noexcept
        method set_hash (line 448) | void set_hash(std::size_t hash) noexcept
      class hopscotch_bucket (line 458) | class hopscotch_bucket: public hopscotch_bucket_hash<StoreHash>
        method hopscotch_bucket (line 489) | hopscotch_bucket() noexcept: bucket_hash(), m_neighborhood_infos(0)
        method hopscotch_bucket (line 495) | hopscotch_bucket(const hopscotch_bucket& bucket)
        method hopscotch_bucket (line 507) | hopscotch_bucket(hopscotch_bucket&& bucket)
        method hopscotch_bucket (line 520) | hopscotch_bucket& operator=(const hopscotch_bucket& bucket)
        method hopscotch_bucket (line 537) | hopscotch_bucket& operator=(hopscotch_bucket&&) = delete;
        method neighborhood_bitmap (line 546) | neighborhood_bitmap neighborhood_infos() const noexcept
        method set_overflow (line 552) | void set_overflow(bool has_overflow) noexcept
        method has_overflow (line 561) | bool has_overflow() const noexcept
        method empty (line 566) | bool empty() const noexcept
        method toggle_neighbor_presence (line 571) | void toggle_neighbor_presence(std::size_t ineighbor) noexcept
        method check_neighbor_presence (line 579) | bool check_neighbor_presence(std::size_t ineighbor) const noexcept
        method value_type (line 591) | value_type& value() noexcept
        method value_type (line 597) | const value_type& value() const noexcept
        method set_value_of_empty_bucket (line 604) | void set_value_of_empty_bucket(std::size_t hash, Args&& ... value_...
        method swap_value_into_empty_bucket (line 613) | void swap_value_into_empty_bucket(hopscotch_bucket& empty_bucket)
        method remove_value (line 627) | void remove_value() noexcept
        method clear (line 635) | void clear() noexcept
        method max_size (line 645) | static std::size_t max_size() noexcept
        method set_empty (line 655) | void set_empty(bool is_empty) noexcept
        method destroy_value (line 664) | void destroy_value() noexcept
      class hopscotch_hash (line 706) | class hopscotch_hash: private Hash, private KeyEqual, private Growth...
        class hopscotch_iterator (line 715) | class hopscotch_iterator
          method hopscotch_iterator (line 779) | hopscotch_iterator(iterator_bucket buckets_iterator,
          method hopscotch_iterator (line 796) | hopscotch_iterator() noexcept
          method hopscotch_iterator (line 800) | hopscotch_iterator(const hopscotch_iterator<false>& other) noexc...
          method value (line 817) | typename std::conditional <
          method reference (line 829) | reference operator*() const
          method pointer (line 838) | pointer operator->() const
          method hopscotch_iterator (line 847) | hopscotch_iterator& operator++()
          method hopscotch_iterator (line 862) | hopscotch_iterator operator++(int)
        class hopscotch_iterator (line 767) | class hopscotch_iterator
          method hopscotch_iterator (line 779) | hopscotch_iterator(iterator_bucket buckets_iterator,
          method hopscotch_iterator (line 796) | hopscotch_iterator() noexcept
          method hopscotch_iterator (line 800) | hopscotch_iterator(const hopscotch_iterator<false>& other) noexc...
          method value (line 817) | typename std::conditional <
          method reference (line 829) | reference operator*() const
          method pointer (line 838) | pointer operator->() const
          method hopscotch_iterator (line 847) | hopscotch_iterator& operator++()
          method hopscotch_iterator (line 862) | hopscotch_iterator operator++(int)
        method hopscotch_hash (line 893) | hopscotch_hash(size_type bucket_count,
        method hopscotch_hash (line 914) | hopscotch_hash(size_type bucket_count,
        method hopscotch_hash (line 937) | hopscotch_hash(const hopscotch_hash& other) = default;
        method hopscotch_hash (line 939) | hopscotch_hash(hopscotch_hash&& other)
        method hopscotch_hash (line 960) | hopscotch_hash& operator=(const hopscotch_hash& other) = default;
        method hopscotch_hash (line 962) | hopscotch_hash& operator=(hopscotch_hash&& other)
        method allocator_type (line 969) | allocator_type get_allocator() const
        method iterator (line 978) | iterator begin() noexcept
        method const_iterator (line 989) | const_iterator begin() const noexcept
        method const_iterator (line 994) | const_iterator cbegin() const noexcept
        method iterator (line 1005) | iterator end() noexcept
        method const_iterator (line 1010) | const_iterator end() const noexcept
        method const_iterator (line 1015) | const_iterator cend() const noexcept
        method empty (line 1025) | bool empty() const noexcept
        method size_type (line 1030) | size_type size() const noexcept
        method size_type (line 1035) | size_type max_size() const noexcept
        method clear (line 1043) | void clear() noexcept
        method insert (line 1054) | std::pair<iterator, bool> insert(const value_type& value)
        method insert (line 1061) | std::pair<iterator, bool> insert(P && value)
        method insert (line 1066) | std::pair<iterator, bool> insert(value_type&& value)
        method iterator (line 1072) | iterator insert(const_iterator hint, const value_type& value)
        method iterator (line 1083) | iterator insert(const_iterator hint, P && value)
        method iterator (line 1088) | iterator insert(const_iterator hint, value_type&& value)
        method insert (line 1099) | void insert(InputIt first, InputIt last)
        method insert_or_assign (line 1123) | std::pair<iterator, bool> insert_or_assign(const key_type& k, M&& ...
        method insert_or_assign (line 1129) | std::pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj)
        method iterator (line 1136) | iterator insert_or_assign(const_iterator hint, const key_type& k, ...
        method iterator (line 1148) | iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj)
        method emplace (line 1161) | std::pair<iterator, bool> emplace(Args&& ... args)
        method iterator (line 1167) | iterator emplace_hint(const_iterator hint, Args&& ... args)
        method try_emplace (line 1173) | std::pair<iterator, bool> try_emplace(const key_type& k, Args&& .....
        method try_emplace (line 1179) | std::pair<iterator, bool> try_emplace(key_type&& k, Args&& ... args)
        method iterator (line 1185) | iterator try_emplace(const_iterator hint, const key_type& k, Args&...
        method iterator (line 1195) | iterator try_emplace(const_iterator hint, key_type&& k, Args&& ......
        method iterator (line 1206) | iterator erase(iterator pos)
        method iterator (line 1211) | iterator erase(const_iterator pos)
        method iterator (line 1227) | iterator erase(const_iterator first, const_iterator last)
        method size_type (line 1243) | size_type erase(const K& key)
        method size_type (line 1249) | size_type erase(const K& key, std::size_t hash)
        method swap (line 1271) | void swap(hopscotch_hash& other)
        method size_type (line 1344) | size_type count(const K& key) const
        method size_type (line 1350) | size_type count(const K& key, std::size_t hash) const
        method iterator (line 1357) | iterator find(const K& key)
        method iterator (line 1363) | iterator find(const K& key, std::size_t hash)
        method const_iterator (line 1370) | const_iterator find(const K& key) const
        method const_iterator (line 1376) | const_iterator find(const K& key, std::size_t hash) const
        method equal_range (line 1383) | std::pair<iterator, iterator> equal_range(const K& key)
        method equal_range (line 1389) | std::pair<iterator, iterator> equal_range(const K& key, std::size_...
        method equal_range (line 1397) | std::pair<const_iterator, const_iterator> equal_range(const K& key...
        method equal_range (line 1403) | std::pair<const_iterator, const_iterator> equal_range(const K& key,
        method size_type (line 1413) | size_type bucket_count() const
        method size_type (line 1423) | size_type max_bucket_count() const
        method load_factor (line 1434) | float load_factor() const
        method max_load_factor (line 1439) | float max_load_factor() const
        method max_load_factor (line 1444) | void max_load_factor(float ml)
        method rehash (line 1452) | void rehash(size_type count)
        method reserve (line 1459) | void reserve(size_type count)
        method hasher (line 1468) | hasher hash_function() const
        method key_equal (line 1473) | key_equal key_eq() const
        method iterator (line 1481) | iterator mutable_iterator(const_iterator pos)
        method size_type (line 1495) | size_type overflow_size() const noexcept
        method key_comp (line 1501) | typename U::key_compare key_comp() const
        method hash_key (line 1509) | std::size_t hash_key(const K& key) const
        method compare_keys (line 1515) | bool compare_keys(const K1& key1, const K2& key2) const
        method bucket_for_hash (line 1520) | std::size_t bucket_for_hash(std::size_t hash) const
        method rehash_impl (line 1532) | void rehash_impl(size_type count)
        method rehash_impl (line 1593) | void rehash_impl(size_type count)
        method iterator_overflow (line 1619) | iterator_overflow mutable_overflow_iterator(const_iterator_overflo...
        method iterator_overflow (line 1625) | iterator_overflow mutable_overflow_iterator(const_iterator_overflo...
        method iterator_overflow (line 1632) | iterator_overflow erase_from_overflow(const_iterator_overflow pos,
        method erase_from_bucket (line 1658) | void erase_from_bucket(iterator_buckets pos,
        method insert_or_assign_impl (line 1672) | std::pair<iterator, bool> insert_or_assign_impl(K&& key, M&& obj)
        method try_emplace_impl (line 1684) | std::pair<iterator, bool> try_emplace_impl(P&& key, Args&& ... arg...
        method insert_impl (line 1701) | std::pair<iterator, bool> insert_impl(P&& value)
        method insert_impl (line 1717) | std::pair<iterator, bool> insert_impl(std::size_t ibucket_for_hash,
        method will_neighborhood_change_on_rehash (line 1764) | bool will_neighborhood_change_on_rehash(size_t ibucket_neighborhoo...
        method find_empty_bucket (line 1791) | std::size_t find_empty_bucket(std::size_t ibucket_start) const
        method iterator_buckets (line 1811) | iterator_buckets insert_in_bucket(std::size_t ibucket_empty,
        method swap_empty_bucket_closer (line 1832) | bool swap_empty_bucket_closer(std::size_t& ibucket_empty_in_out)
        method size_type (line 1905) | size_type count_impl(const K& key, std::size_t hash,
        method iterator (line 1919) | iterator find_impl(const K& key, std::size_t hash, iterator_bucket...
        method const_iterator (line 1935) | const_iterator find_impl(const K& key, std::size_t hash,
        method iterator_buckets (line 1953) | iterator_buckets find_in_buckets(const K& key, std::size_t hash,
        method const_iterator_buckets (line 1963) | const_iterator_buckets find_in_buckets(const K& key, std::size_t h...
        method iterator_overflow (line 1994) | iterator_overflow find_in_overflow(const K& key)
        method const_iterator_overflow (line 2004) | const_iterator_overflow find_in_overflow(const K& key) const
        method iterator_overflow (line 2014) | iterator_overflow find_in_overflow(const K& key)
        method const_iterator_overflow (line 2020) | const_iterator_overflow find_in_overflow(const K& key) const
        method iterator_overflow (line 2029) | iterator_overflow insert_in_overflow(Args && ... value_type_args)
        method iterator_overflow (line 2036) | iterator_overflow insert_in_overflow(Args && ... value_type_args)
        method hopscotch_hash (line 2046) | hopscotch_hash new_hopscotch_hash(size_type bucket_count)
        method hopscotch_hash (line 2054) | hopscotch_hash new_hopscotch_hash(size_type bucket_count)

FILE: common/hopscotch_map.hh
  type tsl (line 39) | namespace tsl
    class hopscotch_map (line 80) | class hopscotch_map
      class KeySelect (line 86) | class KeySelect
        method key_type (line 91) | const key_type& operator()(const std::pair<Key, T>& key_value) const
        method key_type (line 96) | key_type& operator()(std::pair<Key, T>& key_value)
      class ValueSelect (line 102) | class ValueSelect
        method value_type (line 107) | const value_type& operator()(const std::pair<Key, T>& key_value) c...
        method value_type (line 112) | value_type& operator()(std::pair<Key, T>& key_value)
      method hopscotch_map (line 148) | hopscotch_map() : hopscotch_map(ht::DEFAULT_INIT_BUCKETS_SIZE)
      method hopscotch_map (line 152) | explicit hopscotch_map(size_type bucket_count,
      method hopscotch_map (line 160) | hopscotch_map(size_type bucket_count,
      method hopscotch_map (line 165) | hopscotch_map(size_type bucket_count,
      method hopscotch_map (line 171) | explicit hopscotch_map(const Allocator& alloc) : hopscotch_map(
      method hopscotch_map (line 177) | hopscotch_map(InputIt first, InputIt last,
      method hopscotch_map (line 188) | hopscotch_map(InputIt first, InputIt last,
      method hopscotch_map (line 196) | hopscotch_map(InputIt first, InputIt last,
      method hopscotch_map (line 204) | hopscotch_map(std::initializer_list<value_type> init,
      method hopscotch_map (line 213) | hopscotch_map(std::initializer_list<value_type> init,
      method hopscotch_map (line 220) | hopscotch_map(std::initializer_list<value_type> init,
      method hopscotch_map (line 229) | hopscotch_map& operator=(std::initializer_list<value_type> ilist)
      method allocator_type (line 237) | allocator_type get_allocator() const
      method iterator (line 246) | iterator begin() noexcept
      method const_iterator (line 250) | const_iterator begin() const noexcept
      method const_iterator (line 254) | const_iterator cbegin() const noexcept
      method iterator (line 259) | iterator end() noexcept
      method const_iterator (line 263) | const_iterator end() const noexcept
      method const_iterator (line 267) | const_iterator cend() const noexcept
      method empty (line 276) | bool empty() const noexcept
      method size_type (line 280) | size_type size() const noexcept
      method size_type (line 284) | size_type max_size() const noexcept
      method clear (line 292) | void clear() noexcept
      method insert (line 300) | std::pair<iterator, bool> insert(const value_type& value)
      method insert (line 307) | std::pair<iterator, bool> insert(P && value)
      method insert (line 312) | std::pair<iterator, bool> insert(value_type&& value)
      method iterator (line 318) | iterator insert(const_iterator hint, const value_type& value)
      method iterator (line 325) | iterator insert(const_iterator hint, P && value)
      method iterator (line 330) | iterator insert(const_iterator hint, value_type&& value)
      method insert (line 337) | void insert(InputIt first, InputIt last)
      method insert (line 342) | void insert(std::initializer_list<value_type> ilist)
      method insert_or_assign (line 351) | std::pair<iterator, bool> insert_or_assign(const key_type& k, M&& obj)
      method insert_or_assign (line 357) | std::pair<iterator, bool> insert_or_assign(key_type&& k, M&& obj)
      method iterator (line 363) | iterator insert_or_assign(const_iterator hint, const key_type& k, M&...
      method iterator (line 369) | iterator insert_or_assign(const_iterator hint, key_type&& k, M&& obj)
      method emplace (line 384) | std::pair<iterator, bool> emplace(Args&& ... args)
      method iterator (line 399) | iterator emplace_hint(const_iterator hint, Args&& ... args)
      method try_emplace (line 408) | std::pair<iterator, bool> try_emplace(const key_type& k, Args&& ... ...
      method try_emplace (line 414) | std::pair<iterator, bool> try_emplace(key_type&& k, Args&& ... args)
      method iterator (line 420) | iterator try_emplace(const_iterator hint, const key_type& k, Args&& ...
      method iterator (line 426) | iterator try_emplace(const_iterator hint, key_type&& k, Args&& ... a...
      method iterator (line 434) | iterator erase(iterator pos)
      method iterator (line 438) | iterator erase(const_iterator pos)
      method iterator (line 442) | iterator erase(const_iterator first, const_iterator last)
      method size_type (line 446) | size_type erase(const key_type& key)
      method size_type (line 455) | size_type erase(const key_type& key, std::size_t precalculated_hash)
      method size_type (line 465) | size_type erase(const K& key)
      method size_type (line 477) | size_type erase(const K& key, std::size_t precalculated_hash)
      method swap (line 485) | void swap(hopscotch_map& other)
      method T (line 493) | T& at(const Key& key)
      method T (line 502) | T& at(const Key& key, std::size_t precalculated_hash)
      method T (line 508) | const T& at(const Key& key) const
      method T (line 516) | const T& at(const Key& key, std::size_t precalculated_hash) const
      method T (line 527) | T & at(const K& key)
      method T (line 539) | T & at(const K& key, std::size_t precalculated_hash)
      method T (line 549) | const T & at(const K& key) const
      method T (line 558) | const T & at(const K& key, std::size_t precalculated_hash) const
      method T (line 566) | T& operator[](const Key& key)
      method T (line 570) | T& operator[](Key&& key)
      method size_type (line 578) | size_type count(const Key& key) const
      method size_type (line 587) | size_type count(const Key& key, std::size_t precalculated_hash) const
      method size_type (line 597) | size_type count(const K& key) const
      method size_type (line 609) | size_type count(const K& key, std::size_t precalculated_hash) const
      method iterator (line 617) | iterator find(const Key& key)
      method iterator (line 626) | iterator find(const Key& key, std::size_t precalculated_hash)
      method const_iterator (line 631) | const_iterator find(const Key& key) const
      method const_iterator (line 639) | const_iterator find(const Key& key, std::size_t precalculated_hash) ...
      method iterator (line 649) | iterator find(const K& key)
      method iterator (line 661) | iterator find(const K& key, std::size_t precalculated_hash)
      method const_iterator (line 670) | const_iterator find(const K& key) const
      method const_iterator (line 682) | const_iterator find(const K& key, std::size_t precalculated_hash) const
      method equal_range (line 690) | std::pair<iterator, iterator> equal_range(const Key& key)
      method equal_range (line 699) | std::pair<iterator, iterator> equal_range(const Key& key,
      method equal_range (line 705) | std::pair<const_iterator, const_iterator> equal_range(const Key& key...
      method equal_range (line 713) | std::pair<const_iterator, const_iterator> equal_range(const Key& key,
      method equal_range (line 724) | std::pair<iterator, iterator> equal_range(const K& key)
      method equal_range (line 737) | std::pair<iterator, iterator> equal_range(const K& key,
      method equal_range (line 747) | std::pair<const_iterator, const_iterator> equal_range(const K& key) ...
      method equal_range (line 756) | std::pair<const_iterator, const_iterator> equal_range(const K& key,
      method size_type (line 768) | size_type bucket_count() const
      method size_type (line 772) | size_type max_bucket_count() const
      method load_factor (line 781) | float load_factor() const
      method max_load_factor (line 785) | float max_load_factor() const
      method max_load_factor (line 789) | void max_load_factor(float ml)
      method rehash (line 794) | void rehash(size_type count)
      method reserve (line 798) | void reserve(size_type count)
      method hasher (line 807) | hasher hash_function() const
      method key_equal (line 811) | key_equal key_eq() const
      method iterator (line 823) | iterator mutable_iterator(const_iterator pos)
      method size_type (line 828) | size_type overflow_size() const noexcept
      method swap (line 856) | void swap(hopscotch_map& lhs, hopscotch_map& rhs)

FILE: common/http/HttpHandler.hh
  function public (line 40) | virtual public eos::common::ProtocolHandler

FILE: common/http/HttpRequest.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 41) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/HttpResponse.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/HttpResponse.hh
  class HttpResponse (line 44) | class HttpResponse
    type ResponseCodes (line 53) | enum ResponseCodes {
    method HttpResponse (line 107) | HttpResponse() :
    method HeaderMap (line 129) | inline HeaderMap&
    method SetHeaders (line 146) | inline void
    method SetBody (line 175) | inline void
    method GetBodySize (line 184) | inline size_t
    method GetResponseCode (line 193) | inline int
    method SetResponseCode (line 204) | inline void

FILE: common/http/HttpServer.cc
  type timeval (line 162) | struct timeval
  function MHD_RESULT (line 215) | MHD_RESULT
  type MHD_Connection (line 243) | struct MHD_Connection
  type MHD_RequestTerminationCode (line 245) | enum MHD_RequestTerminationCode
  function MHD_RESULT (line 256) | MHD_RESULT
  function MHD_RESULT (line 275) | MHD_RESULT
  function HttpResponse (line 307) | HttpResponse*
  function HttpResponse (line 348) | HttpResponse*
  function HttpResponse (line 358) | HttpResponse*
  function HttpResponse (line 373) | HttpResponse*

FILE: common/http/HttpServer.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 43) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/MimeTypes.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 44) | EOSCOMMONNAMESPACE_BEGIN
  function Match (line 61) | std::string
  function MimeTypes (line 71) | MimeTypes ()

FILE: common/http/OwnCloud.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 49) | EOSCOMMONNAMESPACE_BEGIN
  class OwnCloud (line 108) | class OwnCloud
    method isChunkUpload (line 115) | static bool isChunkUpload(HttpRequest* request)
    method isChunkUpload (line 120) | static bool isChunkUpload(XrdOucEnv& env)
    method GetChunkInfo (line 138) | static bool GetChunkInfo(const char* request,
    method GetNChunk (line 171) | static int GetNChunk(HttpRequest* request)
    method checksum_t (line 184) | static checksum_t GetChecksum(HttpRequest* request,
    method GetChecksumString (line 213) | static std::string GetChecksumString(std::string type, std::string value)
    method GetMaxChunks (line 238) | static int GetMaxChunks(HttpRequest* request)
    method HasOcContentLength (line 249) | static bool HasOcContentLength(HttpRequest* request)
    method ReplaceRemotePhp (line 256) | static void ReplaceRemotePhp(XrdOucString& path)
    method WantsStatus (line 264) | static bool WantsStatus(XrdOucString& path)
    method prepareChunkUpload (line 276) | static std::string prepareChunkUpload(HttpRequest* request,
    method addOcHeader (line 334) | static void addOcHeader(HttpResponse* response,
    method XrdOucString (line 344) | static XrdOucString HeaderToQuery(std::map<std::string, std::string>& ...
    method FilterOcQuery (line 362) | static std::string FilterOcQuery(const char* query)

FILE: common/http/PlainHttpResponse.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 44) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/ProtocolHandler.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 41) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/ProtocolHandlerFactory.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 43) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/s3/S3Handler.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 34) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/http/s3/S3Handler.hh
  class S3Handler (line 47) | class S3Handler : virtual public eos::common::HttpHandler
    method S3Handler (line 77) | S3Handler () : mIsS3(false), mVirtualHost(false) {}
    method GetId (line 123) | inline std::string
    method GetSignature (line 129) | inline std::string
    method GetHost (line 135) | inline std::string
    method GetContentMD5 (line 141) | inline std::string
    method GetContentType (line 147) | inline std::string
    method GetUserAgent (line 153) | inline std::string
    method GetHttpMethod (line 159) | inline std::string
    method GetPath (line 165) | inline std::string
    method GetQuery (line 171) | inline std::string
    method GetSubResource (line 177) | inline std::string
    method GetBucket (line 189) | inline std::string
    method GetDate (line 195) | inline std::string
    method GetCanonicalizedAmzHeaders (line 201) | inline std::string
    method RestErrorResponse (line 230) | static std::string

FILE: common/http/s3/S3Response.hh
  class S3Response (line 46) | class S3Response : public HttpResponse
    method HttpResponse (line 51) | HttpResponse*

FILE: common/json/Json.hh
  function ConvertToJson (line 96) | std::enable_if_t <
  function ConvertToJson (line 109) | std::enable_if_t<std::is_floating_point_v<T>,
  function ConvertToJson (line 117) | inline Json::Value ConvertToJson(const std::atomic<T>& input)
  function ConvertToJson (line 123) | Json::Value ConvertToJson(const std::array<T, N>& input)
  function ConvertToJson (line 135) | Json::Value ConvertToJson(const T(&input)[N])
  function ConvertToJson (line 147) | Json::Value ConvertToJson(const std::vector<T>& input)
  function ConvertToJson (line 159) | Json::Value ConvertToJson(const std::set<T>& input)
  function ConvertToJson (line 171) | Json::Value ConvertToJson(const std::map<K, V>& input)
  function ConvertToJson (line 187) | Json::Value ConvertToJson(const std::unordered_map<K, V>& input)
  function ConvertToJson (line 198) | inline Json::Value ConvertToJson(const std::string& input)
  function ConvertToJson (line 203) | inline Json::Value ConvertToJson(const char* input)
  function ConvertFromJson (line 209) | inline void ConvertFromJson(const Json::Value& val, T& out)
  function ConvertFromJson (line 222) | inline void ConvertFromJson(const Json::Value& val, std::atomic<T>& out)
  function ConvertFromJson (line 230) | void ConvertFromJson(const Json::Value& val, std::array<T, N>& out)
  function ConvertFromJson (line 238) | void ConvertFromJson(const Json::Value& val, T(&out)[N])
  function ConvertFromJson (line 247) | void ConvertFromJson(const Json::Value& val, std::vector<T>& out)
  function ConvertFromJson (line 260) | void ConvertFromJson(const Json::Value& val, std::set<V>& out)
  function ConvertFromJson (line 272) | void ConvertFromJson(const Json::Value& val, std::map<K, V>& out)
  function ConvertFromJson (line 285) | void ConvertFromJson(const Json::Value& val, std::unordered_map<K, V>& out)
  function Marshal (line 305) | std::string Marshal(const T& input, const char* indentation = "")
  function Unmarshal (line 321) | void Unmarshal(const std::string input, T& out)

FILE: common/json/Jsonifiable.hh
  function jsonify (line 50) | virtual void jsonify(std::stringstream& ss) const

FILE: common/mq/FsChangeListener.hh
  class ThreadAssistant (line 35) | class ThreadAssistant
  type eos (line 37) | namespace eos
    type mq (line 39) | namespace mq
      class MessagingRealm (line 41) | class MessagingRealm
  function EOSMQNAMESPACE_BEGIN (line 45) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/GlobalConfigChangeListener.hh
  type qclient (line 34) | namespace qclient
    class SharedHash (line 36) | class SharedHash
    class SharedHashSubscription (line 37) | class SharedHashSubscription
    type SharedHashUpdate (line 38) | struct SharedHashUpdate
  class ThreadAssistant (line 41) | class ThreadAssistant
  class GlobalConfigChangeListener (line 50) | class GlobalConfigChangeListener
    type Event (line 56) | struct Event {
      method isDeletion (line 60) | bool isDeletion() const

FILE: common/mq/LocalHash.hh
  type qclient (line 35) | namespace qclient
    class UpdateBatch (line 37) | class UpdateBatch
  function EOSMQNAMESPACE_BEGIN (line 40) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/MessagingRealm.cc
  function SharedHashProvider (line 52) | SharedHashProvider* MessagingRealm::getHashProvider()
  function SharedDequeProvider (line 60) | SharedDequeProvider* MessagingRealm::getDequeProvider()

FILE: common/mq/MessagingRealm.hh
  type qclient (line 33) | namespace qclient
    class SharedManager (line 35) | class SharedManager
  class MessagingRealm (line 49) | class MessagingRealm
    type Response (line 52) | struct Response {
      method ok (line 56) | bool ok() const
    method ShouldBroadcast (line 132) | inline bool ShouldBroadcast()

FILE: common/mq/QdbListener.hh
  class ThreadAssistant (line 33) | class ThreadAssistant
  type eos (line 35) | namespace eos
    class QdbContactDetails (line 37) | class QdbContactDetails
  type qclient (line 40) | namespace qclient
    class QClient (line 42) | class QClient
    class Message (line 43) | class Message
    class Subscriber (line 44) | class Subscriber
    class Subscription (line 45) | class Subscription
  function EOSMQNAMESPACE_BEGIN (line 48) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/SharedDequeProvider.cc
  function EOSMQNAMESPACE_BEGIN (line 27) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/SharedDequeProvider.hh
  type qclient (line 32) | namespace qclient
    class SharedManager (line 34) | class SharedManager
    class SharedDeque (line 35) | class SharedDeque
  function EOSMQNAMESPACE_BEGIN (line 38) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/SharedHashProvider.cc
  function EOSMQNAMESPACE_BEGIN (line 31) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/SharedHashProvider.hh
  type qclient (line 32) | namespace qclient
    class SharedManager (line 34) | class SharedManager
    class SharedHash (line 35) | class SharedHash
  type eos (line 38) | namespace eos
    type common (line 40) | namespace common
      class SharedHashLocator (line 42) | class SharedHashLocator
  function EOSMQNAMESPACE_BEGIN (line 46) | EOSMQNAMESPACE_BEGIN

FILE: common/mq/SharedHashWrapper.cc
  function SharedHashWrapper (line 107) | SharedHashWrapper

FILE: common/mq/SharedHashWrapper.hh
  type qclient (line 35) | namespace qclient
    class UpdateBatch (line 37) | class UpdateBatch
    class SharedHash (line 38) | class SharedHash
    class SharedHashSubscription (line 39) | class SharedHashSubscription
  class SharedHashWrapper (line 49) | class SharedHashWrapper
    class Batch (line 56) | class Batch
      method Batch (line 62) | Batch() {}

FILE: common/mq/XrdMqTiming.hh
  class XrdMqTiming (line 31) | class XrdMqTiming
    type timeval (line 34) | struct timeval
    method XrdMqTiming (line 40) | XrdMqTiming(const char* name, struct timeval& i_tv):
    method XrdMqTiming (line 48) | XrdMqTiming(const char* i_maintag):
    method Print (line 57) | void Print()

FILE: common/mutextest/RWMutexTest.cc
  function RunThreads (line 91) | void
  function main (line 147) | int

FILE: common/plugin_manager/DynamicLibrary.cc
  function EOSCOMMONNAMESPACE_BEGIN (line 29) | EOSCOMMONNAMESPACE_BEGIN
  function DynamicLibrary (line 53) | DynamicLibrary*

FILE: common/plugin_manager/DynamicLibrary.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 30) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/plugin_manager/Plugin.hh
  type PF_PlatformServices (line 34) | struct PF_PlatformServices
  type PF_Plugin_Layer (line 40) | enum PF_Plugin_Layer {
  type PF_PluginAPI_Version (line 50) | struct PF_PluginAPI_Version {
  type PF_RegisterParams (line 65) | struct PF_RegisterParams {
  type PF_PlatformServices (line 93) | struct PF_PlatformServices {
  type PF_Discovery_Service (line 102) | struct PF_Discovery_Service {

FILE: common/plugin_manager/PluginManager.cc
  function PluginManager (line 59) | PluginManager&
  function IsValid (line 93) | static bool IsValid(const char* objType,
  type dirent (line 203) | struct dirent
  function DynamicLibrary (line 299) | DynamicLibrary*
  function PF_PlatformServices (line 334) | PF_PlatformServices&

FILE: common/plugin_manager/PluginManager.hh
  class PluginManager (line 42) | class PluginManager: public LogId
    method PluginManager (line 147) | PluginManager(const PluginManager&) = delete;

FILE: common/shaping/IoStatsKey.hh
  type eos::common::traffic_shaping (line 8) | namespace eos::common::traffic_shaping {
    type IoStatsKey (line 12) | struct IoStatsKey {
    type IoStatsKeyHash (line 24) | struct IoStatsKeyHash {

FILE: common/shaping/SlidingWindowStats.hh
  type eos::common::traffic_shaping (line 8) | namespace eos::common::traffic_shaping {
    class SlidingWindowStats (line 12) | class SlidingWindowStats {
      method SlidingWindowStats (line 14) | SlidingWindowStats() = default;
      method SlidingWindowStats (line 16) | SlidingWindowStats(const double max_history_seconds, const double ti...
      method Add (line 24) | void
      method Tick (line 30) | void

FILE: common/shellexectest/shell_exec_test.cc
  function test_stdin_to_stdout (line 43) | void
  function test_stderr (line 62) | void
  function test_echo (line 79) | void
  function test_wait (line 110) | void
  function test_is_active (line 124) | void
  function test_status1 (line 142) | void
  function test_status2 (line 162) | void
  function test_status3 (line 182) | void
  function main (line 202) | int

FILE: common/stringencoders/modp_numtoa.c
  function strreverse (line 25) | static void strreverse(char* begin, char* end)
  function modp_itoa10 (line 32) | void modp_itoa10(int32_t value, char* str)
  function modp_uitoa10 (line 46) | void modp_uitoa10(uint32_t value, char* str)
  function modp_litoa10 (line 56) | void modp_litoa10(int64_t value, char* str)
  function modp_ulitoa10 (line 70) | void modp_ulitoa10(uint64_t value, char* str)
  function modp_dtoa (line 80) | void modp_dtoa(double value, char* str, int prec)
  function modp_dtoa2 (line 180) | void modp_dtoa2(double value, char* str, int prec)

FILE: common/table_formatter/TableCell.cc
  function getColorSequence (line 26) | static std::string getColorSequence(TableFormatterColor color) {

FILE: common/table_formatter/TableCell.hh
  class TableCell (line 29) | class TableCell
    type TypeContainingValue (line 139) | enum TypeContainingValue {
    method TableCell (line 154) | TableCell() = delete;

FILE: common/table_formatter/TableFormatterBase.cc
  function TableFormatterColor (line 423) | TableFormatterColor TableFormatterBase::ChangeColor(std::string header,

FILE: common/table_formatter/TableFormatterBase.hh
  function EOSMGMNAMESPACE_BEGIN (line 30) | EOSMGMNAMESPACE_BEGIN

FILE: common/table_formatter/TableFormatting.hh
  class TableCell (line 35) | class TableCell
  type TableFormatterColor (line 46) | enum TableFormatterColor {
  type TableFormatterStyle (line 97) | enum TableFormatterStyle {

FILE: common/thread_id.hh
  function pthread_t (line 40) | static inline pthread_t
  function pthread_t (line 46) | static inline pthread_t

FILE: common/token/EosTok.cc
  function time_t (line 470) | time_t

FILE: common/token/EosTok.hh
  type eos (line 37) | namespace  eos
    type console (line 39) | namespace console
      class TokenEnclosure (line 41) | class TokenEnclosure
  class XrdOucEnv (line 45) | class XrdOucEnv
  function EOSCOMMONNAMESPACE_BEGIN (line 47) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/token/SciToken.cc
  function c_scitoken_create (line 49) | int
  function EOSCOMMONNAMESPACE_BEGIN (line 101) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/token/SciToken.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 31) | EOSCOMMONNAMESPACE_BEGIN

FILE: common/token/Token.hh
  class Token (line 36) | class Token {
    method Token (line 38) | Token() {}

FILE: common/token/eosscitokenmodule.c
  function PyObject (line 35) | static PyObject*
  function PyObject (line 60) | static PyObject*
  type PyModuleDef (line 98) | struct PyModuleDef
  function PyMODINIT_FUNC (line 107) | PyMODINIT_FUNC

FILE: common/token/setup.py
  class BuildCommand (line 19) | class BuildCommand(distutils.command.build.build):
    method initialize_options (line 20) | def initialize_options(self):

FILE: common/ulib/hash_align.h
  function namespace (line 49) | namespace ulib {
  function value (line 126) | struct const_iterator
  function other (line 183) | bool
  function virtual (line 215) | virtual
  function iterator (line 227) | iterator
  function iterator (line 237) | iterator
  function contain (line 259) | bool
  function iterator (line 275) | iterator
  function reference (line 287) | reference
  function iterator (line 291) | iterator
  function const_iterator (line 295) | const_iterator
  function erase (line 299) | void
  function erase (line 303) | void
  function clear (line 307) | void
  function resize (line 311) | int
  type _Key (line 331) | typedef _Key	  key_type;
  type ah_iter_t (line 332) | typedef ah_iter_t size_type;
  type ah_iter_t (line 333) | typedef ah_iter_t hashing_iterator;
  function value (line 336) | struct iterator
  function other (line 380) | bool
  function other (line 384) | bool
  function value (line 389) | struct const_iterator
  function other (line 440) | bool
  function virtual (line 472) | virtual
  function iterator (line 484) | iterator
  function iterator (line 494) | iterator
  function contain (line 516) | bool
  function iterator (line 520) | iterator
  function const (line 530) | bool
  function iterator (line 534) | iterator
  function const_iterator (line 538) | const_iterator
  function erase (line 542) | void
  function erase (line 546) | void
  function clear (line 550) | void
  function resize (line 554) | int

FILE: common/ulib/hash_align_prot.h
  type ah_iter_t (line 38) | typedef uint64_t ah_iter_t;
  type ah_size_t (line 39) | typedef uint64_t ah_size_t;
  type ah_iter_t (line 53) | typedef uint32_t ah_iter_t;
  type ah_size_t (line 54) | typedef uint32_t ah_size_t;

FILE: common/ulib/util_class.h
  function namespace (line 31) | namespace ulib {

FILE: common/utils/BackOffInvoker.hh
  type eos::common (line 30) | namespace eos::common {
    class BackOffInvoker (line 34) | class BackOffInvoker {
      method invoke (line 40) | bool
      method BackOffInvoker (line 52) | BackOffInvoker() : mCounter(0), mLimit(1) {}

FILE: common/utils/BindArguments.hh
  type eos::common (line 27) | namespace eos::common
    type BoundArgsHandler (line 44) | struct BoundArgsHandler {
      method BoundArgsHandler (line 48) | BoundArgsHandler(Fn&& _f,
      method BoundArgsHandler (line 52) | BoundArgsHandler(const Fn& _f,
    function bindArgs (line 67) | auto bindArgs(Fn&& f, Args&& ... args)

FILE: common/utils/ContainerUtils.hh
  type eos::common (line 29) | namespace eos::common
    function erase_if (line 47) | typename C::size_type
    function get_msb (line 70) | inline uint8_t get_msb(uint64_t val)
    function clamp_index (line 83) | inline uint64_t
    function pickIndexRR (line 112) | typename C::value_type
    function splice (line 133) | void
    function splice (line 150) | void splice(C& c, C&& other)
    function next_power2 (line 155) | uint64_t inline next_power2(uint64_t x) {

FILE: common/utils/RandUtils.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 27) | EOSCOMMONNAMESPACE_BEGIN
  function getRandom64 (line 57) | auto
  function getRandomNormal (line 77) | auto

FILE: common/utils/TypeTraits.hh
  type eos::common::detail (line 47) | namespace eos::common::detail
    type is_assoc_container_t (line 58) | struct is_assoc_container_t : std::false_type {}
    type is_assoc_container_t<T, std::void_t<typename T::key_type>> (line 61) | struct is_assoc_container_t<T, std::void_t<typename T::key_type>>:
    type has_data_t (line 71) | struct has_data_t : std::false_type {}
  type has_data_t<T, std::void_t<decltype(std::declval<T>().data())>> (line 74) | struct has_data_t<T, std::void_t<decltype(std::declval<T>().data())>> :

FILE: common/utils/XrdUtils.hh
  function EOSCOMMONNAMESPACE_BEGIN (line 33) | EOSCOMMONNAMESPACE_BEGIN

FILE: console/CommandFramework.cc
  function CommandRegistry (line 13) | CommandRegistry& CommandRegistry::instance()
  function IConsoleCommand (line 29) | IConsoleCommand* CommandRegistry::find(const std::string& name) const
  function RegisterNativeConsoleCommands (line 54) | void RegisterNativeConsoleCommands()
  function EnsureNativeCommandRegistryInitialized (line 233) | void

FILE: console/CommandFramework.hh
  type CommandContext (line 15) | struct CommandContext {
  class IConsoleCommand (line 30) | class IConsoleCommand {
    method helpText (line 35) | virtual std::string
    method requiresMgm (line 40) | virtual bool requiresMgm(const std::string& args) const { return !want...
    method complete (line 41) | virtual std::vector<std::string>
  class CommandRegistry (line 50) | class CommandRegistry {
  class CFuncCommandAdapter (line 63) | class CFuncCommandAdapter : public IConsoleCommand {
    method CFuncCommandAdapter (line 66) | CFuncCommandAdapter(const char* n, const char* d, CFunc f, bool reqMgm)
    method requiresMgm (line 71) | bool requiresMgm(const std::string& args) const override { return mReq...
    method printHelp (line 73) | void printHelp() const override {}

FILE: console/ConsoleArgParser.cc
  function starts_with (line 9) | static bool starts_with(const std::string& s, const char* pfx) {
  function dequoteToken (line 17) | static inline std::string dequoteToken(const std::string& in) {
  function ConsoleArgParser (line 30) | ConsoleArgParser& ConsoleArgParser::setProgramName(const std::string& nm) {
  function ConsoleArgParser (line 34) | ConsoleArgParser& ConsoleArgParser::setDescription(const std::string& de...
  function ConsoleArgParser (line 38) | ConsoleArgParser& ConsoleArgParser::allowCombinedShortOptions(bool allow) {
  function ConsoleArgParser (line 42) | ConsoleArgParser& ConsoleArgParser::allowAttachedValue(bool allow) {
  function ConsoleArgParser (line 46) | ConsoleArgParser& ConsoleArgParser::acceptBareAssignments(bool accept) {
  function ConsoleArgParser (line 50) | ConsoleArgParser& ConsoleArgParser::collectUnknownTokens(bool collect) {
  function ConsoleArgParser (line 54) | ConsoleArgParser& ConsoleArgParser::addOption(const OptionSpec& spec) {

FILE: console/ConsoleArgParser.hh
  class ConsoleArgParser (line 13) | class ConsoleArgParser {
    type OptionSpec (line 15) | struct OptionSpec {
    type ParseResult (line 25) | struct ParseResult {
    type InternalSpec (line 53) | struct InternalSpec {

FILE: console/ConsoleCliCommand.cc
  function isFloatEvalFunc (line 35) | bool isFloatEvalFunc(const CliOptionWithArgs* option,
  function isIntegerEvalFunc (line 59) | bool isIntegerEvalFunc(const CliOptionWithArgs* option,
  function isNumberInRangeEvalFunc (line 86) | bool isNumberInRangeEvalFunc(const CliOptionWithArgs* option,
  function isPositiveNumberEvalFunc (line 114) | bool isPositiveNumberEvalFunc(const CliOptionWithArgs* option,
  function isNegativeNumberEvalFunc (line 130) | bool isNegativeNumberEvalFunc(const CliOptionWithArgs* option,
  function isChoiceEvalFunc (line 146) | bool isChoiceEvalFunc(const CliOptionWithArgs* option,
  function AnalysisResult (line 270) | AnalysisResult*
  function truncateDescString (line 335) | static std::string
  function AnalysisResult (line 577) | AnalysisResult*
  function AnalysisResult (line 645) | AnalysisResult*
  function AnalysisResult (line 735) | AnalysisResult*
  function CliOption (line 951) | CliOption*
  function OptionsGroup (line 980) | OptionsGroup*
  function OptionsGroup (line 993) | OptionsGroup*
  function ConsoleCliCommand (line 1034) | ConsoleCliCommand*
  function ConsoleCliCommand (line 1096) | ConsoleCliCommand*
  function ConsoleCliCommand (line 1154) | ConsoleCliCommand*
  function CliOption (line 1496) | CliOption*

FILE: console/ConsoleCliCommand.hh
  class CliBaseOption (line 39) | class CliBaseOption
    method setName (line 107) | virtual void setName(const std::string &name) { mName = name; }
    method setDescription (line 108) | virtual void setDescription(const std::string &desc) { mDescription = ...
    method required (line 109) | virtual bool required() const { return mRequired; }
    method setRequired (line 110) | virtual void setRequired(bool req) { mRequired = req; }
    method hidden (line 111) | virtual bool hidden() const { return mHidden; }
    method setHidden (line 112) | virtual void setHidden(bool hidden) { mHidden = hidden; }
  class CliOptionWithArgs (line 40) | class CliOptionWithArgs
    method shouldEvaluate (line 157) | bool shouldEvaluate() const { return mEvalFunctions && mUserData; }
  class ConsoleCliCommand (line 41) | class ConsoleCliCommand
    method name (line 249) | std::string name() const { return mName;}
    method description (line 250) | std::string description() const { return mDescription; }
    method setName (line 251) | void setName(const std::string &name) { mName = name;}
    method setDescription (line 252) | void setDescription(const std::string &desc) { mDescription = desc; }
    method ConsoleCliCommand (line 254) | const ConsoleCliCommand *parent() const { return mParentCommand; }
    method setStandalone (line 256) | void setStandalone(bool standalone) { mStandalone = standalone; }
    method standalone (line 257) | bool standalone() const { return mStandalone; }
  class OptionsGroup (line 42) | class OptionsGroup
    method required (line 209) | bool required() const { return mRequired; }
    method setRequired (line 210) | void setRequired(bool req) { mRequired = req; }
    method name (line 212) | std::string name() const { return mName; }
    method setName (line 213) | void setName(std::string name) { mName = name; }
  class ParseError (line 79) | class ParseError {
    method CliBaseOption (line 82) | CliBaseOption* option() const { return mOption; }
    method message (line 83) | std::string message() const { return mMessage; }
  class CliBaseOption (line 98) | class CliBaseOption {
    method setName (line 107) | virtual void setName(const std::string &name) { mName = name; }
    method setDescription (line 108) | virtual void setDescription(const std::string &desc) { mDescription = ...
    method required (line 109) | virtual bool required() const { return mRequired; }
    method setRequired (line 110) | virtual void setRequired(bool req) { mRequired = req; }
    method hidden (line 111) | virtual bool hidden() const { return mHidden; }
    method setHidden (line 112) | virtual void setHidden(bool hidden) { mHidden = hidden; }
  class CliOption (line 122) | class CliOption : public CliBaseOption {
    method OptionsGroup (line 133) | virtual const OptionsGroup *group() const { return mGroup; }
  class CliOptionWithArgs (line 143) | class CliOptionWithArgs : public CliOption{
    method shouldEvaluate (line 157) | bool shouldEvaluate() const { return mEvalFunctions && mUserData; }
  class CliPositionalOption (line 175) | class CliPositionalOption : public CliOptionWithArgs {
    method position (line 188) | int position() { return mPosition; }
    method setPosition (line 189) | void setPosition(int position) { mPosition = position; }
  class OptionsGroup (line 195) | class OptionsGroup {
    method required (line 209) | bool required() const { return mRequired; }
    method setRequired (line 210) | void setRequired(bool req) { mRequired = req; }
    method name (line 212) | std::string name() const { return mName; }
    method setName (line 213) | void setName(std::string name) { mName = name; }
  class ConsoleCliCommand (line 221) | class ConsoleCliCommand {
    method name (line 249) | std::string name() const { return mName;}
    method description (line 250) | std::string description() const { return mDescription; }
    method setName (line 251) | void setName(const std::string &name) { mName = name;}
    method setDescription (line 252) | void setDescription(const std::string &desc) { mDescription = desc; }
    method ConsoleCliCommand (line 254) | const ConsoleCliCommand *parent() const { return mParentCommand; }
    method setStandalone (line 256) | void setStandalone(bool standalone) { mStandalone = standalone; }
    method standalone (line 257) | bool standalone() const { return mStandalone; }

FILE: console/ConsoleCompletion.cc
  type HelpCompletionLeaf (line 53) | struct HelpCompletionLeaf {
  function trim_copy (line 61) | std::string
  function is_command_word (line 74) | bool
  function allows_path_extension_token (line 92) | bool
  function split_words (line 99) | std::vector<std::string>
  function extract_option_tokens (line 113) | std::vector<std::string>
  function strip_choice_token (line 137) | std::string
  function extract_literal_choices (line 155) | std::vector<std::string>
  function parse_absolute_help_path (line 178) | bool
  function parse_rootless_file_help_path (line 225) | bool
  function leading_indent (line 246) | size_t
  function parse_relative_help_path (line 264) | bool
  function attach_primary_help_line (line 298) | void
  function attach_help_key_literal (line 337) | bool
  function is_non_completion_help_line (line 364) | bool
  function HelpCompletionSpec (line 370) | HelpCompletionSpec
  function HelpCompletionSpec (line 448) | const HelpCompletionSpec&
  function count_non_option_arguments (line 462) | size_t
  function starts_with (line 478) | bool
  function dedupe_and_sort (line 484) | std::vector<std::string>
  function ends_with (line 492) | bool
  function filter_candidates (line 502) | std::vector<std::string>
  function global_option_candidates (line 516) | std::vector<std::string>
  function find_command_token_index (line 523) | size_t
  function is_path_identifier_token (line 563) | bool
  function looks_like_non_eos_path (line 571) | bool
  function is_eos_path_prefix (line 579) | bool
  function should_complete_file_subcommand_paths (line 585) | bool
  function is_path_capable_command_name (line 616) | bool
  type CompletionClientState (line 627) | struct CompletionClientState {
  class ScopedCompletionClientState (line 634) | class ScopedCompletionClientState {
    method ScopedCompletionClientState (line 636) | ScopedCompletionClientState()
  function apply_completion_client_context (line 653) | void
  function decode_env_lines (line 684) | std::vector<std::string>
  function list_remote_path_candidates (line 725) | std::vector<std::string>
  function eos_completion_tokenize_prefix (line 766) | std::vector<std::string>
  function EosShellPathCompletionMode (line 811) | EosShellPathCompletionMode
  function eos_shell_resolve_rooted_path_input (line 840) | void
  function eos_shell_completion_candidates (line 879) | std::vector<std::string>
  function eos_help_completion_candidates (line 931) | std::vector<std::string>
  function eos_path_split (line 1013) | void eos_path_split(const std::string& input, std::string& dirname,

FILE: console/ConsoleCompletion.hh
  type EosShellPathCompletionMode (line 121) | enum class EosShellPathCompletionMode {

FILE: console/ConsoleMain.cc
  function RunRegisteredCommand (line 89) | static int RunRegisteredCommand(const std::string& cmdName,
  function exit_handler (line 130) | void
  function jump_handler (line 142) | void
  function wants_help (line 196) | bool
  function command_result_stdout_to_vector (line 247) | void
  function output_result (line 289) | int
  function XrdOucEnv (line 387) | XrdOucEnv*
  function read_pwdfile (line 532) | void
  function usage (line 560) | void
  function RunShellCompletion (line 625) | int
  function Run (line 654) | int
  function execute_line (line 1047) | int
  function parse_comment (line 1178) | std::string
  function PathIdentifier (line 1229) | std::string PathIdentifier(const char* in, bool escapeand)
  function RegWrapDenominator (line 1257) | bool RegWrapDenominator(XrdOucString& input, const std::string& key)
  function Path2FileDenominator (line 1278) | bool Path2FileDenominator(XrdOucString& input)
  function Path2FileDenominator (line 1293) | bool Path2FileDenominator(XrdOucString& input, unsigned long long& id)
  function Path2ContainerDenominator (line 1310) | bool Path2ContainerDenominator(XrdOucString& input)
  function Path2ContainerDenominator (line 1325) | bool Path2ContainerDenominator(XrdOucString& input, unsigned long long& id)
  function RequiresMgm (line 1341) | bool RequiresMgm(const std::string& name, const std::string& args)
  function CheckMgmOnline (line 1357) | bool CheckMgmOnline(const std::string& uri)
  function DefaultRoute (line 1379) | std::string DefaultRoute()
  type stat (line 1417) | struct stat

FILE: console/ConsoleMain.hh
  class XrdOucEnv (line 36) | class XrdOucEnv
  class filesystems (line 211) | class filesystems
    method filesystems (line 214) | filesystems() {}
    method filesystemmap_t (line 222) | filesystemmap_t& fs()
    method clientmap_t (line 226) | clientmap_t& clients()
  class files (line 235) | class files
    method files (line 238) | files() {}
    type fileentry (line 241) | struct fileentry {
    method Size (line 254) | size_t Size()
    class SyncResponseHandler (line 260) | class SyncResponseHandler: public ResponseHandler
      method SyncResponseHandler (line 263) | SyncResponseHandler(const char* path, int fsid):
      method HandleResponse (line 275) | virtual void HandleResponse(XRootDStatus* status,
      method XRootDStatus (line 284) | XRootDStatus* GetStatus()
      method HasStatus (line 289) | bool HasStatus()
      method AnyObject (line 300) | AnyObject* GetResponse()
      method WaitForResponse (line 305) | void WaitForResponse()
      method GetFsid (line 319) | int         GetFsid()
      method GetAge (line 324) | size_t      GetAge()
    type fileentry (line 342) | struct fileentry

FILE: console/ConsoleMainExecutable.cc
  function main (line 26) | int

FILE: console/GlobalOptions.hh
  type GlobalOptions (line 30) | struct GlobalOptions {

FILE: console/ICommand.hh
  class ICommand (line 32) | class ICommand

FILE: console/RegexUtil.hh
  class RegexUtil (line 38) | class RegexUtil
    type RegexErr (line 42) | enum RegexErr {NOTOKENMODEON = -1, NOMOREMATCHES = -2}
    method RegexUtil (line 66) | RegexUtil(const RegexUtil &other) = delete;
    method RegexUtil (line 67) | RegexUtil(RegexUtil &&other) = delete;
    method RegexUtil (line 68) | RegexUtil& operator=(RegexUtil &other) = delete;
    method RegexUtil (line 69) | RegexUtil& operator=(RegexUtil &&other) = delete;
    method SetOrigin (line 84) | inline void SetOrigin(const std::string& origin)

FILE: console/commands/HealthCommand.hh
  type FSInfo (line 39) | struct FSInfo
  type FSInfo (line 50) | struct FSInfo {
  class HealthCommand (line 83) | class HealthCommand : public ICommand
    class GetValueWrapper (line 93) | class GetValueWrapper
      method GetValueWrapper (line 98) | GetValueWrapper(const std::string& s) : m_token(s) {}

FILE: console/commands/coms/unused/com_access.cc
  function com_access (line 30) | int

FILE: console/commands/coms/unused/com_accounting.cc
  function com_accounting_usage (line 28) | inline int
  function com_accounting (line 45) | int

FILE: console/commands/coms/unused/com_archive.cc
  function com_archive (line 29) | int

FILE: console/commands/coms/unused/com_attr.cc
  function com_attr (line 30) | int

FILE: console/commands/coms/unused/com_backup.cc
  function com_backup (line 35) | int com_backup(char* arg1)

FILE: console/commands/coms/unused/com_cd.cc
  function com_cd (line 30) | int

FILE: console/commands/coms/unused/com_chmod.cc
  function com_chmod (line 30) | int

FILE: console/commands/coms/unused/com_chown.cc
  function com_chown (line 30) | int

FILE: console/commands/coms/unused/com_clear.cc
  function com_clear (line 31) | int

FILE: console/commands/coms/unused/com_cp.cc
  function com_cp_usage (line 36) | int
  type Protocol (line 109) | enum Protocol {
  type File_t (line 115) | struct File_t {
    method File_t (line 123) | File_t() : name(""), opaque(""), protocol(Protocol::UNKNOWN), size(0) { }
  type stat (line 130) | struct stat
  type stat (line 134) | struct stat
  function com_cp (line 141) | int
  function run_eos_command (line 1313) | int run_eos_command(const char* cmdline, std::vector<XrdOucString>& result)
  function run_command (line 1336) | int run_command(const char* cmdline, std::vector<XrdOucString>& result)
  function XrdOucString (line 1424) | XrdOucString process_symlink(XrdOucString path)
  function is_dir (line 1445) | bool is_dir(const char* path, Protocol protocol, struct stat* buf)
  function eos_roles_opaque (line 1469) | std::string
  function do_stat (line 1493) | int do_stat(const char* path, Protocol protocol, struct stat& buf)
  function check_protocol_tool (line 1592) | int check_protocol_tool(const char* path)
  function Protocol (line 1628) | Protocol get_protocol(XrdOucString path)
  function parse_debug_level (line 1683) | int parse_debug_level(XrdOucString option)
  function com_cat (line 1714) | int com_cat(char* argin)

FILE: console/commands/coms/unused/com_daemon.cc
  function com_daemon (line 52) | int

FILE: console/commands/coms/unused/com_debug.cc
  function com_debug (line 30) | int

FILE: console/commands/coms/unused/com_du.cc
  function com_du (line 33) | int
  function com_du_help (line 103) | void com_du_help()

FILE: console/commands/coms/unused/com_evict.cc
  class EvictHelper (line 34) | class EvictHelper: public ICmdHelper
    method EvictHelper (line 42) | EvictHelper(const GlobalOptions& opts):
  function com_evict (line 139) | int com_evict(char* arg)
  function com_evict_help (line 159) | void com_evict_help()

FILE: console/commands/coms/unused/com_file.cc
  function GetRemoteFmdFromLocalDb (line 49) | int
  function com_fileinfo (line 134) | int
  function com_fileinfo_help (line 194) | void com_fileinfo_help()
  function com_file (line 225) | int

FILE: console/commands/coms/unused/com_fuse.cc
  function com_fuse (line 37) | int

FILE: console/commands/coms/unused/com_fusex.cc
  function com_fusex (line 32) | int

FILE: console/commands/coms/unused/com_geosched.cc
  function com_geosched (line 34) | int

FILE: console/commands/coms/unused/com_health.cc
  function com_health (line 28) | int com_health(char* arg1)

FILE: console/commands/coms/unused/com_info.cc
  function com_info (line 29) | int

FILE: console/commands/coms/unused/com_inspector.cc
  function com_inspector (line 27) | int

FILE: console/commands/coms/unused/com_json.cc
  function com_json (line 29) | int

FILE: console/commands/coms/unused/com_license.cc
  function com_license (line 31) | int

FILE: console/commands/coms/unused/com_ln.cc
  function com_ln (line 29) | int

FILE: console/commands/coms/unused/com_map.cc
  function com_map (line 30) | int

FILE: console/commands/coms/unused/com_member.cc
  function com_member_help (line 30) | void com_member_help()
  function com_member (line 46) | int

FILE: console/commands/coms/unused/com_mkdir.cc
  function com_mkdir (line 30) | int

FILE: console/commands/coms/unused/com_motd.cc
  function com_motd (line 32) | int

FILE: console/commands/coms/unused/com_mv.cc
  function com_mv (line 29) | int

FILE: console/commands/coms/unused/com_old_find.cc
  function com_old_find (line 36) | int

FILE: console/commands/coms/unused/com_print.cc
  function com_help (line 35) | int

FILE: console/commands/coms/unused/com_proto_access.cc
  class AccessHelper (line 34) | class AccessHelper : public ICmdHelper
    method AccessHelper (line 42) | AccessHelper(const GlobalOptions& opts):
  function com_protoaccess (line 343) | int com_protoaccess(char* arg)
  function com_access_help (line 366) | void com_access_help()

FILE: console/commands/coms/unused/com_proto_acl.cc
  function com_acl (line 35) | int com_acl(char* arg)
  function com_acl_help (line 58) | void com_acl_help()

FILE: console/commands/coms/unused/com_proto_config.cc
  class ConfigHelper (line 34) | class ConfigHelper : public ICmdHelper
    method ConfigHelper (line 42) | ConfigHelper(const GlobalOptions& opts):
  function com_protoconfig (line 188) | int com_protoconfig(char* arg)
  function com_config_help (line 211) | void com_config_help()

FILE: console/commands/coms/unused/com_proto_convert.cc
  class ConvertHelper (line 34) | class ConvertHelper: public ICmdHelper
    method ConvertHelper (line 42) | ConvertHelper(const GlobalOptions& opts) : ICmdHelper(opts) {}
  function com_convert (line 264) | int com_convert(char* arg)
  function com_convert_help (line 287) | void com_convert_help()

FILE: console/commands/coms/unused/com_proto_debug.cc
  class DebugHelper (line 34) | class DebugHelper : public ICmdHelper
    method DebugHelper (line 43) | DebugHelper(const GlobalOptions& opts):
  function com_protodebug (line 120) | int
  function com_debug_help (line 144) | void com_debug_help()

FILE: console/commands/coms/unused/com_proto_devices.cc
  class DevicesHelper (line 34) | class DevicesHelper: public ICmdHelper
    method DevicesHelper (line 42) | DevicesHelper(const GlobalOptions& opts):
  function com_proto_devices (line 105) | int com_proto_devices(char* arg)
  function com_devices_help (line 126) | void com_devices_help()

FILE: console/commands/coms/unused/com_proto_df.cc
  class DfHelper (line 34) | class DfHelper : public ICmdHelper
    method DfHelper (line 43) | DfHelper(const GlobalOptions& opts):
  function com_protodf (line 119) | int
  function com_df_help (line 144) | void com_df_help()

FILE: console/commands/coms/unused/com_proto_find.cc
  function com_proto_find (line 35) | int
  function com_find_help (line 81) | void com_find_help()

FILE: console/commands/coms/unused/com_proto_fs.cc
  function com_protofs (line 33) | int com_protofs(char* arg)
  function com_fs_help (line 61) | void com_fs_help()

FILE: console/commands/coms/unused/com_proto_fsck.cc
  function com_proto_fsck (line 32) | int com_proto_fsck(char* arg)
  function com_fsck_help (line 54) | void com_fsck_help()

FILE: console/commands/coms/unused/com_proto_group.cc
  class GroupHelper (line 35) | class GroupHelper : public ICmdHelper
    method GroupHelper (line 43) | GroupHelper(const GlobalOptions& opts):
  function com_protogroup (line 149) | int com_protogroup(char* arg)
  function com_group_help (line 172) | void com_group_help()

FILE: console/commands/coms/unused/com_proto_io.cc
  class IoHelper (line 39) | class IoHelper : public ICmdHelper {
    method IoHelper (line 46) | IoHelper(const GlobalOptions& opts)
  function 
Copy disabled (too large) Download .json
Condensed preview — 2385 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (24,800K chars).
[
  {
    "path": ".clang-format",
    "chars": 2575,
    "preview": "Language: Cpp\nAccessModifierOffset: -2\nAlignAfterOpenBracket: Align\nAlignConsecutiveAssignments: false\nAlignConsecutiveD"
  },
  {
    "path": ".clang-tidy",
    "chars": 13922,
    "preview": "---\nChecks: 'clang-diagnostic-*,clang-analyzer-*,-clang-analyzer-alpha*,*,-cppcoreguidelines-pro-bounds-pointer-arithmet"
  },
  {
    "path": ".codeclimate.yml",
    "chars": 39,
    "preview": "plugins:\n  cppcheck:\n    enabled: true\n"
  },
  {
    "path": ".ctest/config.cmake",
    "chars": 235,
    "preview": "# This file is meant to contain set commands for options\n# you'd normally set at configuration when calling CMake.\n\n# Fo"
  },
  {
    "path": ".git-blame-ignore-revs",
    "chars": 957,
    "preview": "# This file contains a list of commits that should be ignored by some git commands including `git blame`.\n# You may need"
  },
  {
    "path": ".gitignore",
    "chars": 832,
    "preview": "*.lo\n*.o\n*.la\n*.pyc\n.libs\n.deps\nMakefile\nMakefile.in\nConsole/eos\nconsole/iam.cfg\nXrdMqOfs/xrdmqclientmaster\nXrdMqOfs/xrd"
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 50500,
    "preview": "# ************************************************************************\n# * EOS - the CERN Disk Storage System       "
  },
  {
    "path": ".gitmodules",
    "chars": 1507,
    "preview": "[submodule \"namespace/ns_quarkdb/qclient\"]\n\tpath = namespace/ns_quarkdb/qclient\n\turl = https://gitlab.cern.ch/eos/qclien"
  },
  {
    "path": ".ignore",
    "chars": 106,
    "preview": "unit_tests/googletest/\ncommon/fmt/\nnamespace/ns_quarkdb/qclient/src/fmt/\ncommon/sqlite/\nman/man1/\n.vscode\n"
  },
  {
    "path": ".mailmap",
    "chars": 3705,
    "preview": "Abhishek Lekshmanan <abhishek.lekshmanan@cern.ch> <abhi@pcitstmbpabhi.dyndns.cern.ch>\nAbhishek Lekshmanan <abhishek.leks"
  },
  {
    "path": ".pre-commit-config.yaml",
    "chars": 1197,
    "preview": "fail_fast: false\nrepos:\n  - repo: https://github.com/pre-commit/pre-commit-hooks\n    rev: v6.0.0\n    hooks:\n      - id: "
  },
  {
    "path": "AUDIT.md",
    "chars": 10622,
    "preview": "## EOS Audit Logging\n\n### Overview\n\nEOS implements structured audit logging for successful operations that modify the na"
  },
  {
    "path": "ApMon/AUTHORS",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ApMon/COPYING",
    "chars": 17992,
    "preview": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc."
  },
  {
    "path": "ApMon/ChangeLog",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ApMon/INSTALL",
    "chars": 9273,
    "preview": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004 Free\nS"
  },
  {
    "path": "ApMon/Makefile",
    "chars": 2087,
    "preview": "SPECFILE = $(shell find . -maxdepth 1 -type f -name '*.spec' )\nDIST    ?= $(shell rpm --eval %{dist})\nRPMBUILD = $(shell"
  },
  {
    "path": "ApMon/NEWS",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ApMon/README",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "ApMon/eos-apmon.spec",
    "chars": 2028,
    "preview": "%{!?perl_sitearch: %define perl_sitearch %(eval \"`%{__perl} -V:installsitearch`\"; echo $installsitearch)}\n%define _unpac"
  },
  {
    "path": "ApMon/etc/logrotate.d/eosapmond",
    "chars": 153,
    "preview": "/var/log/eos/apmon/apmon.log {\n\tmissingok\n\tdaily\n        copytruncate\n        create 755 root root\n        dateext\n     "
  },
  {
    "path": "ApMon/jenkins-build.sh",
    "chars": 6306,
    "preview": "#!/bin/bash\n#-------------------------------------------------------------------------------\n# @author Elvin-Alin Sindri"
  },
  {
    "path": "ApMon/maketar.sh",
    "chars": 404,
    "preview": "#!/bin/sh\n\n# Extract package related information\nspecfile=`find . -maxdepth 1 -name '*.spec' -type f`\nname=`awk '$1 == \""
  },
  {
    "path": "ApMon/opt/eos/apmon/eosapmond",
    "chars": 1128,
    "preview": "#!/usr/bin/perl\n# apmonpl <MONALISAHOST> <LOGFILE> <APMONLOGLEVEL> <NODES-NAME> <HOST-NAME> <XRD-PID>\n\nif (@ARGV != 6) {"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon/BgMonitor.pm",
    "chars": 8502,
    "preview": "package ApMon::BgMonitor;\n\nuse strict;\nuse warnings;\n\nuse ApMon::Common qw(logger);\nuse ApMon::ProcInfo;\nuse Data::Dumpe"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon/Common.pm",
    "chars": 16433,
    "preview": "package ApMon::Common;\n\nuse strict;\nuse warnings;\n\nrequire Exporter;\nuse Carp qw(cluck);\nuse Socket;\nuse ApMon::XDRUtils"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon/ConfigLoader.pm",
    "chars": 12701,
    "preview": "package ApMon::ConfigLoader;\n\nuse strict;\nuse warnings;\n\nuse ApMon::Common qw(logger $APMON_DEFAULT_PORT %defaultOptions"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon/ProcInfo.pm",
    "chars": 35778,
    "preview": "package ApMon::ProcInfo;\n\nuse strict;\nuse warnings;\n\nuse ApMon::Common qw(logger);\nuse Data::Dumper;\nuse Net::Domain;\nus"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon/XDRUtils.pm",
    "chars": 2030,
    "preview": "package ApMon::XDRUtils;\n\nuse strict;\nuse warnings;\n\nmy $XDR_STRING = 0;\nmy $XDR_INT32 = 2;\nmy $XDR_REAL64 = 5;\n\nmy $MAX"
  },
  {
    "path": "ApMon/perl/ApMon/ApMon.pm",
    "chars": 18827,
    "preview": "=head1 NAME\n\nApMon - Perl extension for sending application information to MonALISA services.\n\n=head1 SYNOPSIS\n\n  use Ap"
  },
  {
    "path": "ApMon/perl/ApMon/sendToML.sh",
    "chars": 1430,
    "preview": "#!/bin/bash\n\n# Sample shell script that sends the given parameters to the ML service \n# running on the same machine usin"
  },
  {
    "path": "ApMon/perl/ApMon/servMon.sh",
    "chars": 3496,
    "preview": "#!/bin/bash\n\n# Sample shell script that provides host (and services) monitoring with ApMon.\n#\n# 2007-06-07\n# Catalin.Cir"
  },
  {
    "path": "ApMon/run.sh",
    "chars": 824,
    "preview": "#!/bin/sh\n\n[ -f /etc/sysconfig/eos ] && . /etc/sysconfig/eos\n[ -f /etc/sysconfig/eos_env ] && . /etc/sysconfig/eos_env\n\n"
  },
  {
    "path": "ApMon/usr/lib/systemd/system/eosapmond.service",
    "chars": 404,
    "preview": "# systemd service unit file for eosapmond\n# Author: Gianmaria Del Monte <gianmaria.del.monte@cern.ch>\n# Description: Sys"
  },
  {
    "path": "CMakeLists.txt",
    "chars": 10163,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Andreas-Joachi"
  },
  {
    "path": "CTestConfig.cmake",
    "chars": 173,
    "preview": "set(CTEST_PROJECT_NAME \"EOS\")\nset(CTEST_NIGHTLY_START_TIME \"00:00:00 UTC\")\nset(CTEST_DROP_SITE_CDASH TRUE)\nset(CTEST_SUB"
  },
  {
    "path": "License",
    "chars": 71923,
    "preview": "//                     GNU GENERAL PUBLIC LICENSE\n//                        Version 3, 29 June 2007\n// \n//  Copyright (C"
  },
  {
    "path": "README.md",
    "chars": 7098,
    "preview": "[![build status](https://gitlab.cern.ch/dss/eos/badges/master/build.svg)](https://gitlab.cern.ch/dss/eos/commits/master)"
  },
  {
    "path": "archive/CMakeLists.txt",
    "chars": 2571,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "archive/eosarch/__init__.py",
    "chars": 1449,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: __init__.py\n"
  },
  {
    "path": "archive/eosarch/archivefile.py",
    "chars": 25816,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: archivefile."
  },
  {
    "path": "archive/eosarch/asynchandler.py",
    "chars": 4850,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: asynchandler"
  },
  {
    "path": "archive/eosarch/configuration.py",
    "chars": 7505,
    "preview": "# ------------------------------------------------------------------------------\n# File: configuration.py\n# Author: Elvi"
  },
  {
    "path": "archive/eosarch/exceptions.py",
    "chars": 1622,
    "preview": "# ------------------------------------------------------------------------------\n# File: exceptions.py\n# Author: Elvin-A"
  },
  {
    "path": "archive/eosarch/processinfo.py",
    "chars": 5283,
    "preview": "# ------------------------------------------------------------------------------\n# File: processinfo.py\n# Author: Elvin-"
  },
  {
    "path": "archive/eosarch/tests/__init__.py",
    "chars": 1107,
    "preview": "# ------------------------------------------------------------------------------\n# File: __init__.py\n# Author: Elvin-Ali"
  },
  {
    "path": "archive/eosarch/tests/env.py",
    "chars": 1187,
    "preview": "# ------------------------------------------------------------------------------\n# File: env.py\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "archive/eosarch/tests/test_archivefile.py",
    "chars": 3974,
    "preview": "# ------------------------------------------------------------------------------\n# File: test_archivefile.py\n# Author: E"
  },
  {
    "path": "archive/eosarch/transfer.py",
    "chars": 48906,
    "preview": "# ------------------------------------------------------------------------------\n# File: tranfer.py\n# Author: Elvin-Alin"
  },
  {
    "path": "archive/eosarch/utils.py",
    "chars": 11607,
    "preview": "# ------------------------------------------------------------------------------\n# File: utils.py\n# Author: Elvin-Alin S"
  },
  {
    "path": "archive/eosarch_reconstruct.py",
    "chars": 15526,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: eosarch_reco"
  },
  {
    "path": "archive/eosarch_run.py",
    "chars": 2988,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: eosarch_run."
  },
  {
    "path": "archive/eosarchived.conf",
    "chars": 2274,
    "preview": "# ------------------------------------------------------------------------------\n# File: eosarchiverd.conf\n# Author: Elv"
  },
  {
    "path": "archive/eosarchived.py",
    "chars": 16619,
    "preview": "#!/usr/bin/python3\n# ------------------------------------------------------------------------------\n# File: eosarchived."
  },
  {
    "path": "archive/eosarchived.service",
    "chars": 1884,
    "preview": "# ----------------------------------------------------------------------\n# File: eosarchived.service\n# Author: Elvin Sin"
  },
  {
    "path": "archive/eosarchived_env.sysconfig",
    "chars": 943,
    "preview": "# Options for the eosarchived daemon\n# EOSARCHIVED_OPTIONS=\n\n# Enable core dumping\nDAEMON_COREFILE_LIMIT=\"unlimited\"\n\n# "
  },
  {
    "path": "archive/opt-eos-xrootd.pth",
    "chars": 46,
    "preview": "/opt/eos/xrootd/lib64/python3.6/site-packages/"
  },
  {
    "path": "auth_plugin/CMakeLists.txt",
    "chars": 5927,
    "preview": "#-------------------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-"
  },
  {
    "path": "auth_plugin/EosAuthOfs.cc",
    "chars": 40992,
    "preview": "//------------------------------------------------------------------------------\n// File: EosAuthOfs.cc\n// Author: Elvin"
  },
  {
    "path": "auth_plugin/EosAuthOfs.hh",
    "chars": 13646,
    "preview": "// -----------------------------------------------------------------------------\n// File: EosAuthOfs.hh\n// Author: Elvin"
  },
  {
    "path": "auth_plugin/EosAuthOfsDirectory.cc",
    "chars": 7949,
    "preview": "//------------------------------------------------------------------------------\n// File: EosAuthOfsDirectory.cc\n// Auth"
  },
  {
    "path": "auth_plugin/EosAuthOfsDirectory.hh",
    "chars": 3968,
    "preview": "//------------------------------------------------------------------------------\n// File: EosAuthOfsDirectory.hh\n// Auth"
  },
  {
    "path": "auth_plugin/EosAuthOfsFile.cc",
    "chars": 15529,
    "preview": "//------------------------------------------------------------------------------\n// File: EosAuthOfsFile.cc\n// Author: E"
  },
  {
    "path": "auth_plugin/EosAuthOfsFile.hh",
    "chars": 7732,
    "preview": "//------------------------------------------------------------------------------\n// File: EosAuthOfsFile.hh\n// Author: E"
  },
  {
    "path": "auth_plugin/Namespace.hh",
    "chars": 1673,
    "preview": "//------------------------------------------------------------------------------\n// File: Namespace.hh\n// Author: Elvin-"
  },
  {
    "path": "auth_plugin/ProtoUtils.cc",
    "chars": 30495,
    "preview": "//------------------------------------------------------------------------------\n// File: ProtoUtils.cc\n// Author: Elvin"
  },
  {
    "path": "auth_plugin/ProtoUtils.hh",
    "chars": 19693,
    "preview": "//------------------------------------------------------------------------------\n// File: ProtoUtils.hh\n// Author: Elvin"
  },
  {
    "path": "auth_plugin/proto/Chksum.proto",
    "chars": 544,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Chmod.proto",
    "chars": 511,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/DirClose.proto",
    "chars": 357,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/DirFname.proto",
    "chars": 357,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/DirOpen.proto",
    "chars": 692,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdSecEntity.proto\";\n\n//--------------------------------------------------"
  },
  {
    "path": "auth_plugin/proto/DirRead.proto",
    "chars": 355,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/Exists.proto",
    "chars": 471,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/FS_ctl.proto",
    "chars": 536,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\nimport \"XrdSfsFSctl.pro"
  },
  {
    "path": "auth_plugin/proto/FileClose.proto",
    "chars": 362,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/FileFname.proto",
    "chars": 359,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/FileOpen.proto",
    "chars": 760,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdSecEntity.proto\";\n\n//--------------------------------------------------"
  },
  {
    "path": "auth_plugin/proto/FileRead.proto",
    "chars": 421,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/FileStat.proto",
    "chars": 360,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/FileWrite.proto",
    "chars": 453,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/Fsctl.proto",
    "chars": 498,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/GetStats.proto",
    "chars": 283,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/Mkdir.proto",
    "chars": 508,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Prepare.proto",
    "chars": 477,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\nimport \"XrdSfsPrep.prot"
  },
  {
    "path": "auth_plugin/proto/Rem.proto",
    "chars": 477,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Remdir.proto",
    "chars": 483,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Rename.proto",
    "chars": 564,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Request.proto",
    "chars": 2644,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"Stat.proto\";\nimport \"Fsctl.proto\";\nimport \"FS_ctl.proto\";\nimport \"Chmod.pr"
  },
  {
    "path": "auth_plugin/proto/Response.proto",
    "chars": 460,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\n\n//-------------------------------------------------"
  },
  {
    "path": "auth_plugin/proto/Stat.proto",
    "chars": 509,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/Truncate.proto",
    "chars": 520,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\nimport \"XrdOucErrInfo.proto\";\nimport \"XrdSecEntity.proto\";\n\n//--------------------"
  },
  {
    "path": "auth_plugin/proto/XrdOucErrInfo.proto",
    "chars": 392,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/XrdSecEntity.proto",
    "chars": 986,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/XrdSfsFSctl.proto",
    "chars": 473,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "auth_plugin/proto/XrdSfsPrep.proto",
    "chars": 426,
    "preview": "syntax = \"proto2\";\npackage eos.auth;\n\n//------------------------------------------------------------------------------\n/"
  },
  {
    "path": "client/CMakeLists.txt",
    "chars": 4061,
    "preview": "#-------------------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Andrea"
  },
  {
    "path": "client/Namespace.hh",
    "chars": 1714,
    "preview": "// ----------------------------------------------------------------------\n// File: Namespace.hh\n// Author: Andreas-Joach"
  },
  {
    "path": "client/grpc/Find.cc",
    "chars": 5877,
    "preview": "#include <string>\n#include <iostream>\n#include \"client/grpc/GrpcClient.hh\"\n#include <stdio.h>\n#include \"common/StringCon"
  },
  {
    "path": "client/grpc/GrpcClient.cc",
    "chars": 23068,
    "preview": "// ----------------------------------------------------------------------\n// File: GrpccLIENT.cc\n// Author: Andreas-Joac"
  },
  {
    "path": "client/grpc/GrpcClient.hh",
    "chars": 3408,
    "preview": "// ----------------------------------------------------------------------\n// File: GrpcClient.hh\n// Author: Andreas-Joac"
  },
  {
    "path": "client/grpc/GrpcClientAuthProcessor.hh",
    "chars": 4203,
    "preview": "// ----------------------------------------------------------------------\n// File: GrpcClientAuthProcessor.hh\n// Author:"
  },
  {
    "path": "client/grpc/Insert.cc",
    "chars": 5015,
    "preview": "#include <string>\n#include <iostream>\n#include <fstream>\n#include \"client/grpc/GrpcClient.hh\"\n#include <stdio.h>\n#includ"
  },
  {
    "path": "client/grpc/Md.cc",
    "chars": 2821,
    "preview": "#include <string>\n#include <iostream>\n#include \"client/grpc/GrpcClient.hh\"\n#include <stdio.h>\n#include \"common/StringCon"
  },
  {
    "path": "client/grpc/Ns.cc",
    "chars": 20225,
    "preview": "#include <string>\n#include <iostream>\n#include \"client/grpc/GrpcClient.hh\"\n#include <stdio.h>\n#include \"common/StringCon"
  },
  {
    "path": "client/grpc/NsStat.cc",
    "chars": 4862,
    "preview": "/************************************************************************\n * EOS - the CERN Disk Storage System         "
  },
  {
    "path": "client/grpc/Ping.cc",
    "chars": 3705,
    "preview": "#include <string>\n#include <iostream>\n#include \"client/grpc/GrpcClient.hh\"\n#include <stdio.h>\n#include \"common/StringCon"
  },
  {
    "path": "cmake/CPUArchFlags.cmake",
    "chars": 2964,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Abhishek Leksh"
  },
  {
    "path": "cmake/DownloadProject.CMakeLists.cmake.in",
    "chars": 662,
    "preview": "# Distributed under the OSI-approved MIT License.  See accompanying\n# file LICENSE or https://github.com/Crascit/Downloa"
  },
  {
    "path": "cmake/DownloadProject.cmake",
    "chars": 8043,
    "preview": "# Distributed under the OSI-approved MIT License.  See accompanying\n# file LICENSE or https://github.com/Crascit/Downloa"
  },
  {
    "path": "cmake/EosCompileFlags.cmake",
    "chars": 5257,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Mihai Patrasco"
  },
  {
    "path": "cmake/EosCoverage.cmake",
    "chars": 4834,
    "preview": "# ----------------------------------------------------------------------\n# File: EosCoverage.cmake\n# Author: Mihai Patra"
  },
  {
    "path": "cmake/EosFindLibs.cmake",
    "chars": 9183,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "cmake/EosGraphviz.cmake",
    "chars": 2368,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "cmake/EosOSDefaults.cmake",
    "chars": 2883,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "cmake/EosSummary.cmake",
    "chars": 3614,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "cmake/EosTui.cmake",
    "chars": 1977,
    "preview": "# ----------------------------------------------------------------------\n# EOS TUI packaging helpers\n# -----------------"
  },
  {
    "path": "cmake/EosTuiInstall.cmake.in",
    "chars": 863,
    "preview": "# ----------------------------------------------------------------------\n# EOS TUI install helpers\n# -------------------"
  },
  {
    "path": "cmake/EosUtils.cmake",
    "chars": 6021,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Andreas-Joachi"
  },
  {
    "path": "cmake/FindActiveMQCPP.cmake",
    "chars": 955,
    "preview": "# FindActiveMQCPP.cmake\n\n# Locate the header\nfind_path(ACTIVEMQCPP_INCLUDE_DIR\n    NAMES cms/Connection.h\n    PATH_SUFFI"
  },
  {
    "path": "cmake/FindAtomic.cmake",
    "chars": 753,
    "preview": "# Try to find libatmoic\n# Once done, this will define\n#\n# ATOMIC_FOUND        - system has libatomic\n# ATOMIC_LIBRARIES "
  },
  {
    "path": "cmake/FindEosGrpcGateway.cmake",
    "chars": 1493,
    "preview": "# Try to find eos-grpc-gateway library and header files\n# Once done, this will define\n#\n# EosGrpcGateway_FOUND          "
  },
  {
    "path": "cmake/FindGRPC.cmake",
    "chars": 6235,
    "preview": "#\n# Locate and configure the GRPC library\n#\n# Adds the following targets:\n#\n#  GRPC::grpc - GRPC library\n#  GRPC::grpc++"
  },
  {
    "path": "cmake/FindGlobus.cmake",
    "chars": 1619,
    "preview": "# - Locate Globus libraries\n# Defines:\n#\n#  GLOBUS_FOUND\n#  GLOBUS_INCLUDE_DIR\n#  GLOBUS_INCLUDE_DIRS (not cached)\n#  GL"
  },
  {
    "path": "cmake/FindLibevent.cmake",
    "chars": 1344,
    "preview": "# Try to find libevent\n# Once done, this will define\n#\n# LIBEVENT_FOUND        - system has libevent\n# LIBEVENT_INCLUDE_"
  },
  {
    "path": "cmake/FindProtobuf3.cmake",
    "chars": 2757,
    "preview": "# Try to find PROTOBUF3\n# Once done, this will define\n#\n# PROTOBUF3_FOUND               - system has Protobuf3\n# PROTOBU"
  },
  {
    "path": "cmake/FindPythonSitePkg.cmake",
    "chars": 1680,
    "preview": "# Try to find python\n# Once done, this will define\n#\n# PYTHONSITEPKG_FOUND - found python site packages directory\n# PYTH"
  },
  {
    "path": "cmake/FindRocksDB.cmake",
    "chars": 2006,
    "preview": "# Try to find rocksdb\n# Once done, this will define\n#\n# ROCKSDB_FOUND              - system has rocksdb\n#\n# and the foll"
  },
  {
    "path": "cmake/FindScitokens.cmake",
    "chars": 1168,
    "preview": "# Try to find scitokens\n# Once done, this will define\n#\n# SCITOKENS_FOUND          - system has scitokens\n# SCITOKENS_IN"
  },
  {
    "path": "cmake/FindSnappy.cmake",
    "chars": 837,
    "preview": "# - Find Snappy\n# Find the snappy compression library and includes\n#\n# Snappy_INCLUDE_DIRS - where to find snappy.h, etc"
  },
  {
    "path": "cmake/FindSparseHash.cmake",
    "chars": 835,
    "preview": "# Try to find SparseHash\n# Once done, this will define\n#\n# SPARSEHASH_FOUND        - system has SparseHash\n# SPARSEHASH_"
  },
  {
    "path": "cmake/FindSphinx.cmake",
    "chars": 449,
    "preview": "# Try to find then sphinx executable\n# Once done, this will define\n#\n# SPHINX_FOUND      - system has Sphinx\n# SPHINX_EX"
  },
  {
    "path": "cmake/FindXRootD.cmake",
    "chars": 6450,
    "preview": "# Try to find XROOTD\n# Once done, this will define\n#\n# XROOTD_FOUND               - system has XRootD\n# XROOTD_INCLUDE_D"
  },
  {
    "path": "cmake/FindZMQ.cmake",
    "chars": 1522,
    "preview": "# Try to find ZMQ\n# Once done, this will define\n#\n#  ZMQ_FOUND           - system has ZMQ\n#  ZMQ_INCLUDE_DIRS    - ZMQ i"
  },
  {
    "path": "cmake/Findabsl.cmake",
    "chars": 2260,
    "preview": "# Try to find abseil library\n# Once done, this will define\n#\n# ABSL_FOUND          - system has absl library\n# ABSL_INCL"
  },
  {
    "path": "cmake/Findbz2.cmake",
    "chars": 836,
    "preview": "# Try to find bz2\n# Once done, this will define\n#\n# BZ2_FOUND          - system has bz2\n# BZ2_INCLUDE_DIRS   - bz2 inclu"
  },
  {
    "path": "cmake/Finddavix.cmake",
    "chars": 1033,
    "preview": "# - Locate DAVIX library\n# Defines:\n#\n# DAVIX_FOUND         -  system has davix\n#\n# and the following imported targets\n#"
  },
  {
    "path": "cmake/Findeosfolly.cmake",
    "chars": 1552,
    "preview": "# Try to find eos folly.\n# Once done, this will define\n#\n# EOS_FOLLY_FOUND            - system has eos-folly\n# EOS_FOLLY"
  },
  {
    "path": "cmake/Findfuse.cmake",
    "chars": 1851,
    "preview": "# Try to find fuse (devel)\n# Once done, this will define\n#\n# FUSE_FOUND        - system has fuse\n# FUSE_INCLUDE_DIRS - f"
  },
  {
    "path": "cmake/Findfuse3.cmake",
    "chars": 972,
    "preview": "# Try to find fuse (devel)\n# Once done, this will define\n#\n# FUSE3_FOUND - system has fuse\n#\n# and the following importe"
  },
  {
    "path": "cmake/Findglibc.cmake",
    "chars": 1224,
    "preview": "# Try to find glibc-devel\n# Once done, this will define\n#\n# GLIBC_FOUND      - system has glibc-devel\n# and the followin"
  },
  {
    "path": "cmake/Findhelp2man.cmake",
    "chars": 405,
    "preview": "# Locate help2man executable\n# Defines:\n#\n#  HELP2MAN_FOUND        -  system has help2man\n#  HELP2MAN_EXECUTABLE   -  he"
  },
  {
    "path": "cmake/Findisal.cmake",
    "chars": 1133,
    "preview": "# Try to find libisa-l (devel)\n# Once done, this will define\n#\n# ISAL_FOUND          - system has isa-l\n# ISAL_INCLUDE_D"
  },
  {
    "path": "cmake/Findisal_crypto.cmake",
    "chars": 1391,
    "preview": "# Try to find libisa-l_crypto (devel)\n# Once done, this will define\n#\n# ISALCRYPTO_FOUND          - system has isa-l_cry"
  },
  {
    "path": "cmake/Findjemalloc.cmake",
    "chars": 1184,
    "preview": "# Try to find jemalloc\n# Once done, this will define\n#\n# JEMALLOC_FOUND          - system has jemalloc\n# JEMALLOC_INCLUD"
  },
  {
    "path": "cmake/Findjsoncpp.cmake",
    "chars": 1221,
    "preview": "# Try to find libjsoncpp\n# Once done, this will define\n#\n# JSONCPP_FOUND         - system has jsoncpp\n# JSONCPP_INCLUDE_"
  },
  {
    "path": "cmake/Findkrb5.cmake",
    "chars": 1416,
    "preview": "#  Try to find Kerberos5\n#  Check for libkrb5.a\n#\n#  KRB5_FOUND       - True if Kerberos 5 libraries found.\n#  KRB5_INCL"
  },
  {
    "path": "cmake/Findldap.cmake",
    "chars": 922,
    "preview": "# Try to find attr\n# Once done, this will define\n#\n# LDAP_FOUND        - system has libldap\n# LDAP_INCLUDE_DIRS - ldap i"
  },
  {
    "path": "cmake/Findlibbfd.cmake",
    "chars": 1488,
    "preview": "# Try to find libbfd\n# Once done, this will define\n#\n# LIBBFD_FOUND               - system has libbfd\n# LIBBFD_INCLUDE_D"
  },
  {
    "path": "cmake/Findlibproc2.cmake",
    "chars": 3169,
    "preview": "#.rst:\n# Findlibproc2\n# -------\n#\n# Find libproc2 from procps 4.x.\n#\n# Imported Targets\n# ^^^^^^^^^^^^^^^^\n#\n# This modu"
  },
  {
    "path": "cmake/Findlibunwind.cmake",
    "chars": 2015,
    "preview": "# Find the libunwind library\n#\n#  LIBUNWIND_FOUND       - True if libunwind was found.\n#  LIBUNWIND_LIBRARIES   - The li"
  },
  {
    "path": "cmake/Findlz4.cmake",
    "chars": 683,
    "preview": "# Try to find lz4\n# Once done, this will define\n#\n# LZ4_FOUND          - system has bz2\n# LZ4_INCLUDE_DIRS   - bz2 inclu"
  },
  {
    "path": "cmake/Findncurses.cmake",
    "chars": 1330,
    "preview": "# Try to find libncurses\n# Once done, this will define\n#\n# NCURSES_FOUND           - system has libncurses\n# NCURSES_INC"
  },
  {
    "path": "cmake/Findnfs.cmake",
    "chars": 969,
    "preview": "# - Locate NFS library\n# Defines:\n#\n# NFS_FOUND         -  system has libnfs\n#\n# and the following imported targets\n#\n# "
  },
  {
    "path": "cmake/Findprocps.cmake",
    "chars": 1201,
    "preview": "# Try to find procps\n# Once done, this will define\n#\n# PROCPS_FOUND        - system has uuid\n# PROCPS_INCLUDE_DIRS - uui"
  },
  {
    "path": "cmake/Findreadline.cmake",
    "chars": 1057,
    "preview": "# Try to find libreadline\n# Once done, this will define\n#\n# READLINE_FOUND        - system has readline\n# READLINE_INCLU"
  },
  {
    "path": "cmake/Finduuid.cmake",
    "chars": 1199,
    "preview": "# Try to find uuid\n# Once done, this will define\n#\n# UUID_FOUND        - system has uuid\n# UUID_INCLUDE_DIRS - uuid incl"
  },
  {
    "path": "cmake/Findxfs.cmake",
    "chars": 671,
    "preview": "# Try to find xfs\n# Once done, this will define\n#\n# XFS_FOUND        - system has xfs\n# XFS_INCLUDE_DIRS - xfs include d"
  },
  {
    "path": "cmake/Findxxhash.cmake",
    "chars": 1203,
    "preview": "# Try to find libxxhash (devel)\n# Once done, this will define\n#\n# XXHASH_FOUND          - system nhas xxhash\n# XXHASH_IN"
  },
  {
    "path": "cmake/Findzstd.cmake",
    "chars": 634,
    "preview": "# Try to find zstd\n# Once done, this will define\n#\n# ZSTD_FOUND          - system has zstd\n# ZSTD_LIBRARIES      - zstd "
  },
  {
    "path": "cmake/cmake_uninstall.cmake.in",
    "chars": 1130,
    "preview": "IF(NOT EXISTS \"@CMAKE_CURRENT_BINARY_DIR@/install_manifest.txt\")\n  MESSAGE(FATAL_ERROR \"Cannot find install manifest: \\\""
  },
  {
    "path": "cmake/config_spec.cmake.in",
    "chars": 1806,
    "preview": "# ----------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Elvin-Alin Sin"
  },
  {
    "path": "common/Assert.hh",
    "chars": 1942,
    "preview": "// ----------------------------------------------------------------------\n// File: Assert.hh\n// Author: Georgios Bitzers"
  },
  {
    "path": "common/AssistedThread.hh",
    "chars": 9059,
    "preview": "// ----------------------------------------------------------------------\n// File: AssistedThread.hh\n// Author: Georgios"
  },
  {
    "path": "common/Audit.cc",
    "chars": 12912,
    "preview": "// ----------------------------------------------------------------------\n// File: Audit.cc\n// Author: EOS Team - CERN\n/"
  },
  {
    "path": "common/Audit.hh",
    "chars": 5849,
    "preview": "// ----------------------------------------------------------------------\n// File: Audit.hh\n// Author: EOS Team - CERN\n/"
  },
  {
    "path": "common/BehaviourConfig.cc",
    "chars": 5267,
    "preview": "//------------------------------------------------------------------------------\n//! @file BehaviourConfig.cc\n//--------"
  },
  {
    "path": "common/BehaviourConfig.hh",
    "chars": 5385,
    "preview": "//------------------------------------------------------------------------------\n//! @file BehaviourConfig.hh\n//--------"
  },
  {
    "path": "common/BufferManager.cc",
    "chars": 3056,
    "preview": "//------------------------------------------------------------------------------\n//! @file BufferManager.cc\n//! @author "
  },
  {
    "path": "common/BufferManager.hh",
    "chars": 15195,
    "preview": "//------------------------------------------------------------------------------\n//! @file BufferManager.hh\n//! @author "
  },
  {
    "path": "common/CLI11.hpp",
    "chars": 245337,
    "preview": "#pragma once\n\n// CLI11: Version 1.8.0\n// Originally designed by Henry Schreiner\n// https://github.com/CLIUtils/CLI11\n//\n"
  },
  {
    "path": "common/CMakeLists.txt",
    "chars": 12862,
    "preview": "#-------------------------------------------------------------------------------\n# File: CMakeLists.txt\n# Author: Andrea"
  },
  {
    "path": "common/CloExec.hh",
    "chars": 2572,
    "preview": "// ----------------------------------------------------------------------\n// File: CloExec.hh\n// Author: Andreas-Joachim"
  },
  {
    "path": "common/ClockGetTime.cc",
    "chars": 2076,
    "preview": "//------------------------------------------------------------------------------\n//! @file ClockGetTime.cc\n//-----------"
  },
  {
    "path": "common/ClockGetTime.hh",
    "chars": 1807,
    "preview": "//------------------------------------------------------------------------------\n//! @file ClockGetTime.hh\n//-----------"
  },
  {
    "path": "common/CommentLog.cc",
    "chars": 4849,
    "preview": "// ----------------------------------------------------------------------\n// File: CommentLog.cc\n// Author: Andreas-Joac"
  },
  {
    "path": "common/CommentLog.hh",
    "chars": 3592,
    "preview": "// ----------------------------------------------------------------------\n// File: CommentLog.hh\n// Author: Andreas-Joac"
  },
  {
    "path": "common/ConcurrentQueue.hh",
    "chars": 6175,
    "preview": "// ----------------------------------------------------------------------\n//! @file ConcurrentQueue.hh\n//! @author Elvin"
  },
  {
    "path": "common/Config.cc",
    "chars": 6155,
    "preview": "//------------------------------------------------------------------------------\n//! @file Config.cc\n//! @author Andreas"
  },
  {
    "path": "common/Config.hh",
    "chars": 8973,
    "preview": "// ----------------------------------------------------------------------\n// File: Config.hh\n// Author: Andreas-Joachim "
  },
  {
    "path": "common/Constants.hh",
    "chars": 5735,
    "preview": "//------------------------------------------------------------------------------\n// File: Constants.hh\n// Author: Jozsef"
  },
  {
    "path": "common/CopyProcess.hh",
    "chars": 3570,
    "preview": "// ----------------------------------------------------------------------\n// File: CopyProcess.hh\n// Author: Andreas-Joa"
  },
  {
    "path": "common/Counter.hh",
    "chars": 3108,
    "preview": "// ----------------------------------------------------------------------\n// File: Counter.hh\n// Author: Abhishek Lekshm"
  },
  {
    "path": "common/CtaCommon.hh",
    "chars": 3967,
    "preview": "//-----------------------------------------------------------------------\n//! @file CtaCommon.hh\n//! @author Michael Dav"
  },
  {
    "path": "common/DBG.hh",
    "chars": 14287,
    "preview": "/*****************************************************************************\n\n                                dbg(...)"
  },
  {
    "path": "common/Definitions.hh",
    "chars": 2188,
    "preview": "//------------------------------------------------------------------------------\n//! @file Definitions.hh\n//! @author El"
  },
  {
    "path": "common/EosLayoutPrint.cc",
    "chars": 2623,
    "preview": "//------------------------------------------------------------------------------\n//! @file EosLayoutPrint.cc\n//! @author"
  },
  {
    "path": "common/ErrnoToString.cc",
    "chars": 2603,
    "preview": "//------------------------------------------------------------------------------\n//! @file Strerror_wrapper.cc\n//! @auth"
  },
  {
    "path": "common/ErrnoToString.hh",
    "chars": 1927,
    "preview": "//------------------------------------------------------------------------------\n//! @file Strerror_wrapper.hh\n//! @auth"
  },
  {
    "path": "common/ExpiryCache.hh",
    "chars": 6722,
    "preview": "// ----------------------------------------------------------------------\n// File: common/ExpiryCache.cc\n// Author: Jozs"
  },
  {
    "path": "common/FileId.hh",
    "chars": 7439,
    "preview": "// ----------------------------------------------------------------------\n// File: FileId.hh\n// Author: Andreas-Joachim "
  },
  {
    "path": "common/FileMap.hh",
    "chars": 6970,
    "preview": "// ----------------------------------------------------------------------\n// File: FileMap.hh\n// Author: Andreas-Joachim"
  },
  {
    "path": "common/FileSystem.cc",
    "chars": 43674,
    "preview": "//------------------------------------------------------------------------------\n// File: FileSystem.cc\n// Author: Andre"
  },
  {
    "path": "common/FileSystem.hh",
    "chars": 33199,
    "preview": "//------------------------------------------------------------------------------\n// File: FileSystem.hh\n// Author: Andre"
  },
  {
    "path": "common/Fmd.cc",
    "chars": 15268,
    "preview": "/************************************************************************\n * EOS - the CERN Disk Storage System         "
  },
  {
    "path": "common/Fmd.hh",
    "chars": 8515,
    "preview": "/************************************************************************\n * EOS - the CERN Disk Storage System         "
  },
  {
    "path": "common/FutureWrapper.hh",
    "chars": 5862,
    "preview": "//------------------------------------------------------------------------------\n// File: FutureWrapper.hh\n// Author: Ge"
  },
  {
    "path": "common/Glob.cc",
    "chars": 1807,
    "preview": "// ----------------------------------------------------------------------\n// File: Glob.cc\n// Author: Andreas-Joachim Pe"
  },
  {
    "path": "common/Glob.hh",
    "chars": 4443,
    "preview": "// ----------------------------------------------------------------------\n// File: Glob.hh\n// Author: Andreas-Joachim Pe"
  },
  {
    "path": "common/IRWMutex.hh",
    "chars": 4238,
    "preview": "//------------------------------------------------------------------------------\n// File: IRWMutex.hh\n//----------------"
  }
]

// ... and 2185 more files (download for full content)

About this extraction

This page contains the full source code of the cern-eos/eos GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 2385 files (100.5 MB), approximately 6.1M tokens, and a symbol index with 9990 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!