Full Code of happyfish100/FastCFS for AI

master e7d609e56cba cached
261 files
1.5 MB
424.8k tokens
1651 symbols
1 requests
Download .txt
Showing preview only (1,635K chars total). Download the full file or copy to clipboard to get everything.
Repository: happyfish100/FastCFS
Branch: master
Commit: e7d609e56cba
Files: 261
Total size: 1.5 MB

Directory structure:
gitextract_24sao1go/

├── .gitignore
├── FastCFS-auth.spec.in
├── FastCFS-vote.spec.in
├── FastCFS.spec.in
├── LICENSE
├── README-zh_CN.md
├── README.md
├── conf/
│   ├── full/
│   │   ├── fuse.conf
│   │   └── papi.conf
│   ├── fuse.conf
│   └── papi.conf
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── copyright
│   ├── fastcfs-api-dev.install
│   ├── fastcfs-api-libs.install
│   ├── fastcfs-api-tests.install
│   ├── fastcfs-auth-client.install
│   ├── fastcfs-auth-config.install
│   ├── fastcfs-auth-dev.install
│   ├── fastcfs-auth-server-config.install
│   ├── fastcfs-auth-server.dirs
│   ├── fastcfs-auth-server.install
│   ├── fastcfs-fuse-config.install
│   ├── fastcfs-fused.dirs
│   ├── fastcfs-fused.install
│   ├── fastcfs-utils.install
│   ├── fastcfs-vote-client.install
│   ├── fastcfs-vote-config.install
│   ├── fastcfs-vote-dev.install
│   ├── fastcfs-vote-server.dirs
│   ├── fastcfs-vote-server.install
│   ├── rules
│   ├── source/
│   │   └── format
│   ├── substvars
│   └── watch
├── docs/
│   ├── APT-INSTALL-zh_CN.md
│   ├── AUTH-zh_CN.md
│   ├── CONFIGURE-zh_CN.md
│   ├── Easy-install-detail-zh_CN.md
│   ├── FAQ-zh_CN.md
│   ├── INSTALL-zh_CN.md
│   ├── INSTALL.md
│   ├── ReleaseNotes.md
│   ├── TODO-zh_CN.md
│   ├── VoteNode-zh_CN.md
│   ├── YUM-INSTALL-Diy-5nodes-zh_CN.md
│   ├── YUM-INSTALL-zh_CN.md
│   ├── benchmark-step-by-step.md
│   ├── benchmark.md
│   ├── cluster-expansion-zh_CN.md
│   ├── fcfs-ops-tool-zh_CN.md
│   ├── fcfs-ops-tool.md
│   ├── index.md
│   ├── shared-storage-guide-zh_CN.md
│   ├── version-history-zh_CN.md
│   └── versions.json
├── fastcfs.sh
├── helloWorld.sh
├── libfuse_setup.sh
├── make.sh
├── mkdocs.yml
├── shell/
│   ├── Dockerfile
│   ├── conf_tpl_tar.sh
│   ├── fcfs.settings
│   ├── fcfs.sh
│   ├── fcfs_conf.settings
│   ├── fcfs_conf.sh
│   └── template/
│       └── dependency.2.0.1.settings
├── src/
│   ├── api/
│   │   ├── Makefile.in
│   │   ├── async_reporter.c
│   │   ├── async_reporter.h
│   │   ├── fcfs_api.c
│   │   ├── fcfs_api.h
│   │   ├── fcfs_api_allocator.c
│   │   ├── fcfs_api_allocator.h
│   │   ├── fcfs_api_file.c
│   │   ├── fcfs_api_file.h
│   │   ├── fcfs_api_types.h
│   │   ├── fcfs_api_util.c
│   │   ├── fcfs_api_util.h
│   │   ├── inode_htable.c
│   │   ├── inode_htable.h
│   │   ├── std/
│   │   │   ├── api_types.h
│   │   │   ├── capi.c
│   │   │   ├── capi.h
│   │   │   ├── fd_manager.c
│   │   │   ├── fd_manager.h
│   │   │   ├── papi.c
│   │   │   ├── papi.h
│   │   │   ├── posix_api.c
│   │   │   └── posix_api.h
│   │   └── tests/
│   │       ├── Makefile.in
│   │       ├── fcfs_beachmark.c
│   │       ├── fcfs_test_file_copy.c
│   │       ├── fcfs_test_file_op.c
│   │       ├── fcfs_test_papi_copy.c
│   │       └── fcfs_test_read_ahead.c
│   ├── auth/
│   │   ├── client/
│   │   │   ├── Makefile.in
│   │   │   ├── client_func.c
│   │   │   ├── client_func.h
│   │   │   ├── client_global.c
│   │   │   ├── client_global.h
│   │   │   ├── client_proto.c
│   │   │   ├── client_proto.h
│   │   │   ├── client_types.h
│   │   │   ├── fcfs_auth_client.c
│   │   │   ├── fcfs_auth_client.h
│   │   │   ├── fcfs_auth_for_server.c
│   │   │   ├── fcfs_auth_for_server.h
│   │   │   ├── session_regenerate.c
│   │   │   ├── session_regenerate.h
│   │   │   ├── session_sync.c
│   │   │   ├── session_sync.h
│   │   │   ├── simple_connection_manager.c
│   │   │   ├── simple_connection_manager.h
│   │   │   └── tools/
│   │   │       ├── Makefile.in
│   │   │       ├── fauth_cluster_stat.c
│   │   │       ├── fauth_list_servers.c
│   │   │       ├── fcfs_pool.c
│   │   │       ├── fcfs_user.c
│   │   │       ├── tool_func.c
│   │   │       └── tool_func.h
│   │   ├── common/
│   │   │   ├── auth_func.c
│   │   │   ├── auth_func.h
│   │   │   ├── auth_global.c
│   │   │   ├── auth_global.h
│   │   │   ├── auth_proto.c
│   │   │   ├── auth_proto.h
│   │   │   ├── auth_types.h
│   │   │   ├── server_session.c
│   │   │   └── server_session.h
│   │   ├── conf/
│   │   │   ├── auth.conf
│   │   │   ├── client.conf
│   │   │   ├── cluster.conf
│   │   │   ├── full/
│   │   │   │   ├── auth.conf
│   │   │   │   ├── client.conf
│   │   │   │   ├── cluster.conf
│   │   │   │   ├── server.conf
│   │   │   │   └── session.conf
│   │   │   ├── keys/
│   │   │   │   └── session_validate.key
│   │   │   ├── server.conf
│   │   │   └── session.conf
│   │   └── server/
│   │       ├── Makefile.in
│   │       ├── cluster_handler.c
│   │       ├── cluster_handler.h
│   │       ├── cluster_info.c
│   │       ├── cluster_info.h
│   │       ├── cluster_relationship.c
│   │       ├── cluster_relationship.h
│   │       ├── common_handler.c
│   │       ├── common_handler.h
│   │       ├── db/
│   │       │   ├── auth_db.c
│   │       │   ├── auth_db.h
│   │       │   ├── dao/
│   │       │   │   ├── dao.c
│   │       │   │   ├── dao.h
│   │       │   │   ├── func.c
│   │       │   │   ├── func.h
│   │       │   │   ├── granted_pool.c
│   │       │   │   ├── granted_pool.h
│   │       │   │   ├── storage_pool.c
│   │       │   │   ├── storage_pool.h
│   │       │   │   ├── types.h
│   │       │   │   ├── user.c
│   │       │   │   └── user.h
│   │       │   ├── pool_usage_updater.c
│   │       │   └── pool_usage_updater.h
│   │       ├── fcfs_authd.c
│   │       ├── server_func.c
│   │       ├── server_func.h
│   │       ├── server_global.c
│   │       ├── server_global.h
│   │       ├── server_types.h
│   │       ├── service_handler.c
│   │       ├── service_handler.h
│   │       ├── session_subscribe.c
│   │       └── session_subscribe.h
│   ├── common/
│   │   ├── fcfs_global.c
│   │   └── fcfs_global.h
│   ├── fuse/
│   │   ├── Makefile.in
│   │   ├── fcfs_fused.c
│   │   ├── fuse_wrapper.c
│   │   ├── fuse_wrapper.h
│   │   ├── getgroups.c
│   │   ├── getgroups.h
│   │   ├── global.c
│   │   ├── global.h
│   │   ├── groups_htable.c
│   │   └── groups_htable.h
│   ├── java/
│   │   ├── jni/
│   │   │   ├── Makefile.in
│   │   │   ├── com_fastken_fcfs_FCFSConstants.h
│   │   │   ├── com_fastken_fcfs_FCFSDirectory.c
│   │   │   ├── com_fastken_fcfs_FCFSDirectory.h
│   │   │   ├── com_fastken_fcfs_FCFSFile.c
│   │   │   ├── com_fastken_fcfs_FCFSFile.h
│   │   │   ├── com_fastken_fcfs_FCFSPosixAPI.c
│   │   │   ├── com_fastken_fcfs_FCFSPosixAPI.h
│   │   │   ├── common.c
│   │   │   ├── common.h
│   │   │   ├── global.c
│   │   │   └── global.h
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── fastken/
│   │                       └── fcfs/
│   │                           ├── FCFSConstants.java
│   │                           ├── FCFSDirectory.java
│   │                           ├── FCFSFile.java
│   │                           ├── FCFSFileStat.java
│   │                           ├── FCFSPosixAPI.java
│   │                           └── FCFSVFSStat.java
│   ├── preload/
│   │   ├── Makefile.in
│   │   ├── api.c
│   │   ├── api.h
│   │   ├── global.c
│   │   ├── global.h
│   │   └── types.h
│   ├── tools/
│   │   ├── Makefile.in
│   │   ├── fcfs_active_test.c
│   │   └── fcfs_pool_stat.c
│   └── vote/
│       ├── client/
│       │   ├── Makefile.in
│       │   ├── client_func.c
│       │   ├── client_func.h
│       │   ├── client_global.c
│       │   ├── client_global.h
│       │   ├── client_proto.c
│       │   ├── client_proto.h
│       │   ├── client_types.h
│       │   ├── fcfs_vote_client.h
│       │   └── tools/
│       │       ├── Makefile.in
│       │       └── fvote_cluster_stat.c
│       ├── common/
│       │   ├── vote_global.c
│       │   ├── vote_global.h
│       │   ├── vote_proto.c
│       │   ├── vote_proto.h
│       │   └── vote_types.h
│       ├── conf/
│       │   ├── client.conf
│       │   ├── cluster.conf
│       │   ├── full/
│       │   │   ├── client.conf
│       │   │   ├── cluster.conf
│       │   │   └── server.conf
│       │   └── server.conf
│       └── server/
│           ├── Makefile.in
│           ├── cluster_handler.c
│           ├── cluster_handler.h
│           ├── cluster_info.c
│           ├── cluster_info.h
│           ├── cluster_relationship.c
│           ├── cluster_relationship.h
│           ├── common_handler.c
│           ├── common_handler.h
│           ├── fcfs_voted.c
│           ├── server_func.c
│           ├── server_func.h
│           ├── server_global.c
│           ├── server_global.h
│           ├── server_types.h
│           ├── service_group_htable.c
│           ├── service_group_htable.h
│           ├── service_handler.c
│           └── service_handler.h
└── systemd/
    ├── fastauth.service
    ├── fastcfs.service
    └── fastvote.service

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

================================================
FILE: .gitignore
================================================
# Makefile.in
src/api/Makefile
src/api/tests/Makefile
src/preload/Makefile
src/fuse/Makefile
src/tools/Makefile
src/auth/server/Makefile
src/auth/client/Makefile
src/auth/client/tools/Makefile
src/vote/server/Makefile
src/vote/client/Makefile
src/vote/client/tools/Makefile
src/java/jni/Makefile

# Prerequisites
*.d

# Compiled Object files
*.slo
*.lo
*.o
*.obj
*.class

# Precompiled Headers
*.gch
*.pch

# Compiled Dynamic libraries
*.so
*.dylib
*.dSYM
*.dll

# Compiled Static libraries
*.lai
*.la
*.a
*.lib

# Executables
*.out
src/api/tests/fcfs_test_file_op
src/api/tests/fcfs_test_file_copy
src/api/tests/fcfs_test_papi_copy
src/api/tests/fcfs_test_read_ahead
src/api/tests/fcfs_beachmark
src/fuse/fcfs_fused
src/tools/fcfs_active_test
src/tools/fcfs_pool_stat
src/auth/server/fcfs_authd
src/auth/client/tools/fcfs_user
src/auth/client/tools/fcfs_pool
src/auth/client/tools/fauth_list_servers
src/auth/client/tools/fauth_cluster_stat
src/vote/server/fcfs_voted
src/vote/client/tools/fvote_cluster_stat

# other
logs
data
*.pid
*.swp
*.swo

# Build tmp path after execute fastcfs.sh
build

.DS_Store
.fcfs
.idea


================================================
FILE: FastCFS-auth.spec.in
================================================
%define FastCFSAuthClient    FastCFS-auth-client
%define FastCFSAuthDevel     FastCFS-auth-devel
%define FastCFSAuthConfig    FastCFS-auth-config
%define CommitVersion %(echo $COMMIT_VERSION)

Name: FastCFS-auth
Version: 5.5.0
Release: 1%{?dist}
Summary: the auth client library and config files of FastCFS. FastCFS is a high performance cloud native distributed file system for databases, KVM and K8s
License: AGPL v3.0
Group: Arch/Tech
URL:  http://github.com/happyfish100/FastCFS/
Source: http://github.com/happyfish100/FastCFS/%{name}-%{version}.tar.gz

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) 

BuildRequires: libserverframe-devel >= 1.2.10
Requires: %__cp %__mv %__chmod %__grep %__mkdir %__install %__id
Requires: libserverframe >= 1.2.10
Requires: FastCFS-auth-server = %{version}-%{release}
Requires: %{FastCFSAuthClient} = %{version}-%{release}
Requires: %{FastCFSAuthConfig} >= 2.0.0

%description
the auth client library and config files of FastCFS.
FastCFS is a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.
commit version: %{CommitVersion}

%package -n %{FastCFSAuthDevel}
Requires: %{FastCFSAuthClient} = %{version}-%{release}
Summary: header files of FastCFS auth client

%package -n %{FastCFSAuthClient}
Requires: libserverframe >= 1.2.10
Summary: FastCFS auth client

%package -n %{FastCFSAuthConfig}
Summary: FastCFS auth config files for sample

%description -n %{FastCFSAuthDevel}
This package provides the header files of libfcfsauthclient
commit version: %{CommitVersion}

%description -n %{FastCFSAuthClient}
FastCFS auth client
commit version: %{CommitVersion}

%description -n %{FastCFSAuthConfig}
FastCFS auth config files for sample
commit version: %{CommitVersion}


%prep
%setup -q

%build
./make.sh --module=authclient clean && ./make.sh --module=authclient

%install
rm -rf %{buildroot}
DESTDIR=$RPM_BUILD_ROOT ./make.sh --module=authclient install
AUTH_CONFDIR=%{buildroot}/etc/fastcfs/auth/
mkdir -p $AUTH_CONFDIR
cp src/auth/conf/*.conf $AUTH_CONFDIR
cp -R src/auth/conf/keys $AUTH_CONFDIR

%post

%preun

%postun

%clean
rm -rf %{buildroot}

%files

%files -n %{FastCFSAuthClient}
/usr/lib64/libfcfsauthclient.so*
/usr/bin/fcfs_user
/usr/bin/fcfs_pool
/usr/bin/fauth_list_servers
/usr/bin/fauth_cluster_stat

%files -n %{FastCFSAuthDevel}
%defattr(-,root,root,-)
/usr/include/fastcfs/auth/*

%files -n %{FastCFSAuthConfig}
%defattr(-,root,root,-)
%config(noreplace) /etc/fastcfs/auth/*.conf
%config(noreplace) /etc/fastcfs/auth/keys/*

%changelog
* Thu Apr 22 2021 YuQing <384681@qq.com>
- first RPM release (1.0)


================================================
FILE: FastCFS-vote.spec.in
================================================
%define FastCFSVoteClient    FastCFS-vote-client
%define FastCFSVoteDevel     FastCFS-vote-devel
%define FastCFSVoteConfig    FastCFS-vote-config
%define CommitVersion %(echo $COMMIT_VERSION)

Name: FastCFS-vote
Version: 5.5.0
Release: 1%{?dist}
Summary: the vote client library and config files of FastCFS. FastCFS is a high performance cloud native distributed file system for databases, KVM and K8s
License: AGPL v3.0
Group: Arch/Tech
URL:  http://github.com/happyfish100/FastCFS/
Source: http://github.com/happyfish100/FastCFS/%{name}-%{version}.tar.gz

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) 

BuildRequires: libserverframe-devel >= 1.2.10
Requires: %__cp %__mv %__chmod %__grep %__mkdir %__install %__id
Requires: libserverframe >= 1.2.10
Requires: FastCFS-vote-server = %{version}-%{release}
Requires: %{FastCFSVoteClient} = %{version}-%{release}
Requires: %{FastCFSVoteConfig} >= 3.5.0

%description
the vote client library and config files of FastCFS.
FastCFS is a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.
commit version: %{CommitVersion}

%package -n %{FastCFSVoteDevel}
Requires: %{FastCFSVoteClient} = %{version}-%{release}
Summary: header files of FastCFS vote client

%package -n %{FastCFSVoteClient}
Requires: libserverframe >= 1.2.10
Summary: FastCFS vote client

%package -n %{FastCFSVoteConfig}
Summary: FastCFS vote config files for sample

%description -n %{FastCFSVoteDevel}
This package provides the header files of libfcfsvoteclient
commit version: %{CommitVersion}

%description -n %{FastCFSVoteClient}
FastCFS vote client
commit version: %{CommitVersion}

%description -n %{FastCFSVoteConfig}
FastCFS vote config files for sample
commit version: %{CommitVersion}


%prep
%setup -q

%build
./make.sh --module=voteclient clean && ./make.sh --module=voteclient

%install
rm -rf %{buildroot}
DESTDIR=$RPM_BUILD_ROOT ./make.sh --module=voteclient install
VOTE_CONFDIR=%{buildroot}/etc/fastcfs/vote/
mkdir -p $VOTE_CONFDIR
cp src/vote/conf/*.conf $VOTE_CONFDIR

%post

%preun

%postun

%clean
rm -rf %{buildroot}

%files

%files -n %{FastCFSVoteClient}
/usr/lib64/libfcfsvoteclient.so*
/usr/bin/fvote_cluster_stat

%files -n %{FastCFSVoteDevel}
%defattr(-,root,root,-)
/usr/include/fastcfs/vote/*

%files -n %{FastCFSVoteConfig}
%defattr(-,root,root,-)
%config(noreplace) /etc/fastcfs/vote/*.conf

%changelog
* Thu Apr 22 2021 YuQing <384681@qq.com>
- first RPM release (1.0)


================================================
FILE: FastCFS.spec.in
================================================
%define FastCFSFused        FastCFS-fused
%define FastCFSUtils        FastCFS-utils
%define FastCFSAPI          FastCFS-api-libs
%define FastCFSAPITests     FastCFS-api-tests
%define FastCFSAuthServer   FastCFS-auth-server
%define FastCFSVoteServer   FastCFS-vote-server
%define FastCFSAPIDevel     FastCFS-api-devel
%define FastCFSFuseConfig   FastCFS-fuse-config
%define CommitVersion %(echo $COMMIT_VERSION)

Name: FastCFS
Version: 5.5.0
Release: 1%{?dist}
Summary: a high performance cloud native distributed file system for databases, KVM and K8s
License: AGPL v3.0
Group: Arch/Tech
URL:  http://github.com/happyfish100/FastCFS/
Source: http://github.com/happyfish100/FastCFS/%{name}-%{version}.tar.gz

BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

BuildRequires: fastDIR-devel >= 5.5.0
BuildRequires: faststore-devel >= 5.5.0
BuildRequires: fuse3-devel >= 3.16.2
Requires: %__cp %__mv %__chmod %__grep %__mkdir %__install %__id
Requires: %{FastCFSFused} = %{version}-%{release}
Requires: %{FastCFSUtils} = %{version}-%{release}
Requires: %{FastCFSAPITests} = %{version}-%{release}

%description
a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.
commit version: %{CommitVersion}

%package -n %{FastCFSFused}
Requires: fuse3 >= 3.16.2
Requires: %{FastCFSAPI} = %{version}-%{release}
Requires: %{FastCFSFuseConfig} >= 1.0.0
Summary: FastCFS fuse

%package -n %{FastCFSUtils}
Requires: %{FastCFSAPI} = %{version}-%{release}
Summary: FastCFS utils 

%package -n %{FastCFSAPI}
Requires: fastDIR-client >= 5.5.0
Requires: faststore-client >= 5.5.0
Summary: FastCFS api library

%package -n %{FastCFSAPITests}
Requires: %{FastCFSAPI} = %{version}-%{release}
Requires: %{FastCFSFuseConfig} >= 1.0.0
Summary: FastCFS api tests

%package -n %{FastCFSAPIDevel}
Requires: %{FastCFSAPI} = %{version}-%{release}
Summary: header files of FastCFS api library

%package -n %{FastCFSAuthServer}
Requires: fastDIR-client >= 5.5.0
Requires: FastCFS-auth-config >= 2.0.0
Summary: FastCFS auth server

%package -n %{FastCFSVoteServer}
Requires: libserverframe >= 1.2.10
Requires: FastCFS-vote-config >= 3.5.0
Summary: FastCFS vote server

%package -n %{FastCFSFuseConfig}
Requires: faststore-config >= 1.0.0
Summary: FastCFS fuse config files for sample

%description -n %{FastCFSFused}
FastCFS fuse
commit version: %{CommitVersion}

%description -n %{FastCFSUtils}
FastCFS utils
commit version: %{CommitVersion}

%description -n %{FastCFSAPI}
FastCFS api library
commit version: %{CommitVersion}

%description -n %{FastCFSAPITests}
FastCFS api tests
commit version: %{CommitVersion}

%description -n %{FastCFSAPIDevel}
This package provides the header files of libfcfsapi
commit version: %{CommitVersion}

%description -n %{FastCFSAuthServer}
FastCFS auth server
commit version: %{CommitVersion}

%description -n %{FastCFSVoteServer}
FastCFS vote server
commit version: %{CommitVersion}

%description -n %{FastCFSFuseConfig}
FastCFS fuse config files for sample
commit version: %{CommitVersion}

%prep
%setup -q

%build
./make.sh clean && ./make.sh --exclude=client

%install
rm -rf %{buildroot}
DESTDIR=$RPM_BUILD_ROOT ./make.sh --exclude=client install
FUSE_CONFDIR=%{buildroot}/etc/fastcfs/fcfs/
SYSTEMDIR=%{buildroot}/usr/lib/systemd/system/
mkdir -p $FUSE_CONFDIR
mkdir -p $SYSTEMDIR
cp conf/*.conf $FUSE_CONFDIR
cp systemd/fastcfs.service $SYSTEMDIR
cp systemd/fastauth.service $SYSTEMDIR
cp systemd/fastvote.service $SYSTEMDIR

%post

%preun

%postun

%clean
rm -rf %{buildroot}

%files

%post -n %{FastCFSFused}
mkdir -p /opt/fastcfs/fcfs
mkdir -p /opt/fastcfs/fuse
systemctl enable fastcfs

%files -n %{FastCFSFused}
/usr/bin/fcfs_fused
%config(noreplace) /usr/lib/systemd/system/fastcfs.service

%files -n %{FastCFSUtils}
/usr/bin/fcfs_active_test
/usr/bin/fcfs_pool_stat

%files -n %{FastCFSAPI}
%defattr(-,root,root,-)
/usr/lib64/libfcfsapi.so*
/usr/lib64/libfcfspreload.so*

%files -n %{FastCFSAPITests}
/usr/bin/fcfs_beachmark
/usr/bin/fcfs_test_file_op
/usr/bin/fcfs_test_file_copy
/usr/bin/fcfs_test_papi_copy
/usr/bin/fcfs_test_read_ahead

%files -n %{FastCFSAPIDevel}
%defattr(-,root,root,-)
/usr/include/fastcfs/api/*

%post -n %{FastCFSAuthServer}
mkdir -p /opt/fastcfs/auth
systemctl enable fastauth

%post -n %{FastCFSVoteServer}
mkdir -p /opt/fastcfs/vote
systemctl enable fastvote

%files -n %{FastCFSAuthServer}
/usr/bin/fcfs_authd
%config(noreplace) /usr/lib/systemd/system/fastauth.service

%files -n %{FastCFSVoteServer}
/usr/bin/fcfs_voted
%config(noreplace) /usr/lib/systemd/system/fastvote.service

%files -n %{FastCFSFuseConfig}
%defattr(-,root,root,-)
%config(noreplace) /etc/fastcfs/fcfs/*.conf

%changelog
* Fri Jan 1 2021 YuQing <384681@qq.com>
- first RPM release (1.0)


================================================
FILE: LICENSE
================================================
                    GNU AFFERO GENERAL PUBLIC LICENSE
                       Version 3, 19 November 2007

 Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
 Everyone is permitted to copy and distribute verbatim copies
 of this license document, but changing it is not allowed.

                            Preamble

  The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.

  The licenses for most software and other practical works are designed
to take away your freedom to share and change the works.  By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.

  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
them 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.

  Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.

  A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate.  Many developers of free software are heartened and
encouraged by the resulting cooperation.  However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.

  The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community.  It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server.  Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.

  An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals.  This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.

  The precise terms and conditions for copying, distribution and
modification follow.

                       TERMS AND CONDITIONS

  0. Definitions.

  "This License" refers to version 3 of the GNU Affero General Public License.

  "Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.

  "The Program" refers to any copyrightable work licensed under this
License.  Each licensee is addressed as "you".  "Licensees" and
"recipients" may be individuals or organizations.

  To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy.  The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.

  A "covered work" means either the unmodified Program or a work based
on the Program.

  To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy.  Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.

  To "convey" a work means any kind of propagation that enables other
parties to make or receive copies.  Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.

  An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License.  If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.

  1. Source Code.

  The "source code" for a work means the preferred form of the work
for making modifications to it.  "Object code" means any non-source
form of a work.

  A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.

  The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form.  A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.

  The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities.  However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work.  For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.

  The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.

  The Corresponding Source for a work in source code form is that
same work.

  2. Basic Permissions.

  All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met.  This License explicitly affirms your unlimited
permission to run the unmodified Program.  The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work.  This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.

  You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force.  You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright.  Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.

  Conveying under any other circumstances is permitted solely under
the conditions stated below.  Sublicensing is not allowed; section 10
makes it unnecessary.

  3. Protecting Users' Legal Rights From Anti-Circumvention Law.

  No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.

  When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.

  4. Conveying Verbatim Copies.

  You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.

  You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.

  5. Conveying Modified Source Versions.

  You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:

    a) The work must carry prominent notices stating that you modified
    it, and giving a relevant date.

    b) The work must carry prominent notices stating that it is
    released under this License and any conditions added under section
    7.  This requirement modifies the requirement in section 4 to
    "keep intact all notices".

    c) You must license the entire work, as a whole, under this
    License to anyone who comes into possession of a copy.  This
    License will therefore apply, along with any applicable section 7
    additional terms, to the whole of the work, and all its parts,
    regardless of how they are packaged.  This License gives no
    permission to license the work in any other way, but it does not
    invalidate such permission if you have separately received it.

    d) If the work has interactive user interfaces, each must display
    Appropriate Legal Notices; however, if the Program has interactive
    interfaces that do not display Appropriate Legal Notices, your
    work need not make them do so.

  A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit.  Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.

  6. Conveying Non-Source Forms.

  You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:

    a) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by the
    Corresponding Source fixed on a durable physical medium
    customarily used for software interchange.

    b) Convey the object code in, or embodied in, a physical product
    (including a physical distribution medium), accompanied by a
    written offer, valid for at least three years and valid for as
    long as you offer spare parts or customer support for that product
    model, to give anyone who possesses the object code either (1) a
    copy of the Corresponding Source for all the software in the
    product that is covered by this License, on a durable physical
    medium customarily used for software interchange, for a price no
    more than your reasonable cost of physically performing this
    conveying of source, or (2) access to copy the
    Corresponding Source from a network server at no charge.

    c) Convey individual copies of the object code with a copy of the
    written offer to provide the Corresponding Source.  This
    alternative is allowed only occasionally and noncommercially, and
    only if you received the object code with such an offer, in accord
    with subsection 6b.

    d) Convey the object code by offering access from a designated
    place (gratis or for a charge), and offer equivalent access to the
    Corresponding Source in the same way through the same place at no
    further charge.  You need not require recipients to copy the
    Corresponding Source along with the object code.  If the place to
    copy the object code is a network server, the Corresponding Source
    may be on a different server (operated by you or a third party)
    that supports equivalent copying facilities, provided you maintain
    clear directions next to the object code saying where to find the
    Corresponding Source.  Regardless of what server hosts the
    Corresponding Source, you remain obligated to ensure that it is
    available for as long as needed to satisfy these requirements.

    e) Convey the object code using peer-to-peer transmission, provided
    you inform other peers where the object code and Corresponding
    Source of the work are being offered to the general public at no
    charge under subsection 6d.

  A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.

  A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling.  In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage.  For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product.  A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.

  "Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source.  The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.

  If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information.  But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).

  The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed.  Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.

  Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.

  7. Additional Terms.

  "Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law.  If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.

  When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it.  (Additional permissions may be written to require their own
removal in certain cases when you modify the work.)  You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.

  Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:

    a) Disclaiming warranty or limiting liability differently from the
    terms of sections 15 and 16 of this License; or

    b) Requiring preservation of specified reasonable legal notices or
    author attributions in that material or in the Appropriate Legal
    Notices displayed by works containing it; or

    c) Prohibiting misrepresentation of the origin of that material, or
    requiring that modified versions of such material be marked in
    reasonable ways as different from the original version; or

    d) Limiting the use for publicity purposes of names of licensors or
    authors of the material; or

    e) Declining to grant rights under trademark law for use of some
    trade names, trademarks, or service marks; or

    f) Requiring indemnification of licensors and authors of that
    material by anyone who conveys the material (or modified versions of
    it) with contractual assumptions of liability to the recipient, for
    any liability that these contractual assumptions directly impose on
    those licensors and authors.

  All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10.  If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term.  If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.

  If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.

  Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.

  8. Termination.

  You may not propagate or modify a covered work except as expressly
provided under this License.  Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).

  However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.

  Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.

  Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License.  If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.

  9. Acceptance Not Required for Having Copies.

  You are not required to accept this License in order to receive or
run a copy of the Program.  Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance.  However,
nothing other than this License grants you permission to propagate or
modify any covered work.  These actions infringe copyright if you do
not accept this License.  Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.

  10. Automatic Licensing of Downstream Recipients.

  Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License.  You are not responsible
for enforcing compliance by third parties with this License.

  An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations.  If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.

  You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License.  For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.

  11. Patents.

  A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.  The
work thus licensed is called the contributor's "contributor version".

  A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version.  For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.

  Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.

  In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement).  To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.

  If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients.  "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.

  If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.

  A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License.  You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.

  Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.

  12. No Surrender of Others' Freedom.

  If 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 convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all.  For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.

  13. Remote Network Interaction; Use with the GNU General Public License.

  Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software.  This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.

  Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work.  The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.

  14. Revised Versions of this License.

  The Free Software Foundation may publish revised and/or new versions of
the GNU Affero 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 that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation.  If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.

  If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.

  Later license versions may give you additional or different
permissions.  However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.

  15. Disclaimer of Warranty.

  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.

  16. Limitation of Liability.

  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
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.

  17. Interpretation of Sections 15 and 16.

  If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.

                     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
state 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 Affero 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 Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

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

  If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source.  For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code.  There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.

  You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<https://www.gnu.org/licenses/>.


================================================
FILE: README-zh_CN.md
================================================
# FastCFS -- 可以跑数据库的高性能通用分布式文件系统

[English](README.md) | 简体中文

## 1. 简介

FastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统,可以作为MySQL、PostgreSQL、Oracle等数据库,k8s、KVM、FTP、SMB和NFS等系统的后端存储。

### FastCFS 主要特点

* 保证数据强一致前提下实现了高性能:性能完胜Ceph;
* 完全兼容POSIX文件接口,支持文件锁,64G内存即可支持百亿级海量文件;
* 高可用:不存在单点,自动failover;
* 简洁高效的架构和原生实现,不依赖第三方组件,内置运维工具,易用性较好;
* 随机写性能强悍:FCFS基于trunk顺序分配空间,将客户端的随机写转换为顺序写。

### FastCFS 典型应用场景

* **数据库**:支持常规的独享数据和高阶的共享数据两种存储方式,支持数据库云化;
* **文件存储**:如文档、图片、视频等等,FastCFS比对象存储更容易与通用软件集成;
* **超融合存储**:数据库和文件存储共用一个存储集群,显著提升存储资源利用率;
* **高性能计算**:高可靠和高性能的FastCFS,支持RDMA,天然适合高性能计算场景;
* **视频监控**:FastCFS采用顺序写盘方式,使用SATA硬盘也可保证多路视频流畅写入。

## 2. 当前版本:V5.5.0

[FastCFS重大版本一览](docs/version-history-zh_CN.md)

## 3. 支持的操作系统

* Linux: Kernel version >= 3.10 (完全支持,推荐使用4.18及更高版本)
* MacOS or FreeBSD  (仅支持服务端,不支持FUSE)

## 4. 依赖

* [libfuse](https://gitee.com/mirrors/libfuse) (版本 3.9.4 或更高版本,推荐3.16.2)
    * [Python](https://python.org/) (版本 3.5 或更高版本)
    * [Ninja](https://ninja-build.org/) (版本 1.7 或更高版本)
    * [gcc](https://www.gnu.org/software/gcc/) (版本 4.7.0 或更高版本)
* [libfastcommon](https://gitee.com/fastdfs100/libfastcommon) (tag: V1.0.83)
* [libserverframe](https://gitee.com/fastdfs100/libserverframe) (tag: V1.2.11)
* [libdiskallocator](https://gitee.com/fastdfs100/libdiskallocator) (tag: V1.1.13)
* [fastDIR](https://gitee.com/fastdfs100/fastDIR) (tag: V5.5.0)
* [faststore](https://gitee.com/fastdfs100/faststore) (tag: V5.5.0)
* [FastCFS](https://gitee.com/fastdfs100/FastCFS) (tag: V5.5.0)

## 5. 部署 & 运维

FastCFS包含 libfastcommon、libserverframe、libdiskallocator、fastDIR、faststore和FastCFS 六个安装包。

### 一键部署

如果你打算快速体验一下FastCFS,可以一键搭建(包括部署和运行)单节点(需要root身份执行):
```
git clone https://gitee.com/fastdfs100/FastCFS.git; cd FastCFS/
./helloWorld.sh

# 注意:helloWorld.sh将更改FastCFS相关配置文件,请不要在多节点集群上执行!
```

上述操作完成后,执行命令:
```
df -h /opt/fastcfs/fuse | grep fuse
```
可以看到FastCFS挂载的文件目录,你可以当作本地文件系统访问该目录。

一键部署的详细说明,请参见这里[一键部署详细说明](docs/Easy-install-detail-zh_CN.md)

### 集群部署工具

推荐使用 [FastCFS集群运维工具](docs/fcfs-ops-tool-zh_CN.md)

### DIY安装

如果你要自己搭建FastCFS环境,可以采用如下三种安装方式之一:

* yum安装(针对CentOS、Rocky、Fedora、RHEL等),参阅 [yum安装文档](docs/YUM-INSTALL-zh_CN.md)
* apt安装(针对Ubuntu、Debian 和 Deepin),参阅 [apt 安装文档](docs/APT-INSTALL-zh_CN.md)
* 源码编译安装,参阅 [安装文档](docs/INSTALL-zh_CN.md)

### 配置指南

FastCFS安装完成后,请参阅[配置指南](docs/CONFIGURE-zh_CN.md)

### 集群扩容

详情参见 [FastCFS集群扩容手册](docs/cluster-expansion-zh_CN.md)

## 6. 性能测试

FastCFS性能明显优于Ceph:顺序写是Ceph的6.x倍,顺序读是Ceph的2.x倍,随机写大约是Ceph的2倍。

* [FastCFS与Ceph性能对比测试结果概要](docs/benchmark.md)

* 详情参见 [完整PDF文档](docs/benchmark-20210621.pdf)

* 如何进行性能测试点击 [这里](docs/benchmark-step-by-step.md)

## 7. K8s CSI驱动

参见项目 [fastcfs-csi](https://gitee.com/fastdfs100/fastcfs-csi)

## 8. 技术文章

参见 <a href="https://my.oschina.net/u/3334339" target="_blank">技术博客</a>

## 9. 常见问题

参见 [FastCFS常见问题](docs/FAQ-zh_CN.md)

## 10. 待完成工作

*  [fstore] 单盘故障恢复后,自动恢复数据(已完成)
*  [fstore] 机器故障或网络短暂故障恢复后,master需重新均衡分配(已完成)
*  [fauth & fdir & fstore] leader选举支持过半原则,防止脑裂(已完成)
*  [fauth & fdir & fstore] 实现公用选举节点,双副本防脑裂(已完成)
*  [fdir & fstore] binlog去重及历史数据清理(已完成)
*  [fdir & fstore] 数据提交采用多数派确认机制保证数据一致性和可靠性(已完成)
*  [fdir & fstore] 针对两副本,数据提交多数派机制智能化(已完成)
*  [fstore] 文件读写性能优化(已完成)
*  [fdir & api] POSIX兼容性测试及改进(已完成)
*  [fstore] slice存储引擎插件,有限内存支持海量数据(已完成)
*  [all] 适配RDMA网络,突破网络瓶颈(已完成)
*  [fdir] 支持回收站功能,不用担心误删除文件(已完成)
*  [all] 支持集群在线扩容

参见更多 [TODO List](docs/TODO-zh_CN.md),欢迎大家参与。

## 11. 商业支持

我们提供商业技术支持和定制化开发,欢迎微信或邮件洽谈。

email: 384681(at)qq(dot)com

## 12. 联系我们

查看FastCFS相关技术文章,请关注微信公众号:

<img src="images/wechat_subscribe.jpg" width="200" alt="微信公众号">

微信交流群:

<img src="images/wechat_group.jpg" width="200" alt="微信交流群">


================================================
FILE: README.md
================================================
# FastCFS -- a high performance general distributed file system for databases, K8s and KVM etc.

English | [Chinese](README-zh_CN.md)

## 1. About

FastCFS is a general distributed file system with strong consistency, high performance, high availability and supporting 10 billion massive files.
FastCFS can be used as the back-end storage of databases (MySQL, PostgreSQL, Oracle etc.), K8s, KVM, FTP, SMB and NFS.

### Main Features

* High performance on the premise of strong data consistency: performance is more better than ceph
* Fully compatible with POSIX, supporting file lock and 10 billion massive files
* High availability: no single point & automatic failover
* Easy to use:
    * simple and efficient architecture and native implementation
    * independent of third-party components
    * built-in operation and maintenance tools
* Strong random write performance: FCFS allocates space based on the trunk file, converts random writes from the client to sequential writes

### Classical Application Scene

* **Database**: supports two storage methods (conventional exclusive data and high-level shared data) and database cloudification
* **File Storage**: documents, pictures, videos, etc., FastCFS is easier to integrate with general software than the object storage
* **Unified Storage**: database and file storage share a storage cluster, which significantly improves the utilization of storage resources
* **High Performance Computing**: FastCFS with high reliability and high performance is naturally suitable for the HPC scene
* **Video monitoring**: smooth writing for multi-channel videos with HDD such as SATA because FastCFS uses sequential writing approach


## 2. Current Version: V5.5.0

## 3. Supported Platforms

* Linux: Kernel version >= 3.10  (Full support, >= 4.18 is recommended)
* MacOS or FreeBSD (Only server side)

## 4. Dependencies

* [libfuse](https://github.com/libfuse/libfuse) (version 3.9.4 or newer, 3.16.2 is recommended)
    * [Python](https://python.org/) (version 3.5 or newer)
    * [Ninja](https://ninja-build.org/) (version 1.7 or newer)
    * [gcc](https://www.gnu.org/software/gcc/) (version 4.7.0 or newer)
* [libfastcommon](https://github.com/happyfish100/libfastcommon) (tag: V1.0.83)
* [libserverframe](https://github.com/happyfish100/libserverframe) (tag: V1.2.11)
* [libdiskallocator](https://github.com/happyfish100/libdiskallocator) (tag: V1.1.13)
* [fastDIR](https://github.com/happyfish100/fastDIR) (tag: V5.5.0)
* [faststore](https://github.com/happyfish100/faststore) (tag: V5.5.0)
* [FastCFS](https://github.com/happyfish100/FastCFS) (tag: V5.5.0)

## 5. Installation

### 5.1 DIY installation

you can use [Cluster Operation Tool](docs/fcfs-ops-tool.md) to deploy FastCFS

step by step please see [INSTALL](docs/INSTALL.md)

recommend to execute libfuse_setup.sh for compiling and installing libfuse

### 5.2 easy installation

libfastcommon, libserverframe, fastDIR, faststore and FastCFS can be compiled, installed and auto configurated by fastcfs.sh

fastcfs.sh can automatically pull or update above six projects codes from GitHub, compile and install according to dependency orders, and automatically generate cluster related configuration files according to the config templates.

```
git clone https://github.com/happyfish100/FastCFS.git; cd FastCFS/
```

fastcfs.sh usage:

```
* install: pull/update codes from gitee, then make and install
* config: copy config files and configure them with local ip
* start | stop | restart: for service processes control
```

one click to build (deploy and run) single node demo environment (MUST run by root):

```
./helloWorld.sh
```

or execute following commands (MUST run by root):

```
./fastcfs.sh install
./fastcfs.sh config --force
./fastcfs.sh restart
```

now you can see the mounted path of FastCFS by the command:

```
df -h /opt/fastcfs/fuse | grep fuse
```

## 6. Benchmark

FastCFS has huge better performance than Ceph: the IOPS ratio of sequential write is 6.x, sequential read is 2.x, random write is about 2.0.

* [FastCFS vs. Ceph benchmark](docs/benchmark.md)

## 7. K8s CSI Driver

[fastcfs-csi](https://github.com/happyfish100/fastcfs-csi)

## 8. Chinese Relative articles

<a href="https://blog.csdn.net/happy_fish100/" target="_blank">CSDN blog</a>

## 9. TODO List

*  [fstore] data recovery after single disk fault (done)
*  [fstore] after the machine recovery, the data masters should be rebalanced (done)
*  [fauth & fdir & fstore] leader election uses  more than half principle to prevent brain-split (done)
*  [fauth & fdir & fstore] import public vote node under 2 copies scene to prevent brain-split (done)
*  [fdir & fstore] binlog deduplication and historical data deletion (done)
*  [fdir & fstore] data submission by majority confirmation to ensure data consistency (done)
*  [fdir & fstore] for two replicas, the data submission majority mechanism is intelligent (done)
*  [fstore] file read & write performance optimization (done)
*  [fdir & api] POSIX compatibility test and improvement (done)
*  [fstore] slice storage engine plugin to support massive data with limited memory (done)
*  [all] adapt to RDMA network to break through network bottlenecks (done)
*  [fdir] support recycle bin, don't worry accidentally deleting files (done)
*  [all] cluster online expansion

## 10. Business Support

We provide technical support service and customized development. Welcome to use WeChat or email for discuss.

## 11. Contact us

email: 384681(at)qq(dot)com

WeChat subscription: search "fastdfs" for the related articles (Chinese Only)


================================================
FILE: conf/full/fuse.conf
================================================
# the base path to store log files
# this path must exist
base_path = /opt/fastcfs/fcfs

# the mount point (local path) for FUSE
# the local path must exist
mountpoint = /opt/fastcfs/fuse

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level = info

#unix group name to run this program, 
#not set (empty) means run by the group of current user
run_by_group =

#unix username to run this program,
#not set (empty) means run by current user
run_by_user =

# sync log buff to disk every interval seconds
# default value is 1 seconds
sync_log_buff_interval = 1

# if rotate the error log every day
# default value is false
rotate_error_log = false

# rotate error log time base, time format: Hour:Minute
# Hour from 0 to 23, Minute from 0 to 59
# default value is 00:00
error_log_rotate_time = 00:00

# if compress the old error log by gzip
# default value is false
compress_old_error_log = false

# compress the error log days before
# default value is 1
compress_error_log_days_before = 7

# rotate error log when the log file exceeds this size
# 0 means never rotates log file by log file size
# default value is 0
rotate_error_log_size = 0

# keep days of the log files
# 0 means do not delete old log files
# default value is 0
log_file_keep_days = 0


# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# TCP quick ack for Linux (setsockopt with TCP_QUICKACK option)
# default value is true
tcp_quick_ack = true

# the rule of read data, value list:
### any : any available server
### slave : slave first, access master when all slaves down or offline
### master : master only (default)
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
read_rule = master

# the mode of retry interval, value list:
### fixed for fixed interval
### multiple for multiplication (default)
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
retry_interval_mode = multiple

# the max retry interval in milliseconds
# valid when retry_interval_mode set to multiple
# default value is 3000 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
retry_max_interval_ms = 3000

# retry times when connect to server fail
###  0 for never retry
### < 0 for infinite retry
# default value is 200
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
connect_retry_times = 200

# retry interval when connect to server fail
# unit: milliseconds
# default value is 100 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
connect_retry_interval_ms = 100

# retry times when communicate with server fail
###  0 for never retry
### < 0 for infinite retry
# default value is 200
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
network_retry_times = 200

# retry interval when communicate with server fail
# unit: milliseconds
# default value is 100 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
network_retry_interval_ms = 100

# if use busy polling for RDMA network
# should set to true for HPC
# default value is false
busy_polling = false


[idempotency]
# if enable RPC idempotency for highest level consistency
# default value is false
enabled = true

# the idempotency channel hashtable capacity
# default value is 1361
channel_htable_capacity = 1361

# the heartbeat interval for RPC idempotency channel
# unit: seconds
# default value is 3s
channel_heartbeat_interval = 3

# close the idempotency channel when max idle time reachs
# unit: seconds
# default value is 300s
channel_max_idle_time  = 300

# max connections for RPC idempotency report
# you should set this parameter larger than the total server count of
# FastDIR and FastStore
# default value is 256
max_connections = 1024

# work thread count for RPC idempotency report
# default value is 1
work_threads = 1

# max pkg size for RPC idempotency report
# default value is 256KB
max_pkg_size = 256KB

# thread stack size, should >= 320KB
thread_stack_size = 512KB


[FastDIR]
# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# the namespace for FastDIR
namespace = fs

# config the cluster servers
cluster_config_filename = ../fdir/cluster.conf

# if use sys lock for file append and truncate to avoid conflict
# set true when the files appended or truncated by many nodes (FUSE instances)
# default value is false
use_sys_lock_for_append = false

# if async report file attributes (size, modify time etc.) to the FastDIR server
# default value is true
async_report_enabled = true

# the interval in milliseconds for async report file attributes to the FastDIR server
# default value is 100 ms
async_report_interval_ms = 100

# the sharding count of hashtable
# NO more than 1000 is recommended
# default value is 17
hashtable_sharding_count = 17

# the capacity (bucket count) of all sharding hashtables
# default value is 1403641
hashtable_total_capacity = 1403641

# the shared allocators for hashtabe entry, task etc.
# NO more than the CPU cores is recommended
# default value is 11
shared_allocator_count = 11

# set the owner (user and group) of new created files and directories
# the values are:
## caller: current user and group from the calling process (default)
## fixed: fixed user and group
owner_type = caller

# set the user owner (username) of the new created files and directories
# this parameter is valid only when owner_type set to fixed
# empty for the user who runs the fcfs_fused program
owner_user =

# set the group owner (group name) of the new created files and directories
# this parameter is valid only when owner_type set to fixed
# empty for the group of the user who runs the fcfs_fused program
owner_group =


[FastStore]
# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# config the cluster servers and groups
cluster_config_filename = ../fstore/cluster.conf

# the sharding count of hashtable
# NO more than 1000 is recommended
# default value is 163
hashtable_sharding_count = 163

# the capacity (bucket count) of all sharding hashtables
# default value is 1403641
hashtable_total_capacity = 1403641

# the shared allocators for hashtabe entry, task, slice etc.
# NO more than the CPU cores is recommended
# default value is 17
shared_allocator_count = 17


[write-combine]
# if enable write combine feature for FastStore
# default value is true
enabled = true

# the buffer size for write combine
# the min value is 64KB and the max value is the data block size such as 4MB
# default value is 256KB
buffer_size = 256KB

# the min wait time in milliseconds for write combine
# the min value is 10ms and the max value is 100ms
# default value is 20ms
min_wait_time_ms = 50

# the max wait time in milliseconds for write combine
# the min value is 100ms and the max value is 10000ms
# default value is 1000ms
max_wait_time_ms = 1000

# the slice size for skipping write combine
# skip combine when the slice size >= this parameter
# the min value is 64KB and the max value is the data block size such as 4MB
# default value is 256KB
skip_combine_on_slice_size = 256KB

# the merged slice count of last combine for skipping write combine
# skip combine when the last combine is in progress and
# it's merged slice count <= this parameter
# default value is 1
skip_combine_on_last_merged_slices = 1

# the shared locks for timer (timeout manager)
# default value is 163
timer_shared_lock_count = 163

# the max waiting slice count in queue for flow control
# default value is 16
max_waiting_slice_count = 16

# the thread limit (max threads) for the thread pool
# default value is 8
thread_pool_max_threads = 8

# the min idle thread count for the thread pool
# default value is 2
thread_pool_min_idle_count = 2

# the max idle time in seconds for the thread pool
# the running thread will exit on three conditions:
##   1. this paramter > 0
##   2. running thread count > thread_pool_min_idle_count
##   3. the thread's idle time exceeds this parameter
# default value is 300 (seconds)
thread_pool_max_idle_time = 300


[read-ahead]
# if enable read ahead feature for FastStore
# default value is true
enabled = true

# the TTL in miliseconds for preread cache
# the min value is 100ms and the max value is 10000ms
# default value is 1000ms
cache_ttl_ms = 1000

# the min buffer size for preread
# the min value is 1KB and the max value is 16KB
# default value is 4KB
min_buffer_size = 4KB

# the max buffer size for preread
# the min value is 16KB and the max value is 256KB
# default value is 128KB
max_buffer_size = 128KB

# the slice size for skipping read ahead
# skip read ahead when the slice size >= this parameter
# the min value is 8KB and the max value is 128KB
# default value is half of max_buffer_size
skip_preread_on_slice_size = 64KB

# the shared locks for preread hashtable
# default value is 1361
shared_lock_count = 1361

[FUSE]
# if single thread mode
# set true to disable multi-threaded operation
# default value is false
singlethread = false

# if use separate fuse device fd for each thread
# set to true for more high performance
# default value is false
clone_fd = true

# the max worker threads for FUSE
# this parameter is valid when the version of libfuse >= 3.12
# default value is 10
max_threads = 10

# the max idle worker threads for FUSE
# default value is 10
max_idle_threads = 10

# access permissions for other users
# the values are:
##  all for all users
##  root for root only
##  empty or other values for none
allow_others = all

# mount the filesystem read-only as mount option: ro
# default value is false
read_only = false

# auto unmount on process termination
# default value is false
auto_unmount = false

# cache time for file entry in seconds
# default value is 1.0s
entry_timeout = 5.0

# cache time for file attribute in seconds
# default value is 1.0s
attribute_timeout = 5.0

# if enable kernel writeback cache
# set to true for unshared data scene (private data for single node)
# default value is true
writeback_cache = true

# if keep kernel cache for read
# set to true for unshared data scene (private data for single node)
# should set to false on shared data scene for multi nodes
# default value is true
kernel_cache = true

# if enable x-attribute
# default value is false
# IMPORTANT NOTE:
### because Linux kernel get the xattr "security.capability" *EVERY* write,
### do NOT change this parameter to true unless your application need
### setxattr, getxattr or listxattr really!
xattr_enabled = false

# if enable additional groups for POSIX ACL
# default value is true
groups_enabled = true


[groups-cache]
# if enable additional groups cache
# default value is true
enabled = true

# the timeout of additional groups cache in seconds
# default value is 300 seconds
timeout = 300

# element limit for less memory usage
# default value is 65536
element_limit = 65536

# the sharding count of hashtable
# NO more than 1000 is recommended
# default value is 163
hashtable_sharding_count = 163

# the capacity (bucket count) of all sharding hashtables
# default value is 175447
hashtable_total_capacity = 175447

# the shared allocators for hashtabe entry, task etc.
# NO more than the CPU cores is recommended
# default value is 7
shared_allocator_count = 7


================================================
FILE: conf/full/papi.conf
================================================
# the base path to store log files
# this path must exist
base_path = /opt/fastcfs/fcfs

# the virtual mount point
mountpoint = /opt/fastcfs/fuse

#standard log level as syslog, case insensitive, value list:
### emerg for emergency
### alert
### crit for critical
### error
### warn for warning
### notice
### info
### debug
log_level = info

#unix group name to run this program, 
#not set (empty) means run by the group of current user
run_by_group =

#unix username to run this program,
#not set (empty) means run by current user
run_by_user =

# sync log buff to disk every interval seconds
# default value is 1 seconds
sync_log_buff_interval = 1

# if rotate the error log every day
# default value is false
rotate_error_log = false

# rotate error log time base, time format: Hour:Minute
# Hour from 0 to 23, Minute from 0 to 59
# default value is 00:00
error_log_rotate_time = 00:00

# if compress the old error log by gzip
# default value is false
compress_old_error_log = false

# compress the error log days before
# default value is 1
compress_error_log_days_before = 7

# rotate error log when the log file exceeds this size
# 0 means never rotates log file by log file size
# default value is 0
rotate_error_log_size = 0

# keep days of the log files
# 0 means do not delete old log files
# default value is 0
log_file_keep_days = 0


# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# TCP quick ack for Linux (setsockopt with TCP_QUICKACK option)
# default value is true
tcp_quick_ack = true

# the rule of read data, value list:
### any : any available server
### slave : slave first, access master when all slaves down or offline
### master : master only (default)
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
read_rule = master

# the mode of retry interval, value list:
### fixed for fixed interval
### multiple for multiplication (default)
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
retry_interval_mode = multiple

# the max retry interval in milliseconds
# valid when retry_interval_mode set to multiple
# default value is 3000 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
retry_max_interval_ms = 3000

# retry times when connect to server fail
###  0 for never retry
### < 0 for infinite retry
# default value is 200
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
connect_retry_times = 200

# retry interval when connect to server fail
# unit: milliseconds
# default value is 100 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
connect_retry_interval_ms = 100

# retry times when communicate with server fail
###  0 for never retry
### < 0 for infinite retry
# default value is 200
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
network_retry_times = 200

# retry interval when communicate with server fail
# unit: milliseconds
# default value is 100 ms
# this parameter can be overriden / redefined in section [FastDIR] and [FastStore]
network_retry_interval_ms = 100

[idempotency]
# if enable RPC idempotency for highest level consistency
# default value is false
enabled = true

# the idempotency channel hashtable capacity
# default value is 1361
channel_htable_capacity = 1361

# the heartbeat interval for RPC idempotency channel
# unit: seconds
# default value is 3s
channel_heartbeat_interval = 3

# close the idempotency channel when max idle time reachs
# unit: seconds
# default value is 300s
channel_max_idle_time  = 300

# max connections for RPC idempotency report
# you should set this parameter larger than the total server count of
# FastDIR and FastStore
# default value is 256
max_connections = 1024

# work thread count for RPC idempotency report
# default value is 1
work_threads = 1

# max pkg size for RPC idempotency report
# default value is 256KB
max_pkg_size = 256KB

# thread stack size, should >= 320KB
thread_stack_size = 512KB


[FastDIR]
# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# the namespace for FastDIR
namespace = fs

# config the cluster servers
cluster_config_filename = ../fdir/cluster.conf

# if use sys lock for file append and truncate to avoid conflict
# set true when the files appended or truncated by many nodes (FUSE instances)
# default value is false
use_sys_lock_for_append = false

# if async report file attributes (size, modify time etc.) to the FastDIR server
# default value is true
async_report_enabled = true

# the interval in milliseconds for async report file attributes to the FastDIR server
# default value is 100 ms
async_report_interval_ms = 100

# the sharding count of hashtable
# NO more than 1000 is recommended
# default value is 17
hashtable_sharding_count = 17

# the capacity (bucket count) of all sharding hashtables
# default value is 1403641
hashtable_total_capacity = 1403641

# the shared allocators for hashtabe entry, task etc.
# NO more than the CPU cores is recommended
# default value is 11
shared_allocator_count = 11

# set the owner (user and group) of new created files and directories
# the values are:
## caller: current user and group from the calling process (default)
## fixed: fixed user and group
owner_type = caller

# set the user owner (username) of the new created files and directories
# this parameter is valid only when owner_type set to fixed
# empty for the user who runs the fs_fused program
owner_user =

# set the group owner (group name) of the new created files and directories
# this parameter is valid only when owner_type set to fixed
# empty for the group of the user who runs the fs_fused program
owner_group =


[FastStore]
# connect timeout in seconds
# default value is 10
# Note: in the intranet network (LAN), 10 seconds is enough.
connect_timeout = 10

# network timeout in seconds
# default value is 60
network_timeout = 60

# config the cluster servers and groups
cluster_config_filename = ../fstore/cluster.conf

# the sharding count of hashtable
# NO more than 1000 is recommended
# default value is 163
hashtable_sharding_count = 163

# the capacity (bucket count) of all sharding hashtables
# default value is 1403641
hashtable_total_capacity = 1403641

# the shared allocators for hashtabe entry, task, slice etc.
# NO more than the CPU cores is recommended
# default value is 17
shared_allocator_count = 17


[write-combine]
# if enable write combine feature for FastStore
# default value is true
enabled = true

# the buffer size for write combine
# the min value is 64KB and the max value is the data block size such as 4MB
# default value is 256KB
buffer_size = 256KB

# the min wait time in milliseconds for write combine
# the min value is 10ms and the max value is 100ms
# default value is 20ms
min_wait_time_ms = 50

# the max wait time in milliseconds for write combine
# the min value is 100ms and the max value is 10000ms
# default value is 1000ms
max_wait_time_ms = 1000

# the slice size for skipping write combine
# skip combine when the slice size >= this parameter
# the min value is 64KB and the max value is the data block size such as 4MB
# default value is 256KB
skip_combine_on_slice_size = 256KB

# the merged slice count of last combine for skipping write combine
# skip combine when the last combine is in progress and
# it's merged slice count <= this parameter
# default value is 1
skip_combine_on_last_merged_slices = 1

# the shared locks for timer (timeout manager)
# default value is 163
timer_shared_lock_count = 163

# the max waiting slice count in queue for flow control
# default value is 16
max_waiting_slice_count = 16

# the thread limit (max threads) for the thread pool
# default value is 8
thread_pool_max_threads = 8

# the min idle thread count for the thread pool
# default value is 2
thread_pool_min_idle_count = 2

# the max idle time in seconds for the thread pool
# the running thread will exit on three conditions:
##   1. this paramter > 0
##   2. running thread count > thread_pool_min_idle_count
##   3. the thread's idle time exceeds this parameter
# default value is 300 (seconds)
thread_pool_max_idle_time = 300


[read-ahead]
# if enable read ahead feature for FastStore
# default value is true
enabled = true

# the TTL in miliseconds for preread cache
# the min value is 100ms and the max value is 10000ms
# default value is 1000ms
cache_ttl_ms = 1000

# the min buffer size for preread
# the min value is 1KB and the max value is 16KB
# default value is 4KB
min_buffer_size = 4KB

# the max buffer size for preread
# the min value is 16KB and the max value is 256KB
# default value is 128KB
max_buffer_size = 128KB

# the slice size for skipping read ahead
# skip read ahead when the slice size >= this parameter
# the min value is 8KB and the max value is 128KB
# default value is half of max_buffer_size
skip_preread_on_slice_size = 64KB

# the shared locks for preread hashtable
# default value is 1361
shared_lock_count = 1361


================================================
FILE: conf/fuse.conf
================================================
# the base path to store log files
# this path must exist
base_path = /opt/fastcfs/fcfs

# the mount point (local path) for FUSE
# the local path must exist
mountpoint = /opt/fastcfs/fuse

# if use busy polling for RDMA network
# should set to true for HPC
# default value is false
busy_polling = false


[idempotency]
# if enable RPC idempotency for highest level consistency
# default value is false
enabled = true

# thread stack size, should >= 320KB
thread_stack_size = 512KB


[FastDIR]
# the namespace for FastDIR
namespace = fs

# config the cluster servers
cluster_config_filename = ../fdir/cluster.conf

# if use sys lock for file append and truncate to avoid conflict
# set true when the files appended or truncated by many nodes (FUSE instances)
# default value is false
use_sys_lock_for_append = false

# if async report file attributes (size, modify time etc.) to the FastDIR server
# default value is true
async_report_enabled = true

# the interval in milliseconds for async report file attributes to the FastDIR server
# default value is 100 ms
async_report_interval_ms = 100


[FastStore]
# config the cluster servers and groups
cluster_config_filename = ../fstore/cluster.conf


[write-combine]
# if enable write combine feature for FastStore
# default value is true
enabled = true


[read-ahead]
# if enable read ahead feature for FastStore
# default value is true
enabled = true


[FUSE]
# if use separate fuse device fd for each thread
# set to true for more high performance
# default value is false
clone_fd = true

# access permissions for other users
# the values are:
##  all for all users
##  root for root only
##  empty or other values for none
allow_others = all

# cache time for file attribute in seconds
# default value is 1.0s
attribute_timeout = 5.0

# cache time for file entry in seconds
# default value is 1.0s
entry_timeout = 5.0

# if enable kernel writeback cache
# set to true for unshared data scene (private data for single node)
# default value is true
writeback_cache = true

# if keep kernel cache for read
# set to true for unshared data scene (private data for single node)
# should set to false on shared data scene for multi nodes
# default value is true
kernel_cache = true

# if enable x-attribute
# default value is false
# IMPORTANT NOTE:
### because Linux kernel get the xattr "security.capability" *EVERY* write,
### do NOT change this parameter to true unless your application need
### setxattr, getxattr or listxattr really!
xattr_enabled = false


================================================
FILE: conf/papi.conf
================================================
# the base path to store log files
# this path must exist
base_path = /opt/fastcfs/fcfs

# the virtual mount point
mountpoint = /


[idempotency]
# if enable RPC idempotency for highest level consistency
# default value is false
enabled = true

# thread stack size, should >= 320KB
thread_stack_size = 512KB


[FastDIR]
# the namespace for FastDIR
namespace = fs

# config the cluster servers
cluster_config_filename = ../fdir/cluster.conf

# if use sys lock for file append and truncate to avoid conflict
# set true when the files appended or truncated by many nodes (FUSE instances)
# default value is false
use_sys_lock_for_append = false

# if async report file attributes (size, modify time etc.) to the FastDIR server
# default value is true
async_report_enabled = true

# the interval in milliseconds for async report file attributes to the FastDIR server
# default value is 100 ms
async_report_interval_ms = 100


[FastStore]
# config the cluster servers and groups
cluster_config_filename = ../fstore/cluster.conf


[write-combine]
# if enable write combine feature for FastStore
# default value is true
enabled = true


[read-ahead]
# if enable read ahead feature for FastStore
# default value is true
enabled = true


================================================
FILE: debian/changelog
================================================
fastcfs (5.5.0-1) unstable; urgency=medium

  * upgrade to 5.5.0-1

 -- YuQing <384681@qq.com>  Sun, 23 Nov 2025 10:53:21 +0000

fastcfs (5.5.0-1) unstable; urgency=medium

  * upgrade to 5.5.0-1

 -- YuQing <384681@qq.com>  Sun, 23 Nov 2025 10:06:42 +0000

fastcfs (5.5.0-1) unstable; urgency=medium

  * upgrade to 5.5.0-1

 -- YuQing <384681@qq.com>  Sun, 23 Nov 2025 09:11:49 +0000

fastcfs (5.4.1-1) unstable; urgency=medium

  * upgrade to 5.4.1-1

 -- YuQing <384681@qq.com>  Sat, 16 Aug 2025 16:37:13 +0000

fastcfs (5.4.0-1) unstable; urgency=medium

  * upgrade to 5.4.0-1

 -- YuQing <384681@qq.com>  Sun, 06 Apr 2025 17:01:49 +0000

fastcfs (5.3.2-1) unstable; urgency=medium

  * upgrade to 5.3.2-1

 -- YuQing <384681@qq.com>  Sun, 29 Sep 2024 15:29:40 +0000

fastcfs (5.3.1-1) unstable; urgency=medium

  * upgrade to 5.3.1-1

 -- YuQing <384681@qq.com>  Sat, 15 Jun 2024 14:50:36 +0000

fastcfs (5.3.0-1) unstable; urgency=medium

  * upgrade to 5.3.0-1

 -- YuQing <384681@qq.com>  Sun, 17 Mar 2024 15:16:01 +0000

fastcfs (5.2.0-1) unstable; urgency=medium

  * upgrade to 5.2.0-1

 -- YuQing <384681@qq.com>  Wed, 31 Jan 2024 12:05:19 +0000

fastcfs (5.1.0-1) unstable; urgency=medium

  * upgrade to 5.1.0-1

 -- YuQing <384681@qq.com>  Mon, 01 Jan 2024 11:30:03 +0000

fastcfs (5.0.0-3) unstable; urgency=medium

  * upgrade to 5.0.0-3

 -- YuQing <384681@qq.com>  Tue, 21 Nov 2023 14:41:40 +0000

fastcfs (5.0.0-2) unstable; urgency=medium

  * upgrade to 5.0.0-2

 -- YuQing <384681@qq.com>  Mon, 20 Nov 2023 13:29:08 +0000

fastcfs (5.0.0-1) unstable; urgency=medium

  * upgrade to 5.0.0-1

 -- YuQing <384681@qq.com>  Sun, 19 Nov 2023 14:50:41 +0000

fastcfs (4.3.0-1) unstable; urgency=medium

  * upgrade to 4.3.0-1

 -- YuQing <384681@qq.com>  Sun, 06 Aug 2023 07:28:20 +0000

fastcfs (4.2.0-1) unstable; urgency=medium

  * upgrade to 4.2.0-1

 -- YuQing <384681@qq.com>  Sun, 23 Jul 2023 14:33:49 +0000

fastcfs (4.1.0-1) unstable; urgency=medium

  * upgrade to 4.1.0-1

 -- YuQing <384681@qq.com>  Sat, 24 Jun 2023 06:57:02 +0000

fastcfs (4.0.0-1) unstable; urgency=medium

  * upgrade to 4.0.0-1

 -- YuQing <384681@qq.com>  Sun, 04 Jun 2023 10:59:03 +0000

fastcfs (3.7.2-1) unstable; urgency=medium

  * upgrade to 3.7.2-1

 -- YuQing <384681@qq.com>  Sat, 18 Feb 2023 05:50:44 +0000

fastcfs (3.7.1-1) unstable; urgency=medium

  * upgrade to 3.7.1-1

 -- YuQing <384681@qq.com>  Sun, 15 Jan 2023 13:56:32 +0000

fastcfs (3.7.0-1) unstable; urgency=medium

  * upgrade to 3.7.0-1

 -- YuQing <384681@qq.com>  Mon, 21 Nov 2022 15:01:45 +0000

fastcfs (3.6.2-1) unstable; urgency=medium

  * upgrade to 3.6.2-1

 -- YuQing <384681@qq.com>  Sat, 08 Oct 2022 13:30:32 +0000

fastcfs (3.6.1-1) unstable; urgency=medium

  * upgrade to 3.6.1-1

 -- YuQing <384681@qq.com>  Thu, 22 Sep 2022 12:24:49 +0000

fastcfs (3.6.0-1) unstable; urgency=medium

  * upgrade to 3.6.0-1

 -- YuQing <384681@qq.com>  Wed, 07 Sep 2022 13:38:59 +0000

fastcfs (3.5.0-2) unstable; urgency=medium

  * upgrade to 3.5.0-2

 -- YuQing <384681@qq.com>  Sat, 30 Jul 2022 12:58:43 +0000

fastcfs (3.5.0-1) unstable; urgency=medium

  * upgrade to 3.5.0-1

 -- YuQing <384681@qq.com>  Mon, 25 Jul 2022 13:54:45 +0000

fastcfs (3.4.0-2) unstable; urgency=medium

  * upgrade to 3.4.0-2

 -- YuQing <384681@qq.com>  Thu, 30 Jun 2022 15:20:18 +0000

fastcfs (3.4.0-1) unstable; urgency=medium

  * upgrade to 3.4.0-1

 -- YuQing <384681@qq.com>  Wed, 15 Jun 2022 14:28:17 +0000

fastcfs (3.3.0-1) unstable; urgency=medium

  * upgrade to 3.3.0-1

 -- YuQing <384681@qq.com>  Thu, 28 Apr 2022 11:56:12 +0000

fastcfs (3.2.0-1) unstable; urgency=medium

  [ sungness ]
  * Update README.md
  * Update AUTH-zh_CN.md
  * Update docs style
  * Update CONFIGURE-zh_CN.md
  * update docs style
  * Update fcfs.sh add status command
  * Update fcfs-ops-tool.md add  description for status command
  * Update fcfs.sh

  [ YuQing ]
  * CONFIGURE-zh_CN.md changed for storage engine

  [ sungness ]
  * Update fcfs.sh and fcfs_conf.sh add storage.conf for fdir

  [ YuQing ]
  * AUTH-zh_CN.md changed
  * AUTH-zh_CN.md refined
  * AUTH-zh_CN.md format
  * fcfs_authd.service rename to fastauth.service
  * README: description improved
  * fix permission check for storage pool list
  * fcfs_pool.c: beautify spool output
  * fix list_spool and list_gpool return status
  * [fauth] support regenerate secret key
  * use -y option to confirm when the user is same with the admin
  * beautify prompt for -y option
  * change FUSEOwnerType to FCFSAPIOwnerType
  * add files src/api/fcfs_posix_api.[hc]
  * move fcfs_posix_api.[hc] to std/posix_api.[hc]
  * add files: std/fd_manager.[hc]
  * add files: std/papi_file.[hc] and std/papi_dir.[hc]
  * fcfs_write and fcfs_pwrite impl.
  * fcfs_writev and fcfs_pwritev impl.
  * fcfs_read[v] and fcfs_pread[v] impl.
  * impl. fcfs_fstat, fcfs_symlinkat, etc.
  * rename papi_file.[hc] to papi.[hc]
  * call stat_dentry_xxx with flags
  * call link_dentry_xxx with flags
  * fcfs_api_file.c: check_writable and check_readable
  * impl. fcfs_utimes, fcfs_rename etc.
  * call remove_dentry_xxx with flags
  * impl. fcfs_setxattr, fcfs_getxattr etc.
  * impl. opendir, readdir, closedir ...
  * fcntl impl.
  * chdir and getcwd impl.
  * wrapper chroot, dup, dup2 etc.
  * add src/api/tests/test_papi_copy.c and test passed
  * test_papi_copy.c: support readv & writev
  * add preload files: types.h and global.[hc]
  * adapt dlsym in mac OS
  * preload api wrapper done.
  * set get size flags for getxattr and listxattr
  * proxy api correctly (such as use syscall) when not inited
  * __xstat, __lxstat etc. implement OK.

  [ vazmin ]
  * fcfs_authd service rename to fastauth

  [ YuQing ]
  * support posix_fallocate, dprintf etc.
  * support euidaccess and eaccess
  * preload support posix_fallocate, dprintf etc.
  * C API fcfs_fopen impl.
  * remove ctx parameter for posix functions with fd
  * fdopen, freopen impl.
  * impl. fputc, fgetc, fread, fwrite etc.
  * impl. getdelim, getline etc.
  * support function fcfs_readline
  * preload for c APIs
  * change function prototypes for __xmknod and __xmknodat
  * compile passed in MacOS
  * impl. __fprintf_chk and __vfprintf_chk
  * impl. fsync, fdatasync and fcloseall
  * preload use syscall to forward request
  * papi.[hc] use fcfs_getcwd for current directory
  * extract common codes for posix_api_init
  * impl. fcfs_api_log_client_common_configs and fcfs_posix_api_log_configs
  * add docs/cluster-expansion-zh_CN.md
  * docs/cluster-expansion-zh_CN.md refined
  * docs/cluster-expansion-zh_CN.md refined v2
  * docs/cluster-expansion-zh_CN.md refined v3
  * upgrade version to 3.2.0
  * upgrade versions for RPM spec files
  * compile passed in CentOS 7.4
  * fuse.conf add parameter: xattr_enabled
  * docs/cluster-expansion-zh_CN.md refined v4
  * add link to docs/cluster-expansion-zh_CN.md

  [ Jerry ]
  * add mkdocs for documents build

  [ YuQing ]
  * add comments for posix_api.h
  * cluster-expansion-zh_CN.md refined v5
  * change version declare for README.md
  * README refined

 -- YuQing <384681@qq.com>  Sun, 13 Mar 2022 17:07:08 +0800

fastcfs (3.1.0-1) unstable; urgency=medium

  * upgrade version to 3.1.0

 -- YuQing <384681@qq.com>  Sat, 15 Jan 2022 20:54:06 +0800

fastcfs (3.0.0-1) unstable; urgency=medium

  * upgrade version to 3.0.0

 -- YuQing <384681@qq.com>  Sun, 26 Dec 2021 21:55:51 +0800
 
fastcfs (2.3.0-1) unstable; urgency=medium

  * Initial release.

 -- YuQing <384681@qq.com>  Tue, 20 Jul 2021 00:55:33 +0800


================================================
FILE: debian/compat
================================================
11


================================================
FILE: debian/control
================================================
Source: fastcfs
Section: admin
Priority: optional
Maintainer: YuQing <384681@qq.com>
Build-Depends: debhelper (>=11~),
               fastdir-dev (>= 3.2.0) <pkg.fastcfs.core>,
               faststore-dev (>= 3.2.0) <pkg.fastcfs.core>,
               libfuse3-dev (>= 3.10.1) <pkg.fastcfs.core>,
               fastcfs-auth-dev (>=3.6.0) <pkg.fastcfs.core>,
               fastcfs-vote-dev (>=3.6.0) <pkg.fastcfs.core>,
               libfastcommon-dev (>= 1.0.56),
               libserverframe-dev (>= 1.1.13)
Standards-Version: 4.1.4
Homepage: http://github.com/happyfish100/FastCFS/


Package: fastcfs
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastcfs-fused (= ${binary:Version}),
         fastcfs-utils (= ${binary:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: the auth client library and config files of FastCFS.
 a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.


Package: fastcfs-fused
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastcfs-api-libs (= ${binary:Version}),
         fuse3 (>= 3.10.1),
         fastcfs-fuse-config (>= ${fastcfs-fuse-config:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS fuse

Package: fastcfs-utils
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: libserverframe (>= ${libserverframe:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS utils

Package: fastcfs-api-libs
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastdir-client (>= ${fastdir-client:Version}),
         faststore-client (>= ${faststore-client:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS api library

Package: fastcfs-api-tests
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastcfs-fuse-config (>= ${fastcfs-fuse-config:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS api tests

Package: fastcfs-api-dev
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastcfs-api-libs (= ${binary:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: header files of FastCFS api library

Package: fastcfs-auth-server
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: fastdir-client (>= ${fastdir-client:Version}),
         fastcfs-auth-config (>= ${fastcfs-auth-config:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS auth server

Package: fastcfs-fuse-config
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: faststore-config (>= ${faststore-config:Version})
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS fuse config files for sample

Package: fastcfs-auth
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.auth.client>
Depends: libfastcommon (>= ${libfastcommon:Version}),
         libserverframe (>= ${libserverframe:Version}),
         fastcfs-auth-server (= ${binary:Version}),
         fastcfs-auth-client (= ${binary:Version}),
         fastcfs-auth-config (>= ${fastcfs-auth-config:Version}),
         ${misc:Depends}
Description: the auth client library and config files of FastCFS.
 FastCFS is a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.


Package: fastcfs-auth-dev
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.auth.client>
Depends: fastcfs-auth-client (= ${binary:Version}),
         ${misc:Depends}
Description: header files of FastCFS auth client
 This package provides the header files of libfcfsauthclient

 
Package: fastcfs-auth-client
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.auth.client>
Depends: libfastcommon (>= ${libfastcommon:Version}),
         libserverframe (>= ${libserverframe:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS auth client
 FastCFS auth client

Package: fastcfs-auth-config
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.auth.client>
Depends: ${misc:Depends}
Description: FastCFS auth config files for sample
 FastCFS auth config files for sample

Package: fastcfs-vote-server
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.fastcfs.core>
Depends: libserverframe (>= ${libserverframe:Version}),
         fastcfs-vote-config (>= ${fastcfs-vote-config:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS vote server

Package: fastcfs-vote
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.vote.client>
Depends: libfastcommon (>= ${libfastcommon:Version}),
         libserverframe (>= ${libserverframe:Version}),
         fastcfs-vote-server (= ${binary:Version}),
         fastcfs-vote-client (= ${binary:Version}),
         fastcfs-vote-config (>= ${fastcfs-vote-config:Version}),
         ${misc:Depends}
Description: the vote client library and config files of FastCFS.
 FastCFS is a high performance distributed file system which can be used as the back-end storage of databases and cloud platforms.

Package: fastcfs-vote-dev
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.vote.client>
Depends: fastcfs-vote-client (= ${binary:Version}),
         ${misc:Depends}
Description: header files of FastCFS vote client
 This package provides the header files of libfcfsauthclient
 
Package: fastcfs-vote-client
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.vote.client>
Depends: libfastcommon (>= ${libfastcommon:Version}),
         libserverframe (>= ${libserverframe:Version}),
         ${misc:Depends}, ${shlibs:Depends}
Description: FastCFS vote client
 FastCFS vote client

Package: fastcfs-vote-config
Architecture: any
Multi-Arch: foreign
Build-Profiles: <pkg.vote.client>
Depends: ${misc:Depends}
Description: FastCFS vote config files for sample
 FastCFS vote config files for sample

================================================
FILE: debian/copyright
================================================
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
Upstream-Name: fastcfs
Source: <url://example.com>
#
# Please double check copyright with the licensecheck(1) command.

Files:     *
Copyright: 2020 YuQing <384681@qq.com>
License:   AGPL-3.0+
 This program is free software: you can use, redistribute, and/or modify
 it under the terms of the GNU Affero General Public License, version 3
 or later ("AGPL"), as published by the Free Software Foundation.
 .
 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.
 .
 You should have received a copy of the GNU Affero General Public License
 along with this program. If not, see <https://www.gnu.org/licenses/>.

# License file: LICENSE
                     GNU AFFERO GENERAL PUBLIC LICENSE
                        Version 3, 19 November 2007
 .
  Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
  Everyone is permitted to copy and distribute verbatim copies
  of this license document, but changing it is not allowed.
 .
                             Preamble
 .
   The GNU Affero General Public License is a free, copyleft license for
 software and other kinds of works, specifically designed to ensure
 cooperation with the community in the case of network server software.
 .
   The licenses for most software and other practical works are designed
 to take away your freedom to share and change the works.  By contrast,
 our General Public Licenses are intended to guarantee your freedom to
 share and change all versions of a program--to make sure it remains free
 software for all its users.
 .
   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
 them 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.
 .
   Developers that use our General Public Licenses protect your rights
 with two steps: (1) assert copyright on the software, and (2) offer
 you this License which gives you legal permission to copy, distribute
 and/or modify the software.
 .
   A secondary benefit of defending all users' freedom is that
 improvements made in alternate versions of the program, if they
 receive widespread use, become available for other developers to
 incorporate.  Many developers of free software are heartened and
 encouraged by the resulting cooperation.  However, in the case of
 software used on network servers, this result may fail to come about.
 The GNU General Public License permits making a modified version and
 letting the public access it on a server without ever releasing its
 source code to the public.
 .
   The GNU Affero General Public License is designed specifically to
 ensure that, in such cases, the modified source code becomes available
 to the community.  It requires the operator of a network server to
 provide the source code of the modified version running there to the
 users of that server.  Therefore, public use of a modified version, on
 a publicly accessible server, gives the public access to the source
 code of the modified version.
 .
   An older license, called the Affero General Public License and
 published by Affero, was designed to accomplish similar goals.  This is
 a different license, not a version of the Affero GPL, but Affero has
 released a new version of the Affero GPL which permits relicensing under
 this license.
 .
   The precise terms and conditions for copying, distribution and
 modification follow.
 .
                        TERMS AND CONDITIONS
 .
   0. Definitions.
 .
   "This License" refers to version 3 of the GNU Affero General Public License.
 .
   "Copyright" also means copyright-like laws that apply to other kinds of
 works, such as semiconductor masks.
 .
   "The Program" refers to any copyrightable work licensed under this
 License.  Each licensee is addressed as "you".  "Licensees" and
 "recipients" may be individuals or organizations.
 .
   To "modify" a work means to copy from or adapt all or part of the work
 in a fashion requiring copyright permission, other than the making of an
 exact copy.  The resulting work is called a "modified version" of the
 earlier work or a work "based on" the earlier work.
 .
   A "covered work" means either the unmodified Program or a work based
 on the Program.
 .
   To "propagate" a work means to do anything with it that, without
 permission, would make you directly or secondarily liable for
 infringement under applicable copyright law, except executing it on a
 computer or modifying a private copy.  Propagation includes copying,
 distribution (with or without modification), making available to the
 public, and in some countries other activities as well.
 .
   To "convey" a work means any kind of propagation that enables other
 parties to make or receive copies.  Mere interaction with a user through
 a computer network, with no transfer of a copy, is not conveying.
 .
   An interactive user interface displays "Appropriate Legal Notices"
 to the extent that it includes a convenient and prominently visible
 feature that (1) displays an appropriate copyright notice, and (2)
 tells the user that there is no warranty for the work (except to the
 extent that warranties are provided), that licensees may convey the
 work under this License, and how to view a copy of this License.  If
 the interface presents a list of user commands or options, such as a
 menu, a prominent item in the list meets this criterion.
 .
   1. Source Code.
 .
   The "source code" for a work means the preferred form of the work
 for making modifications to it.  "Object code" means any non-source
 form of a work.
 .
   A "Standard Interface" means an interface that either is an official
 standard defined by a recognized standards body, or, in the case of
 interfaces specified for a particular programming language, one that
 is widely used among developers working in that language.
 .
   The "System Libraries" of an executable work include anything, other
 than the work as a whole, that (a) is included in the normal form of
 packaging a Major Component, but which is not part of that Major
 Component, and (b) serves only to enable use of the work with that
 Major Component, or to implement a Standard Interface for which an
 implementation is available to the public in source code form.  A
 "Major Component", in this context, means a major essential component
 (kernel, window system, and so on) of the specific operating system
 (if any) on which the executable work runs, or a compiler used to
 produce the work, or an object code interpreter used to run it.
 .
   The "Corresponding Source" for a work in object code form means all
 the source code needed to generate, install, and (for an executable
 work) run the object code and to modify the work, including scripts to
 control those activities.  However, it does not include the work's
 System Libraries, or general-purpose tools or generally available free
 programs which are used unmodified in performing those activities but
 which are not part of the work.  For example, Corresponding Source
 includes interface definition files associated with source files for
 the work, and the source code for shared libraries and dynamically
 linked subprograms that the work is specifically designed to require,
 such as by intimate data communication or control flow between those
 subprograms and other parts of the work.
 .
   The Corresponding Source need not include anything that users
 can regenerate automatically from other parts of the Corresponding
 Source.
 .
   The Corresponding Source for a work in source code form is that
 same work.
 .
   2. Basic Permissions.
 .
   All rights granted under this License are granted for the term of
 copyright on the Program, and are irrevocable provided the stated
 conditions are met.  This License explicitly affirms your unlimited
 permission to run the unmodified Program.  The output from running a
 covered work is covered by this License only if the output, given its
 content, constitutes a covered work.  This License acknowledges your
 rights of fair use or other equivalent, as provided by copyright law.
 .
   You may make, run and propagate covered works that you do not
 convey, without conditions so long as your license otherwise remains
 in force.  You may convey covered works to others for the sole purpose
 of having them make modifications exclusively for you, or provide you
 with facilities for running those works, provided that you comply with
 the terms of this License in conveying all material for which you do
 not control copyright.  Those thus making or running the covered works
 for you must do so exclusively on your behalf, under your direction
 and control, on terms that prohibit them from making any copies of
 your copyrighted material outside their relationship with you.
 .
   Conveying under any other circumstances is permitted solely under
 the conditions stated below.  Sublicensing is not allowed; section 10
 makes it unnecessary.
 .
   3. Protecting Users' Legal Rights From Anti-Circumvention Law.
 .
   No covered work shall be deemed part of an effective technological
 measure under any applicable law fulfilling obligations under article
 11 of the WIPO copyright treaty adopted on 20 December 1996, or
 similar laws prohibiting or restricting circumvention of such
 measures.
 .
   When you convey a covered work, you waive any legal power to forbid
 circumvention of technological measures to the extent such circumvention
 is effected by exercising rights under this License with respect to
 the covered work, and you disclaim any intention to limit operation or
 modification of the work as a means of enforcing, against the work's
 users, your or third parties' legal rights to forbid circumvention of
 technological measures.
 .
   4. Conveying Verbatim Copies.
 .
   You may convey 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;
 keep intact all notices stating that this License and any
 non-permissive terms added in accord with section 7 apply to the code;
 keep intact all notices of the absence of any warranty; and give all
 recipients a copy of this License along with the Program.
 .
   You may charge any price or no price for each copy that you convey,
 and you may offer support or warranty protection for a fee.
 .
   5. Conveying Modified Source Versions.
 .
   You may convey a work based on the Program, or the modifications to
 produce it from the Program, in the form of source code under the
 terms of section 4, provided that you also meet all of these conditions:
 .
     a) The work must carry prominent notices stating that you modified
     it, and giving a relevant date.
 .
     b) The work must carry prominent notices stating that it is
     released under this License and any conditions added under section
     7.  This requirement modifies the requirement in section 4 to
     "keep intact all notices".
 .
     c) You must license the entire work, as a whole, under this
     License to anyone who comes into possession of a copy.  This
     License will therefore apply, along with any applicable section 7
     additional terms, to the whole of the work, and all its parts,
     regardless of how they are packaged.  This License gives no
     permission to license the work in any other way, but it does not
     invalidate such permission if you have separately received it.
 .
     d) If the work has interactive user interfaces, each must display
     Appropriate Legal Notices; however, if the Program has interactive
     interfaces that do not display Appropriate Legal Notices, your
     work need not make them do so.
 .
   A compilation of a covered work with other separate and independent
 works, which are not by their nature extensions of the covered work,
 and which are not combined with it such as to form a larger program,
 in or on a volume of a storage or distribution medium, is called an
 "aggregate" if the compilation and its resulting copyright are not
 used to limit the access or legal rights of the compilation's users
 beyond what the individual works permit.  Inclusion of a covered work
 in an aggregate does not cause this License to apply to the other
 parts of the aggregate.
 .
   6. Conveying Non-Source Forms.
 .
   You may convey a covered work in object code form under the terms
 of sections 4 and 5, provided that you also convey the
 machine-readable Corresponding Source under the terms of this License,
 in one of these ways:
 .
     a) Convey the object code in, or embodied in, a physical product
     (including a physical distribution medium), accompanied by the
     Corresponding Source fixed on a durable physical medium
     customarily used for software interchange.
 .
     b) Convey the object code in, or embodied in, a physical product
     (including a physical distribution medium), accompanied by a
     written offer, valid for at least three years and valid for as
     long as you offer spare parts or customer support for that product
     model, to give anyone who possesses the object code either (1) a
     copy of the Corresponding Source for all the software in the
     product that is covered by this License, on a durable physical
     medium customarily used for software interchange, for a price no
     more than your reasonable cost of physically performing this
     conveying of source, or (2) access to copy the
     Corresponding Source from a network server at no charge.
 .
     c) Convey individual copies of the object code with a copy of the
     written offer to provide the Corresponding Source.  This
     alternative is allowed only occasionally and noncommercially, and
     only if you received the object code with such an offer, in accord
     with subsection 6b.
 .
     d) Convey the object code by offering access from a designated
     place (gratis or for a charge), and offer equivalent access to the
     Corresponding Source in the same way through the same place at no
     further charge.  You need not require recipients to copy the
     Corresponding Source along with the object code.  If the place to
     copy the object code is a network server, the Corresponding Source
     may be on a different server (operated by you or a third party)
     that supports equivalent copying facilities, provided you maintain
     clear directions next to the object code saying where to find the
     Corresponding Source.  Regardless of what server hosts the
     Corresponding Source, you remain obligated to ensure that it is
     available for as long as needed to satisfy these requirements.
 .
     e) Convey the object code using peer-to-peer transmission, provided
     you inform other peers where the object code and Corresponding
     Source of the work are being offered to the general public at no
     charge under subsection 6d.
 .
   A separable portion of the object code, whose source code is excluded
 from the Corresponding Source as a System Library, need not be
 included in conveying the object code work.
 .
   A "User Product" is either (1) a "consumer product", which means any
 tangible personal property which is normally used for personal, family,
 or household purposes, or (2) anything designed or sold for incorporation
 into a dwelling.  In determining whether a product is a consumer product,
 doubtful cases shall be resolved in favor of coverage.  For a particular
 product received by a particular user, "normally used" refers to a
 typical or common use of that class of product, regardless of the status
 of the particular user or of the way in which the particular user
 actually uses, or expects or is expected to use, the product.  A product
 is a consumer product regardless of whether the product has substantial
 commercial, industrial or non-consumer uses, unless such uses represent
 the only significant mode of use of the product.
 .
   "Installation Information" for a User Product means any methods,
 procedures, authorization keys, or other information required to install
 and execute modified versions of a covered work in that User Product from
 a modified version of its Corresponding Source.  The information must
 suffice to ensure that the continued functioning of the modified object
 code is in no case prevented or interfered with solely because
 modification has been made.
 .
   If you convey an object code work under this section in, or with, or
 specifically for use in, a User Product, and the conveying occurs as
 part of a transaction in which the right of possession and use of the
 User Product is transferred to the recipient in perpetuity or for a
 fixed term (regardless of how the transaction is characterized), the
 Corresponding Source conveyed under this section must be accompanied
 by the Installation Information.  But this requirement does not apply
 if neither you nor any third party retains the ability to install
 modified object code on the User Product (for example, the work has
 been installed in ROM).
 .
   The requirement to provide Installation Information does not include a
 requirement to continue to provide support service, warranty, or updates
 for a work that has been modified or installed by the recipient, or for
 the User Product in which it has been modified or installed.  Access to a
 network may be denied when the modification itself materially and
 adversely affects the operation of the network or violates the rules and
 protocols for communication across the network.
 .
   Corresponding Source conveyed, and Installation Information provided,
 in accord with this section must be in a format that is publicly
 documented (and with an implementation available to the public in
 source code form), and must require no special password or key for
 unpacking, reading or copying.
 .
   7. Additional Terms.
 .
   "Additional permissions" are terms that supplement the terms of this
 License by making exceptions from one or more of its conditions.
 Additional permissions that are applicable to the entire Program shall
 be treated as though they were included in this License, to the extent
 that they are valid under applicable law.  If additional permissions
 apply only to part of the Program, that part may be used separately
 under those permissions, but the entire Program remains governed by
 this License without regard to the additional permissions.
 .
   When you convey a copy of a covered work, you may at your option
 remove any additional permissions from that copy, or from any part of
 it.  (Additional permissions may be written to require their own
 removal in certain cases when you modify the work.)  You may place
 additional permissions on material, added by you to a covered work,
 for which you have or can give appropriate copyright permission.
 .
   Notwithstanding any other provision of this License, for material you
 add to a covered work, you may (if authorized by the copyright holders of
 that material) supplement the terms of this License with terms:
 .
     a) Disclaiming warranty or limiting liability differently from the
     terms of sections 15 and 16 of this License; or
 .
     b) Requiring preservation of specified reasonable legal notices or
     author attributions in that material or in the Appropriate Legal
     Notices displayed by works containing it; or
 .
     c) Prohibiting misrepresentation of the origin of that material, or
     requiring that modified versions of such material be marked in
     reasonable ways as different from the original version; or
 .
     d) Limiting the use for publicity purposes of names of licensors or
     authors of the material; or
 .
     e) Declining to grant rights under trademark law for use of some
     trade names, trademarks, or service marks; or
 .
     f) Requiring indemnification of licensors and authors of that
     material by anyone who conveys the material (or modified versions of
     it) with contractual assumptions of liability to the recipient, for
     any liability that these contractual assumptions directly impose on
     those licensors and authors.
 .
   All other non-permissive additional terms are considered "further
 restrictions" within the meaning of section 10.  If the Program as you
 received it, or any part of it, contains a notice stating that it is
 governed by this License along with a term that is a further
 restriction, you may remove that term.  If a license document contains
 a further restriction but permits relicensing or conveying under this
 License, you may add to a covered work material governed by the terms
 of that license document, provided that the further restriction does
 not survive such relicensing or conveying.
 .
   If you add terms to a covered work in accord with this section, you
 must place, in the relevant source files, a statement of the
 additional terms that apply to those files, or a notice indicating
 where to find the applicable terms.
 .
   Additional terms, permissive or non-permissive, may be stated in the
 form of a separately written license, or stated as exceptions;
 the above requirements apply either way.
 .
   8. Termination.
 .
   You may not propagate or modify a covered work except as expressly
 provided under this License.  Any attempt otherwise to propagate or
 modify it is void, and will automatically terminate your rights under
 this License (including any patent licenses granted under the third
 paragraph of section 11).
 .
   However, if you cease all violation of this License, then your
 license from a particular copyright holder is reinstated (a)
 provisionally, unless and until the copyright holder explicitly and
 finally terminates your license, and (b) permanently, if the copyright
 holder fails to notify you of the violation by some reasonable means
 prior to 60 days after the cessation.
 .
   Moreover, your license from a particular copyright holder is
 reinstated permanently if the copyright holder notifies you of the
 violation by some reasonable means, this is the first time you have
 received notice of violation of this License (for any work) from that
 copyright holder, and you cure the violation prior to 30 days after
 your receipt of the notice.
 .
   Termination of your rights under this section does not terminate the
 licenses of parties who have received copies or rights from you under
 this License.  If your rights have been terminated and not permanently
 reinstated, you do not qualify to receive new licenses for the same
 material under section 10.
 .
   9. Acceptance Not Required for Having Copies.
 .
   You are not required to accept this License in order to receive or
 run a copy of the Program.  Ancillary propagation of a covered work
 occurring solely as a consequence of using peer-to-peer transmission
 to receive a copy likewise does not require acceptance.  However,
 nothing other than this License grants you permission to propagate or
 modify any covered work.  These actions infringe copyright if you do
 not accept this License.  Therefore, by modifying or propagating a
 covered work, you indicate your acceptance of this License to do so.
 .
   10. Automatic Licensing of Downstream Recipients.
 .
   Each time you convey a covered work, the recipient automatically
 receives a license from the original licensors, to run, modify and
 propagate that work, subject to this License.  You are not responsible
 for enforcing compliance by third parties with this License.
 .
   An "entity transaction" is a transaction transferring control of an
 organization, or substantially all assets of one, or subdividing an
 organization, or merging organizations.  If propagation of a covered
 work results from an entity transaction, each party to that
 transaction who receives a copy of the work also receives whatever
 licenses to the work the party's predecessor in interest had or could
 give under the previous paragraph, plus a right to possession of the
 Corresponding Source of the work from the predecessor in interest, if
 the predecessor has it or can get it with reasonable efforts.
 .
   You may not impose any further restrictions on the exercise of the
 rights granted or affirmed under this License.  For example, you may
 not impose a license fee, royalty, or other charge for exercise of
 rights granted under this License, and you may not initiate litigation
 (including a cross-claim or counterclaim in a lawsuit) alleging that
 any patent claim is infringed by making, using, selling, offering for
 sale, or importing the Program or any portion of it.
 .
   11. Patents.
 .
   A "contributor" is a copyright holder who authorizes use under this
 License of the Program or a work on which the Program is based.  The
 work thus licensed is called the contributor's "contributor version".
 .
   A contributor's "essential patent claims" are all patent claims
 owned or controlled by the contributor, whether already acquired or
 hereafter acquired, that would be infringed by some manner, permitted
 by this License, of making, using, or selling its contributor version,
 but do not include claims that would be infringed only as a
 consequence of further modification of the contributor version.  For
 purposes of this definition, "control" includes the right to grant
 patent sublicenses in a manner consistent with the requirements of
 this License.
 .
   Each contributor grants you a non-exclusive, worldwide, royalty-free
 patent license under the contributor's essential patent claims, to
 make, use, sell, offer for sale, import and otherwise run, modify and
 propagate the contents of its contributor version.
 .
   In the following three paragraphs, a "patent license" is any express
 agreement or commitment, however denominated, not to enforce a patent
 (such as an express permission to practice a patent or covenant not to
 sue for patent infringement).  To "grant" such a patent license to a
 party means to make such an agreement or commitment not to enforce a
 patent against the party.
 .
   If you convey a covered work, knowingly relying on a patent license,
 and the Corresponding Source of the work is not available for anyone
 to copy, free of charge and under the terms of this License, through a
 publicly available network server or other readily accessible means,
 then you must either (1) cause the Corresponding Source to be so
 available, or (2) arrange to deprive yourself of the benefit of the
 patent license for this particular work, or (3) arrange, in a manner
 consistent with the requirements of this License, to extend the patent
 license to downstream recipients.  "Knowingly relying" means you have
 actual knowledge that, but for the patent license, your conveying the
 covered work in a country, or your recipient's use of the covered work
 in a country, would infringe one or more identifiable patents in that
 country that you have reason to believe are valid.
 .
   If, pursuant to or in connection with a single transaction or
 arrangement, you convey, or propagate by procuring conveyance of, a
 covered work, and grant a patent license to some of the parties
 receiving the covered work authorizing them to use, propagate, modify
 or convey a specific copy of the covered work, then the patent license
 you grant is automatically extended to all recipients of the covered
 work and works based on it.
 .
   A patent license is "discriminatory" if it does not include within
 the scope of its coverage, prohibits the exercise of, or is
 conditioned on the non-exercise of one or more of the rights that are
 specifically granted under this License.  You may not convey a covered
 work if you are a party to an arrangement with a third party that is
 in the business of distributing software, under which you make payment
 to the third party based on the extent of your activity of conveying
 the work, and under which the third party grants, to any of the
 parties who would receive the covered work from you, a discriminatory
 patent license (a) in connection with copies of the covered work
 conveyed by you (or copies made from those copies), or (b) primarily
 for and in connection with specific products or compilations that
 contain the covered work, unless you entered into that arrangement,
 or that patent license was granted, prior to 28 March 2007.
 .
   Nothing in this License shall be construed as excluding or limiting
 any implied license or other defenses to infringement that may
 otherwise be available to you under applicable patent law.
 .
   12. No Surrender of Others' Freedom.
 .
   If 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 convey a
 covered work so as to satisfy simultaneously your obligations under this
 License and any other pertinent obligations, then as a consequence you may
 not convey it at all.  For example, if you agree to terms that obligate you
 to collect a royalty for further conveying from those to whom you convey
 the Program, the only way you could satisfy both those terms and this
 License would be to refrain entirely from conveying the Program.
 .
   13. Remote Network Interaction; Use with the GNU General Public License.
 .
   Notwithstanding any other provision of this License, if you modify the
 Program, your modified version must prominently offer all users
 interacting with it remotely through a computer network (if your version
 supports such interaction) an opportunity to receive the Corresponding
 Source of your version by providing access to the Corresponding Source
 from a network server at no charge, through some standard or customary
 means of facilitating copying of software.  This Corresponding Source
 shall include the Corresponding Source for any work covered by version 3
 of the GNU General Public License that is incorporated pursuant to the
 following paragraph.
 .
   Notwithstanding any other provision of this License, you have
 permission to link or combine any covered work with a work licensed
 under version 3 of the GNU General Public License into a single
 combined work, and to convey the resulting work.  The terms of this
 License will continue to apply to the part which is the covered work,
 but the work with which it is combined will remain governed by version
 3 of the GNU General Public License.
 .
   14. Revised Versions of this License.
 .
   The Free Software Foundation may publish revised and/or new versions of
 the GNU Affero 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 that a certain numbered version of the GNU Affero General
 Public License "or any later version" applies to it, you have the
 option of following the terms and conditions either of that numbered
 version or of any later version published by the Free Software
 Foundation.  If the Program does not specify a version number of the
 GNU Affero General Public License, you may choose any version ever published
 by the Free Software Foundation.
 .
   If the Program specifies that a proxy can decide which future
 versions of the GNU Affero General Public License can be used, that proxy's
 public statement of acceptance of a version permanently authorizes you
 to choose that version for the Program.
 .
   Later license versions may give you additional or different
 permissions.  However, no additional obligations are imposed on any
 author or copyright holder as a result of your choosing to follow a
 later version.
 .
   15. Disclaimer of Warranty.
 .
   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.
 .
   16. Limitation of Liability.
 .
   IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
 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.
 .
   17. Interpretation of Sections 15 and 16.
 .
   If the disclaimer of warranty and limitation of liability provided
 above cannot be given local legal effect according to their terms,
 reviewing courts shall apply local law that most closely approximates
 an absolute waiver of all civil liability in connection with the
 Program, unless a warranty or assumption of liability accompanies a
 copy of the Program in return for a fee.
 .
                      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
 state 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 Affero 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 Affero General Public License for more details.
 .
     You should have received a copy of the GNU Affero General Public License
     along with this program.  If not, see <https://www.gnu.org/licenses/>.
 .
 Also add information on how to contact you by electronic and paper mail.
 .
   If your software can interact with users remotely through a computer
 network, you should also make sure that it provides a way for users to
 get its source.  For example, if your program is a web application, its
 interface could display a "Source" link that leads users to an archive
 of the code.  There are many ways you could offer source, and different
 solutions will be better for different programs; see section 13 for the
 specific requirements.
 .
   You should also get your employer (if you work as a programmer) or school,
 if any, to sign a "copyright disclaimer" for the program, if necessary.
 For more information on this, and how to apply and follow the GNU AGPL, see
 <https://www.gnu.org/licenses/>.


================================================
FILE: debian/fastcfs-api-dev.install
================================================
usr/include/fastcfs/api/*

================================================
FILE: debian/fastcfs-api-libs.install
================================================
usr/lib/libfcfsapi.so*

================================================
FILE: debian/fastcfs-api-tests.install
================================================
usr/bin/fcfs_beachmark
usr/bin/fcfs_test_file_op
usr/bin/fcfs_test_file_copy
usr/bin/fcfs_test_papi_copy
usr/bin/fcfs_test_read_ahead

================================================
FILE: debian/fastcfs-auth-client.install
================================================
usr/lib/libfcfsauthclient.so*
usr/bin/fcfs_user
usr/bin/fcfs_pool
usr/bin/fauth_list_servers
usr/bin/fauth_cluster_stat


================================================
FILE: debian/fastcfs-auth-config.install
================================================
etc/fastcfs/auth/*.conf
etc/fastcfs/auth/keys/*


================================================
FILE: debian/fastcfs-auth-dev.install
================================================
usr/include/fastcfs/auth/*


================================================
FILE: debian/fastcfs-auth-server-config.install
================================================
usr/lib/systemd/system/fastauth.service

================================================
FILE: debian/fastcfs-auth-server.dirs
================================================
opt/fastcfs/auth

================================================
FILE: debian/fastcfs-auth-server.install
================================================
usr/bin/fcfs_authd

================================================
FILE: debian/fastcfs-fuse-config.install
================================================
etc/fastcfs/fcfs/*.conf

================================================
FILE: debian/fastcfs-fused.dirs
================================================
opt/fastcfs/fuse
opt/fastcfs/fcfs

================================================
FILE: debian/fastcfs-fused.install
================================================
usr/bin/fcfs_fused

================================================
FILE: debian/fastcfs-utils.install
================================================
usr/bin/fcfs_active_test
usr/bin/fcfs_pool_stat

================================================
FILE: debian/fastcfs-vote-client.install
================================================
usr/lib/libfcfsvoteclient.so*
usr/bin/fvote_cluster_stat


================================================
FILE: debian/fastcfs-vote-config.install
================================================
etc/fastcfs/vote/*.conf


================================================
FILE: debian/fastcfs-vote-dev.install
================================================
usr/include/fastcfs/vote/*


================================================
FILE: debian/fastcfs-vote-server.dirs
================================================
opt/fastcfs/vote

================================================
FILE: debian/fastcfs-vote-server.install
================================================
usr/bin/fcfs_voted

================================================
FILE: debian/rules
================================================
#!/usr/bin/make -f

export DESTDIR = $(CURDIR)/debian/tmp
export FUSE_CONFDIR=$(DESTDIR)/etc/fastcfs/fcfs/
export AUTH_CONFDIR=$(DESTDIR)/etc/fastcfs/auth/
export VOTE_CONFDIR=$(DESTDIR)/etc/fastcfs/vote/

%:
	dh $@

override_dh_auto_build:
ifneq ($(filter pkg.fastcfs.core,$(DEB_BUILD_PROFILES)),)
	./make.sh --exclude=client clean && ./make.sh --exclude=client
endif
ifneq ($(filter pkg.auth.client,$(DEB_BUILD_PROFILES)),)
	./make.sh --module=auth_client clean && ./make.sh --module=auth_client
endif
ifneq ($(filter pkg.vote.client,$(DEB_BUILD_PROFILES)),)
	./make.sh --module=vote_client clean && ./make.sh --module=vote_client
endif
	

override_dh_auto_install:
ifneq ($(filter pkg.fastcfs.core,$(DEB_BUILD_PROFILES)),)
	./make.sh --exclude=client install
	mkdir -p $(FUSE_CONFDIR)
	cp conf/*.conf $(FUSE_CONFDIR)
	cp systemd/fastcfs.service debian/fastcfs-fused.fastcfs.service
	cp systemd/fastauth.service debian/fastcfs-auth-server.fastauth.service
	cp systemd/fastvote.service debian/fastcfs-vote-server.fastvote.service
endif
ifneq ($(filter pkg.auth.client,$(DEB_BUILD_PROFILES)),)
	./make.sh --module=auth_client install
	AUTH_CONFDIR=$(DESTDIR)/etc/fastcfs/auth/
	mkdir -p $(AUTH_CONFDIR)
	cp src/auth/conf/*.conf $(AUTH_CONFDIR)
	cp -R src/auth/conf/keys $(AUTH_CONFDIR)
endif
ifneq ($(filter pkg.vote.client,$(DEB_BUILD_PROFILES)),)
	./make.sh --module=vote_client install
	VOTE_CONFDIR=%{buildroot}/etc/fastcfs/vote/
	mkdir -p $(VOTE_CONFDIR)
	cp src/vote/conf/*.conf $(VOTE_CONFDIR)
endif
	dh_auto_install

override_dh_installsystemd:
	dh_installsystemd --package=fastcfs-fused --name=fastcfs --no-start --no-restart-on-upgrade
	dh_installsystemd --package=fastcfs-auth-server --name=fastauth --no-start --no-restart-on-upgrade
	dh_installsystemd --package=fastcfs-vote-server --name=fastvote --no-start --no-restart-on-upgrade

.PHONY: override_dh_gencontrol
override_dh_gencontrol:
	dh_gencontrol -- -Tdebian/substvars


================================================
FILE: debian/source/format
================================================
3.0 (quilt)


================================================
FILE: debian/substvars
================================================
libfastcommon:Version=1.0.83
libserverframe:Version=1.2.11
fastcfs-auth-config:Version=2.0.0
fastcfs-vote-config:Version=3.4.0
fastdir-client:Version=5.5.0
faststore-config:Version=1.0.0
faststore-client:Version=5.5.0
fastcfs-fuse-config:Version=1.0.0


================================================
FILE: debian/watch
================================================
version=3
opts="mode=git" https://github.com/happyfish100/FastCFS.git \
   refs/tags/v([\d\.]+) debian uupdate


================================================
FILE: docs/APT-INSTALL-zh_CN.md
================================================

## 支持Debian 10及以上版本,Ubuntu 18.04及以上版本 和 Deepin 20及以上版本,amd64 和arm64 两种架构。


### 1. 配置 apt 存储库

配置 apt 存储库和签名密钥,以使系统的包管理器启用自动更新。

```shell
sudo apt-get install curl gpg
curl http://www.fastken.cn/aptrepo/packages.fastos.pub | gpg --dearmor > fastos-archive-keyring.gpg
sudo install -D -o root -g root -m 644 fastos-archive-keyring.gpg /usr/share/keyrings/fastos-archive-keyring.gpg
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/fastos-archive-keyring.gpg] http://www.fastken.cn/aptrepo/fastos/ fastos main" > /etc/apt/sources.list.d/fastos.list'
rm -f fastos-archive-keyring.gpg
```

如果需要安装调试包,执行:
```shell
sudo sh -c 'echo "deb [signed-by=/usr/share/keyrings/fastos-archive-keyring.gpg] http://www.fastken.cn/aptrepo/fastos-debug/ fastos-debug main" > /etc/apt/sources.list.d/fastos-debug.list'
```


然后更新包缓存
```
sudo apt update
```

### 2. fastDIR server安装

在需要运行 fastDIR server的服务器上执行:
```shell
sudo apt install fastdir-server -y
```

### 3. faststore server安装

在需要运行 faststore server的服务器上执行:
```shell
sudo apt install faststore-server -y
```

### 4. FastCFS客户端安装

在需要使用FastCFS存储服务的机器(即FastCFS客户端)上执行:
```shell
# 注:fastcfs-fused依赖fuse3
sudo apt install fastcfs-fused -y
```

### 5. Vote server安装(可选)

Vote server作为FastCFS多个服务模块共用的选举节点,主要作用是实现双副本防脑裂(即双活互备防脑裂)。

在需要运行选举节点的服务器上执行:
```shell
sudo apt install fastcfs-vote-server -y
```

### 6. Auth server安装(可选)

如果需要存储池或访问控制,则需要安装本模块。

在需要运行 Auth server的服务器上执行:
```shell
sudo apt install fastcfs-auth-server -y
```

### 7. 集群配置(必须)

安装完成后,需要修改对应的配置文件,服务才可以正常启动。请参阅[配置指南](CONFIGURE-zh_CN.md)


### 8. 启动

FastCFS后台程序可通过systemd管理。systemd服务名称如下:

  * fastdir: 目录服务,对应程序为 fdir_serverd
  * faststore:存储服务,对应程序为 fs_serverd
  * fastcfs: FUSE后台服务,对应程序为 fcfs_fused
  * fastvote: 选举节点,对应程序为 fcfs_voted
  * fastauth: 认证服务,对应程序为 fcfs_authd

可以使用标准的systemd命令对上述5个服务进行管理,例如:
```shell
sudo systemctl restart fastdir
sudo systemctl restart faststore
sudo systemctl restart fastcfs
sudo systemctl restart fastvote
sudo systemctl restart fastauth
```


================================================
FILE: docs/AUTH-zh_CN.md
================================================

# Auth (认证模块)配置及运行

如果你不需要使用存储池或访问权限控制,可以跳过本文档。

本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请自行对应。

为了防脑裂,建议配置3个节点(服务器),因认证服务占用资源较少,可以和其他服务共用服务器。

## 1. Auth配置文件目录结构

```
/etc/fastcfs/
        |
        |__ auth: 认证中心
             |__ keys: 存放用户密钥文件,每个用户对应一个密钥文件,例如 admin.key
             |    |__ session_validate.key: 用于FastDIR和FastStore请求auth服务验证session和权限
             |__ cluster.conf: 服务器列表,配置服务器ID、IP和端口
             |__ server.conf: fcfs_authd对应的配置文件
             |__ client.conf: 客户端配置文件
             |__ auth.conf: 认证相关的公共配置文件,在FastDIR和FastStore的cluster.conf中引用
             |__ session.conf: session相关配置文件,在Auth、FastDIR和FastStore的server.conf中引用
```


## 2. authd程序工作目录

```
/opt/fastcfs/
        |
        |__ auth
             |__ authd.pid: 服务进程fcfs_authd的pid文件
             |__ logs: 日志文件目录
                  |__ fcfs_authd.log: 错误日志
                  |__ slow.log: 慢查询日志
```

开启认证功能需要设置认证中心、FastDIR server、FastStore server和FastCFS客户端。

## 3. 认证中心(authd server)配置

配置文件路径:/etc/fastcfs/auth

Auth集群内各个server配置的cluster.conf必须完全一样。

建议配置一次,分发到其他服务器即可。

### 3.1 把Auth集群中的所有服务实例配置到cluster.conf中

每个Auth服务实例包含2个服务端口:cluster 和 service

一个Auth服务实例需要配置一个[server-$id]的section,其中$id为实例ID。

### 3.2 配置 server.conf

* [cluster] 和 [service] 配置的端口(port)必须与cluster.conf中本机的一致,否则启动会报错

### 3.3 配置 auth.conf

将 auth_enabled 设置为 true 以开启认证功能

### 3.4 复制FastDIR server上的如下配置文件到 /etc/fastcfs/fdir/

```
/etc/fastcfs/fdir/client.conf
/etc/fastcfs/fdir/cluster.conf
```

### 3.5 启动authd

authd命令直接重启:

```
/usr/bin/fcfs_authd /etc/fastcfs/auth/server.conf restart
```

或者系统服务命令启动:

```
sudo systemctl restart fastauth
```

查看日志:

```
tail /opt/fastcfs/auth/logs/fcfs_authd.log
```

* 第一次运行将自动创建 admin 用户,默认生成的密钥文件名为 **/etc/fastcfs/auth/keys/admin.key**
* 友情提示:只在master上生成该密钥文件,请在master上分发密钥文件。

### 3.6 创建存储池

创建名为 fs 的存储池,配额无限制:

```
fcfs_pool create fs unlimited
```

**_注:存储池名称必须和FastCFS fuse客户端配置文件fuse.conf中的命名空间一致(缺省配置为fs,可按需修改)_**

## 4. FastDIR server

### 4.1 复制auth server上的如下配置文件到 /etc/fastcfs/auth/

```
/etc/fastcfs/auth/auth.conf
/etc/fastcfs/auth/session.conf
/etc/fastcfs/auth/cluster.conf
/etc/fastcfs/auth/client.conf
```

### 4.2 复制auth server上的如下密钥文件到 /etc/fastcfs/auth/keys/

```
/etc/fastcfs/auth/keys/admin.key
/etc/fastcfs/auth/keys/session_validate.key
```

拷贝完成后重启FastDIR服务(fdir_serverd)

## 5. FastStore server

* 参见 4. FastDIR server 部分


拷贝完成后重启FastStore服务(fs_serverd)

## 6. FastCFS客户端(fused)

* 参见 4. FastDIR server 部分

拷贝完成后重启fuse服务(fcfs_fused)

## 友情提示

* 4 ~ 6部分的配置及启动参见 [配置指南](CONFIGURE-zh_CN.md)


## 7. 命令行工具

* fcfs_user:用户管理,主要包括创建用户、删除用户、设置用户权限(权限包括用户管理、创建存储池等等)

* fcfs_pool:储存池管理,主要包括创建pool、删除pool、把pool读写权限授权给其他用户

友情提示:直接执行上述命令可以查看使用帮助。

## 8. 注意事项

* Auth server依赖FastDIR server,需要先启动FastDIR server,然后启动Auth server。


================================================
FILE: docs/CONFIGURE-zh_CN.md
================================================

# 配置及运行

本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请自行对应。

FastCFS集群配置包含如下五部分:

* fastDIR server(服务实例)配置
* faststore server(服务实例)配置
* FastCFS客户端配置
* 选举节点配置(可选)
* 认证配置(可选)


## 1. 配置文件目录结构

```
/etc/fastcfs/
        |
        |__ fcfs: fused服务
        |    |__ fuse.conf: fcfs_fused对应的配置文件
        |
        |__ fdir: FastDIR目录服务
        |    |__ cluster.conf: 服务器列表,配置服务器ID、IP和端口
        |    |__ server.conf: fdir_serverd对应的配置文件
        |    |__ storage.conf: 持久化存储配置文件
        |    |__ client.conf: 客户端配置文件
        |
        |__ fstore: faststore存储服务
             |__ cluster.conf: 服务器列表(配置服务器ID、IP和端口),并配置服务器分组及数据分组之间的对应关系
             |__ storage.conf: 存储路径及空间分配和回收配置
             |__ server.conf: fs_serverd对应的配置文件
             |__ client.conf: 客户端配置文件
```

## 2. 程序工作目录

```
/opt/fastcfs/
        |
        |__ fcfs
        |    |__ fused.pid: 服务进程fcfs_fused的pid文件
        |    |__ logs: 日志文件目录
        |         |__ fcfs_fused.log: 错误日志
        |
        |__ fdir
        |    |__ serverd.pid: 服务进程fdir_serverd的pid文件
        |    |__ data: 系统数据文件目录,包含集群拓扑结构和binlog
        |    |    |__ cluster.info: 集群拓扑信息
        |    |    |__ .inode.sn: 当前inode顺序号
        |    |    |__ binlog: 存放binlog文件
        |    |
        |    |__ db: 存储引擎默认数据目录
        |    |    |__ trunk: trunk binlog
        |    |    |__ inode: segment索引(一个segment包含多个inode,最多65536个,segment id顺序递增)
        |    |    |__ ####(如0001、0002等等): 以trunk file方式存放inode数据
        |    |
        |    |__ logs: 日志文件目录
        |         |__ fdir_serverd.log: 错误日志
        |         |__ slow.log: 慢查询日志
        |
        |__ fstore
              |__ serverd.pid: 服务进程fs_serverd的pid文件
              |__ data: 系统数据文件目录,包含集群拓扑结构和binlog
              |    |__ data_group.info: 集群数据分组信息
              |    |__ .store_path_index.dat: 存储路径索引
              |    |__ .trunk_id.dat: 当前trunk id信息
              |    |__ replica: replica binlog,一个DG对应一个子目录
              |    |__ slice: slice binlog
              |    |__ trunk: trunk binlog
              |    |__ recovery: slave追加master历史数据,一个DG对应一个子目录
              |    |__ migrate: 迁移出去的DG数据清理
              |    |__ rebuild: 单盘数据恢复
              |
              |__ db: slice索引存储引擎默认数据目录
              |    |__ trunk: trunk binlog
              |    |__ block: segment索引(一个segment包含多个block,segment id哈希分布)
              |    |__ ####(如0001、0002等等): 以trunk file方式存放block索引数据
              |
              |__ logs: 日志文件目录
                   |__ fs_serverd.log: 错误日志
                   |__ slow.log: 慢查询日志
```

## 3. fastDIR server(服务实例)配置

配置文件路径:

> /etc/fastcfs/fdir

fastDIR集群内各个server配置的cluster.conf必须完全一样,建议配置一次,分发到集群中的所有服务器和客户端即可。

### 3.1 把fastDIR集群中的所有服务实例配置到cluster.conf中

每个 **fastDIR** 服务实例包含2个服务端口:**cluster** 和 **service**;

**cluster.conf** 中配置集群所有实例,一个实例由IP + 端口(包括 cluster和service 2个端口 )组成;

一个fastDIR服务实例需要配置一个[server-$id]的section,其中$id为实例ID(从1开始编号);

如果一台服务器上启动了多个实例,因端口与全局配置的不一致,此时必须指定端口。

一个服务实例的配置示例如下:

```
[server-3]
cluster-port = 11015
service-port = 11016
host = 172.16.168.128
```

### 3.2 配置 server.conf

* 如果需要修改数据存放路径,修改配置项 data_path 为绝对路径
* 本机端口包含cluster和service 2个端口,分配在[cluster] 和 [service] 中配置
* 本机IP + 本机端口必须配置在cluster.conf的一个实例中,否则启动时会出现下面类似的出错信息
```
ERROR - file: cluster_info.c, line: 119, cluster config file: /etc/fastcfs/fdir/cluster.conf,
      can't find myself by my local ip and listen port
```

* V3.0支持的持久化特性默认是关闭的,在 [storage-engine] 中设置,详情参见源码的conf目录下的配置示例。
启用存储引擎配置示例:

```
[storage-engine]
# if enable the storage engine
### false: use binlog directly
### true: use storage engine for massive files
# default value is false
enabled = true

# the config filename for storage
storage_config_filename = storage.conf

# the path to store the data files
# can be an absolute path or a relative path
# the relative path for sub directory under the base_path
# this path will be created auto when not exist
# default value is db
data_path = db

# the memory limit ratio for dentry
# the valid limit range is [1%, 99%]
# default value is 80%
memory_limit = 80%
```

### 3.3 配置 storage.conf

* 开启持久化存储特性的情况下,才需要配置storage.conf
* 通常采用默认设置即可

fastDIR重启:

```
/usr/bin/fdir_serverd /etc/fastcfs/fdir/server.conf restart
```
或者:

```
sudo systemctl restart fastdir
```

查看日志:

```
tail /opt/fastcfs/fdir/logs/fdir_serverd.log
```

## 4. faststore server(服务实例)配置

配置文件路径:

> /etc/fastcfs/fstore

faststore集群各个服务实例配置的cluster.conf必须完全一样,建议把cluster.conf一次性配置好,然后分发到集群中的所有服务器和客户端。

### 4.1 把 faststore 集群中的所有服务实例配置到 cluster.conf 中

每个 **faststore** 服务实例包含3个服务端口:cluster、replica 和 service,和 **fastDIR** 的 cluster.conf 相比,多了一个replica端口,二者配置方式完全相同。

### 4.2 在 cluster.conf 中配置服务器分组和数据分组对应关系

对于生产环境,为了便于今后扩容,建议数据分组数目至少为64,最好不要超过1024(视业务未来5年发展规模而定)。

### 4.3 在storage.conf 中配置存储路径等参数

支持配置多个存储路径。为了充分发挥出硬盘性能,建议挂载单盘,每块盘作为一个存储路径。

配置示例:

```
store_path_count = 1

[store-path-1]
path = /opt/faststore/data
```

### 4.4 配置 server.conf

* 如果需要修改binlog存放路径,修改配置项 data_path 为绝对路径
* 本机端口包含cluster、replica和service 3个端口,分配在[cluster]、[replica] 和 [service] 中配置
* 本机IP + 本机端口必须配置在cluster.conf的一个实例中,否则启动时会出现类似下面的出错信息

```
ERROR - file: server_group_info.c, line: 347, cluster config file: /etc/fastcfs/fstore/cluster.conf,
      can't find myself by my local ip and listen port
```

* V4.0支持的slice索引持久化特性默认是关闭的,在 [storage-engine] 中设置,详情参见源码的conf目录下的配置示例。
启用存储引擎配置示例:

```
[storage-engine]
# if enable the storage engine
### false: use binlog directly
### true: use storage engine for huge storage
# default value is false
enabled = true

# the config filename for storage
storage_config_filename = dbstore.conf

# the path to store the data files
# can be an absolute path or a relative path
# the relative path for sub directory under the base_path
# this path will be created auto when not exist
# default value is db
data_path = db

# the memory limit ratio for slice index
# the valid limit range is [1%, 99%]
# default value is 60%
memory_limit = 60%
```

### 4.5 配置 dbstore.conf

* slice索引开启持久化存储特性的情况下,才需要配置dbstore.conf
* 通常采用默认设置即可


faststore重启:

```
/usr/bin/fs_serverd /etc/fastcfs/fstore/server.conf restart
```

或者:

```
sudo systemctl restart faststore
```

查看日志:

```
tail /opt/fastcfs/fstore/logs/fs_serverd.log
```

## 5. FastCFS客户端配置

fused 配置文件路径:

> /etc/fastcfs/fcfs

_注:如果fused客户端与faststore和fastDIR部署在同一个服务器上,可跳过5.1、5.2节,否则需要将faststore和fastDIR的cluster.conf配置文件复制到fused客户端所在服务器上。_

### 5.1 复制faststore server上的如下配置文件到 /etc/fastcfs/fstore/

```
/etc/fastcfs/fstore/cluster.conf
```

### 5.2 复制fastDIR server上的如下配置文件到 /etc/fastcfs/fdir/

```
/etc/fastcfs/fdir/cluster.conf
```

### 5.3 修改fuse挂载点(可选)

如有必要,可修改配置文件 **fuse.conf** 中的 **mountpoint** 参数来指定挂载点:

> mountpoint = /opt/fastcfs/fuse

fused 重启:

> /usr/bin/fcfs_fused /etc/fastcfs/fcfs/fuse.conf restart

或者:

> sudo systemctl restart fastcfs

查看日志:

> tail /opt/fastcfs/fcfs/logs/fcfs_fused.log

查看fastDIR集群状态:

> fdir_cluster_stat

查看单台fastDIR 服务状态:

> fdir_service_stat $IP:$port

**_友情提示:可以拷贝fdir_cluster_stat 输出的IP和服务端口_**

查看faststore集群状态:

> fs_cluster_stat

查看非ACTIVE的服务列表,使用:

> fs_cluster_stat -N

使用 -h 查看更多选项

查看FastCFS磁盘使用情况:

> df -h /opt/fastcfs/fuse | grep fuse

至此,mountpoint(如:/opt/fastcfs/fuse)可以作为本地文件目录访问了。

## 6. 选举节点配置(可选)

如果需要实现双副本防脑裂(即双活互备防脑裂),请参阅 [选举节点配置文档](VoteNode-zh_CN.md)

## 7. 认证配置(可选)

如果需要开启存储池或访问权限控制,请参阅 [认证配置文档](AUTH-zh_CN.md)

## 8. 共享数据配置(可选)

将FastCFS作为Oracle RAC等系统的共享存储,请参阅 [共享数据配置指南](shared-storage-guide-zh_CN.md)

祝顺利! have a nice day!


================================================
FILE: docs/Easy-install-detail-zh_CN.md
================================================
# 快速体验FastCFS

以CentOS 8为例,用单个服务节点,以一键安装的方式体验下FastCFS。 此方式仅供体验使用,不适合在生产环境使用. 

## 1. 获得最新的代码

```
git clone https://gitee.com/fastdfs100/FastCFS.git
```

## 2. 安装

涉及到libfuse的安装更新以及在/usr/local下创建目录,请务必使用sudo或者root的方式安装。

```
cd FastCFS/
sudo ./helloWorld.sh
```

安装过程中会有进度提示信息,全自动进行,当看到以下提示时说明安装成功了。

```
INFO: Copy file fuse.conf to /etc/fastcfs/fcfs/
waiting services ready ...
/dev/fuse        38G     0   38G   0% /opt/fastcfs/fuse

the mounted path is: /opt/fastcfs/fuse
have a nice day!
```

## 3. 验证:查看安装的文件目录

安装成功后,通过df -h 可以看到新增一个/dev/fuse的设备,默认容量与你的磁盘容量有关,非固定值。比如我的是38G. 

```
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             189M     0  189M   0% /dev
tmpfs                219M     0  219M   0% /dev/shm
tmpfs                219M  6.6M  212M   4% /run
tmpfs                219M     0  219M   0% /sys/fs/cgroup
/dev/mapper/cs-root   47G  5.9G   42G  13% /
/dev/sda1           1014M  242M  773M  24% /boot
tmpfs                 44M  4.0K   44M   1% /run/user/1000
/dev/fuse             38G     0   38G   0% /opt/fastcfs/fuse
```

## 4. 使用:在新挂载的目录/opt/fastcfs/fuse 中,可以进行标准的文件创建/编辑/删除操作

```
[first@192.168.126.50 /opt/fastcfs/fuse]
$ pwd
/opt/fastcfs/fuse
[first@192.168.126.50 /opt/fastcfs/fuse]
$ touch abc  // 创建文件
[first@192.168.126.50 /opt/fastcfs/fuse]
$ ll
total 0
-rw-rw-r--. 1 first first 0 May 14 17:06 abc
[first@192.168.126.50 /opt/fastcfs/fuse]
$ rm abc  // 删除文件
[first@192.168.126.50 /opt/fastcfs/fuse]
$ mkdir -p d1/d2/d3  // 创建目录
[first@192.168.126.50 /opt/fastcfs/fuse]
$ ll
total 0
drwxrwxr-x. 2 first first 0 May 14 17:06 d1
[first@192.168.126.50 /opt/fastcfs/fuse]
$ touch d1/d2/d3/123 // 创建文件
[first@192.168.126.50 /opt/fastcfs/fuse]
$ ll d1/d2/d3/123 
-rw-rw-r--. 1 first first 0 May 14 17:06 d1/d2/d3/123
[first@192.168.126.50 /opt/fastcfs/fuse]
$ rm -rf d1 // 删除目录
[first@192.168.126.50 /opt/fastcfs/fuse]
$ ll
total 0
```
 
## 5. 停止服务

使用fashcfs.sh为管理脚本,可以停止、重启服务:

```
[first@192.168.126.50 ~/FastCFS]
$ sudo ./fastcfs.sh stop
[sudo] password for first:
waiting for pid [2364] exit ...
pid [2364] exit.
waiting for pid [2379] exit ...
pid [2379] exit.
waiting for pid [2383] exit ...
pid [2383] exit.
waiting for pid [2400] exit ...
pid [2400] exit.
```

## 6. 移除安装包恢复初始环境

```
sudo yum remove FastCFS-auth-server FastCFS-fused fastDIR-server faststore-server -y
sudo yum remove fastDIR-config faststore-config FastCFS-auth-config FastCFS-fuse-config -y
sudo rm -rf /etc/fastcfs /opt/fastcfs /opt/faststore
```


================================================
FILE: docs/FAQ-zh_CN.md
================================================
# FAQ

## 1. 服务器最低配置要求

2核CPU、4G内存、10G硬盘

## 2. 网络连接异常

当日志出现`Connection refused`或者`Transport endpoint is not connected`之类的异常记录。
请检查防火墙设置。FastCFS 共有9个服务端口,这些对应的端口应该打开:

* fdir
  * 默认集群端口 `11011`
  * 默认服务端口 `11012`
* fvote
  * 默认集群端口 `41011`
  * 默认服务端口 `41012`
* fauth
  * 默认集群端口 `31011`
  * 默认服务端口 `31012`
* fstore
  * 默认集群端口 `21014`
  * 默认副本端口 `21015`
  * 默认服务端口 `21016`


## 3. 服务有没有启动顺序?

有。应按顺序启动`fvote`(可选),`fdir`, `fauth`(可选),`fstore`,`fuseclient`。

## 4. FastCFS支持单盘数据恢复吗?

```
支持。
实现机制:从本组的其他服务器上获取数据,恢复指定硬盘(即存储路径)上的所有数据。
使用场景:硬盘坏掉后更换为新盘,或者因某种原因重新格式化硬盘。
单盘故障恢复后,重启fs_serverd时,加上命令行参数 --data-rebuild <store_path>,
其中 store_path为要恢复数据硬盘对应的存储路径。
```

## 5. FastCFS是如何防脑裂的?

```
leader/master选举时采用过半数机制,一个分组的节点数最好为奇数(比如3个)。
配置项为 quorum,默认值为auto,表示节点数为奇数时开启,为偶数时关闭。
详情参见源码目录下的conf/full/cluster.conf

v3.4引入公用选举节点,在偶数节点数(比如双副本)时也可以防脑裂,详情参见配置文档。
```

## 6. fdir和fstore多副本(如3副本)情况下,停机后重启不能写入数据

```
为了保证数据一致性,当停机时间超过配置参数max_shutdown_duration(默认配置300秒),
需要等待本组的其他服务器在线才可以选出master/leader。

以3副本为例,如果3台服务器停机均超过max_shutdown_duration,而有的服务器没有启动,
那么master/leader选举不出来,导致不能写入数据。此时启动fdir_serverd需要加上命令行
参数--force-master-election,启动fs_serverd需要加上命令行参数--force-leader-election
```

## 7. 如何验证多个副本的数据一致性?

```
faststore需要源码编译,修改make.sh,将
CFLAGS='-Wall'
修改为:
CFLAGS='-Wall -DFS_DUMP_SLICE_FOR_DEBUG=32'
启动fs_serverd,数据将导出到 $base_path/data/dump/slice.index,例如:
/opt/fastcfs/fstore/data/dump/slice.index

文件格式:
类型 文件ID block偏移量 slice偏移量 slice长度 数据长度 数据CRC32

可以通过 diff 命令比较同一组服务器下的两个节点导出的slice.index是否相同。

注意:-DFS_DUMP_SLICE_FOR_DEBUG=32 这个编译选项仅供测试环境进行数据一致性验证,请不要在生产环境使用。

```

## 8. fuse客户端通过df看到的空间明显大于存储池配额

这是因为客户端没有启用auth,需要将配置文件/etc/fastcfs/auth/auth.conf中的auth_enabled设置为true,修改后重启fcfs_fused生效。

友情提示:如何配置auth服务请参阅 [认证配置文档](AUTH-zh_CN.md)

## 9. FastCFS作为NFS后端存储时NFS client mount失败

出错信息:reason given by server: No such file or directory

解决方法:

NFS v3直接使用服务端配置的目录如:/opt/fastcfs/fuse,而v4将服务端配置的路径作为基路径,mount要使用/

NFS挂载默认会使用最新的NFS协议,挂载命令示例(支持v4前提下使用):
```
mount -t nfs -onolock 172.16.168.131:/ /mnt/nfs
```

NFS v3挂载命令示例:
```
mount -t nfs -onolock 172.16.168.131:/opt/fastcfs/fuse /mnt/nfs
```

指定NFS v4挂载命令示例:
```
mount -t nfs -onolock,nfsvers=4 172.16.168.131:/ /mnt/nfs
```

友情提示:
   * CentOS 6需要使用NFS v3挂载
   * /etc/exports中需要设置fsid=0,例如:/opt/fastcfs/fuse 172.16.168.130(fsid=0,rw,sync,no_root_squash,no_all_squash)

## 10. 为何删除了足够多的数据,df看到磁盘占用空间不见降低呢?

FastCFS基于trunk file进行空间分配,目前trunk file只会增加而不会释放。文件数据删除后空间会回收利用,通过fuse client上df命令可以看到FastCFS的可用空间将增加。
磁盘空间使用率达到阈值后才会启动空间回收,默认阈值为50%,可以根据实际需要调整。配置示例参见faststore源码目录下的conf/full/storage.conf。

## 11. 如何将fastore的数据清除干净?

一些特殊情况下,需要清除掉faststore的数据,此时要删除faststore的系统目录(server.conf中配置的base_path,默认为/opt/fastcfs/fstore)和用户数据存放目录(默认为/opt/faststore/data,配置多盘的情况要逐一删除数据目录),删除命令示例(文件删除后不可恢复,请再三确认后执行):
```
rm -rf /opt/fastcfs/fstore /opt/faststore/data
```

## 12. 日志中报没有访问权限,如何进行排查?

/opt/fastcfs/fcfs/logs/fcfs_fused.log 中的错误示例:

[2023-02-25 06:39:08] ERROR - file: client_proto.c, line: 607, fdir server 192.168.3.210:11012 response message: response status 1, error info: Operation not permitted

问题排查:

依次查看各台fdir server上的日志文件 /opt/fastcfs/fdir/logs/fdir_serverd.log,找到对应的出错信息,然后使用最新版本的fdir_stat 查看对应的完整路径(文件名),根据文件或目录owner、权限、访问用户及其用户组进行排查。

按文件或目录inode查询示例:

```
fdir_stat -Fn fs 9007199660325177
```

按父目录inode + 子目录名或者文件名查询示例:
```
fdir_stat -Fn fs 9007199667318991 test
```

友情提示:如果采用的是装包方式,程序fdir_stat 所在的rpm包名为fastDIR-client,deb包名为fastdir-client


================================================
FILE: docs/INSTALL-zh_CN.md
================================================
# FastCFS安装手册

## 1、fastcfs.sh 脚本统一安装

通过执行fastcfs.sh脚本,可自动安装软件包,并能根据配置文件模版自动生成集群相关配置文件。

fastcfs.sh 命令参数说明:

```
* install: 安装程序包
* config: 复制配置文件并自动配置为单节点
* start | stop | restart: 服务进程控制
```

或执行如下命令(需要root身份执行):

```
./fastcfs.sh install
./fastcfs.sh config
./fastcfs.sh restart
```

通过 df 命令查看FastCFS挂载的文件目录:

```
df -h /opt/fastcfs/fuse | grep fuse
```

以上命令执行成功,你就可以通过本地目录 /opt/fastcfs/fuse 访问FastCFS了。

## 2、DIY编译和安装

### 2.1 安装libaio devel包

对于 CentOS或REHL,执行:

```
yum install libaio-devel -y
```

对于 Unbuntu或Debian,执行:

```
apt install libaio-dev -y
```

其他Linux系统,需要编译安装 **libaio** 库。

### 2.2 安装存储插件包和RDMA通信包【可选】

fastDIR 和faststore 的存储插件以及RDMA通信库都是闭源的,可以通过 yum 或 apt 安装使用。

配置我们的yum源和apt源:

* yum安装方式(针对CentOS、Rocky、Fedora、RHEL等),参阅 [yum安装文档](YUM-INSTALL-zh_CN.md)
* apt安装方式(针对Ubuntu、Debian 和 Deepin),参阅 [apt 安装文档](APT-INSTALL-zh_CN.md)

如果使用存储插件特性,需要通过 yum 或 apt 安装相应的存储插件。

* fastDIR 存储插件包名:libfdirstorage
* faststore 存储插件包名:libfsstorage

具备RDMA网络环境,要启动 RDMA 通信方式,需要安装RDMA通信包:libfastrdma


### 2.3 libfastcommon 编译安装

```
git clone https://gitee.com/fastdfs100/libfastcommon.git; cd libfastcommon/
git checkout master
./make.sh clean && ./make.sh && ./make.sh install
```

默认安装目录:
```
/usr/lib64
/usr/lib
/usr/include/fastcommon
```

### 2.4 libserverframe 编译安装

```
git clone https://gitee.com/fastdfs100/libserverframe.git; cd libserverframe/
./make.sh clean && ./make.sh && ./make.sh install
```

### 2.5 libdiskallocator 编译安装

```
git clone https://gitee.com/fastdfs100/libdiskallocator.git; cd libdiskallocator/
./make.sh clean && ./make.sh && ./make.sh install
```

### 2.6 Vote Node client 编译安装

```
git clone https://gitee.com/fastdfs100/FastCFS.git; cd FastCFS/
./make.sh clean && ./make.sh --module=voteclient && ./make.sh --module=voteclient install
```

### 2.7 Auth client 编译安装

```
git clone https://gitee.com/fastdfs100/FastCFS.git; cd FastCFS/
./make.sh clean && ./make.sh --module=authclient && ./make.sh --module=authclient install
```

### 2.8 fastDIR 编译安装

```
git clone https://gitee.com/fastdfs100/fastDIR.git; cd fastDIR/
./make.sh clean && ./make.sh && ./make.sh install
mkdir -p /etc/fastcfs/fdir/
cp conf/*.conf /etc/fastcfs/fdir/
```

### 2.9 faststore 编译安装

```
git clone https://gitee.com/fastdfs100/faststore.git; cd faststore/
./make.sh clean && ./make.sh && ./make.sh install
mkdir -p /etc/fastcfs/fstore/
cp conf/*.conf /etc/fastcfs/fstore/
```

### 2.10 fuse客户端编译安装

#### 2.10.1 libfuse 编译安装

libfuse 编译依赖比较复杂,建议使用脚本libfuse_setup.sh一键编译和安装。或者执行如下步骤DIY:

构建libfuse需要先安装meson和ninja。安装meson和ninja需要python3.5及更高版本。

##### 2.10.1.1 gcc 安装

友情提示:gcc版本必须 >= 4.7.0

Ubuntu下安装命令:

```
apt install gcc g++ -y
```

CentOS下安装命令:

```
yum install gcc gcc-c++ -y
```

##### 2.10.1.2 pkg-config 和 python安装

需要安装的包名:
* pkg-config
* python3
* python3-pip

Ubuntu下安装命令:

```
apt install pkg-config python3 python3-pip -y
```

CentOS下安装命令:

```
yum install pkgconfig python3 python3-pip -y
```

##### 2.10.1.3 meson 和 ninja 安装

友情提示: ninja 版本必须 >= 1.7

```
pip3 install meson
pip3 install ninja
```

##### 2.10.1.4 libfuse 安装

```
git clone https://gitee.com/mirrors/libfuse.git; cd libfuse/
git checkout fuse-3.16.2
mkdir build/; cd build/
meson ..
meson configure -D prefix=/usr
meson configure -D examples=false
ninja && ninja install
sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf
sed -i "s#prefix=.*#prefix=/usr#g" /usr/lib64/pkgconfig/fuse3.pc
```

#### 2.10.2 依赖的项目编译和安装

参见上面的2.3 ~2.8,按照步骤逐一编译和安装


#### 2.10.3 fcfs_fused 编译安装

进入之前clone下来的FastCFS目录,然后执行:
```
./make.sh --module=fuseclient clean && ./make.sh --module=fuseclient && ./make.sh --module=fuseclient install
mkdir -p /etc/fastcfs/fcfs/
mkdir -p /etc/fastcfs/vote/
mkdir -p /etc/fastcfs/auth/
cp conf/*.conf /etc/fastcfs/fcfs/
cp -R src/vote/conf/* /etc/fastcfs/vote/
cp -R src/auth/conf/* /etc/fastcfs/auth/
```

配置参见 [配置文档](CONFIGURE-zh_CN.md)


================================================
FILE: docs/INSTALL.md
================================================
### 1. install libaio devel

for CentOS or REHL:
```
yum install libaio-devel -y
```

for Unbuntu or Debian:
```
apt install libaio-dev -y
```

### 2. libfastcommon

```
git clone git@github.com:happyfish100/libfastcommon.git || git clone https://github.com/happyfish100/libfastcommon.git
cd libfastcommon/
git checkout master
./make.sh clean && ./make.sh && ./make.sh install
```

default install directories:
```
/usr/lib64
/usr/lib
/usr/include/fastcommon
```

### 3. libserverframe

```
git clone git@github.com:happyfish100/libserverframe.git || git clone https://github.com/happyfish100/libserverframe.git
cd libserverframe/
./make.sh clean && ./make.sh && ./make.sh install
```

### 4. libdiskallocator

```
git clone https://gitee.com/fastdfs100/libdiskallocator.git  || git clone https://github.com/happyfish100/libdiskallocator.git
cd libdiskallocator/
./make.sh clean && ./make.sh && ./make.sh install
```

### 5. Vote Node client

```
git clone git@github.com:happyfish100/FastCFS.git || git clone https://github.com/happyfish100/FastCFS.git
cd FastCFS/
./make.sh clean && ./make.sh --module=voteclient && ./make.sh --module=voteclient install
```

### 6. Auth client

```
git clone git@github.com:happyfish100/FastCFS.git || git clone https://github.com/happyfish100/FastCFS.git
cd FastCFS/
./make.sh clean && ./make.sh --module=authclient && ./make.sh --module=authclient install
```

### 7. fastDIR

```
git clone git@github.com:happyfish100/fastDIR.git || git clone https://github.com/happyfish100/fastDIR.git
cd fastDIR/
./make.sh clean && ./make.sh && ./make.sh install
mkdir -p /etc/fastcfs/fdir/
cp conf/*.conf /etc/fastcfs/fdir/
```

### 8. faststore

```
git clone git@github.com:happyfish100/faststore.git || git clone https://github.com/happyfish100/faststore.git
cd faststore/
./make.sh clean && ./make.sh && ./make.sh install
mkdir -p /etc/fastcfs/fstore/
cp conf/*.conf /etc/fastcfs/fstore/
```

### 9. fuse client
#### 9.1. libfuse

libfuse requires meson and ninja which require python3.5 or higher version

##### 9.1.1. pkg-config and python

packages: pkg-config  python3  python3-pip

Ubuntu:
```
apt install pkg-config python3 python3-pip -y
```

CentOS:
```
yum install pkgconfig python3 python3-pip -y
```

##### 9.1.2. meson and ninja

```
pip3 install meson
pip3 install ninja
```

##### 9.1.3. gcc

Ubuntu:
```
apt install gcc g++ -y
```

CentOS:
```
yum install gcc gcc-c++ -y
```

##### 9.1.4. libfuse

```
git clone git@github.com:libfuse/libfuse.git || git clone https://github.com/libfuse/libfuse.git
cd libfuse/
git checkout fuse-3.10.1
mkdir build/; cd build/
meson ..
meson configure -D prefix=/usr
meson configure -D examples=false
ninja && ninja install
sed -i 's/#user_allow_other/user_allow_other/g' /etc/fuse.conf
sed -i "s#prefix=.*#prefix=/usr#g" /usr/lib64/pkgconfig/fuse3.pc
```

#### 9.2. fcfs_fused

```
cd FastCFS/
./make.sh --module=fuseclient clean && ./make.sh --module=fuseclient && ./make.sh --module=fuseclient install
mkdir -p /etc/fastcfs/fcfs/
mkdir -p /etc/fastcfs/vote/
mkdir -p /etc/fastcfs/auth/
cp conf/*.conf /etc/fastcfs/fcfs/
cp -R src/vote/conf/* /etc/fastcfs/vote/
cp -R src/auth/conf/* /etc/fastcfs/auth/
```


================================================
FILE: docs/ReleaseNotes.md
================================================
## FastCFS V3.1.0 发布,主要改进如下:
### 新特性
1. [fdir] 对核心组件FastDIR进行改进,实现了LRU淘汰算法,以有限内存支持海量文件
   分布式目录服务FastDIR的淘汰算法具有两大特性:
     1. 按目录结构淘汰:先淘汰子节点,然后淘汰父节点;
     2. 按数据线程淘汰:每个数据线程作为一个独立的数据单元,数据存取和淘汰均在其数据线程中以无锁方式完成。

### Bug修复
1. 采用引用计数方式,不再延迟释放 dentry;
2. delay free namespace string for lockless;
3. bugfixed: get trunk_file_size from ini file correctly。

---------------

## FastCFS V3.0.0 发布,主要改进如下:
### 新特性
1. [fdir] 核心组件FastDIR通过插件方式实现数据存储引擎,采用binlog + 存储引擎插件,按需加载inode数据,单机以有限内存(如64GB)支持100亿级的海量文件

### Bug修复
1. [fdir] increase/decrease parent's nlink on rename operation
1. [fdir] set dentry->kv_array->count to 0 correctly
1. [fstore] should init barray->count to 0

---------------

## FastCFS V2.3.0发布,主要改进如下:
### 新特性
1. [fauth] auth server以主备方式支持多节点,避免单点;
1. [fstore&fdir] leader/master选举/切换引入超时机制,选举时长可控;
1. [网络] 网络通信相关改进:
  1)握手失败,server端主动断开连接; 
  2)cluster内部通信server端超时控制; 
  3)调整网络通信超时默认值(连接超时由10秒调整为2秒,收发数据超时由30秒调整为10秒)。

### Bug修复


---------------
## FastCFS V2.2.0 发布,主要改进如下:
### 新特性
1. [fstore] 使用libaio实现异步读,随机读性能提升明显;
1. [fstore] 支持预读机制,顺序读性能提升显著;
1. [csi] k8s驱动(fastcfs-csi)已同步发布,
1. [devOPS] 集群运维工具(fcfs.sh)

### Bug修复
1. [fstore] 修复V2.1.0引入的bug:第一次运行时,一个关键bool变量没有正确赋值;
2. [fuseclient] 修复列举目录导致元数据缓存的一致性问题;
3. [fauth] 修复username和poolname格式修饰符不当导致的乱码问题。


---------------
## FastCFS V2.0.0 发布,为了更好地对接虚拟机和K8s,V2.0主要实现了存储池和访问权限控制,并支持配额:
### 新特性
1. [fauth] 用户和权限体系

### Bug修复

---------------
## FastCFS V1.2.0 发布,主要对数据恢复和master任命机制做了改进,修复了5个稳定性bug,FastCFS的可靠性和稳定性上了一个新台阶:
### 新特性


### Bug修复


---------------
## FastCFS V1.0.0 发布:
FastCFS 3人小团队历经11个月的研发,推出了FastCFS第一个可用版本,MySQL、PostgresSQL和Oracle可以跑通。

FastCFS服务端两个核心组件是 FastStore 和 FastDIR。FastStore是基于块存储的分布式数据存储服务,其文件block大小为4MB,文件 inode + 文件偏移量 (offset)作为block的key,对应的文件内容为 value,FastStore本质是一个分布式Key-Value系统。
### 主要特性
1. [fdir] 高性能分布式目录服务,管理文件元数据,支持命名空间
1. [fstore] FastStore是一个分布式Key-Value系统,提供了文件块操作,基于数据块的无中心设计,(类一致性Hash),理论上可以无限扩容;
1. [fuseclient] 基于FUSE的标准文件接口已经实现,可以使用fused模块mount到本地,为数据库、虚拟机以及其他使用标准文件接口的应用提供存储。



================================================
FILE: docs/TODO-zh_CN.md
================================================
# TODO List

欢迎有志之士参与完善!

## 一、测试与反馈

## 二、对外接口

### 1. 对象存储

#### 1.1 S3

#### 1.2 OSS

#### 1.3 OBS

#### 1.4 COS

### 2. VFS

### 3. NBD

### 4. iSCSI


================================================
FILE: docs/VoteNode-zh_CN.md
================================================

# Vote Node (选举节点)配置及运行

如果你不需要实现双副本防脑裂(即双活互备防脑裂),可以跳过本文档。

本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请自行对应。

为了防脑裂,建议配置3个节点(服务器),因选举服务占用资源较少,可以和其他服务共用服务器。

## 1. Vote Node配置文件目录结构

```
/etc/fastcfs/
        |
        |__ vote: 选举节点
             |__ cluster.conf: 服务器列表,配置服务器ID、IP和端口
             |__ server.conf: fcfs_voted对应的配置文件
             |__ client.conf: 客户端配置文件
```


## 2. voted程序工作目录

```
/opt/fastcfs/
        |
        |__ vote
             |__ voted.pid: 服务进程fcfs_voted的pid文件
             |__ logs: 日志文件目录
                  |__ fcfs_voted.log: 错误日志
```

开启共用选举服务需要设置选举节点、Auth server、FastDIR server和FastStore server。

## 3. 选举节点(vote server)配置

配置文件路径:/etc/fastcfs/vote

Vote集群内各个server配置的cluster.conf必须完全一样。

建议配置一次,分发到其他服务器即可。

### 3.1 把Vote集群中的所有服务实例配置到cluster.conf中

每个Vote服务实例包含2个服务端口:cluster 和 service

一个Vote服务实例需要配置一个[server-$id]的section,其中$id为实例ID。

### 3.2 配置 server.conf

* [cluster] 和 [service] 配置的端口(port)必须与cluster.conf中本机的一致,否则启动会报错

### 3.3 启动voted

voted命令直接重启:

```
/usr/bin/fcfs_voted /etc/fastcfs/vote/server.conf restart
```

或者系统服务命令启动:

```
sudo systemctl restart fastvote
```

查看日志:

```
tail /opt/fastcfs/vote/logs/fcfs_voted.log
```

## 4. Auth server

### 4.1 复制vote server上的如下配置文件到 /etc/fastcfs/vote/

```
/etc/fastcfs/vote/cluster.conf
/etc/fastcfs/vote/client.conf
```

修改 /etc/fastcfs/auth/cluster.conf,将vote_node_enabled 设置为true。
配置片段如下:

```
[master-election]
# if enable vote node when the number of servers is even
# the default value is false
vote_node_enabled = true

# the cluster config filename of the vote node
# this parameter is valid when vote_node_enabled is true
vote_node_cluster_filename = ../vote/cluster.conf
```

拷贝完成后重启认证服务(fcfs_authd)

## 5. FastDIR server

修改 /etc/fastcfs/fdir/cluster.conf,将vote_node_enabled 设置为true。

* 详情参见 4. Auth server 部分

拷贝和设置完成后重启FastDIR服务(fdir_serverd)

## 6. FastStore server

* 参见 4. Auth server 部分

修改 /etc/fastcfs/fstore/cluster.conf,将vote_node_enabled 设置为true。
配置片段如下:

```
[leader-election]

# if enable vote node when the number of servers is even
# the default value is false
vote_node_enabled = true

# the cluster config filename of the vote node
# this parameter is valid when vote_node_enabled is true
vote_node_cluster_filename = ../vote/cluster.conf
```

拷贝完成后重启FastStore服务(fs_serverd)

## 友情提示

* 4 ~ 6部分的配置及启动参见 [配置指南](CONFIGURE-zh_CN.md)


================================================
FILE: docs/YUM-INSTALL-Diy-5nodes-zh_CN.md
================================================
### 安装的集群架构
FastCFS支持大规模的集群,下面以最为典型的最小化集群的部署方式,说明下自定义安装的过程。更大规模的安装方式可参照此过程扩展安装。
1. 节点类型和数量:共计5个节点,3个服务端节点(3副本策略),2客户端节点
2. 服务端集群:FastStore和FastDir公用,也可以分开独立部署,生产环境建议分开。本说明为了降低节点数量,采用了公用部署的方式。
3. 客户端:为了说明支持多客户端,使用了2个客户端节点。生产环境中如果只需要1个客户端,也是没问题的。
<img src="../images/demo-5-nodes-deploy.jpg" width="800" alt="5个节点的集群架构图">

### 前置依赖
先安装FastOS.repo yum源,FastCFS所需要的pkg都在此源中,安装成功后就可以安装FastCFS相关软件包了。

- CentOS 7等el7系列的Linux发行版
```
rpm -ivh http://www.fastken.cn/yumrepo/el7/noarch/FastOSrepo-1.0.1-1.el7.noarch.rpm
```

- CentOS 8等el8系列的Linux发行版
```
rpm -ivh http://www.fastken.cn/yumrepo/el8/noarch/FastOSrepo-1.0.1-1.el8.noarch.rpm
```

友情提示:支持的Linux发行版以及与el7或el8的对应关系参见 [yum安装方式](YUM-INSTALL-zh_CN.md)


### 服务端集群安装
在192.168.126.[101,102,103]上分别安装FastStore、FastDIR 两个服务. 
#### 安装FastDIR
```
yum install fastDIR-server
```
安装过程中会安装所依赖的包,选y就可以了. 
```
==================================================================================================================
 Package                            Architecture          Version                     Repository             Size
==================================================================================================================
Installing:
 fastDIR-server                     x86_64                2.0.1-1.el8                 FastOS                 71 k
Installing dependencies:
 FastCFS-auth-client                x86_64                2.0.1-1.el8                 FastOS                 36 k
 FastCFS-auth-config                x86_64                2.0.1-1.el8                 FastOS                 10 k
 fastDIR-config                     x86_64                2.0.1-1.el8                 FastOS                9.5 k
 libfastcommon                      x86_64                1.0.50-1.el8                FastOS                140 k
 libserverframe                     x86_64                1.1.7-1.el8                 FastOS                 47 k

Transaction Summary
==================================================================================================================
Install  6 Packages

Total download size: 313 k
Installed size: 711 k
Is this ok [y/N]: y   // 安装过程中会安装所依赖的包,选y就可以了. 

```
安装完毕后,在/etc/fastcfs 下可看到fdir的目录,存储的是FastDIR的配置文件.  配置项的内容,后续会说明。
```
$ ll /etc/fastcfs/fdir/
total 16
-rw-r--r--. 1 root root 1565 May  9 13:49 client.conf
-rw-r--r--. 1 root root  753 May  9 13:49 cluster.conf
-rw-r--r--. 1 root root 5242 May  9 13:49 server.conf
```

#### 安装FastStore

```
yum install faststore-server
```
再说明下:实际生产环境部署中,FastDIR是和FastStore两个服务可以分开部署的,不需要再同一台服务器上。
```
==================================================================================================================
 Package                          Architecture           Version                     Repository              Size
==================================================================================================================
Installing:
 faststore-server                 x86_64                 2.0.1-1.el8                 FastOS                 134 k
Installing dependencies:
 faststore-config                 x86_64                 2.0.1-1.el8                 FastOS                  11 k

Transaction Summary
==================================================================================================================
Install  2 Packages

Total download size: 145 k
Installed size: 422 k
Is this ok [y/N]: y  // 安装过程中会安装所依赖的包,选y就可以了. 
```
安装完毕后,在/etc/fastcfs 下可看到fstore目录,存储的是FastStore的配置文件。配置项的内容,后续会说明。
```
$ ll /etc/fastcfs/fstore/
total 20
-rw-r--r--. 1 root root 1577 May  9 13:52 client.conf
-rw-r--r--. 1 root root 3256 May  9 13:52 cluster.conf
-rw-r--r--. 1 root root 4965 May  9 13:52 server.conf
-rw-r--r--. 1 root root 2609 May  9 13:52 storage.conf
```

### 安装客户端
在192.168.126.[201,202]上安装Client包, 包名为FastCFS-fused. 
```
yum install FastCFS-fused -y 
```

安装完毕后,在/etc/fastcfs 下可看到以下目录,存储是对应服务的配置文件.  
```
$ ll /etc/fastcfs/
drwxr-xr-x. 3 root root 113 May 14 15:20 auth
drwxr-xr-x. 2 root root  23 May 14 15:20 fcfs
drwxr-xr-x. 2 root root  64 May 14 15:20 fdir
drwxr-xr-x. 2 root root  84 May 14 15:20 fstore
```
**为什么在Client的节点上,需要有fdir和fstore的目录呢?因为FastCFS是无中心配置的,Client需要知道fdir和fstore的集群情况,所以就需要fdir和fstore的配置文件。**

### 自定义安装配置
#### 说明
FastCFS并没有统一的配置中心,需要在各个节点上单独部署配置文件。配置文件分为两大类:集群配置文件和服务配置文件。

1. **集群配置文件:** 指的是描述 FastDir 和 FastStore 的配置文件,入口文件名称为cluster.conf . 该配置文件中设定是集群的参数,如服务节点的IP和端口号,服务节点的数量等。 cluster.conf 文件全局统一,各个节点上的内容是相同的, FastDir 和 FastStore 有各自的cluster.conf文件。

2. **服务配置文件:** 指的是服务本身的配置文件,入口文件名称server.conf 如线程数量、链接数量、缓冲区大小、日志配置等。 服务配置文件的内容,可以全局不统一。不过从集群的角度考虑,如果各服务器配置相同,最好是统一的。 

#### FastDIR 配置

1. **配置文件说明** 
```
$ ll /etc/fastcfs/fdir/ 
-rw-r--r--. 1 root root 1565 May  9 13:49 client.conf // 暂时不使用,不用关注
-rw-r--r--. 1 root root  753 May  9 13:49 cluster.conf // 集群配置文件
-rw-r--r--. 1 root root 5242 May  9 13:49 server.conf // 服务配置文件 
```

2. **集群配置文件** :在101节点上,修改/etc/fastcfs/fdir/cluster.conf 文件,修改为正确的IP地址,修改后的内容如下
```
  1 # config the auth config filename
  2 auth_config_filename = /etc/fastcfs/auth/auth.conf
  3
  4
  5 [group-cluster]
  6 # the default cluster port
  7 port = 11011  // 集群之间的通信使用的默认端口号,不用修改
  8
  9 [group-service]
 10 # the default service port
 11 port = 11012  // 对client提供服务,使用的默认端口号,不用修改
 12
 13 # config a server instance
 14 # section format: [server-$id]
 15 # server id is a 32 bits natural number (1, 2, 3 etc.),
 16 [server-1]
 17
 18 # format: host[:port]
 19 # host can be an IP address or a hostname
 20 # IP address is recommended
 21 # can occur more than once
 22 host = 192.168.126.101  // 节点101的地址,使用默认的端口号
 23
 24 [server-2]
 25 # cluster-port = 11013
 26 # service-port = 11014
 27 host = 192.168.126.102 // 节点102的地址,使用默认的端口号
 28
 29 [server-3]
 30 # cluster-port = 11015
 31 # service-port = 11016
 32 host = 192.168.126.103  // 节点103的地址,使用默认的端口号

```
3. **服务配置文件** : 在101节点上,/etc/fastcfs/fdir/server.conf, 该文件配置项较多,但默认不用任何调整,确认文件底部的[service]区内容就好.
```
180 [cluster]
181 # bind an address of this host
182 # empty for bind all addresses of this host
183 bind_addr =
184
185 # the listen port
186 port = 11011
187
188 # the accept thread count
189 # default value is 1 which is recommended
190 accept_threads = 1
191
192 # the network thread count
193 # these threads deal network io
194 # dispatched by the incoming socket fd
195 # default value is 4
196 work_threads = 2
197
198 [service]
199 bind_addr =  // 保持为空,FastDIR 会自动使用本机的IP地址
200 port = 11012  // 确保与cluster.conf 中 group-service 的设定值相同
201 accept_threads = 1
202 work_threads = 4
```
4. 把cluster.conf文件复制到102-103,201-202 这5台服务器上,保证所有节点都能知道集群配置
```
scp /etc/fastcfs/fdir/cluster.conf 192.168.126.102:/etc/fastcfs/fdir/
scp /etc/fastcfs/fdir/cluster.conf 192.168.126.103:/etc/fastcfs/fdir/
scp /etc/fastcfs/fdir/cluster.conf 192.168.126.201:/etc/fastcfs/fdir/
scp /etc/fastcfs/fdir/cluster.conf 192.168.126.202:/etc/fastcfs/fdir/
```

#### FastStore 配置

1. **配置文件说明** 
```
$ ll /etc/fastcfs/fstore
-rw-r--r--. 1 root root 1577 May  9 13:52 client.conf // 暂时不使用,不用关注
-rw-r--r--. 1 root root 3253 May 14 13:08 cluster.conf // 集群配置文件
-rw-r--r--. 1 root root 4965 May  9 13:52 server.conf // 服务配置文件
-rw-r--r--. 1 root root 2609 May  9 13:52 storage.conf // 服务配置文件
```

2. **集群配置文件** :在101节点上,修改/etc/fastcfs/fstore/cluster.conf 文件,仅需要修改server_ids的值和[group-cluster]部分,其它参数不需要调整。修改后的内容如下. 
```
 57 [server-group-1]
 58
 59 # config one or more server id(s) from servers.conf
 60 ## multiple server ids separated by comma(s).
 61 ## [start, end] for range, including start and end.
 62 # this parameter can occurs more than once.
 63 # server_ids = [1, 3]
 64 server_ids = [1,3]  //  使用了3副本的策略,有3个服务节点101/102/103,所以设定为[1,3]
 65
 66 # the data group id based 1. the formats as:
 67 ##  * multiple data group ids separated by comma(s).
 68 ##  * [start, end] for range, including start and end.
 69 # this parameter can occurs more than once.
 70 data_group_ids = [1, 32]
 71 data_group_ids = [33, 64]
 72
 73
 74 [group-cluster]
 75 # the default cluster port
 76 port = 21014  // 集群之间的通信使用的默认端口号,不用修改
 77
 78 [group-replica]
 79 # the default replica port
 80 port = 21015 // Master-Slave 之间同步数据使用的默认端口号,不用修改
 81
 82 [group-service]
 83 # the default service port
 84 port = 21016  // 对Client提供服务,使用的默认端口号,不用修改
 85
 86 # config a server
 87 # section format: [server-$id]
 88 # server id is a 32 bits natural number (1, 2, 3 etc.),
 89 [server-1]
 90
 91 # format: host[:port]
 92 # host can be an IP address or a hostname
 93 # IP address is recommended
 94 # can occur more than once
 95 host = 192.168.126.101  // 节点101的地址,使用默认的端口号 
 96 
 97 [server-2]
 99 host = 192.168.126.102 // 节点102的地址,使用默认的端口号
100
101 [server-3]
103 host = 192.168.126.103  // 节点103的地址,使用默认的端口号
```
3. **服务配置文件** 在101节点上,/etc/fastcfs/fstore/server.conf 和  /etc/fastcfs/fstore/storage.conf. 默认均需要修改,只需确认下server.conf的配置是否正确
```
190 [replica]
191 bind_addr =
192 port = 21015  // 保持与fstore/server.conf 中 [group-replica]设定的port值相同
193 accept_threads = 1
194 work_threads = 4
195
196 [service]
197 bind_addr =
198 port = 21016  // 保持与fstore/server.conf 中 [group-service]设定的port值相同
199 accept_threads = 1
200 work_threads = 4
```
4. 把cluster.conf文件复制到102-103,201-202 这5台服务器上,保证所有节点都能知道集群配置
```
scp /etc/fastcfs/fstore/cluster.conf 192.168.126.102:/etc/fastcfs/fstore/
scp /etc/fastcfs/fstore/cluster.conf 192.168.126.103:/etc/fastcfs/fstore/
scp /etc/fastcfs/fstore/cluster.conf 192.168.126.201:/etc/fastcfs/fstore/
scp /etc/fastcfs/fstore/cluster.conf 192.168.126.202:/etc/fastcfs/fstore/
```

#### FastClient 配置
1. Client 需要知道FastDIR和FastStore的集群配置数据,在上述scp过程中,已经分别scp到了对应的目录下,不需要修改.
2. Client 自身的配置文件为 /etc/fastcfs/fcfs/fuse.conf 属于服务配置文件,也不需要修改. 
 
### 启动服务

安装并配置完成后,可以启动服务并验证.

1. **关闭防火墙:** CentOS 8 默认情况下开启防火墙,会导致各节点之间无法访问,可暂关闭防火墙。
```
sudo systemctl stop firewalld.service
```
2. **启动FastDir:***  在101/102/103 三个节点上,执行下列命令启动. 注意必须是3个节点都启动。
```
sudo systemctl restart fastdir
```
或者
```
sudo /usr/bin/fdir_serverd /etc/fastcfs/fdir/server.conf restart
```
查看日志,确认启动成功.
```
$ tail /opt/fastcfs/fdir/logs/fdir_serverd.log

[2021-05-14 15:39:36] ERROR - file: connection_pool.c, line: 140, connect to server 192.168.126.102:11011 fail, errno: 113, error info: No route to host
[2021-05-14 15:39:36] ERROR - file: connection_pool.c, line: 140, connect to server 192.168.126.103:11011 fail, errno: 113, error info: No route to host
[2021-05-14 15:39:36] INFO - file: cluster_relationship.c, line: 668, round 19th select master, alive server count: 1 < server count: 3, the candidate server status: 0 (INIT) does not match the selection rule. you must start ALL servers in the first time, or remove the deprecated server(s) from the config file. try again after 32 seconds.
[2021-05-14 15:40:01] INFO - file: cluster_relationship.c, line: 474, the master server id: 3, ip 192.168.126.103:11011
```
日志中有error提示,是因为防火墙导致的3个节点无法互相通信产生的,关闭防火墙后FastDIR会自动进行尝试链接。从最后一行INFO日志可看到,服务已经启动成功了,并且选择了103节点作为Master. 

3. **启动FastStore:** 与FastDir的启动方式类似,在101/102/103 三个节点上,执行下列命令启动. 注意必须是3个节点都启动。
```
sudo systemctl restart faststore
```
或者
```
sudo /usr/bin/fs_serverd /etc/fastcfs/fstore/server.conf restart
```
查看日志,确认启动成功.
```
[2021-05-14 16:06:08.326966] INFO - file: replication/replication_processor.c, line: 419, connect to replication peer id: 3, 192.168.126.103:21015 successfully
[2021-05-14 16:06:08.344415] INFO - file: replication/replication_processor.c, line: 419, connect to replication peer id: 3, 192.168.126.103:21015 successfully
[2021-05-14 16:06:08.368437] INFO - file: replica_handler.c, line: 598, replication peer id: 1, 192.168.126.101:21014 join in
[2021-05-14 16:06:09.942673] INFO - file: replica_handler.c, line: 598, replication peer id: 1, 192.168.126.101:21014 join in
[2021-05-14 16:06:10.374344] INFO - file: recovery/binlog_fetch.c, line: 589, data group id: 1, wait replica channel of master id 1 ready success, waiting count: 2
[2021-05-14 16:06:10.415848] INFO - file: recovery/binlog_fetch.c, line: 589, data group id: 6, wait replica channel of master id 1 ready success, waiting count: 2
```
看到以上类似的日志,即是启动成功了。 

4. **启动FastClient:** 在201、202 节点上启动Client.
```
sudo systemctl restart fastcfs
```
或者
```
sudo  /usr/bin/fcfs_fused /etc/fastcfs/fcfs/fuse.conf restart
```
查看日志,确认启动成功
```
$ tail /opt/fastcfs/fcfs/logs/fcfs_fused.log 
[2021-05-14 16:14:15] INFO - file: sf_nio.c, line: 205, connect to server 192.168.126.101:11012 successfully
[2021-05-14 16:14:15] INFO - file: sf_nio.c, line: 205, connect to server 192.168.126.103:11012 successfully
[2021-05-14 16:14:15] INFO - file: sf_connection_manager.c, line: 827, [FastDIR] connection manager thread start
[2021-05-14 16:14:15] INFO - file: sf_connection_manager.c, line: 827, [FastStore] connection manager thread start
[2021-05-14 16:14:55] INFO - file: sf_nio.c, line: 205, connect to server 192.168.126.101:21016 successfully
```
查看文件目录是否成功挂载
```
$ df -h
Filesystem           Size  Used Avail Use% Mounted on
devtmpfs             189M     0  189M   0% /dev
tmpfs                219M     0  219M   0% /dev/shm
tmpfs                219M  6.6M  212M   4% /run
tmpfs                219M     0  219M   0% /sys/fs/cgroup
/dev/mapper/cs-root   47G  4.9G   43G  11% /
/dev/sda1           1014M  242M  773M  24% /boot
tmpfs                 44M  4.0K   44M   1% /run/user/1000
/dev/fuse             38G     0   38G   0% /opt/fastcfs/fuse  // 这是即是FastCFS挂载的根目录
```
5. 验证 :在201节点上创建文件
```
[first@192.168.126.201 /opt/fastcfs/fuse]
$ mkdir -p abc/123
[first@192.168.126.201 /opt/fastcfs/fuse]
$ touch abc/123/demo.txt
[first@192.168.126.201 /opt/fastcfs/fuse]
$ vim abc/123/demo.txt
[first@192.168.126.201 /opt/fastcfs/fuse]
$ ll abc/123
total 1
-rw-rw-r--+ 1 first first 13 May 14 16:22 demo.txt  
```
在202节点上查看该文件,可见文件已经创建成功了
```
[first@192.168.126.202 /opt/fastcfs/fuse]
$ tail abc/123/demo.txt
hello world
[first@192.168.126.202 /opt/fastcfs/fuse]
```

### 服务监控
1. 查看FastDir集群状态
```
$ fdir_cluster_stat
server_id: 1, host: 192.168.126.101:11012, status: 23 (ACTIVE), is_master: 0
server_id: 2, host: 192.168.126.102:11012, status: 23 (ACTIVE), is_master: 0
server_id: 3, host: 192.168.126.103:11012, status: 23 (ACTIVE), is_master: 1

server count: 3
```
2. 查看单个FastDir节点状态
```
[first@192.168.126.201 /etc/fastcfs/fcfs]
$ fdir_service_stat 192.168.126.101:11012
        server_id: 1
        status: 23 (ACTIVE)
        is_master: false
        connection : {current: 4, max: 4}
        binlog : {current_version: 24}
        dentry : {current_inode_sn: 1000009, ns_count: 1, dir_count: 3, file_count: 1}
```
3. 查看FastStore集群状态
```
$ fs_cluster_stat | more

data_group_id: 1
        server_id: 1, host: 192.168.126.101:21016, status: 5 (ACTIVE), is_preseted: 1, is_master: 1, data_version: 0
        server_id: 2, host: 192.168.126.102:21016, status: 5 (ACTIVE), is_preseted: 0, is_master: 0, data_version: 0
        server_id: 3, host: 192.168.126.103:21016, status: 5 (ACTIVE), is_preseted: 0, is_master: 0, data_version: 0

data_group_id: 2
        server_id: 1, host: 192.168.126.101:21016, status: 5 (ACTIVE), is_preseted: 0, is_master: 0, data_version: 0
        server_id: 2, host: 192.168.126.102:21016, status: 5 (ACTIVE), is_preseted: 1, is_master: 1, data_version: 0
.....................
```
4. 查看磁盘使用情况
```
df -h 
```


================================================
FILE: docs/YUM-INSTALL-zh_CN.md
================================================

## yum安装方式

yum 安装方式支持intel的x86_64和ARM的aarch64架构,主要用于测试和生产环境搭建。
支持的Linux发行版如下:
* CentOS & CentOS Stream
* Fedora
* Rocky
* Anolis
* AlmaLinux
* RHEL (Red Hat Enterprise Linux)
* Oracle Linux
* Amazon Linux
* Alibaba Cloud Linux
* openEuler
* Kylin
* UOS

### 1. 安装FastOS.repo

先安装FastOS.repo yum源,然后就可以安装FastCFS相关软件包了。

CentOS 7、RHEL 7、Oracle Linux 7、Alibaba Cloud Linux 2、Anolis OS 7、AlmaLinux 7、Amazon Linux 2、Fedora 27及以下版本:
```
rpm -ivh http://www.fastken.cn/yumrepo/el7/noarch/FastOSrepo-1.0.1-1.el7.noarch.rpm
```

CentOS 8、Rocky Linux 8、RHEL 8、Oracle Linux 8、Alibaba Cloud Linux 3、Anolis OS 8、AlmaLinux 8、openEuler [20, 23]、Kylin V10、UOS 20、Amazon Linux 3、Fedora [28, 37]:
```
rpm -ivh http://www.fastken.cn/yumrepo/el8/noarch/FastOSrepo-1.0.1-1.el8.noarch.rpm
```

CentOS Stream 9、Rocky Linux 9、RHEL 9、Oracle Linux 9、Alibaba Cloud Linux 4、Anolis OS 23、AlmaLinux 9、openEuler 24.03、Kylin V11、Amazon Linux 2023、Fedora 38及以上版本:
```
rpm -ivh http://www.fastken.cn/yumrepo/el9/noarch/FastOSrepo-1.0.1-1.el9.noarch.rpm
```


### 2. fastDIR server安装

在需要运行 fastDIR server的服务器上执行:
```
yum install fastDIR-server -y
```

### 3. faststore server安装

在需要运行 faststore server的服务器上执行:
```
yum install faststore-server -y
```

### 4. FastCFS客户端安装

在需要使用FastCFS存储服务的机器(即FastCFS客户端)上,除了openEuler之外的其他Linux发行版执行:
```
yum install FastCFS-fused -y
```

对于openEuler 20.03和Kylin V10,因需安装的fuse3和系统已有的fuse在依赖关系上存在冲突,需要用rpm命令强制安装fuse3,执行:
```
arch=$(uname -r | awk -F '.' '{print $NF}');
dist=el8;
ver='3.16.2-2';
rpm -ivh http://www.fastken.cn/yumrepo/$dist/$arch/fuse3-libs-$ver.$dist.$arch.rpm  \
         http://www.fastken.cn/yumrepo/$dist/$arch/fuse-common-$ver.$dist.$arch.rpm \
         http://www.fastken.cn/yumrepo/$dist/$arch/fuse3-$ver.$dist.$arch.rpm --force --nodeps;

yum install FastCFS-fused -y
```

对于openEuler 22.03及更高版本,直接执行:
```
yum install FastCFS-fused -y
```

### 5. Vote server安装(可选)

Vote server作为FastCFS多个服务模块共用的选举节点,主要作用是实现双副本防脑裂(即双活互备防脑裂)。

在需要运行选举节点的服务器上执行:
```
yum install FastCFS-vote-server -y
```

### 6. Auth server安装(可选)

如果需要存储池或访问控制,则需要安装本模块。

在需要运行 Auth server的服务器上执行:
```
yum install FastCFS-auth-server -y
```

安装完成后,需要修改对应的配置文件,服务才可以正常启动。请参阅[配置指南](CONFIGURE-zh_CN.md)

FastCFS后台程序可通过systemd管理。systemd服务名称如下:
```
  * fastdir: 目录服务,对应程序为 fdir_serverd
  * faststore:存储服务,对应程序为 fs_serverd
  * fastcfs: FUSE后台服务,对应程序为 fcfs_fused
  * fastvote: 选举节点,对应程序为 fcfs_voted
  * fastauth: 认证服务,对应程序为 fcfs_authd
```

可以使用标准的systemd命令对上述5个服务进行管理,例如:
```
systemctl restart fastdir
systemctl restart faststore
systemctl restart fastcfs
systemctl restart fastvote
systemctl restart fastauth
```
### 6. 一个包含5个节点的安装过程的详细文档
请参与[5节点安装文档](YUM-INSTALL-Diy-5nodes-zh_CN.md)


================================================
FILE: docs/benchmark-step-by-step.md
================================================

## FastCFS性能测试参考文档

服务器之间需要实现免密登录,集群部署参见:[FastCFS集群部署工具介绍](fcfs-ops-tool-zh_CN.md)

### 集群快速部署

在施压服务器(即client机器)上执行如下命令:

```
curl -o /usr/bin/fcfs.sh http://fastken.cn/fastcfs/ops/fcfs.sh && sudo chmod +x /usr/bin/fcfs.sh;
curl -o /usr/bin/fcfs_conf.sh http://fastken.cn/fastcfs/ops/fcfs_conf.sh && sudo chmod +x /usr/bin/fcfs_conf.sh;

mkdir -p fastcfs-ops && cd fastcfs-ops;
server_ips='请替换为西文逗号分隔的服务器IP列表';
client_ip=$(ip addr | grep -w inet | grep -v 127.0.0.1 | awk '{print $2}' | tr -d 'addr:' | awk -F '/' '{print $1}' | head -n 1);
cat > fcfs_conf.settings <<EOF
fastcfs_version=5.0.0

vote_ips=$server_ips
auth_ips=$server_ips
fdir_ips=$server_ips
fstore_group_count=1
fstore_group_1=$server_ips
data_group_count=64
EOF


cat > fcfs.settings <<EOF
fastcfs_version=5.0.0

fuseclient_ips=$client_ip
EOF

fcfs_conf.sh create;
```

修改conf/fdir/cluster.conf 和 conf/fstore/cluster.conf 的配置项 communication,配置示例如下:

```
# config the auth config filename
auth_config_filename = ../auth/auth.conf

# the communication value list:
##  socket: TCP over ethernet or RDMA network
##  rdma: RDMA network only
# default value by the global config with same name
communication = socket

# smart polling mode for RDMA network
# auto detect to poll by Linux epoll or RDMA busy polling
# default value is true
smart_polling = true

# switch the polling approach between Linux epoll and RDMA busy polling
# switch to RDMA busy polling when IOPS >= this parameter,
# otherwise switch to Linux epoll
# default value is 10240
polling_switch_on_iops = 1024
```

修改conf/fcfs/fuse.conf的配置项,配置示例如下:

```
# the mount point (local path) for FUSE
# the local path must exist
mountpoint = /opt/fastcfs/fuse

# if use busy polling for RDMA network
# should set to true for HPC
# default value is false
busy_polling = true


[read-ahead]
# if enable read ahead feature for FastStore
# default value is true
enabled = false
```

首次部署:
```
fcfs.sh setup;
```

修改配置后重新部署:
```
fcfs.sh config;
fcfs.sh restart;
```


### 安装压测工具

CentOS、Alibaba Cloud Linux等发行版:
```
yum install fio FastCFS-api-tests -y
```

Ubuntu 或者Debian:
```
apt install fio fastcfs-api-tests -y
```

### fio压测示例

```
cd /opt/fastcfs/fuse;
jobnum=4; rw=randread;
out_path=FastCFS-fio/$rw-$jobnum;
log_file=$out_path/fio;
mkdir -p $out_path;

fio --filename_format=test_file.\$jobnum  --direct=1 --rw=$rw --thread --numjobs=$jobnum --iodepth=16 --ioengine=psync  --bs=4k --group_reporting --name=FastCFS --loops=1000 --log_avg_msec=500 --write_bw_log=$log_file --write_lat_log=$log_file --write_iops_log=$log_file --runtime=300 --size=256M
```

### fcfs_beachmark压测示例
```
fcfs_beachmark -m randread -s 256M -T 4  -t 300 -f  /opt/fastcfs/fuse/test_file
```


================================================
FILE: docs/benchmark.md
================================================

## FastCFS vs. Ceph benchmark under 3 nodes cluster (three copies of data)

<table border=1 cellspacing=0 cellpadding=4 width=640 style="border:2px solid">
<thead>
<tr style="background-color:#D3D3D3">
<td width=128 rowspan=2 align=center><b>read/write type</b></td>
<td width=128 rowspan=2 align=right><b>fio jobs &nbsp;</b></td>
<td width=256 colspan=2 align=center><b>IOPS(4KB Block)</b></td>
<td width=128 rowspan=2 align=right><b>ratio &nbsp;</b></td>
</tr>
<tr style="background-color:#D3D3D3">
<td width=128 align=right><b>FastCFS &nbsp;</b></td>
<td width=128 align=right><b>Ceph &nbsp;</b></td>
</tr>
</thead>

<tr style="background-color:#F5F5F5">
<td width=128 rowspan=3 align=center><b>sequential write</b></td>
<td width=128 align=right>4 &nbsp;</td>
<td width=128 align=right>32,256 &nbsp;</td>
<td width=128 align=right>5,120 &nbsp;</td>
<td width=128 align=right>630% &nbsp;</td>
</tr>

<tr style="background-color:#F5F5F5">
<td align=right>8 &nbsp;</td>
<td align=right>55,296 &nbsp;</td>
<td align=right>8,371 &nbsp;</td>
<td align=right>661% &nbsp;</td>
</tr>

<tr style="background-color:#F5F5F5">
<td align=right>16 &nbsp;</td>
<td align=right>76,800 &nbsp;</td>
<td align=right>11,571 &nbsp;</td>
<td align=right>664% &nbsp;</td>
</tr>

<tr>
<td rowspan=3 align=center><b>rand write</b></td>
<td align=right>4 &nbsp;</td>
<td align=right>6,374 &nbsp;</td>
<td align=right>4,454 &nbsp;</td>
<td align=right>143% &nbsp;</td>
</tr>

<tr>
<td align=right>8 &nbsp;</td>
<td align=right>11,264 &nbsp;</td>
<td align=right>6,400 &nbsp;</td>
<td align=right>176% &nbsp;</td>
</tr>

<tr>
<td align=right>16 &nbsp;</td>
<td align=right>16,870 &nbsp;</td>
<td align=right>7,091 &nbsp;</td>
<td align=right>238% &nbsp;</td>
</tr>

<tr style="background-color:#F5F5F5">
<td rowspan=3 align=center><b>sequential read</b></td>
<td align=right>4 &nbsp;</td>
<td align=right>34,880 &nbsp;</td>
<td align=right>14,848 &nbsp;</td>
<td align=right>235% &nbsp;</td>
</tr>

<tr style="background-color:#F5F5F5">
<td align=right>8 &nbsp;</td>
<td align=right>62,751 &nbsp;</td>
<td align=right>24,883 &nbsp;</td>
<td align=right>252% &nbsp;</td>
</tr>

<tr style="background-color:#F5F5F5">
<td align=right>16 &nbsp;</td>
<td align=right>86,508 &nbsp;</td>
<td align=right>38,912 &nbsp;</td>
<td align=right>222% &nbsp;</td>
</tr>

<tr>
<td rowspan=3 align=center><b>rand read</b></td>
<td align=right>4 &nbsp;</td>
<td align=right>12,527 &nbsp;</td>
<td align=right>12,160 &nbsp;</td>
<td align=right>103% &nbsp;</td>
</tr>

<tr>
<td align=right>8 &nbsp;</td>
<td align=right>23,610 &nbsp;</td>
<td align=right>22,220 &nbsp;</td>
<td align=right>106% &nbsp;</td>
</tr>

<tr>
<td align=right>16 &nbsp;</td>
<td align=right>41,790 &nbsp;</td>
<td align=right>36,608 &nbsp;</td>
<td align=right>114% &nbsp;</td>
</tr>
</table>

more info see Chinese doc: [FastCFS vs. Ceph benchmark detail](benchmark-20210621.pdf)


================================================
FILE: docs/cluster-expansion-zh_CN.md
================================================

# FastCFS集群扩容手册

FastCFS集群三个服务组件:fauth、fdir 和fstore,下面将分别介绍这三个服务组件的扩容方法和步骤。

## 1. fauth(认证服务)

认证服务的用户和权限等数据保存在fdir中,服务采用热备模式,建议部署2 ~ 3个服务器(节点),主节点失效后会自动切换到备用节点。
因认证服务器自身不保存数据,因此可以根据实际需要随时增加或减少认证服务器。

## 2. fdir(目录服务)

FastCFS目录服务用于文件元数据管理,目前只支持一组服务器,使用常规服务器(如64GB内存 + SSD)可以支持百亿级文件。
详情参见[高性能大容量分布式目录服务FastDIR简介](https://my.oschina.net/u/3334339/blog/5405816)

建议将fdir部署在3台服务器上,可以根据实际需要随时增加或减少fdir服务器,fdir将基于binlog自动完成数据同步。

## 3. fstore(数据存储)

fstore 采用分组方式保存文件内容。为了便于扩容,FastCFS引入了数据分组(DG)的概念。

按4MB分块的文件内容(文件块),根据其hash code(文件ID + 文件块偏移量),路由到对应的数据分组。计算公式如下:
```
DGI = HashCode % DGC

DGI:数据分组索引号
HashCode:文件分块哈希值
DGC:数据分组总数
```

数据分组是逻辑或虚拟概念,映射到的物理或实体概念是服务器分组(SG),二者是多对一关系,即:一个服务器分组(SG)可以容纳多个数据分组(DG)。

fstore集群的服务器分组总数,英文缩写为SGC。

DG 和SG映射关系配置在fstore的cluster.conf中,配置示例片段(简洁起见,只配置了一个3副本的SG):
```
# SGC
server_group_count = 1

# DGC
data_group_count = 256

# 配置SG1
[server-group-1]
server_ids = [1-3]
data_group_ids = [1, 256]

```

fstore集群扩容,可以一次增加一个SG。当集群规模较小(比如SGC小于等于4)时,建议一次扩容一倍(SGC翻番)。

DGC一旦确定就不可更改,除非建立新集群。因此在初始化集群时,需要确定好数据分组总数(DGC),可以根据业务发展规划,充分预估出DGC。

比如根据存储量预估5年后需要的服务器分组数(SGC)为20,为了充分发挥多核性能,每台服务器上跑32个数据分组(DG),DGC为20 * 32 = 640,按2次幂向上对齐,最终配置为1024。

* 友情提示:建议生产环境DGC至少配置为256。

fstore在线扩容分为两个步骤修改cluster.conf:
1. 增加扩容的SG 和迁移过去的DG映射;
2. 新增的SG自动同步完成后,将原有SG迁移出去的DG映射删除。

上述两个步骤将cluster.conf修改完成后,都需要将cluster.conf分发到fstore集群和fuseclient,然后重启fstore集群和fuseclient。推荐重启步骤如下:
```
 1. 停止fuseclient
 2. 重启fstore集群
 3. 启动fuseclient
```

将上述配置示例的1个SG扩容为2个SG(均采用3副本),我们如何调整cluster.conf:

### 步骤1
修改后的cluster.conf内容片段如下:

```
# SGC,由1扩容为2
server_group_count = 2

# DGC
data_group_count = 256

# 修改DG映射,将 [129, 256]迁移至SG2
[server-group-1]
server_ids = [1-3]
data_group_ids = [1, 128]

# 配置SG2
# 必须加上server [1-3]用于同步已有数据
[server-group-2]
server_ids = [1-6]
data_group_ids = [129, 256]
```

将cluster.conf分发到fstore集群所有服务器以及所有fuseclient后,重启fstore集群和fuseclient。

等待新增的SG同步完成,然后进入步骤2。

* 友情提示:
   * 数据同步过程中fstore集群正常提供服务;
   * 可以使用工具 fs_cluster_stat 查看fstore集群状态,比如:
```
# 查看ACTIVE列表,确保所有服务器状态为ACTIVE,确认一下最后一行输出的总数
fs_cluster_stat -A

# 查看非ACTIVE列表,确保输出为空
fs_cluster_stat -N

# 抽查某个数据分组(如ID为256)的ACTIVE状态,确保全部为ACTIVE
fs_cluster_stat -g 256

# 查看帮助
fs_cluster_stat -h
```

### 步骤2
修改后的cluster.conf内容片段如下:

```
# SGC
server_group_count = 2

# DGC
data_group_count = 256

[server-group-1]
server_ids = [1-3]
data_group_ids = [1, 128]

# 去掉server [1-3]
[server-group-2]
server_ids = [4-6]
data_group_ids = [129, 256]
```

将cluster.conf分发到fstore集群所有服务器以及所有fuseclient后,重启fstore集群和fuseclient

### 清除已迁走的数据
数据迁移完成后,为了清除迁移出去的数据占用空间,V3.2支持清除迁移出去的replica和slice binlog,启动 fs_serverd时带上参数 --migrate-clean 即可,示例如下:
```
/usr/bin/fs_serverd  /etc/fastcfs/fstore/server.conf restart --migrate-clean
```

**注意:** 为了防止误操作,正常情况下启动fs_serverd **不要** 使用--migrate-clean!

* 友情提示:
   * 配置文件分发和程序启停可以使用fcfs.sh,使用说明参见[FastCFS集群运维工具](fcfs-ops-tool-zh_CN.md)
   * 步骤1和2重启fstore集群和fuseclient的过程,会导致服务不可用,建议在业务低峰期进行


================================================
FILE: docs/fcfs-ops-tool-zh_CN.md
================================================
# FastCFS 运维工具介绍

* [fcfs.sh](#fcfs.sh) -- 用于管理 FastCFS 集群的快捷运维工具
* [fcfs_conf.sh](#fcfs_conf.sh) -- 用于快速创建集群配置文件的工具

## 1. fcfs.sh 介绍

fcfs.sh 是一个用于快速部署和管理 FastCFS 集群的脚本工具。它基于 SSH 访问协议连接远程节点服务器,并使用服务器上带有 sudo 功能的账号(也可以使用root)进行相关命令的执行。它只需在你的工作站机器上运行,不需要服务器、数据库或者其他额外资源。

如果你需要经常搭建、卸载或配置 FastCFS集群,又想节省大量的重复工作,那么它很适合你。

***注: 该脚本工具目前适用于以下操作系统:***

* CentOS 7 和 CentOS 8 及以上版本
* Red Hat Linux 8 及以上版本
* Rocky Linux 8 及以上版本
* Anolis 7及以上版本
* AlmaLinux 7及以上版本
* Fedora Linux 20 及以上版本
* Oracle Linux 8 及以上版本
* Amazon Linux
* Alibaba Cloud Linux
* BigCLoud 21及以上版本
* openEuler 20及以上版本
* Kylin V10及以上版本
* UOS 20及以上版本
* Debian 10 及以上版本
* Ubuntu 18.04 及以上版本

<a name="fcfs.sh"></a>
### 1.1. 这个工具能做什么?

它能快速构建 FastCFS 集群,包括安装软件、分发配置文件,以及管理集群服务和查看集群日志。

它也能对 FastCFS 单节点或整个集群的相关软件进行升级或降级。

它能重新安装软件或者重新分发配置文件。

### 1.2. 这个工具不能做什么?

它不是一个通用的部署工具, 仅适用于 FastCFS 集群。除了将配置文件分发到集群的各个服务器节点以外,它不对集群配置做任何处理。你必须为它提供可用的集群配置文件。

### 1.3. 获取 fcfs.sh

从以下地址下载 fcfs.sh,并将其放置在工作站机器的bin目录下,以便命令行能够找到:

> http://fastken.cn/fastcfs/ops/fcfs.sh

获取命令:

> sudo curl -o /usr/bin/fcfs.sh  http://fastken.cn/fastcfs/ops/fcfs.sh && sudo chmod +x /usr/bin/fcfs.sh

下载完成后可通过命令 ***which fcfs.sh*** 测试工具是否生效。

### 1.4. 使用工具的前置条件

* fcfs.settings -- 集群运维配置,放置在当前工作目录中
* conf -- 集群配置文件目录,放置在当前工作目录中
* 远程服务器 SSH 免密登录,参见 [5. SSH 免密登录](#SSH-password-free-login)

你必须为每个集群创建一个独立的工作目录(例如:***fastcfs-ops***),将 ***fcfs.settings*** 和 ***conf*** 放入其中。然后所有针对该集群的后续命令操作,都必须在该工作目录中执行。

#### 1.4.1. fcfs.settings

fcfs.settings 包括两个字段 ***fastcfs_version*** 和 ***fuseclient_ips***,fastcfs_version 用于指定 FastCFS 主版本号,fuseclient_ips 用于指定要部署 fuse client 的服务器主机。当需要对 FastCFS 集群软件进行升级或降级操作时,你需要先修改 fastcfs_version 对应的版本号为你期望的版本。

fcfs.settings 配置文件内容举例:

```
# 要安装的集群版本号(例如:5.5.0)
fastcfs_version=5.5.0

# 要安装 fuseclient 客户端的IP列表,多个ip以英文逗号分隔
fuseclient_ips=10.0.1.14
```

***注:推荐使用 5.5.0 及更高版本用于集群部署。***

#### 1.4.2. conf

FastCFS集群的所有配置文件必须提前放置在工作目录中的 ***conf*** 目录,conf 包含以下四个子目录:

* vote -- fvote 服务器的配置文件
* fdir -- fdir 服务器的配置文件
* fstore -- fstore 服务器的配置文件
* auth -- fauth 服务器的配置文件
* fcfs -- fuseclient 客户端的配置文件

**获取配置文件样例**

```
mkdir fastcfs-ops
cd fastcfs-ops/
curl -o fcfs-config-sample.tar.gz http://fastken.cn/fastcfs/ops/fcfs-config-sample.tar.gz
tar -xzvf fcfs-config-sample.tar.gz
```

**使用fcfs_conf.sh创建集群配置文件**

也可以根据自己的需要,使用脚本工具 fcfs_conf.sh 创建 FastCFS集群配置文件。参见:[fcfs_conf.sh](#fcfs_conf.sh)

<a name="SSH-password-free-login"></a>
### 1.5. SSH 免密登录

fcfs.sh 将通过 SSH 连接所有集群主机。它需要工作站机器可以通过 SSH 在远程主机上执行脚本,执行命令的用户身份可以是 root 或带 sudo的用户,并且必须支持免密登录。

为了开启免密登录,你需要先为 SSH 生成 rsa 公钥/私钥对:

> ssh-keygen -t rsa -C cfs -f cfs-ssh-key

将生成密钥文件:

* cfs-ssh-key  -- 私钥文件
* cfs-ssh-key.pub -- 公钥文件

#### 1.5.1. 部署私钥

将私钥文件 cfs-ssh-key 拷贝到工作站机器的当前用户home目录 ***"~/.ssh/"***,然后将下面的配置片段加入配置文件 ~/.ssh/config(每个集群主机一份):

```
Host [node ip]
    HostName [node host name]
    User [ssh user]
    Port 22
    PubkeyAuthentication yes
    IdentityFile ~/.ssh/cfs-ssh-key
```

#### 1.5.2. 部署公钥

将公钥文件内容加入到每个节点服务器sudo 用户的home目录下 ***.ssh/authorized_keys*** 文件中:

> ssh-copy-id -i cfs-ssh-key.pub [user name]@[node server ip]

并确保服务器上sshd的配置文件中开启了以下配置参数:

```
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile      .ssh/authorized_keys
```

### 1.6. 工具命令介绍

fcfs.sh工具的命令包括三部分:command,module 和 node。Command 是必须的,module 和 node 是可选的。

用法:

> fcfs.sh command [module] [node]

**Commands**:

* setup -- 安装并运行 FastCFS 软件的快捷命令,组合了 install、config 和 restart三个命令
* install -- 安装 FastCFS 软件
* reinstall -- 重新安装 FastCFS 软件
* remove -- 移除 FastCFS 软件,功能与 erase 命令相同
* erase -- 移除 FastCFS 软件
* config -- 将集群配置文件拷贝到目标主机目录
* start -- 启动集群中的所有或单个模块服务
* restart -- 重启集群中的所有或单个模块服务
* stop -- 停止集群中的所有或单个模块服务
* tail -- 查看指定模块日志的最后一部分内容(等同于远程服务器的tail命令)
* status -- 查看指定模块服务进程状态
* help -- 查看命令的详细说明和样例

**Modules**:

* fvote -- Vote 服务器
* fdir -- fastDIR 服务器
* fstore -- faststore 服务器
* fauth -- FastCFS auth 服务器
* fuseclient -- FastCFS fuse 客户端

**Node**:

可以用于指定要执行命令的单个集群节点主机名或IP,如果不指定,命令将在所有节点上执行。node 参数必须在使用了 module 参数的情况下使用,不能单独直接使用。

#### 1.6.1. FastCFS 一键安装

你可以使用命令 ***setup*** 在集群节点上快速安装 FastCFS 软件,并自动配置和启动模块服务.

**样例**

安装并启动整个 FastCFS 集群:

> fcfs.sh setup

在所有 fdir 节点上安装并启动 fdir 服务器:

> fcfs.sh setup fdir

在节点 10.0.1.11 上安装 fdir 服务器:

> fcfs.sh setup fdir 10.0.1.11

节点 10.0.1.11 必须属于 fdir 集群,否则命令将失败。

#### 1.6.2. FastCFS 软件安装

你可以使用命令 ***install*** 只安装 FastCFS 软件。这个命令是 setup 命令的一部分。

第一次执行该命令时,必须在所有节点上安装所有软件(也就是说,此时不能指定module和node)。之后,当需要增加新节点时,可以携带 module 和 node 参数使用。

**样例**

在所有节点安装所需的 FastCFS 软件:

> fcfs.sh install

在所有 fdir 节点上安装 fdir 服务器:

> fcfs.sh install fdir

在 10.0.1.11 节点上安装 fdir 服务器:

> fcfs.sh install fdir 10.0.1.11

#### 1.6.3. FastCFS 软件升级

当你想升级 FastCFS 软件时,你需要先将配置文件 fcfs.settings 中的 fastcfs_version 字段的值修改为新的版本号,然后执行 install 命令:

> fcfs.sh install

#### 1.6.4. FastCFS 软件降级

如果你确实需要将 FastCFS 软件降级为旧的版本,你必须先执行 ***remove*** 命令:

> fcfs.
Download .txt
gitextract_24sao1go/

├── .gitignore
├── FastCFS-auth.spec.in
├── FastCFS-vote.spec.in
├── FastCFS.spec.in
├── LICENSE
├── README-zh_CN.md
├── README.md
├── conf/
│   ├── full/
│   │   ├── fuse.conf
│   │   └── papi.conf
│   ├── fuse.conf
│   └── papi.conf
├── debian/
│   ├── changelog
│   ├── compat
│   ├── control
│   ├── copyright
│   ├── fastcfs-api-dev.install
│   ├── fastcfs-api-libs.install
│   ├── fastcfs-api-tests.install
│   ├── fastcfs-auth-client.install
│   ├── fastcfs-auth-config.install
│   ├── fastcfs-auth-dev.install
│   ├── fastcfs-auth-server-config.install
│   ├── fastcfs-auth-server.dirs
│   ├── fastcfs-auth-server.install
│   ├── fastcfs-fuse-config.install
│   ├── fastcfs-fused.dirs
│   ├── fastcfs-fused.install
│   ├── fastcfs-utils.install
│   ├── fastcfs-vote-client.install
│   ├── fastcfs-vote-config.install
│   ├── fastcfs-vote-dev.install
│   ├── fastcfs-vote-server.dirs
│   ├── fastcfs-vote-server.install
│   ├── rules
│   ├── source/
│   │   └── format
│   ├── substvars
│   └── watch
├── docs/
│   ├── APT-INSTALL-zh_CN.md
│   ├── AUTH-zh_CN.md
│   ├── CONFIGURE-zh_CN.md
│   ├── Easy-install-detail-zh_CN.md
│   ├── FAQ-zh_CN.md
│   ├── INSTALL-zh_CN.md
│   ├── INSTALL.md
│   ├── ReleaseNotes.md
│   ├── TODO-zh_CN.md
│   ├── VoteNode-zh_CN.md
│   ├── YUM-INSTALL-Diy-5nodes-zh_CN.md
│   ├── YUM-INSTALL-zh_CN.md
│   ├── benchmark-step-by-step.md
│   ├── benchmark.md
│   ├── cluster-expansion-zh_CN.md
│   ├── fcfs-ops-tool-zh_CN.md
│   ├── fcfs-ops-tool.md
│   ├── index.md
│   ├── shared-storage-guide-zh_CN.md
│   ├── version-history-zh_CN.md
│   └── versions.json
├── fastcfs.sh
├── helloWorld.sh
├── libfuse_setup.sh
├── make.sh
├── mkdocs.yml
├── shell/
│   ├── Dockerfile
│   ├── conf_tpl_tar.sh
│   ├── fcfs.settings
│   ├── fcfs.sh
│   ├── fcfs_conf.settings
│   ├── fcfs_conf.sh
│   └── template/
│       └── dependency.2.0.1.settings
├── src/
│   ├── api/
│   │   ├── Makefile.in
│   │   ├── async_reporter.c
│   │   ├── async_reporter.h
│   │   ├── fcfs_api.c
│   │   ├── fcfs_api.h
│   │   ├── fcfs_api_allocator.c
│   │   ├── fcfs_api_allocator.h
│   │   ├── fcfs_api_file.c
│   │   ├── fcfs_api_file.h
│   │   ├── fcfs_api_types.h
│   │   ├── fcfs_api_util.c
│   │   ├── fcfs_api_util.h
│   │   ├── inode_htable.c
│   │   ├── inode_htable.h
│   │   ├── std/
│   │   │   ├── api_types.h
│   │   │   ├── capi.c
│   │   │   ├── capi.h
│   │   │   ├── fd_manager.c
│   │   │   ├── fd_manager.h
│   │   │   ├── papi.c
│   │   │   ├── papi.h
│   │   │   ├── posix_api.c
│   │   │   └── posix_api.h
│   │   └── tests/
│   │       ├── Makefile.in
│   │       ├── fcfs_beachmark.c
│   │       ├── fcfs_test_file_copy.c
│   │       ├── fcfs_test_file_op.c
│   │       ├── fcfs_test_papi_copy.c
│   │       └── fcfs_test_read_ahead.c
│   ├── auth/
│   │   ├── client/
│   │   │   ├── Makefile.in
│   │   │   ├── client_func.c
│   │   │   ├── client_func.h
│   │   │   ├── client_global.c
│   │   │   ├── client_global.h
│   │   │   ├── client_proto.c
│   │   │   ├── client_proto.h
│   │   │   ├── client_types.h
│   │   │   ├── fcfs_auth_client.c
│   │   │   ├── fcfs_auth_client.h
│   │   │   ├── fcfs_auth_for_server.c
│   │   │   ├── fcfs_auth_for_server.h
│   │   │   ├── session_regenerate.c
│   │   │   ├── session_regenerate.h
│   │   │   ├── session_sync.c
│   │   │   ├── session_sync.h
│   │   │   ├── simple_connection_manager.c
│   │   │   ├── simple_connection_manager.h
│   │   │   └── tools/
│   │   │       ├── Makefile.in
│   │   │       ├── fauth_cluster_stat.c
│   │   │       ├── fauth_list_servers.c
│   │   │       ├── fcfs_pool.c
│   │   │       ├── fcfs_user.c
│   │   │       ├── tool_func.c
│   │   │       └── tool_func.h
│   │   ├── common/
│   │   │   ├── auth_func.c
│   │   │   ├── auth_func.h
│   │   │   ├── auth_global.c
│   │   │   ├── auth_global.h
│   │   │   ├── auth_proto.c
│   │   │   ├── auth_proto.h
│   │   │   ├── auth_types.h
│   │   │   ├── server_session.c
│   │   │   └── server_session.h
│   │   ├── conf/
│   │   │   ├── auth.conf
│   │   │   ├── client.conf
│   │   │   ├── cluster.conf
│   │   │   ├── full/
│   │   │   │   ├── auth.conf
│   │   │   │   ├── client.conf
│   │   │   │   ├── cluster.conf
│   │   │   │   ├── server.conf
│   │   │   │   └── session.conf
│   │   │   ├── keys/
│   │   │   │   └── session_validate.key
│   │   │   ├── server.conf
│   │   │   └── session.conf
│   │   └── server/
│   │       ├── Makefile.in
│   │       ├── cluster_handler.c
│   │       ├── cluster_handler.h
│   │       ├── cluster_info.c
│   │       ├── cluster_info.h
│   │       ├── cluster_relationship.c
│   │       ├── cluster_relationship.h
│   │       ├── common_handler.c
│   │       ├── common_handler.h
│   │       ├── db/
│   │       │   ├── auth_db.c
│   │       │   ├── auth_db.h
│   │       │   ├── dao/
│   │       │   │   ├── dao.c
│   │       │   │   ├── dao.h
│   │       │   │   ├── func.c
│   │       │   │   ├── func.h
│   │       │   │   ├── granted_pool.c
│   │       │   │   ├── granted_pool.h
│   │       │   │   ├── storage_pool.c
│   │       │   │   ├── storage_pool.h
│   │       │   │   ├── types.h
│   │       │   │   ├── user.c
│   │       │   │   └── user.h
│   │       │   ├── pool_usage_updater.c
│   │       │   └── pool_usage_updater.h
│   │       ├── fcfs_authd.c
│   │       ├── server_func.c
│   │       ├── server_func.h
│   │       ├── server_global.c
│   │       ├── server_global.h
│   │       ├── server_types.h
│   │       ├── service_handler.c
│   │       ├── service_handler.h
│   │       ├── session_subscribe.c
│   │       └── session_subscribe.h
│   ├── common/
│   │   ├── fcfs_global.c
│   │   └── fcfs_global.h
│   ├── fuse/
│   │   ├── Makefile.in
│   │   ├── fcfs_fused.c
│   │   ├── fuse_wrapper.c
│   │   ├── fuse_wrapper.h
│   │   ├── getgroups.c
│   │   ├── getgroups.h
│   │   ├── global.c
│   │   ├── global.h
│   │   ├── groups_htable.c
│   │   └── groups_htable.h
│   ├── java/
│   │   ├── jni/
│   │   │   ├── Makefile.in
│   │   │   ├── com_fastken_fcfs_FCFSConstants.h
│   │   │   ├── com_fastken_fcfs_FCFSDirectory.c
│   │   │   ├── com_fastken_fcfs_FCFSDirectory.h
│   │   │   ├── com_fastken_fcfs_FCFSFile.c
│   │   │   ├── com_fastken_fcfs_FCFSFile.h
│   │   │   ├── com_fastken_fcfs_FCFSPosixAPI.c
│   │   │   ├── com_fastken_fcfs_FCFSPosixAPI.h
│   │   │   ├── common.c
│   │   │   ├── common.h
│   │   │   ├── global.c
│   │   │   └── global.h
│   │   └── src/
│   │       └── main/
│   │           └── java/
│   │               └── com/
│   │                   └── fastken/
│   │                       └── fcfs/
│   │                           ├── FCFSConstants.java
│   │                           ├── FCFSDirectory.java
│   │                           ├── FCFSFile.java
│   │                           ├── FCFSFileStat.java
│   │                           ├── FCFSPosixAPI.java
│   │                           └── FCFSVFSStat.java
│   ├── preload/
│   │   ├── Makefile.in
│   │   ├── api.c
│   │   ├── api.h
│   │   ├── global.c
│   │   ├── global.h
│   │   └── types.h
│   ├── tools/
│   │   ├── Makefile.in
│   │   ├── fcfs_active_test.c
│   │   └── fcfs_pool_stat.c
│   └── vote/
│       ├── client/
│       │   ├── Makefile.in
│       │   ├── client_func.c
│       │   ├── client_func.h
│       │   ├── client_global.c
│       │   ├── client_global.h
│       │   ├── client_proto.c
│       │   ├── client_proto.h
│       │   ├── client_types.h
│       │   ├── fcfs_vote_client.h
│       │   └── tools/
│       │       ├── Makefile.in
│       │       └── fvote_cluster_stat.c
│       ├── common/
│       │   ├── vote_global.c
│       │   ├── vote_global.h
│       │   ├── vote_proto.c
│       │   ├── vote_proto.h
│       │   └── vote_types.h
│       ├── conf/
│       │   ├── client.conf
│       │   ├── cluster.conf
│       │   ├── full/
│       │   │   ├── client.conf
│       │   │   ├── cluster.conf
│       │   │   └── server.conf
│       │   └── server.conf
│       └── server/
│           ├── Makefile.in
│           ├── cluster_handler.c
│           ├── cluster_handler.h
│           ├── cluster_info.c
│           ├── cluster_info.h
│           ├── cluster_relationship.c
│           ├── cluster_relationship.h
│           ├── common_handler.c
│           ├── common_handler.h
│           ├── fcfs_voted.c
│           ├── server_func.c
│           ├── server_func.h
│           ├── server_global.c
│           ├── server_global.h
│           ├── server_types.h
│           ├── service_group_htable.c
│           ├── service_group_htable.h
│           ├── service_handler.c
│           └── service_handler.h
└── systemd/
    ├── fastauth.service
    ├── fastcfs.service
    └── fastvote.service
Download .txt
SYMBOL INDEX (1651 symbols across 128 files)

FILE: src/api/async_reporter.c
  function batch_set_dentry_size (line 30) | static inline int batch_set_dentry_size(const int count)
  function int_event_ptr_array (line 46) | static int int_event_ptr_array(FCFSAPIAsyncReportEventPtrArray *event_pt...
  function FCFSAPIAsyncReportEvent (line 57) | static FCFSAPIAsyncReportEvent **realloc_event_ptrs(
  function to_event_ptr_array (line 81) | static int to_event_ptr_array(FCFSAPIAsyncReportEvent *head,
  function compare_event_ptr (line 110) | static int compare_event_ptr(const FCFSAPIAsyncReportEvent **t1,
  function merge_event (line 121) | static inline void merge_event(FCFSAPIAsyncReportEvent *dest,
  function merge_events (line 143) | static int merge_events(FCFSAPIAsyncReportEvent *head)
  function notify_waiting_tasks (line 216) | static inline void notify_waiting_tasks(FCFSAPIAsyncReportEvent *event)
  function notify_waiting_tasks_and_free_events (line 235) | static inline void notify_waiting_tasks_and_free_events(
  function deal_events (line 248) | static inline int deal_events(FCFSAPIAsyncReportEvent *head)
  function async_reporter_terminate (line 289) | void async_reporter_terminate()
  function check_and_set_stage (line 311) | static inline void check_and_set_stage()
  function async_reporter_init (line 358) | int async_reporter_init(FCFSAPIContext *fcfs_api_ctx)

FILE: src/api/async_reporter.h
  type AsyncReporterContext (line 29) | typedef struct {
  function async_reporter_push (line 53) | static inline int async_reporter_push(const FDIRSetDEntrySizeInfo *dsize)
  function async_reporter_push_notify (line 74) | static inline int async_reporter_push_notify(const uint64_t inode,
  function async_reporter_notify (line 103) | static inline void async_reporter_notify()
  function async_reporter_wait_all (line 127) | static inline int async_reporter_wait_all(const uint64_t inode)

FILE: src/api/fcfs_api.c
  function opendir_session_alloc_init (line 61) | static int opendir_session_alloc_init(void *element, void *args)
  function fcfs_api_client_session_create (line 77) | int fcfs_api_client_session_create(FCFSAPIContext *ctx, const bool publish)
  function fcfs_api_rdma_enabled (line 92) | static inline bool fcfs_api_rdma_enabled(FCFSAPIContext *ctx)
  function fcfs_api_common_init (line 109) | static int fcfs_api_common_init(FCFSAPIContext *ctx, FDIRClientContext *...
  function fcfs_api_init_ex1 (line 190) | int fcfs_api_init_ex1(FCFSAPIContext *ctx, FDIRClientContext *fdir,
  function fcfs_api_init_ex (line 220) | int fcfs_api_init_ex(FCFSAPIContext *ctx, const char *ns,
  function fcfs_api_pooled_init_ex (line 245) | int fcfs_api_pooled_init_ex(FCFSAPIContext *ctx, const char *ns,
  function fcfs_api_init_ex2 (line 270) | int fcfs_api_init_ex2(FCFSAPIContext *ctx, FDIRClientContext *fdir,
  function fcfs_api_destroy_ex (line 310) | void fcfs_api_destroy_ex(FCFSAPIContext *ctx)
  function check_create_root_path (line 328) | static int check_create_root_path(FCFSAPIContext *ctx)
  function fcfs_api_start_ex (line 356) | int fcfs_api_start_ex(FCFSAPIContext *ctx)
  function fcfs_api_terminate_ex (line 430) | void fcfs_api_terminate_ex(FCFSAPIContext *ctx)
  function fcfs_api_async_report_config_to_string_ex (line 438) | void fcfs_api_async_report_config_to_string_ex(FCFSAPIContext *ctx,
  function fcfs_api_setgroups (line 463) | static int fcfs_api_setgroups(FCFSAPIOwnerInfo *owner_info,
  function fcfs_api_getgroups (line 500) | static int fcfs_api_getgroups(FCFSAPIOwnerInfo *owner_info)
  function fcfs_api_getgrouplist (line 518) | static int fcfs_api_getgrouplist(FCFSAPIOwnerInfo *owner_info)
  function fcfs_api_set_owner (line 564) | int fcfs_api_set_owner(FCFSAPIContext *ctx)
  function fcfs_api_load_owner_config (line 575) | static int fcfs_api_load_owner_config(IniFullContext *ini_ctx,
  function fcfs_api_load_idempotency_config_ex (line 643) | int fcfs_api_load_idempotency_config_ex(const char *log_prefix_name,
  function load_mountpoint (line 721) | static int load_mountpoint(IniFullContext *ini_ctx,
  function fcfs_api_check_mountpoint (line 814) | int fcfs_api_check_mountpoint(const char *config_filename,
  function fcfs_api_load_ns_mountpoint (line 837) | int fcfs_api_load_ns_mountpoint(IniFullContext *ini_ctx,
  function fcfs_api_free_ns_mountpoint (line 875) | void fcfs_api_free_ns_mountpoint(FCFSAPINSMountpointHolder *nsmp)
  function fcfs_api_log_client_common_configs (line 883) | void fcfs_api_log_client_common_configs(FCFSAPIContext *ctx,

FILE: src/api/fcfs_api.h
  function fcfs_api_set_contexts_ex1 (line 62) | static inline void fcfs_api_set_contexts_ex1(FCFSAPIContext *ctx,
  function fcfs_api_set_contexts_ex (line 72) | static inline void fcfs_api_set_contexts_ex(FCFSAPIContext *ctx,
  function fcfs_api_pooled_init_ex1 (line 98) | static inline int fcfs_api_pooled_init_ex1(FCFSAPIContext *ctx,
  function fcfs_api_init_with_auth (line 123) | static inline int fcfs_api_init_with_auth(const char *ns,
  function fcfs_api_pooled_init_with_auth (line 134) | static inline int fcfs_api_pooled_init_with_auth(const char *ns,
  function fcfs_api_pooled_init1_with_auth (line 145) | static inline int fcfs_api_pooled_init1_with_auth(const char *ns,
  function fcfs_api_load_idempotency_config (line 160) | static inline int fcfs_api_load_idempotency_config(const char
  function fcfs_api_check_mountpoint1 (line 177) | static inline int fcfs_api_check_mountpoint1(const char

FILE: src/api/fcfs_api_allocator.c
  function async_report_event_alloc_init (line 21) | static int async_report_event_alloc_init(FCFSAPIAsyncReportEvent *event,
  function waiting_task_alloc_init (line 28) | static int waiting_task_alloc_init(FCFSAPIWaitingTask *task,
  function init_allocator_context (line 41) | static int init_allocator_context(FCFSAPIAllocatorContext *ctx)
  function fcfs_api_allocator_init (line 64) | int fcfs_api_allocator_init(FCFSAPIContext *api_ctx)

FILE: src/api/fcfs_api_allocator.h
  type FCFSAPIAllocatorContext (line 22) | typedef struct fcfs_api_allocator_context {
  type FCFSAPIAllocatorCtxArray (line 27) | typedef struct fcfs_api_allocator_ctx_array {
  function FCFSAPIAllocatorContext (line 40) | static inline FCFSAPIAllocatorContext *fcfs_api_allocator_get(

FILE: src/api/fcfs_api_file.c
  function deal_open_flags (line 31) | static int deal_open_flags(FCFSAPIFileInfo *fi, FDIRClientOperFnamePair ...
  function fcfs_api_open_ex (line 132) | int fcfs_api_open_ex(FCFSAPIContext *ctx, FCFSAPIFileInfo *fi,
  function fcfs_api_open_by_dentry_ex (line 161) | int fcfs_api_open_by_dentry_ex(FCFSAPIContext *ctx, FCFSAPIFileInfo *fi,
  function fcfs_api_open_by_inode_ex (line 180) | int fcfs_api_open_by_inode_ex(FCFSAPIContext *ctx, FCFSAPIFileInfo *fi,
  function fcfs_api_close (line 206) | int fcfs_api_close(FCFSAPIFileInfo *fi)
  function report_size_and_time (line 229) | static int report_size_and_time(FCFSAPIContext *ctx,
  function fcfs_api_file_report_size_and_time (line 255) | static int fcfs_api_file_report_size_and_time(
  function fcfs_api_file_write_done_callback (line 304) | void fcfs_api_file_write_done_callback(FSAPIWriteDoneCallbackArg *callba...
  function do_pwrite (line 320) | static int do_pwrite(FCFSAPIFileInfo *fi, FSAPIWriteBuffer *wbuffer,
  function check_writable (line 408) | static inline int check_writable(FCFSAPIFileInfo *fi)
  function check_readable (line 422) | static inline int check_readable(FCFSAPIFileInfo *fi)
  function pwrite_wrapper (line 434) | static int pwrite_wrapper(FCFSAPIFileInfo *fi, FSAPIWriteBuffer *wbuffer,
  function fcfs_api_pwrite_ex (line 455) | int fcfs_api_pwrite_ex(FCFSAPIFileInfo *fi, const char *buff,
  function do_write (line 465) | static int do_write(FCFSAPIFileInfo *fi, FSAPIWriteBuffer *wbuffer,
  function fcfs_api_write_ex (line 526) | int fcfs_api_write_ex(FCFSAPIFileInfo *fi, const char *buff,
  function fcfs_api_pwritev_ex (line 535) | int fcfs_api_pwritev_ex(FCFSAPIFileInfo *fi, const struct iovec *iov,
  function fcfs_api_writev_ex (line 546) | int fcfs_api_writev_ex(FCFSAPIFileInfo *fi, const struct iovec *iov,
  function do_pread (line 556) | static int do_pread(FCFSAPIFileInfo *fi, const bool is_readv,
  function fcfs_api_pread_ex (line 679) | int fcfs_api_pread_ex(FCFSAPIFileInfo *fi, char *buff, const int size,
  function fcfs_api_read_ex (line 689) | int fcfs_api_read_ex(FCFSAPIFileInfo *fi, char *buff, const int size,
  function fcfs_api_preadv_ex (line 706) | int fcfs_api_preadv_ex(FCFSAPIFileInfo *fi, const struct iovec *iov,
  function fcfs_api_readv_ex (line 717) | int fcfs_api_readv_ex(FCFSAPIFileInfo *fi, const struct iovec *iov,
  function do_truncate (line 734) | static int do_truncate(FCFSAPIContext *ctx, const int64_t oid,
  function do_allocate (line 784) | static int do_allocate(FCFSAPIContext *ctx, const int64_t oid,
  function check_and_sys_lock (line 819) | static inline int check_and_sys_lock(FCFSAPIContext *ctx,
  function check_and_sys_unlock (line 845) | static inline int check_and_sys_unlock(FCFSAPIContext *ctx,
  function file_truncate (line 869) | static int file_truncate(FCFSAPIContext *ctx, const int64_t oid,
  function fcfs_api_ftruncate_ex (line 916) | int fcfs_api_ftruncate_ex(FCFSAPIFileInfo *fi, const int64_t new_size,
  function get_regular_file_inode (line 929) | static int get_regular_file_inode(FCFSAPIContext *ctx,
  function fcfs_api_truncate_ex (line 949) | int fcfs_api_truncate_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_file_truncate_ex (line 964) | int fcfs_api_file_truncate_ex(FCFSAPIContext *ctx,
  function calc_file_offset_ex (line 987) | static inline int calc_file_offset_ex(FCFSAPIFileInfo *fi,
  function fcfs_api_lseek (line 1032) | int fcfs_api_lseek(FCFSAPIFileInfo *fi, const int64_t offset, const int ...
  function fcfs_api_fill_stat (line 1051) | void fcfs_api_fill_stat(const FDIRDEntryInfo *dentry, struct stat *stat)
  function fcfs_api_fstat (line 1071) | int fcfs_api_fstat(FCFSAPIFileInfo *fi, struct stat *buf)
  function fapi_stat (line 1093) | static inline int fapi_stat(FCFSAPIContext *ctx,
  function fcfs_api_lstat_ex (line 1111) | int fcfs_api_lstat_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_stat_ex (line 1121) | int fcfs_api_stat_ex(FCFSAPIContext *ctx, const char *path,
  function fcntl_lock (line 1131) | static inline int fcntl_lock(FCFSAPIFileInfo *fi, const int operation,
  function fcntl_unlock (line 1160) | static inline int fcntl_unlock(FCFSAPIFileInfo *fi, const int operation,
  function fcfs_api_flock_ex2 (line 1185) | int fcfs_api_flock_ex2(FCFSAPIFileInfo *fi, const int operation,
  function fcntl_type_to_flock_op (line 1204) | static inline int fcntl_type_to_flock_op(const short type, int *operation)
  function flock_op_to_fcntl_type (line 1223) | static inline int flock_op_to_fcntl_type(const int operation, short *type)
  function fcfs_api_setlk_ex (line 1242) | int fcfs_api_setlk_ex(FCFSAPIFileInfo *fi, const struct flock *lock,
  function fcfs_api_getlk_ex (line 1275) | int fcfs_api_getlk_ex(FCFSAPIFileInfo *fi,
  function fcfs_api_fallocate_ex (line 1319) | int fcfs_api_fallocate_ex(FCFSAPIFileInfo *fi, const int mode,
  function fcfs_api_rename_ex (line 1396) | int fcfs_api_rename_ex(FCFSAPIContext *ctx, const char *old_path,
  function fcfs_api_symlink_ex (line 1429) | int fcfs_api_symlink_ex(FCFSAPIContext *ctx, const char *target,
  function fcfs_api_readlink (line 1443) | int fcfs_api_readlink(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_link_ex (line 1455) | int fcfs_api_link_ex(FCFSAPIContext *ctx, const char *old_path,
  function fcfs_api_mknod_ex (line 1472) | int fcfs_api_mknod_ex(FCFSAPIContext *ctx, const char *path,
  function do_make_dentry (line 1488) | static inline int do_make_dentry(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_mkfifo_ex (line 1499) | int fcfs_api_mkfifo_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_mkdir_ex (line 1505) | int fcfs_api_mkdir_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_statvfs_ex (line 1511) | int fcfs_api_statvfs_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_access_ex (line 1577) | int fcfs_api_access_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_euidaccess_ex (line 1589) | int fcfs_api_euidaccess_ex(FCFSAPIContext *ctx, const char *path,
  function fcfs_api_set_file_flags (line 1601) | int fcfs_api_set_file_flags(FCFSAPIFileInfo *fi, const int flags)

FILE: src/api/fcfs_api_file.h
  function fcfs_api_create_ex (line 128) | static inline int fcfs_api_create_ex(FCFSAPIContext *ctx,
  type iovec (line 154) | struct iovec
  type iovec (line 158) | struct iovec
  type iovec (line 161) | struct iovec
  type iovec (line 165) | struct iovec
  function fcfs_api_unlink_ex (line 182) | static inline int fcfs_api_unlink_ex(FCFSAPIContext *ctx,
  type stat (line 192) | struct stat
  type stat (line 194) | struct stat
  type stat (line 197) | struct stat
  type stat (line 200) | struct stat
  function fcfs_api_flock_ex (line 206) | static inline int fcfs_api_flock_ex(FCFSAPIFileInfo *fi,
  function fcfs_api_flock (line 212) | static inline int fcfs_api_flock(FCFSAPIFileInfo *fi, const int operation)
  type flock (line 218) | struct flock
  function fcfs_api_getlk (line 221) | static inline int fcfs_api_getlk(FCFSAPIFileInfo *fi, struct flock *lock)
  type flock (line 227) | struct flock
  function fcfs_api_setlk (line 230) | static inline int fcfs_api_setlk(FCFSAPIFileInfo *fi,
  function fcfs_api_setlkw (line 240) | static inline int fcfs_api_setlkw(FCFSAPIFileInfo *fi,
  function fcfs_api_eaccess_ex (line 283) | static inline int fcfs_api_eaccess_ex(FCFSAPIContext *ctx,
  type statvfs (line 292) | struct statvfs
  function fcfs_api_fdatasync (line 296) | static inline int fcfs_api_fdatasync(FCFSAPIFileInfo *fi,
  function fcfs_api_fsync (line 303) | static inline int fcfs_api_fsync(FCFSAPIFileInfo *fi, const int64_t tid)

FILE: src/api/fcfs_api_types.h
  type FCFSAPIOwnerType (line 29) | typedef enum {
  type FCFSAPIOwnerInfo (line 34) | typedef struct fcfs_api_owner_info {
  type FCFSAPINSMountpointHolder (line 39) | typedef struct fcfs_api_ns_mountpoint_holder {
  type FCFSAPIOpendirSession (line 44) | typedef struct fcfs_api_opendir_session {
  type FCFSAPIContext (line 50) | typedef struct fcfs_api_context {
  type FCFSAPIFileInfo (line 79) | typedef struct fcfs_api_file_info {
  type FCFSAPIFileContext (line 97) | typedef struct fcfs_api_file_context {
  type FCFSAPIWriteDoneCallbackExtraData (line 103) | typedef struct fcfs_api_write_done_callback_extra_data {
  type FCFSAPIWriteDoneCallbackArg (line 110) | typedef struct fcfs_api_write_done_callback_arg {
  type fcfs_api_inode_hentry (line 115) | struct fcfs_api_inode_hentry
  type fcfs_api_insert_event_context (line 116) | struct fcfs_api_insert_event_context
  type FCFSAPIWaitingTask (line 118) | typedef struct fcfs_api_waiting_task {
  type FCFSAPIEventType (line 125) | typedef enum {
  type FCFSAPIAsyncReportEvent (line 130) | typedef struct fcfs_api_async_report_event {
  type FCFSAPIAsyncReportEventPtrArray (line 144) | typedef struct fcfs_api_async_report_event_ptr_array {

FILE: src/api/fcfs_api_util.c
  function fcfs_api_remove_dentry_by_pname_ex (line 24) | int fcfs_api_remove_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_remove_dentry_ex (line 47) | int fcfs_api_remove_dentry_ex(FCFSAPIContext *ctx,
  function fcfs_api_rename_dentry_by_pname_ex (line 69) | int fcfs_api_rename_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_rename_dentry_ex (line 99) | int fcfs_api_rename_dentry_ex(FCFSAPIContext *ctx, const char *path1,

FILE: src/api/fcfs_api_util.h
  function fcfs_api_lookup_inode_by_fullname_ex (line 183) | static inline int fcfs_api_lookup_inode_by_fullname_ex(FCFSAPIContext *ctx,
  function fcfs_api_lookup_inode_by_path_ex (line 191) | static inline int fcfs_api_lookup_inode_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_stat_dentry_by_inode_ex (line 201) | static inline int fcfs_api_stat_dentry_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_stat_dentry_by_fullname_ex (line 212) | static inline int fcfs_api_stat_dentry_by_fullname_ex(FCFSAPIContext *ctx,
  function fcfs_api_stat_dentry_by_path_ex (line 233) | static inline int fcfs_api_stat_dentry_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_stat_dentry_by_pname_ex (line 243) | static inline int fcfs_api_stat_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_access_dentry_by_inode_ex (line 264) | static inline int fcfs_api_access_dentry_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_access_dentry_by_path_ex (line 276) | static inline int fcfs_api_access_dentry_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_access_dentry_by_pname_ex (line 299) | static inline int fcfs_api_access_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_create_dentry_by_pname_ex (line 322) | static inline int fcfs_api_create_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_symlink_dentry_by_pname_ex (line 333) | static inline int fcfs_api_symlink_dentry_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_readlink_by_pname_ex (line 344) | static inline int fcfs_api_readlink_by_pname_ex(FCFSAPIContext *ctx,
  function fcfs_api_readlink_by_inode_ex (line 352) | static inline int fcfs_api_readlink_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_modify_stat_by_inode_ex (line 377) | static inline int fcfs_api_modify_stat_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_utimes_by_inode_ex (line 439) | static inline int fcfs_api_utimes_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_utimes_by_path_ex (line 456) | static inline int fcfs_api_utimes_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_utimens_by_inode_ex (line 469) | static inline int fcfs_api_utimens_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_utimens_by_path_ex (line 490) | static inline int fcfs_api_utimens_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_utime_ex (line 507) | static inline int fcfs_api_utime_ex(FCFSAPIContext *ctx,
  function fcfs_api_chown_by_inode_ex (line 530) | static inline int fcfs_api_chown_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_chown_ex (line 547) | static inline int fcfs_api_chown_ex(FCFSAPIContext *ctx,
  function fcfs_api_chmod_by_inode_ex (line 564) | static inline int fcfs_api_chmod_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_chmod_ex (line 580) | static inline int fcfs_api_chmod_ex(FCFSAPIContext *ctx,
  function convert_xattr_flags (line 596) | static inline int convert_xattr_flags(const int flags)
  function fcfs_api_set_xattr_by_inode_ex (line 614) | static inline int fcfs_api_set_xattr_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_set_xattr_by_path_ex (line 622) | static inline int fcfs_api_set_xattr_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_remove_xattr_by_inode_ex (line 630) | static inline int fcfs_api_remove_xattr_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_remove_xattr_by_path_ex (line 638) | static inline int fcfs_api_remove_xattr_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_get_xattr_by_inode_ex (line 646) | static inline int fcfs_api_get_xattr_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_get_xattr_by_path_ex (line 655) | static inline int fcfs_api_get_xattr_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_list_xattr_by_inode_ex (line 664) | static inline int fcfs_api_list_xattr_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_list_xattr_by_path_ex (line 672) | static inline int fcfs_api_list_xattr_by_path_ex(FCFSAPIContext *ctx,
  function fcfs_api_list_dentry_by_inode_ex (line 680) | static inline int fcfs_api_list_dentry_by_inode_ex(FCFSAPIContext *ctx,
  function fcfs_api_list_compact_dentry_by_path_ex (line 691) | static inline int fcfs_api_list_compact_dentry_by_path_ex(FCFSAPIContext...
  function fcfs_api_list_compact_dentry_by_inode_ex (line 699) | static inline int fcfs_api_list_compact_dentry_by_inode_ex(
  function FCFSAPIOpendirSession (line 707) | static inline FCFSAPIOpendirSession *fcfs_api_alloc_opendir_session_ex(
  function fcfs_api_free_opendir_session_ex (line 714) | static inline void fcfs_api_free_opendir_session_ex(
  function fcfs_api_dentry_sys_lock_ex (line 720) | static inline int fcfs_api_dentry_sys_lock_ex(FCFSAPIContext *ctx,
  function fcfs_api_dentry_sys_unlock (line 732) | static inline int fcfs_api_dentry_sys_unlock(FDIRClientSession *session,
  function fcfs_api_link_dentry_by_pname_ex (line 742) | static inline int fcfs_api_link_dentry_by_pname_ex(FCFSAPIContext *ctx,

FILE: src/api/inode_htable.c
  type FCFSAPIInsertEventContext (line 23) | typedef struct fcfs_api_insert_event_context {
  type FCFSAPIFindCallbackArg (line 27) | typedef struct fcfs_api_find_callback_arg {
  function inode_htable_insert_callback (line 32) | static int inode_htable_insert_callback(SFShardingHashEntry *he,
  function inode_htable_accept_reclaim_callback (line 74) | static bool inode_htable_accept_reclaim_callback(SFShardingHashEntry *he)
  function inode_htable_init (line 79) | int inode_htable_init(const int sharding_count,
  function inode_htable_insert (line 92) | int inode_htable_insert(FCFSAPIAsyncReportEvent *event)
  function inode_htable_check_conflict_and_wait (line 103) | int inode_htable_check_conflict_and_wait(const uint64_t inode)

FILE: src/api/inode_htable.h
  type FCFSAPIInodeHEntry (line 22) | typedef struct fcfs_api_inode_hentry {
  function fcfs_api_notify_waiting_task (line 40) | static inline void fcfs_api_notify_waiting_task(FCFSAPIWaitingTask *task)
  function fcfs_api_wait_report_done_and_release (line 48) | static inline void fcfs_api_wait_report_done_and_release(

FILE: src/api/std/api_types.h
  type off_t (line 25) | typedef off_t off64_t;
  type dirent (line 30) | struct dirent
  type dirent (line 31) | struct dirent
  type dirent (line 32) | struct dirent
  type dirent (line 33) | struct dirent
  type FCFSPosixAPIContext (line 35) | typedef struct fcfs_posix_api_context {
  type FCFSPosixAPITPIDType (line 41) | typedef enum {
  type FCFSPosixAPIFileInfo (line 46) | typedef struct fcfs_posix_api_file_info {
  type FCFSPosixFilePtrArray (line 53) | typedef struct fcfs_posix_file_ptr_array {
  type FCFSPosixAPIDIR (line 58) | typedef struct fcfs_posix_api_dir {
  type FCFSPosixCAPIFILE (line 65) | typedef struct fcfs_posix_capi_file {
  type FCFSPosixAPIGlobalVars (line 74) | typedef struct fcfs_posix_api_global_vars {

FILE: src/api/std/capi.c
  function fcfs_capi_init (line 47) | int fcfs_capi_init()
  function fcfs_capi_destroy (line 52) | void fcfs_capi_destroy()
  function FILE (line 58) | static FILE *alloc_file_handle(int fd)
  function free_file_handle (line 83) | static inline int free_file_handle(FCFSPosixCAPIFILE *file)
  function mode_to_flags (line 99) | static int mode_to_flags(const char *mode, int *flags)
  function check_flags (line 158) | static int check_flags(const char *mode, const int flags, int *adding_fl...
  function do_fdopen (line 218) | static inline int do_fdopen(FCFSPosixAPIContext *ctx,
  function fcfs_flockfile (line 232) | void fcfs_flockfile(FILE *fp)
  function fcfs_ftrylockfile (line 238) | int fcfs_ftrylockfile(FILE *fp)
  function fcfs_funlockfile (line 249) | void fcfs_funlockfile(FILE *fp)
  function FILE (line 255) | FILE *fcfs_fopen_ex(FCFSPosixAPIContext *ctx,
  function FILE (line 267) | FILE *fcfs_fdopen_ex(FCFSPosixAPIContext *ctx, int fd, const char *mode)
  function FILE (line 291) | FILE *fcfs_freopen_ex(FCFSPosixAPIContext *ctx,
  function fcfs_fclose (line 318) | int fcfs_fclose(FILE *fp)
  function fcfs_fcloseall (line 324) | int fcfs_fcloseall()
  function fcfs_setvbuf (line 346) | int fcfs_setvbuf(FILE *fp, char *buf, int mode, size_t size)
  function fcfs_fseek (line 363) | int fcfs_fseek(FILE *fp, long offset, int whence)
  function fcfs_fseeko (line 369) | int fcfs_fseeko(FILE *fp, off_t offset, int whence)
  function fcfs_ftell (line 375) | long fcfs_ftell(FILE *fp)
  function off_t (line 381) | off_t fcfs_ftello(FILE *fp)
  function fcfs_rewind (line 387) | void fcfs_rewind(FILE *fp)
  function fcfs_fgetpos (line 393) | int fcfs_fgetpos(FILE *fp, fpos_t *pos)
  function fcfs_fsetpos (line 400) | int fcfs_fsetpos(FILE *fp, const fpos_t *pos)
  function do_fgetc (line 415) | static inline int do_fgetc(FILE *fp, const bool need_lock)
  function do_fputc (line 440) | static inline int do_fputc(int c, FILE *fp, const bool need_lock)
  function do_clearerr (line 463) | static inline void do_clearerr(FILE *fp, const bool need_lock)
  function do_feof (line 478) | static inline int do_feof(FILE *fp, const bool need_lock)
  function do_ferror (line 494) | static inline int do_ferror(FILE *fp, const bool need_lock)
  function do_fileno (line 510) | static inline int do_fileno(FILE *fp, const bool need_lock)
  function do_fflush (line 526) | static inline int do_fflush(FILE *fp, const bool need_lock)
  function do_fread (line 532) | static inline size_t do_fread(void *buff, size_t size,
  function do_fwrite (line 558) | static inline size_t do_fwrite(const void *buff, size_t size,
  function do_fputs (line 584) | static inline int do_fputs(const char *s, FILE *fp, const bool need_lock)
  function fcfs_fgetc_unlocked (line 633) | int fcfs_fgetc_unlocked(FILE *fp)
  function fcfs_fputc_unlocked (line 639) | int fcfs_fputc_unlocked(int c, FILE *fp)
  function fcfs_clearerr_unlocked (line 645) | void fcfs_clearerr_unlocked(FILE *fp)
  function fcfs_feof_unlocked (line 651) | int fcfs_feof_unlocked(FILE *fp)
  function fcfs_ferror_unlocked (line 657) | int fcfs_ferror_unlocked(FILE *fp)
  function fcfs_fileno_unlocked (line 663) | int fcfs_fileno_unlocked(FILE *fp)
  function fcfs_fflush_unlocked (line 669) | int fcfs_fflush_unlocked(FILE *fp)
  function fcfs_fread_unlocked (line 675) | size_t fcfs_fread_unlocked(void *buff,
  function fcfs_fwrite_unlocked (line 682) | size_t fcfs_fwrite_unlocked(const void *buff,
  function fcfs_fputs_unlocked (line 689) | int fcfs_fputs_unlocked(const char *s, FILE *fp)
  function fcfs_fgetc (line 701) | int fcfs_fgetc(FILE *fp)
  function fcfs_fputc (line 707) | int fcfs_fputc(int c, FILE *fp)
  function fcfs_clearerr (line 713) | void fcfs_clearerr(FILE *fp)
  function fcfs_feof (line 719) | int fcfs_feof(FILE *fp)
  function fcfs_ferror (line 725) | int fcfs_ferror(FILE *fp)
  function fcfs_fileno (line 731) | int fcfs_fileno(FILE *fp)
  function fcfs_fflush (line 737) | int fcfs_fflush(FILE *fp)
  function fcfs_fread (line 743) | size_t fcfs_fread(void *buff,
  function fcfs_fwrite (line 750) | size_t fcfs_fwrite(const void *buff,
  function fcfs_fputs (line 757) | int fcfs_fputs(const char *s, FILE *fp)
  function fcfs_ungetc (line 769) | int fcfs_ungetc(int c, FILE *fp)
  function fcfs_fprintf (line 787) | int fcfs_fprintf(FILE *fp, const char *format, ...)
  function fcfs_vfprintf (line 800) | int fcfs_vfprintf(FILE *fp, const char *format, va_list ap)
  function fcfs_getdelim (line 806) | ssize_t fcfs_getdelim(char **line, size_t *size, int delim, FILE *fp)
  function do_readline (line 812) | static inline ssize_t do_readline(FILE *fp, char *buff,
  function fcfs_readline (line 834) | ssize_t fcfs_readline(FILE *fp, char *buff, size_t size)
  function fcfs_readline_unlocked (line 840) | ssize_t fcfs_readline_unlocked(FILE *fp, char *buff, size_t size)

FILE: src/api/std/capi.h
  function fcfs_getc_unlocked (line 75) | static inline int fcfs_getc_unlocked(FILE *fp)
  function fcfs_putc_unlocked (line 80) | static inline int fcfs_putc_unlocked(int c, FILE *fp)
  function fcfs_getline (line 140) | static inline ssize_t fcfs_getline(char **line, size_t *size, FILE *fp)
  function fcfs_setbuf (line 161) | static inline void fcfs_setbuf(FILE *fp, char *buf)
  function fcfs_setbuffer (line 166) | static inline void fcfs_setbuffer(FILE *fp, char *buf, size_t size)
  function fcfs_setlinebuf (line 171) | static inline void fcfs_setlinebuf(FILE *fp)

FILE: src/api/std/fd_manager.c
  type FCFSFDManagerContext (line 23) | typedef struct fcfs_fd_manager_context {
  function file_parray_realloc (line 39) | static int file_parray_realloc()
  function finfo_init_func (line 82) | static int finfo_init_func(FCFSPosixAPIFileInfo *finfo, void *args)
  function fcfs_fd_manager_init (line 95) | int fcfs_fd_manager_init()
  function fcfs_fd_manager_destroy (line 111) | void fcfs_fd_manager_destroy()
  function set_file_info (line 121) | static inline int set_file_info(const int index,
  function FCFSPosixAPIFileInfo (line 139) | FCFSPosixAPIFileInfo *fcfs_fd_manager_alloc(const char *filename)
  function FCFSPosixAPIFileInfo (line 167) | FCFSPosixAPIFileInfo *fcfs_fd_manager_get(const int fd)
  function fcfs_fd_manager_free (line 191) | int fcfs_fd_manager_free(FCFSPosixAPIFileInfo *finfo)

FILE: src/api/std/fd_manager.h
  function fcfs_fd_manager_normalize_path (line 34) | static inline void fcfs_fd_manager_normalize_path(

FILE: src/api/std/papi.c
  function FCFSPosixAPIFileInfo (line 26) | static FCFSPosixAPIFileInfo *do_open_ex(FCFSPosixAPIContext *ctx,
  function do_open (line 55) | static inline int do_open(FCFSPosixAPIContext *ctx, const char *path,
  function do_getcwd1 (line 99) | static inline int do_getcwd1(FCFSPosixAPIContext *ctx,
  function papi_resolve_path (line 112) | static inline int papi_resolve_path(FCFSPosixAPIContext *ctx,
  function papi_resolve_pathat (line 135) | static int papi_resolve_pathat(FCFSPosixAPIContext *ctx, const char *func,
  function fcfs_open_ex (line 171) | int fcfs_open_ex(FCFSPosixAPIContext *ctx, const char *path, int flags, ...
  function fcfs_file_open (line 192) | int fcfs_file_open(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_openat_ex (line 208) | int fcfs_openat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_creat_ex (line 230) | int fcfs_creat_ex(FCFSPosixAPIContext *ctx, const char *path, mode_t mode)
  function fcfs_close (line 235) | int fcfs_close(int fd)
  function fcfs_fsync (line 249) | int fcfs_fsync(int fd)
  function fcfs_fdatasync (line 263) | int fcfs_fdatasync(int fd)
  function do_write (line 277) | static inline ssize_t do_write(FCFSPosixAPIFileInfo *file,
  function fcfs_write (line 293) | ssize_t fcfs_write(int fd, const void *buff, size_t count)
  function fcfs_file_write (line 305) | ssize_t fcfs_file_write(int fd, const void *buff, size_t size, size_t n)
  function fcfs_pwrite (line 333) | ssize_t fcfs_pwrite(int fd, const void *buff, size_t count, off_t offset)
  function fcfs_writev (line 355) | ssize_t fcfs_writev(int fd, const struct iovec *iov, int iovcnt)
  function fcfs_pwritev (line 376) | ssize_t fcfs_pwritev(int fd, const struct iovec *iov,
  function do_read (line 399) | static inline ssize_t do_read(FCFSPosixAPIFileInfo *file,
  function fcfs_read (line 415) | ssize_t fcfs_read(int fd, void *buff, size_t count)
  function fcfs_readahead (line 427) | ssize_t fcfs_readahead(int fd, off64_t offset, size_t count)
  function fcfs_file_read (line 439) | ssize_t fcfs_file_read(int fd, void *buff, size_t size, size_t n)
  function fcfs_file_readline (line 467) | ssize_t fcfs_file_readline(int fd, char *s, size_t size)
  function fcfs_file_gets (line 531) | ssize_t fcfs_file_gets(int fd, char *s, size_t size)
  function fcfs_file_getdelim (line 541) | ssize_t fcfs_file_getdelim(int fd, char **line, size_t *size, int delim)
  function fcfs_pread (line 628) | ssize_t fcfs_pread(int fd, void *buff, size_t count, off_t offset)
  function fcfs_readv (line 650) | ssize_t fcfs_readv(int fd, const struct iovec *iov, int iovcnt)
  function fcfs_preadv (line 671) | ssize_t fcfs_preadv(int fd, const struct iovec *iov,
  function off_t (line 694) | off_t fcfs_lseek(int fd, off_t offset, int whence)
  function off_t (line 712) | off_t fcfs_ltell(int fd)
  function fcfs_fallocate (line 724) | int fcfs_fallocate(int fd, int mode, off_t offset, off_t length)
  function fcfs_truncate_ex (line 744) | int fcfs_truncate_ex(FCFSPosixAPIContext *ctx,
  function fcfs_ftruncate (line 769) | int fcfs_ftruncate(int fd, off_t length)
  function fcfs_lstat_ex (line 789) | int fcfs_lstat_ex(FCFSPosixAPIContext *ctx,
  function fcfs_stat_ex (line 811) | int fcfs_stat_ex(FCFSPosixAPIContext *ctx,
  function fcfs_fstat (line 834) | int fcfs_fstat(int fd, struct stat *buf)
  function fcfs_fstatat_ex (line 852) | int fcfs_fstatat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_flock (line 875) | int fcfs_flock(int fd, int operation)
  function do_fcntl (line 893) | static int do_fcntl(FCFSPosixAPIFileInfo *file, int cmd, void *arg)
  function fcfs_fcntl (line 943) | int fcfs_fcntl(int fd, int cmd, ...)
  function fcfs_symlink_ex (line 960) | int fcfs_symlink_ex(FCFSPosixAPIContext *ctx,
  function fcfs_symlinkat_ex (line 987) | int fcfs_symlinkat_ex(FCFSPosixAPIContext *ctx, const char *link,
  function fcfs_link_ex (line 1014) | int fcfs_link_ex(FCFSPosixAPIContext *ctx,
  function fcfs_linkat_ex (line 1043) | int fcfs_linkat_ex(FCFSPosixAPIContext *ctx, int fd1,
  function fcfs_readlink_ex (line 1074) | ssize_t fcfs_readlink_ex(FCFSPosixAPIContext *ctx,
  function fcfs_readlinkat_ex (line 1096) | ssize_t fcfs_readlinkat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_mknod_ex (line 1118) | int fcfs_mknod_ex(FCFSPosixAPIContext *ctx,
  function fcfs_mknodat_ex (line 1140) | int fcfs_mknodat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_mkfifo_ex (line 1162) | int fcfs_mkfifo_ex(FCFSPosixAPIContext *ctx,
  function fcfs_mkfifoat_ex (line 1184) | int fcfs_mkfifoat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_access_ex (line 1206) | int fcfs_access_ex(FCFSPosixAPIContext *ctx,
  function fcfs_faccessat_ex (line 1229) | int fcfs_faccessat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_euidaccess_ex (line 1253) | int fcfs_euidaccess_ex(FCFSPosixAPIContext *ctx,
  function fcfs_utime_ex (line 1276) | int fcfs_utime_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_utimes_ex (line 1299) | int fcfs_utimes_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_futimes_ex (line 1325) | int fcfs_futimes_ex(FCFSPosixAPIContext *ctx,
  function fcfs_futimesat_ex (line 1350) | int fcfs_futimesat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_futimens_ex (line 1376) | int fcfs_futimens_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_utimensat_ex (line 1401) | int fcfs_utimensat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_unlink_ex (line 1427) | int fcfs_unlink_ex(FCFSPosixAPIContext *ctx, const char *path)
  function fcfs_unlinkat_ex (line 1451) | int fcfs_unlinkat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_rename_ex (line 1478) | int fcfs_rename_ex(FCFSPosixAPIContext *ctx,
  function do_renameat (line 1509) | static inline int do_renameat(FCFSPosixAPIContext *ctx,
  function fcfs_renameat_ex (line 1540) | int fcfs_renameat_ex(FCFSPosixAPIContext *ctx, int fd1,
  function fcfs_renameat2_ex (line 1547) | int fcfs_renameat2_ex(FCFSPosixAPIContext *ctx, int fd1,
  function fcfs_mkdir_ex (line 1564) | int fcfs_mkdir_ex(FCFSPosixAPIContext *ctx,
  function fcfs_mkdirat_ex (line 1586) | int fcfs_mkdirat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_rmdir_ex (line 1608) | int fcfs_rmdir_ex(FCFSPosixAPIContext *ctx, const char *path)
  function fcfs_chown_ex (line 1633) | int fcfs_chown_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_lchown_ex (line 1659) | int fcfs_lchown_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_fchown (line 1685) | int fcfs_fchown(int fd, uid_t owner, gid_t group)
  function fcfs_fchownat_ex (line 1709) | int fcfs_fchownat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_chmod_ex (line 1735) | int fcfs_chmod_ex(FCFSPosixAPIContext *ctx,
  function fcfs_fchmod (line 1761) | int fcfs_fchmod(int fd, mode_t mode)
  function fcfs_fchmodat_ex (line 1785) | int fcfs_fchmodat_ex(FCFSPosixAPIContext *ctx, int fd,
  function fcfs_statvfs_ex (line 1811) | int fcfs_statvfs_ex(FCFSPosixAPIContext *ctx,
  function fcfs_fstatvfs (line 1831) | int fcfs_fstatvfs(int fd, struct statvfs *buf)
  function do_setxattr (line 1851) | static inline int do_setxattr(FCFSPosixAPIContext *ctx, const char *func,
  function fcfs_setxattr_ex (line 1880) | int fcfs_setxattr_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_lsetxattr_ex (line 1887) | int fcfs_lsetxattr_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_fsetxattr (line 1894) | int fcfs_fsetxattr(int fd, const char *name, const void *value,
  function do_getxattr (line 1924) | static inline ssize_t do_getxattr(FCFSPosixAPIContext *ctx,
  function fcfs_getxattr_ex (line 1955) | ssize_t fcfs_getxattr_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_lgetxattr_ex (line 1962) | ssize_t fcfs_lgetxattr_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_fgetxattr (line 1969) | ssize_t fcfs_fgetxattr(int fd, const char *name,
  function do_listxattr (line 1999) | static inline ssize_t do_listxattr(FCFSPosixAPIContext *ctx,
  function fcfs_listxattr_ex (line 2027) | ssize_t fcfs_listxattr_ex(FCFSPosixAPIContext *ctx,
  function fcfs_llistxattr_ex (line 2034) | ssize_t fcfs_llistxattr_ex(FCFSPosixAPIContext *ctx,
  function fcfs_flistxattr (line 2041) | ssize_t fcfs_flistxattr(int fd, char *list, size_t size)
  function do_removexattr (line 2067) | static inline int do_removexattr(FCFSPosixAPIContext *ctx, const char *f...
  function fcfs_removexattr_ex (line 2094) | int fcfs_removexattr_ex(FCFSPosixAPIContext *ctx,
  function fcfs_lremovexattr_ex (line 2101) | int fcfs_lremovexattr_ex(FCFSPosixAPIContext *ctx,
  function fcfs_fremovexattr (line 2108) | int fcfs_fremovexattr(int fd, const char *name)
  function FCFSPosixAPIDIR (line 2134) | static FCFSPosixAPIDIR *do_opendir(FCFSPosixAPIContext *ctx,
  function DIR (line 2164) | DIR *fcfs_opendir_ex(FCFSPosixAPIContext *ctx, const char *path)
  function DIR (line 2191) | DIR *fcfs_fdopendir_ex(FCFSPosixAPIContext *ctx, int fd)
  function fcfs_closedir_ex (line 2222) | int fcfs_closedir_ex(FCFSPosixAPIContext *ctx, DIR *dirp)
  type dirent (line 2234) | struct dirent
  type dirent (line 2243) | struct dirent
  function fcfs_readdir_r_ex (line 2249) | int fcfs_readdir_r_ex(FCFSPosixAPIContext *ctx, DIR *dirp,
  function fcfs_seekdir_ex (line 2265) | void fcfs_seekdir_ex(FCFSPosixAPIContext *ctx, DIR *dirp, long loc)
  function fcfs_telldir_ex (line 2271) | long fcfs_telldir_ex(FCFSPosixAPIContext *ctx, DIR *dirp)
  function fcfs_rewinddir_ex (line 2277) | void fcfs_rewinddir_ex(FCFSPosixAPIContext *ctx, DIR *dirp)
  function fcfs_dirfd_ex (line 2283) | int fcfs_dirfd_ex(FCFSPosixAPIContext *ctx, DIR *dirp)
  function do_scandir (line 2295) | static int do_scandir(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_scandir_ex (line 2370) | int fcfs_scandir_ex(FCFSPosixAPIContext *ctx, const char *path,
  function fcfs_scandirat_ex (line 2385) | int fcfs_scandirat_ex(FCFSPosixAPIContext *ctx, int fd, const char *path,
  function do_chdir (line 2400) | static int do_chdir(const string_t *path)
  function fcfs_chdir_ex (line 2422) | int fcfs_chdir_ex(FCFSPosixAPIContext *ctx, const char *path)
  function fcfs_fchdir (line 2437) | int fcfs_fchdir(int fd)
  function fcfs_chroot_ex (line 2491) | int fcfs_chroot_ex(FCFSPosixAPIContext *ctx, const char *path)
  function fcfs_dup_ex (line 2496) | int fcfs_dup_ex(FCFSPosixAPIContext *ctx, int fd)
  function fcfs_dup2_ex (line 2503) | int fcfs_dup2_ex(FCFSPosixAPIContext *ctx, int fd1, int fd2)
  function fcfs_munmap_ex (line 2516) | int fcfs_munmap_ex(FCFSPosixAPIContext *ctx, void *addr, size_t length)
  function fcfs_lockf_ex (line 2521) | int fcfs_lockf_ex(FCFSPosixAPIContext *ctx, int fd, int cmd, off_t len)
  function fcfs_posix_fallocate_ex (line 2561) | int fcfs_posix_fallocate_ex(FCFSPosixAPIContext *ctx,
  function fcfs_posix_fadvise_ex (line 2583) | int fcfs_posix_fadvise_ex(FCFSPosixAPIContext *ctx, int fd,
  function do_vdprintf (line 2596) | static int do_vdprintf(FCFSPosixAPIFileInfo *file,
  function fcfs_dprintf (line 2631) | int fcfs_dprintf(int fd, const char *format, ...)
  function fcfs_vdprintf (line 2648) | int fcfs_vdprintf(int fd, const char *format, va_list ap)

FILE: src/api/std/papi.h
  type iovec (line 265) | struct iovec
  type iovec (line 267) | struct iovec
  type iovec (line 274) | struct iovec
  type iovec (line 276) | struct iovec
  type stat (line 293) | struct stat
  type stat (line 296) | struct stat
  type stat (line 298) | struct stat
  type stat (line 301) | struct stat
  function fcfs_eaccess_ex (line 347) | static inline int fcfs_eaccess_ex(FCFSPosixAPIContext *ctx,
  type utimbuf (line 354) | struct utimbuf
  type timeval (line 357) | struct timeval
  type timeval (line 360) | struct timeval
  type timeval (line 363) | struct timeval
  type timespec (line 366) | struct timespec
  type timespec (line 369) | struct timespec
  type statvfs (line 415) | struct statvfs
  type statvfs (line 417) | struct statvfs
  type dirent (line 459) | struct dirent
  type dirent (line 462) | struct dirent
  type dirent (line 462) | struct dirent
  type dirent (line 473) | struct dirent
  type dirent (line 473) | struct dirent
  type dirent (line 474) | struct dirent
  type dirent (line 474) | struct dirent
  type dirent (line 477) | struct dirent
  type dirent (line 477) | struct dirent
  type dirent (line 478) | struct dirent
  type dirent (line 478) | struct dirent
  function FCFSPosixAPIFileInfo (line 513) | static inline FCFSPosixAPIFileInfo *fcfs_get_file_handle(int fd)

FILE: src/api/std/posix_api.c
  function load_posix_api_config (line 27) | static int load_posix_api_config(FCFSPosixAPIContext *ctx,
  function fcfs_posix_api_init_ex1 (line 45) | int fcfs_posix_api_init_ex1(FCFSPosixAPIContext *ctx, const char
  function fcfs_posix_api_log_configs_ex (line 107) | void fcfs_posix_api_log_configs_ex(FCFSPosixAPIContext *ctx,
  function fcfs_posix_api_destroy_ex (line 134) | void fcfs_posix_api_destroy_ex(FCFSPosixAPIContext *ctx)

FILE: src/api/std/posix_api.h
  function fcfs_posix_api_init_ex (line 58) | static inline int fcfs_posix_api_init_ex(FCFSPosixAPIContext *ctx,
  function fcfs_posix_api_init (line 75) | static inline int fcfs_posix_api_init(const char *log_prefix_name,
  function fcfs_posix_api_log_configs (line 97) | static inline void fcfs_posix_api_log_configs()
  function fcfs_posix_api_start_ex (line 109) | static inline int fcfs_posix_api_start_ex(FCFSPosixAPIContext *ctx)
  function fcfs_posix_api_init_start_ex (line 122) | static inline int fcfs_posix_api_init_start_ex(
  function fcfs_posix_api_stop_ex (line 141) | static inline void fcfs_posix_api_stop_ex(FCFSPosixAPIContext *ctx)
  function fcfs_posix_api_start (line 158) | static inline int fcfs_posix_api_start()
  function fcfs_posix_api_init_start (line 170) | static inline int fcfs_posix_api_init_start(const char *log_prefix_name,
  function fcfs_posix_api_stop (line 181) | static inline void fcfs_posix_api_stop()
  function fcfs_posix_api_destroy (line 190) | static inline void fcfs_posix_api_destroy()
  function pid_t (line 196) | static inline pid_t fcfs_posix_api_getpid()
  function pid_t (line 201) | static inline pid_t fcfs_posix_api_gettid(
  function fcfs_posix_api_set_owner_ex (line 211) | static inline int fcfs_posix_api_set_owner_ex(
  function fcfs_posix_api_set_owner (line 217) | static inline int fcfs_posix_api_set_owner()
  function fcfs_posix_api_set_fctx (line 222) | static inline void fcfs_posix_api_set_fctx(FCFSAPIFileContext *fctx,

FILE: src/api/tests/fcfs_beachmark.c
  type BeachmarkMode (line 29) | typedef enum {
  type BeachmarkThreadInfo (line 36) | typedef struct {
  function usage (line 80) | static inline void usage(char *argv[])
  function open_file (line 93) | static inline int open_file(const char *filename, int flags)
  function close_file (line 102) | static inline void close_file(int fd)
  function create_file (line 111) | static int create_file(const char *filename, const int64_t start_offset)
  function check_create_file (line 199) | static int check_create_file(const char *filename)
  function thread_run (line 246) | static int thread_run(BeachmarkThreadInfo *thread)
  function output (line 379) | static void output(const time_t current_time)
  function sigQuitHandler (line 414) | static void sigQuitHandler(int sig)
  function setup_signal_handler (line 424) | static int setup_signal_handler()
  function beachmark (line 444) | static int beachmark()
  function main (line 547) | int main(int argc, char *argv[])

FILE: src/api/tests/fcfs_test_file_copy.c
  function usage (line 33) | static void usage(char *argv[])
  function copy_file (line 41) | static int copy_file()
  function main (line 154) | int main(int argc, char *argv[])

FILE: src/api/tests/fcfs_test_file_op.c
  function usage (line 27) | static void usage(char *argv[])
  function main (line 36) | int main(int argc, char *argv[])

FILE: src/api/tests/fcfs_test_papi_copy.c
  function usage (line 36) | static void usage(char *argv[])
  function alloc_iovec_array (line 45) | static int alloc_iovec_array(iovec_array_t *array, char *buff)
  function copy_file (line 72) | static int copy_file()
  function main (line 269) | int main(int argc, char *argv[])

FILE: src/api/tests/fcfs_test_read_ahead.c
  type BlockArray (line 30) | typedef struct {
  function usage (line 49) | static void usage(char *argv[])
  function check_create_root_path (line 59) | static int check_create_root_path()
  function init (line 81) | static int init()
  function fill_buffer (line 120) | static void fill_buffer(char *buff, const int length,
  function sequential_write (line 139) | static int sequential_write(FCFSAPIFileInfo *fi, char *out_buff)
  function random_write (line 170) | static int random_write(FCFSAPIFileInfo *fi, char *out_buff)
  function do_write (line 201) | static inline int do_write(FCFSAPIFileInfo *fi, char *out_buff)
  function do_read (line 261) | static int do_read(const int thread_index, FCFSAPIFileInfo *fi,
  function read_test (line 330) | static int read_test(const int thread_index)
  function sigQuitHandler (line 391) | static void sigQuitHandler(int sig)
  function main (line 401) | int main(int argc, char *argv[])

FILE: src/auth/client/client_func.c
  function fcfs_auth_alloc_group_servers (line 26) | int fcfs_auth_alloc_group_servers(FCFSAuthServerGroup *server_group,
  function fcfs_auth_load_server_config (line 43) | static int fcfs_auth_load_server_config(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_do_init_ex (line 57) | static int fcfs_auth_client_do_init_ex(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_log_config_ex (line 88) | void fcfs_auth_client_log_config_ex(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_load_from_file_ex1 (line 109) | int fcfs_auth_client_load_from_file_ex1(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_init_ex2 (line 137) | int fcfs_auth_client_init_ex2(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_destroy_ex (line 161) | void fcfs_auth_client_destroy_ex(FCFSAuthClientContext *client_ctx)

FILE: src/auth/client/client_func.h
  function fcfs_auth_client_load_from_file_ex (line 56) | static inline int fcfs_auth_client_load_from_file_ex(FCFSAuthClientContext
  function fcfs_auth_client_init_ex1 (line 68) | static inline int fcfs_auth_client_init_ex1(FCFSAuthClientContext *clien...

FILE: src/auth/client/client_global.h
  type FCFSAuthClientGlobalVars (line 23) | typedef struct fcfs_auth_client_global_vars {

FILE: src/auth/client/client_proto.c
  function check_name_ex (line 51) | static inline int check_name_ex(const string_t *name,
  function pack_name_ex (line 67) | static inline int pack_name_ex(const string_t *name, const char *caption,
  function pack_user_pool_pair_ex (line 83) | static inline int pack_user_pool_pair_ex(const string_t *username,
  function pack_user_passwd_pair (line 101) | static inline int pack_user_passwd_pair(const string_t *username,
  function fcfs_auth_client_proto_user_login (line 114) | int fcfs_auth_client_proto_user_login(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_session_subscribe (line 164) | int fcfs_auth_client_proto_session_subscribe(
  function fcfs_auth_client_proto_session_validate (line 199) | int fcfs_auth_client_proto_session_validate(
  function fcfs_auth_client_proto_user_create (line 253) | int fcfs_auth_client_proto_user_create(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_user_passwd (line 288) | int fcfs_auth_client_proto_user_passwd(FCFSAuthClientContext *client_ctx,
  type fast_mpool_man (line 326) | struct fast_mpool_man
  function client_proto_user_list_do (line 329) | static int client_proto_user_list_do(FCFSAuthClientContext *client_ctx,
  function client_proto_list_wrapper (line 406) | static int client_proto_list_wrapper(client_proto_list_func list_func,
  function fcfs_auth_client_proto_user_list (line 451) | int fcfs_auth_client_proto_user_list(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_user_grant (line 462) | int fcfs_auth_client_proto_user_grant(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_user_remove (line 494) | int fcfs_auth_client_proto_user_remove(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_spool_create (line 525) | int fcfs_auth_client_proto_spool_create(FCFSAuthClientContext *client_ctx,
  function client_proto_spool_list_do (line 582) | int client_proto_spool_list_do(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_spool_list (line 662) | int fcfs_auth_client_proto_spool_list(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_spool_remove (line 672) | int fcfs_auth_client_proto_spool_remove(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_spool_set_quota (line 703) | int fcfs_auth_client_proto_spool_set_quota(FCFSAuthClientContext *client...
  function fcfs_auth_client_proto_spool_get_quota (line 735) | int fcfs_auth_client_proto_spool_get_quota(FCFSAuthClientContext *client...
  function fcfs_auth_client_proto_gpool_grant (line 770) | int fcfs_auth_client_proto_gpool_grant(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_proto_gpool_withdraw (line 809) | int fcfs_auth_client_proto_gpool_withdraw(FCFSAuthClientContext
  function client_proto_gpool_list_do (line 846) | static int client_proto_gpool_list_do(FCFSAuthClientContext
  function fcfs_auth_client_proto_gpool_list (line 938) | int fcfs_auth_client_proto_gpool_list(FCFSAuthClientContext
  function fcfs_auth_client_get_master (line 948) | int fcfs_auth_client_get_master(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_cluster_stat (line 987) | int fcfs_auth_client_cluster_stat(FCFSAuthClientContext *client_ctx,

FILE: src/auth/client/client_proto.h
  type FCFSAuthClientClusterStatEntry (line 24) | typedef struct fcfs_auth_client_cluster_stat_entry {
  type fast_mpool_man (line 65) | struct fast_mpool_man
  type fast_mpool_man (line 81) | struct fast_mpool_man
  type fast_mpool_man (line 103) | struct fast_mpool_man

FILE: src/auth/client/client_types.h
  type FCFSAuthClientUserKeyPair (line 27) | typedef struct fcfs_auth_client_user_key_pair {
  type FCFSAuthClientServerEntry (line 32) | typedef struct fcfs_auth_client_server_entry {
  type FCFSAuthServerGroup (line 38) | typedef struct fcfs_auth_server_group {
  type FCFSAuthClientCommonCfg (line 44) | typedef struct fcfs_auth_client_common_cfg {
  type FCFSAuthClientContext (line 52) | typedef struct fcfs_auth_client_context {
  type FCFSAuthClientFullContext (line 64) | typedef struct fcfs_auth_client_full_context {

FILE: src/auth/client/fcfs_auth_client.c
  function load_auth_user_passwd (line 23) | static int load_auth_user_passwd(FCFSAuthClientCommonCfg *auth_cfg,
  function load_auth_config (line 109) | static int load_auth_config(FCFSAuthClientFullContext *auth,
  function fcfs_auth_load_config_ex (line 159) | int fcfs_auth_load_config_ex(FCFSAuthClientFullContext *auth,
  function fcfs_auth_config_to_string_ex (line 192) | void fcfs_auth_config_to_string_ex(const FCFSAuthClientFullContext *auth,
  function fcfs_auth_client_user_login_ex (line 206) | int fcfs_auth_client_user_login_ex(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_session_subscribe (line 215) | int fcfs_auth_client_session_subscribe(FCFSAuthClientContext *client_ctx)
  function fcfs_auth_client_session_validate (line 221) | int fcfs_auth_client_session_validate(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_user_create (line 231) | int fcfs_auth_client_user_create(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_user_passwd (line 238) | int fcfs_auth_client_user_passwd(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_user_list (line 246) | int fcfs_auth_client_user_list(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_user_grant (line 255) | int fcfs_auth_client_user_grant(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_user_remove (line 263) | int fcfs_auth_client_user_remove(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_spool_create (line 271) | int fcfs_auth_client_spool_create(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_spool_list (line 280) | int fcfs_auth_client_spool_list(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_spool_remove (line 290) | int fcfs_auth_client_spool_remove(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_spool_set_quota (line 298) | int fcfs_auth_client_spool_set_quota(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_spool_get_quota (line 306) | int fcfs_auth_client_spool_get_quota(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_gpool_grant (line 314) | int fcfs_auth_client_gpool_grant(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_gpool_withdraw (line 323) | int fcfs_auth_client_gpool_withdraw(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_client_gpool_list (line 331) | int fcfs_auth_client_gpool_list(FCFSAuthClientContext *client_ctx,

FILE: src/auth/client/fcfs_auth_client.h
  function fcfs_auth_config_to_string (line 42) | static inline void fcfs_auth_config_to_string(const FCFSAuthClientFullCo...
  function fcfs_auth_client_user_login (line 53) | static inline int fcfs_auth_client_user_login(
  function fcfs_auth_client_session_create_ex (line 63) | static inline int fcfs_auth_client_session_create_ex(
  function fcfs_auth_client_session_create (line 96) | static inline int fcfs_auth_client_session_create(
  type fast_mpool_man (line 119) | struct fast_mpool_man
  type fast_mpool_man (line 134) | struct fast_mpool_man
  type fast_mpool_man (line 156) | struct fast_mpool_man

FILE: src/auth/client/fcfs_auth_for_server.c
  function fcfs_auth_for_server_check_priv (line 20) | int fcfs_auth_for_server_check_priv(FCFSAuthClientContext *client_ctx,

FILE: src/auth/client/fcfs_auth_for_server.h
  function fcfs_auth_for_server_init_ex (line 36) | static inline int fcfs_auth_for_server_init_ex(FCFSAuthClientFullContext
  function fcfs_auth_for_server_cfg_to_string (line 61) | static inline void fcfs_auth_for_server_cfg_to_string(const
  function fcfs_auth_for_server_start (line 80) | static inline int fcfs_auth_for_server_start(const
  function fcfs_auth_for_server_destroy (line 90) | static inline void fcfs_auth_for_server_destroy(

FILE: src/auth/client/session_regenerate.c
  type SessionRegenerateContext (line 28) | typedef struct synced_session_array {
  function session_regenerate_do (line 35) | static int session_regenerate_do()
  function fcfs_auth_error_handler (line 60) | static int fcfs_auth_error_handler(const int errnum)
  function session_regenerate_init (line 73) | int session_regenerate_init()

FILE: src/auth/client/session_sync.c
  type SyncedSessionEntry (line 30) | typedef struct synced_session_entry {
  type SyncedSessionArray (line 36) | typedef struct synced_session_array {
  function synced_session_array_init (line 45) | static int synced_session_array_init(SyncedSessionArray *array)
  function check_realloc_session_array (line 58) | static int check_realloc_session_array(SyncedSessionArray *array,
  function parse_session_push (line 94) | static int parse_session_push(SFResponseInfo *response)
  function deal_session_array (line 159) | static void deal_session_array()
  function session_sync (line 199) | static int session_sync(ConnectionInfo *conn)
  function session_sync_init (line 289) | int session_sync_init()
  function session_sync_start (line 300) | int session_sync_start()

FILE: src/auth/client/simple_connection_manager.c
  type FCFSAuthCMSimpleExtra (line 26) | typedef struct fcfs_auth_cm_simple_extra {
  function check_realloc_group_servers (line 38) | static int check_realloc_group_servers(FCFSAuthServerGroup *server_group)
  function ConnectionInfo (line 70) | static ConnectionInfo *get_spec_connection(SFConnectionManager *cm,
  function ConnectionInfo (line 101) | static ConnectionInfo *get_connection(SFConnectionManager *cm,
  function ConnectionInfo (line 133) | static ConnectionInfo *get_master_connection(SFConnectionManager *cm,
  function release_connection (line 184) | static void release_connection(SFConnectionManager *cm,
  function close_connection (line 193) | static void close_connection(SFConnectionManager *cm,
  function copy_to_server_group_array (line 207) | static void copy_to_server_group_array(FCFSAuthClientContext *client_ctx,
  function fcfs_auth_simple_connection_manager_init (line 240) | int fcfs_auth_simple_connection_manager_init(FCFSAuthClientContext *clie...
  function fcfs_auth_simple_connection_manager_destroy (line 299) | void fcfs_auth_simple_connection_manager_destroy(SFConnectionManager *cm)

FILE: src/auth/client/tools/fauth_cluster_stat.c
  function usage (line 27) | static void usage(char *argv[])
  function output (line 33) | static void output(FCFSAuthClientClusterStatEntry *stats, const int count)
  function main (line 50) | int main(int argc, char *argv[])

FILE: src/auth/client/tools/fauth_list_servers.c
  function usage (line 27) | static void usage(char *argv[])
  function main (line 32) | int main(int argc, char *argv[])

FILE: src/auth/client/tools/fcfs_pool.c
  function usage (line 47) | static void usage(char *argv[])
  function create_spool (line 83) | static int create_spool(int argc, char *argv[])
  function quota_spool (line 113) | static int quota_spool(int argc, char *argv[])
  function parse_pool_access (line 135) | static inline int parse_pool_access(const string_t *privs,
  function grant_privilege (line 146) | static int grant_privilege(int argc, char *argv[])
  function withdraw_privilege (line 188) | static int withdraw_privilege(int argc, char *argv[])
  function remove_spool (line 209) | static int remove_spool(int argc, char *argv[])
  function output_spools (line 224) | static void output_spools(FCFSAuthStoragePoolArray *array)
  function output_gpools (line 243) | static void output_gpools(FCFSAuthGrantedPoolArray *array)
  function list_spool (line 269) | static int list_spool(int argc, char *argv[])
  function list_gpool (line 296) | static int list_gpool(int argc, char *argv[])
  function main (line 323) | int main(int argc, char *argv[])

FILE: src/auth/client/tools/fcfs_user.c
  function usage (line 38) | static void usage(char *argv[])
  function user_create_or_passwd (line 72) | static int user_create_or_passwd(int argc, char *argv[], const int cmd)
  function create_user (line 128) | static inline int create_user(int argc, char *argv[])
  function passwd_user (line 134) | static inline int passwd_user(int argc, char *argv[])
  function grant_privilege (line 140) | static int grant_privilege(int argc, char *argv[])
  function remove_user (line 161) | static int remove_user(int argc, char *argv[])
  function output_users (line 176) | static void output_users(FCFSAuthUserArray *array)
  function list_user (line 193) | static int list_user(int argc, char *argv[])
  function main (line 220) | int main(int argc, char *argv[])

FILE: src/auth/client/tools/tool_func.c
  function fcfs_auth_get_user_priv (line 42) | static inline int64_t fcfs_auth_get_user_priv(const string_t *str)
  function string_t (line 57) | static inline const string_t *fcfs_auth_get_user_priv_name(const int64_t...
  function fcfs_auth_parse_user_priv (line 72) | int fcfs_auth_parse_user_priv(const string_t *str, int64_t *priv)
  function fcfs_auth_parse_pool_access (line 133) | int fcfs_auth_parse_pool_access(const string_t *str, int *priv)

FILE: src/auth/common/auth_func.c
  function fcfs_auth_generate_passwd (line 23) | void fcfs_auth_generate_passwd(unsigned char passwd[16])
  function fcfs_auth_save_passwd (line 55) | int fcfs_auth_save_passwd(const char *filename, unsigned char passwd[16])
  function fcfs_auth_load_passwd_ex (line 64) | int fcfs_auth_load_passwd_ex(const char *filename,
  function fcfs_auth_replace_filename_with_username (line 150) | int fcfs_auth_replace_filename_with_username(const string_t *src,
  function fcfs_auth_user_check_realloc_array (line 163) | int fcfs_auth_user_check_realloc_array(FCFSAuthUserArray *array,
  function fcfs_auth_spool_check_realloc_array (line 198) | int fcfs_auth_spool_check_realloc_array(FCFSAuthStoragePoolArray *array,
  function fcfs_auth_gpool_check_realloc_array (line 233) | int fcfs_auth_gpool_check_realloc_array(FCFSAuthGrantedPoolArray *array,

FILE: src/auth/common/auth_func.h
  function fcfs_auth_user_init_array (line 29) | static inline void fcfs_auth_user_init_array(FCFSAuthUserArray *array)
  function fcfs_auth_user_free_array (line 36) | static inline void fcfs_auth_user_free_array(FCFSAuthUserArray *array)
  function fcfs_auth_spool_init_array (line 47) | static inline void fcfs_auth_spool_init_array(
  function fcfs_auth_spool_free_array (line 55) | static inline void fcfs_auth_spool_free_array(
  function fcfs_auth_granted_init_array (line 67) | static inline void fcfs_auth_granted_init_array(
  function fcfs_auth_granted_free_array (line 75) | static inline void fcfs_auth_granted_free_array(

FILE: src/auth/common/auth_global.h
  type FCFSAuthGlobalVars (line 22) | typedef struct fcfs_auth_global_vars {

FILE: src/auth/common/auth_proto.c
  function fcfs_auth_proto_init (line 18) | void fcfs_auth_proto_init()

FILE: src/auth/common/auth_proto.h
  type SFCommonProtoHeader (line 75) | typedef SFCommonProtoHeader  FCFSAuthProtoHeader;
  type FCFSAuthProtoNameInfo (line 77) | typedef struct fcfs_auth_proto_name_info {
  type FCFSAuthProtoUserPasswdPair (line 82) | typedef struct fcfs_auth_proto_user_passwd_pair {
  type FCFSAuthProtoUserPoolPair (line 87) | typedef struct fcfs_auth_proto_user_pool_pair {
  type FCFSAuthProtoPoolPriviledges (line 92) | typedef struct fcfs_auth_proto_pool_priviledges {
  type FCFSAuthProtoUserLoginReq (line 97) | typedef struct fcfs_auth_proto_user_login_req {
  type FCFSAuthProtoUserLoginResp (line 103) | typedef struct fcfs_auth_proto_user_login_resp {
  type FCFSAuthProtoSessionSubscribeReq (line 107) | typedef struct fcfs_auth_proto_session_subscribe_req {
  type FCFSAuthProtoSessionValidateReq (line 111) | typedef struct fcfs_auth_proto_session_validate_req {
  type FCFSAuthProtoSessionValidateResp (line 120) | typedef struct fcfs_auth_proto_session_validate_resp {
  type FCFSAuthProtoSessionPushRespBodyHeader (line 124) | typedef struct fcfs_auth_proto_session_push_resp_body_header {
  type FCFSAuthProtoSessionPushEntry (line 128) | typedef struct fcfs_auth_proto_session_push_entry {
  type FCFSAuthProtoSessionPushRespBodyPart (line 141) | typedef struct fcfs_auth_proto_session_push_resp_body_part {
  type FCFSAuthProtoUserCreateReq (line 147) | typedef struct fcfs_auth_proto_user_create_req {
  type FCFSAuthProtoUserPasswdReq (line 152) | typedef struct fcfs_auth_proto_user_passwd_req {
  type FCFSAuthProtoUserListReq (line 156) | typedef struct fcfs_auth_proto_user_list_req {
  type FCFSAuthProtoListRespHeader (line 161) | typedef struct fcfs_auth_proto_list_resp_header {
  type FCFSAuthProtoUserListRespBodyPart (line 167) | typedef struct fcfs_auth_proto_user_list_resp_body_part {
  type FCFSAuthProtoUserGrantReq (line 172) | typedef struct fcfs_auth_proto_user_grant_req {
  type FCFSAuthProtoUserRemoveReq (line 177) | typedef struct fcfs_auth_proto_user_remove_req {
  type FCFSAuthProtoSPoolCreateReq (line 182) | typedef struct fcfs_auth_proto_spool_create_req {
  type FCFSAuthProtoSPoolCreateResp (line 188) | typedef struct fcfs_auth_proto_spool_create_resp {
  type FCFSAuthProtoSPoolListReq (line 192) | typedef struct fcfs_auth_proto_spool_list_req {
  type FCFSAuthProtoSPoolListRespBodyPart (line 197) | typedef struct fcfs_auth_proto_spool_list_resp_body_part {
  type FCFSAuthProtoSPoolRemoveReq (line 202) | typedef struct fcfs_auth_proto_spool_remove_req {
  type FCFSAuthProtoSPoolSetQuotaReq (line 206) | typedef struct fcfs_auth_proto_spool_set_quota_req {
  type FCFSAuthProtoSPoolGetQuotaReq (line 211) | typedef struct fcfs_auth_proto_spool_get_quota_req {
  type FCFSAuthProtoSPoolGetQuotaResp (line 215) | typedef struct fcfs_auth_proto_spool_get_quota_resp {
  type FCFSAuthProtoSPoolGrantReq (line 219) | typedef struct fcfs_auth_proto_spool_grant_req {
  type FCFSAuthProtoSPoolWithdrawReq (line 224) | typedef struct fcfs_auth_proto_spool_withdraw_req {
  type FCFSAuthProtoSPoolListReq (line 228) | typedef FCFSAuthProtoSPoolListReq FCFSAuthProtoGPoolListReq;
  type FCFSAuthProtoGPoolListRespBodyPart (line 230) | typedef struct fcfs_auth_proto_gpool_list_resp_body_part {
  type FCFSAuthProtoGetServerResp (line 235) | typedef struct fcfs_auth_proto_get_server_resp {
  type FCFSAuthProtoGetServerStatusReq (line 242) | typedef struct fcfs_auth_proto_get_server_status_req {
  type FCFSAuthProtoGetServerStatusResp (line 247) | typedef struct fcfs_auth_proto_get_server_status_resp {
  type FCFSAuthProtoJoinMasterReq (line 253) | typedef struct fcfs_auth_proto_join_master_req {
  type FCFSAuthProtoClusterStatRespBodyHeader (line 259) | typedef struct fcfs_auth_proto_cluster_stat_resp_body_header {
  type FCFSAuthProtoClusterStatRespBodyPart (line 264) | typedef struct fcfs_auth_proto_cluster_stat_resp_body_part {
  function fcfs_auth_parse_user_pool_pair (line 287) | static inline void fcfs_auth_parse_user_pool_pair(FCFSAuthProtoUserPoolPair
  function fcfs_auth_pack_user_pool_pair (line 299) | static inline void fcfs_auth_pack_user_pool_pair(const string_t *username,

FILE: src/auth/common/auth_types.h
  type FCFSAuthValidatePriviledgeType (line 75) | typedef enum {
  type FCFSAuthSPoolPriviledges (line 81) | typedef struct fcfs_auth_spool_priviledges {
  type FCFSAuthStoragePoolInfo (line 86) | typedef struct fcfs_auth_storage_pool_info {
  type FCFSAuthGrantedPoolInfo (line 94) | typedef struct fcfs_auth_granted_pool_info {
  type FCFSAuthGrantedPoolFullInfo (line 100) | typedef struct fcfs_auth_granted_pool_full_info {
  type FCFSAuthUserInfo (line 106) | typedef struct fcfs_auth_user_info {
  type FCFSAuthStoragePoolArray (line 114) | typedef struct fcfs_auth_storage_pool_array {
  type FCFSAuthGrantedPoolArray (line 121) | typedef struct fcfs_auth_granted_pool_array {
  type FCFSAuthUserArray (line 128) | typedef struct fcfs_auth_user_array {

FILE: src/auth/common/server_session.c
  type ServerSessionHashtable (line 41) | typedef struct {
  type ServerSessionAllocatorArray (line 46) | typedef struct {
  type ServerSessionLockArray (line 52) | typedef struct {
  type ServerSessionContext (line 57) | typedef struct {
  function server_session_cfg_to_string_ex (line 81) | void server_session_cfg_to_string_ex(char *buff,
  function load_session_validate_key (line 101) | static int load_session_validate_key(IniFullContext *ini_ctx)
  function do_load_session_cfg (line 144) | static int do_load_session_cfg(const char *session_filename)
  function load_session_config (line 192) | static int load_session_config(IniFullContext *ini_ctx)
  function server_session_alloc_init (line 211) | static int server_session_alloc_init(ServerSessionHashEntry *session,
  function init_allocator_array (line 219) | static int init_allocator_array(ServerSessionAllocatorArray *array)
  function init_lock_array (line 249) | static int init_lock_array(ServerSessionLockArray *array)
  function init_hashtable (line 272) | static int init_hashtable(ServerSessionHashtable *htable)
  function server_session_init_ex (line 286) | int server_session_init_ex(IniFullContext *ini_ctx, const int fields_size,
  function ServerSessionHashEntry (line 319) | static inline ServerSessionHashEntry *session_htable_find(ServerSessionH...
  function session_htable_insert (line 349) | static int session_htable_insert(ServerSessionHashEntry *se, const bool ...
  function ServerSessionEntry (line 382) | ServerSessionEntry *server_session_add_ex(const ServerSessionEntry *entry,
  function server_session_get_fields (line 430) | int server_session_get_fields(const uint64_t session_id, void *fields)
  function server_session_user_priv_granted (line 451) | int server_session_user_priv_granted(const uint64_t session_id,
  function server_session_fstore_priv_granted (line 478) | int server_session_fstore_priv_granted(const uint64_t session_id,
  function server_session_fdir_priv_granted (line 505) | int server_session_fdir_priv_granted(const uint64_t session_id,
  function free_hash_entry (line 532) | static inline void free_hash_entry(ServerSessionHashEntry *entry)
  function server_session_delete (line 541) | int server_session_delete(const uint64_t session_id)
  function server_session_clear (line 575) | void server_session_clear()

FILE: src/auth/common/server_session.h
  type ServerSessionConfig (line 26) | typedef struct server_session_config {
  type ServerSessionIdInfo (line 36) | typedef union server_session_id_info {
  type SessionSyncedFields (line 47) | typedef struct session_synced_fields {
  type ServerSessionEntry (line 60) | typedef struct server_session_entry {
  type ServerSessionHashEntry (line 65) | typedef struct server_session_hash_entry {
  type ServerSessionCallbacks (line 72) | typedef struct server_session_callbacks {

FILE: src/auth/server/cluster_handler.c
  function cluster_handler_init (line 49) | int cluster_handler_init()
  function cluster_handler_destroy (line 54) | int cluster_handler_destroy()
  function cluster_recv_timeout_callback (line 59) | int cluster_recv_timeout_callback(struct fast_task_info *task)
  function session_subscriber_cleanup (line 80) | static void session_subscriber_cleanup(AuthServerContext *server_ctx,
  function cluster_task_finish_cleanup (line 93) | void cluster_task_finish_cleanup(struct fast_task_info *task)
  function cluster_subscriber_queue_push_ex (line 129) | void cluster_subscriber_queue_push_ex(ServerSessionSubscriber *subscriber,
  function ServerSessionSubscriber (line 145) | static inline ServerSessionSubscriber *cluster_subscriber_queue_pop(
  function cluster_deal_session_subscribe (line 162) | static int cluster_deal_session_subscribe(struct fast_task_info *task)
  function session_validate (line 234) | static int session_validate(const int64_t session_id,
  function cluster_deal_session_validate (line 281) | static int cluster_deal_session_validate(struct fast_task_info *task)
  function cluster_check_config_sign (line 325) | static int cluster_check_config_sign(struct fast_task_info *task,
  function cluster_deal_get_server_status (line 347) | static int cluster_deal_get_server_status(struct fast_task_info *task)
  function cluster_deal_join_master (line 378) | static int cluster_deal_join_master(struct fast_task_info *task)
  function cluster_deal_ping_master (line 437) | static int cluster_deal_ping_master(struct fast_task_info *task)
  function cluster_deal_next_master (line 465) | static int cluster_deal_next_master(struct fast_task_info *task)
  function cluster_process (line 499) | static int cluster_process(struct fast_task_info *task)
  function cluster_deal_task (line 569) | int cluster_deal_task(struct fast_task_info *task, const int stage)
  function cluster_deal_queue (line 597) | static int cluster_deal_queue(AuthServerContext *server_context,
  function cluster_thread_loop_callback (line 685) | int cluster_thread_loop_callback(struct nio_thread_data *thread_data)

FILE: src/auth/server/cluster_handler.h
  type fast_task_info (line 34) | struct fast_task_info
  type fast_task_info (line 35) | struct fast_task_info
  type nio_thread_data (line 37) | struct nio_thread_data
  type fast_task_info (line 38) | struct fast_task_info

FILE: src/auth/server/cluster_info.c
  function init_cluster_server_array (line 31) | static int init_cluster_server_array()
  function find_myself_in_cluster_config (line 59) | static int find_myself_in_cluster_config(const char *filename)
  function FCFSAuthClusterServerInfo (line 134) | FCFSAuthClusterServerInfo *fcfs_auth_get_server_by_id(const int server_id)
  function cluster_info_init (line 146) | int cluster_info_init(const char *cluster_config_filename)

FILE: src/auth/server/cluster_relationship.c
  type FCFSAuthClusterServerStatus (line 40) | typedef struct fcfs_auth_cluster_server_status {
  type FCFSAuthClusterServerDetectEntry (line 46) | typedef struct fcfs_auth_cluster_server_detect_entry {
  type FCFSAuthClusterServerDetectArray (line 51) | typedef struct fcfs_auth_cluster_server_detect_array {
  type FCFSAuthClusterRelationshipContext (line 58) | typedef struct fcfs_auth_cluster_relationship_context {
  function proto_unpack_server_status (line 76) | static inline void proto_unpack_server_status(
  function proto_get_server_status (line 84) | static int proto_get_server_status(ConnectionInfo *conn,
  function init_inactive_server_array (line 144) | static void init_inactive_server_array()
  function cluster_unset_master (line 164) | static inline bool cluster_unset_master(FCFSAuthClusterServerInfo *master)
  function proto_join_master (line 169) | static int proto_join_master(ConnectionInfo *conn, const int network_tim...
  function proto_ping_master (line 196) | static int proto_ping_master(ConnectionInfo *conn, const int network_tim...
  function cluster_cmp_server_status (line 214) | static int cluster_cmp_server_status(const void *p1, const void *p2)
  function cluster_get_server_status_ex (line 233) | static int cluster_get_server_status_ex(FCFSAuthClusterServerStatus
  function do_check_brainsplit (line 260) | static int do_check_brainsplit(FCFSAuthClusterServerInfo *cs)
  function cluster_check_brainsplit (line 290) | static int cluster_check_brainsplit(int *inactive_count)
  function fill_join_request (line 320) | static inline void fill_join_request(FCFSVoteClientJoinRequest *join_req...
  function vote_node_active_check (line 332) | static inline int vote_node_active_check()
  function master_check (line 353) | static int master_check()
  function get_vote_server_status (line 404) | static int get_vote_server_status(FCFSAuthClusterServerStatus *server_st...
  function notify_vote_next_leader (line 435) | static int notify_vote_next_leader(FCFSAuthClusterServerStatus *server_s...
  function cluster_get_master (line 444) | static int cluster_get_master(FCFSAuthClusterServerStatus *server_status,
  function do_notify_master_changed (line 528) | static int do_notify_master_changed(FCFSAuthClusterServerInfo *cs,
  function cluster_relationship_pre_set_master (line 564) | int cluster_relationship_pre_set_master(FCFSAuthClusterServerInfo *master)
  function load_data (line 583) | static int load_data()
  function cluster_relationship_set_master (line 601) | static int cluster_relationship_set_master(FCFSAuthClusterServerInfo
  function cluster_relationship_commit_master (line 661) | int cluster_relationship_commit_master(FCFSAuthClusterServerInfo *master)
  function cluster_relationship_trigger_reselect_master (line 686) | void cluster_relationship_trigger_reselect_master()
  function cluster_pre_set_next_master (line 708) | static int cluster_pre_set_next_master(FCFSAuthClusterServerInfo *cs,
  function cluster_commit_next_master (line 726) | static int cluster_commit_next_master(FCFSAuthClusterServerInfo *cs,
  function notify_next_master (line 743) | static int notify_next_master(cluster_notify_next_master_func notify_func,
  function cluster_notify_master_changed (line 786) | static int cluster_notify_master_changed(
  function cluster_select_master (line 828) | static int cluster_select_master()
  function cluster_ping_master (line 959) | static int cluster_ping_master(FCFSAuthClusterServerInfo *master,
  function cluster_relationship_init (line 1080) | int cluster_relationship_init()
  function cluster_relationship_destroy (line 1105) | int cluster_relationship_destroy()
  function cluster_relationship_add_to_inactive_sarray (line 1110) | void cluster_relationship_add_to_inactive_sarray(FCFSAuthClusterServerIn...
  function cluster_relationship_remove_from_inactive_sarray (line 1145) | void cluster_relationship_remove_from_inactive_sarray(FCFSAuthClusterSer...

FILE: src/auth/server/common_handler.c
  function fcfs_auth_get_cmd_log_level (line 39) | static int fcfs_auth_get_cmd_log_level(const int cmd)
  function common_handler_init (line 52) | void common_handler_init()
  function fcfs_auth_deal_get_master (line 68) | int fcfs_auth_deal_get_master(struct fast_task_info *task,

FILE: src/auth/server/common_handler.h
  type fast_task_info (line 33) | struct fast_task_info

FILE: src/auth/server/db/auth_db.c
  type AuthDBContext (line 36) | typedef struct auth_db_context {
  function user_compare (line 68) | static int user_compare(const DBUserInfo *user1, const DBUserInfo *user2)
  function pool_name_cmp (line 73) | static int pool_name_cmp(const DBStoragePoolInfo *sp1,
  function pool_id_cmp (line 79) | static int pool_id_cmp(const DBStoragePoolInfo *sp1,
  function granted_pool_cmp (line 85) | static int granted_pool_cmp(const DBGrantedPoolInfo *pg1,
  function user_alloc_init (line 91) | int user_alloc_init(void *element, void *args)
  function init_name_allocators (line 110) | static inline int init_name_allocators(
  function init_allocators (line 122) | static int init_allocators()
  function destroy_allocators (line 149) | static void destroy_allocators()
  function free_storage_pool_func (line 156) | static void free_storage_pool_func(UniqSkiplist *sl,
  function free_granted_pool_func (line 169) | static void free_granted_pool_func(UniqSkiplist *sl,
  function init_skiplists (line 178) | static int init_skiplists()
  function destroy_skiplists (line 229) | static void destroy_skiplists()
  function auth_db_init (line 238) | static int auth_db_init()
  function auth_db_destroy (line 262) | void auth_db_destroy()
  function DBUserInfo (line 273) | static inline DBUserInfo *user_get(AuthServerContext *server_ctx,
  function user_set_passwd (line 283) | static inline int user_set_passwd(DBUserInfo *user, const string_t *passwd)
  function user_create (line 297) | static int user_create(AuthServerContext *server_ctx, DBUserInfo **dbuser,
  function adb_user_create (line 348) | int adb_user_create(AuthServerContext *server_ctx,
  function DBUserInfo (line 370) | const DBUserInfo *adb_user_get(AuthServerContext *server_ctx,
  function adb_user_remove (line 386) | int adb_user_remove(AuthServerContext *server_ctx, const string_t *usern...
  function adb_user_update_priv (line 408) | int adb_user_update_priv(AuthServerContext *server_ctx,
  function adb_user_update_passwd (line 441) | int adb_user_update_passwd(AuthServerContext *server_ctx,
  function adb_user_list (line 463) | int adb_user_list(AuthServerContext *server_ctx,
  function DBStoragePoolInfo (line 493) | static inline DBStoragePoolInfo *get_spool_by_id(const int64_t pool_id)
  function DBStoragePoolInfo (line 502) | static inline DBStoragePoolInfo *get_spool_by_name(const string_t *name)
  function DBStoragePoolInfo (line 512) | static inline DBStoragePoolInfo *user_spool_get(AuthServerContext
  function spool_global_skiplists_insert (line 522) | static inline int spool_global_skiplists_insert(DBStoragePoolInfo *dbspool)
  function storage_pool_create (line 535) | static int storage_pool_create(AuthServerContext *server_ctx,
  function adb_spool_create (line 598) | int adb_spool_create(AuthServerContext *server_ctx, const string_t
  function FCFSAuthStoragePoolInfo (line 636) | const FCFSAuthStoragePoolInfo *adb_spool_get(AuthServerContext *server_ctx,
  function adb_spool_remove (line 658) | int adb_spool_remove(AuthServerContext *server_ctx,
  function call_pool_quota_avail_func (line 693) | static void call_pool_quota_avail_func(const DBStoragePoolInfo *dbpool,
  function adb_spool_set_quota (line 705) | int adb_spool_set_quota(AuthServerContext *server_ctx,
  function adb_spool_get_quota (line 760) | int adb_spool_get_quota(AuthServerContext *server_ctx,
  function adb_spool_set_used_bytes (line 784) | int adb_spool_set_used_bytes(const string_t *poolname,
  function adb_spool_list (line 804) | int adb_spool_list(AuthServerContext *server_ctx, const string_t *username,
  function convert_spool_array (line 839) | static int convert_spool_array(AuthServerContext *server_ctx,
  function load_user_spool (line 862) | static int load_user_spool(AuthServerContext *server_ctx,
  function granted_pool_create (line 885) | static int granted_pool_create(AuthServerContext *server_ctx,
  function convert_granted_array (line 940) | static int convert_granted_array(AuthServerContext *server_ctx,
  function load_granted_pool (line 962) | static int load_granted_pool(AuthServerContext *server_ctx, DBUserInfo *...
  function convert_user_array (line 984) | static int convert_user_array(AuthServerContext *server_ctx,
  function load_pool_auto_id (line 1019) | static int load_pool_auto_id(AuthServerContext *server_ctx)
  function adb_load_data (line 1039) | int adb_load_data(AuthServerContext *server_ctx)
  function adb_check_generate_admin_user (line 1074) | int adb_check_generate_admin_user(AuthServerContext *server_ctx)
  function DBGrantedPoolInfo (line 1109) | static inline DBGrantedPoolInfo *granted_pool_get(
  function adb_granted_create (line 1119) | int adb_granted_create(AuthServerContext *server_ctx, const string_t *us...
  function adb_granted_remove (line 1172) | int adb_granted_remove(AuthServerContext *server_ctx,
  function set_gpool_full_info (line 1208) | static inline void set_gpool_full_info(FCFSAuthGrantedPoolFullInfo *gf,
  function adb_granted_full_get (line 1216) | int adb_granted_full_get(AuthServerContext *server_ctx, const string_t
  function adb_granted_privs_get (line 1237) | int adb_granted_privs_get(AuthServerContext *server_ctx,
  function adb_granted_list (line 1261) | int adb_granted_list(AuthServerContext *server_ctx, const string_t *user...
  function adb_spool_get_auto_id (line 1295) | int64_t adb_spool_get_auto_id(AuthServerContext *server_ctx)
  function adb_spool_inc_auto_id (line 1300) | int adb_spool_inc_auto_id(AuthServerContext *server_ctx)
  function adb_spool_next_auto_id (line 1307) | int adb_spool_next_auto_id(AuthServerContext *server_ctx, int64_t *auto_id)
  function DBStoragePoolInfo (line 1313) | DBStoragePoolInfo *adb_spool_global_get(const string_t *poolname)

FILE: src/auth/server/db/auth_db.h
  type DBUserInfo (line 22) | typedef struct db_user_info {
  type DBStoragePoolInfo (line 30) | typedef struct db_storage_pool_info {
  type DBGrantedPoolInfo (line 35) | typedef struct db_granted_pool_info {
  type DBPrivChangeCallbacks (line 47) | typedef struct db_priv_change_callbacks {
  function adb_spool_access (line 91) | static inline int adb_spool_access(AuthServerContext

FILE: src/auth/server/db/dao/dao.h
  function dao_get_context_size (line 27) | static inline int dao_get_context_size()
  function dao_init_context (line 32) | static inline int dao_init_context(const int thread_index,

FILE: src/auth/server/db/dao/func.h
  type FCFSAuthDAOVariables (line 50) | typedef struct {
  function dao_set_xattr_string (line 85) | static inline int dao_set_xattr_string(FDIRClientContext *client_ctx,
  function dao_set_xattr_integer (line 98) | static inline int dao_set_xattr_integer(FDIRClientContext *client_ctx,
  function dao_get_xattr_string (line 109) | static inline int dao_get_xattr_string(FDIRClientContext *client_ctx,
  function dao_get_xattr_int64 (line 129) | static inline int dao_get_xattr_int64(FDIRClientContext *client_ctx,
  function dao_get_xattr_int32 (line 161) | static inline int dao_get_xattr_int32(FDIRClientContext *client_ctx,

FILE: src/auth/server/db/dao/granted_pool.c
  function dao_granted_create (line 23) | int dao_granted_create(FDIRClientContext *client_ctx, const string_t *us...
  function dao_granted_remove (line 64) | int dao_granted_remove(FDIRClientContext *client_ctx,
  function dump_to_granted_array (line 76) | static int dump_to_granted_array(FDIRClientContext *client_ctx,
  function dao_granted_list (line 135) | int dao_granted_list(FDIRClientContext *client_ctx, const string_t *user...

FILE: src/auth/server/db/dao/storage_pool.c
  function dao_spool_create (line 23) | int dao_spool_create(FDIRClientContext *client_ctx,
  function dao_spool_remove (line 65) | int dao_spool_remove(FDIRClientContext *client_ctx, const int64_t spool_id)
  function dao_spool_set_quota (line 71) | int dao_spool_set_quota(FDIRClientContext *client_ctx,
  function dump_to_spool_array (line 78) | static int dump_to_spool_array(FDIRClientContext *client_ctx,
  function dao_spool_list (line 124) | int dao_spool_list(FDIRClientContext *client_ctx, const string_t *username,
  function dao_spool_set_base_path_inode (line 156) | int dao_spool_set_base_path_inode(FDIRClientContext *client_ctx)
  function dao_spool_get_auto_id (line 167) | int dao_spool_get_auto_id(FDIRClientContext *client_ctx, int64_t *auto_id)
  function dao_spool_set_auto_id (line 173) | int dao_spool_set_auto_id(FDIRClientContext *client_ctx, const int64_t a...

FILE: src/auth/server/db/dao/storage_pool.h
  type fast_mpool_man (line 41) | struct fast_mpool_man

FILE: src/auth/server/db/dao/types.h
  type AuthFullPath (line 29) | typedef struct auth_full_path {

FILE: src/auth/server/db/dao/user.c
  function user_make_subdir (line 23) | static int user_make_subdir(FDIRClientContext *client_ctx,
  function dao_user_create (line 49) | int dao_user_create(FDIRClientContext *client_ctx, FCFSAuthUserInfo *user)
  function dao_user_update_priv (line 111) | int dao_user_update_priv(FDIRClientContext *client_ctx,
  function dao_user_update_passwd (line 117) | int dao_user_update_passwd(FDIRClientContext *client_ctx,
  function dao_user_remove (line 124) | int dao_user_remove(FDIRClientContext *client_ctx, const int64_t user_id)
  function dump_to_user_array (line 130) | static int dump_to_user_array(FDIRClientContext *client_ctx,
  function dao_user_list (line 191) | int dao_user_list(FDIRClientContext *client_ctx, struct fast_mpool_man

FILE: src/auth/server/db/dao/user.h
  type fast_mpool_man (line 36) | struct fast_mpool_man

FILE: src/auth/server/db/pool_usage_updater.c
  type PoolUsageUpdaterContext (line 27) | typedef struct {
  function nss_fetch (line 44) | static int nss_fetch(ConnectionInfo *conn)
  function pool_usage_refresh (line 78) | static int pool_usage_refresh(ConnectionInfo *conn)
  function pool_usage_updater_init (line 138) | static int pool_usage_updater_init()
  function pool_usage_updater_start (line 154) | int pool_usage_updater_start()
  function pool_usage_updater_terminate (line 179) | void pool_usage_updater_terminate()

FILE: src/auth/server/fcfs_authd.c
  function process_cmdline (line 56) | static int process_cmdline(int argc, char *argv[], bool *continue_flag)
  function main (line 105) | int main(int argc, char *argv[])
  function setup_server_env (line 215) | static int setup_server_env(const char *config_filename)

FILE: src/auth/server/server_func.c
  function server_load_fdir_client_config (line 39) | static int server_load_fdir_client_config(IniContext *ini_context,
  function server_load_admin_generate_config (line 74) | static int server_load_admin_generate_config(IniContext *ini_context,
  function server_load_pool_generate_config (line 149) | static int server_load_pool_generate_config(IniContext *ini_context,
  function log_cluster_server_config (line 187) | static void log_cluster_server_config()
  function server_log_configs (line 201) | static void server_log_configs()
  function load_master_election_config (line 246) | static int load_master_election_config(const char *cluster_filename)
  function load_cluster_config (line 276) | static int load_cluster_config(IniFullContext *ini_ctx,
  function server_load_config (line 303) | int server_load_config(const char *filename)

FILE: src/auth/server/server_global.h
  type AuthServerGlobalVars (line 28) | typedef struct server_global_vars {

FILE: src/auth/server/server_types.h
  type FCFSAuthClusterServerInfo (line 51) | typedef struct fcfs_auth_cluster_server_info {
  type FCFSAuthClusterServerArray (line 56) | typedef struct fcfs_auth_cluster_server_array {
  type db_user_info (line 61) | struct db_user_info
  type db_storage_pool_info (line 62) | struct db_storage_pool_info
  type ServerSessionFields (line 64) | typedef struct server_session_fields {
  type ServerSessionSubscriber (line 73) | typedef struct server_session_subscriber {
  type AuthServerTaskArg (line 83) | typedef struct server_task_arg {
  type AuthServerContext (line 101) | typedef struct auth_server_context {

FILE: src/auth/server/service_handler.c
  function service_handler_init (line 49) | int service_handler_init()
  function service_handler_destroy (line 55) | int service_handler_destroy()
  function service_task_finish_cleanup (line 60) | void service_task_finish_cleanup(struct fast_task_info *task)
  function check_user_priv (line 77) | static int check_user_priv(struct fast_task_info *task)
  function service_deal_user_login (line 129) | static int service_deal_user_login(struct fast_task_info *task)
  function service_deal_user_create (line 232) | static int service_deal_user_create(struct fast_task_info *task)
  function service_deal_user_passwd (line 268) | static int service_deal_user_passwd(struct fast_task_info *task)
  function service_parse_limit (line 296) | static int service_parse_limit(struct fast_task_info *task,
  function service_deal_user_list (line 306) | static int service_deal_user_list(struct fast_task_info *task)
  function service_deal_user_grant (line 388) | static int service_deal_user_grant(struct fast_task_info *task)
  function service_deal_user_remove (line 414) | static int service_deal_user_remove(struct fast_task_info *task)
  function spool_create_by_template (line 438) | static int spool_create_by_template(struct fast_task_info *task,
  function service_deal_spool_create (line 494) | static int service_deal_spool_create(struct fast_task_info *task)
  function service_deal_spool_list (line 576) | static int service_deal_spool_list(struct fast_task_info *task)
  function service_deal_spool_remove (line 683) | static int service_deal_spool_remove(struct fast_task_info *task)
  function service_deal_spool_set_quota (line 709) | static int service_deal_spool_set_quota(struct fast_task_info *task)
  function service_deal_spool_get_quota (line 738) | static int service_deal_spool_get_quota(struct fast_task_info *task)
  function service_deal_spool_grant (line 772) | static int service_deal_spool_grant(struct fast_task_info *task)
  function service_deal_spool_withdraw (line 830) | static int service_deal_spool_withdraw(struct fast_task_info *task)
  function service_deal_gpool_list (line 868) | static int service_deal_gpool_list(struct fast_task_info *task)
  function service_deal_cluster_stat (line 968) | static int service_deal_cluster_stat(struct fast_task_info *task)
  function service_process (line 1003) | static int service_process(struct fast_task_info *task)
  function service_deal_task (line 1084) | int service_deal_task(struct fast_task_info *task, const int stage)
  function create_session_for_access_fdir (line 1124) | static int create_session_for_access_fdir(ServerSessionEntry

FILE: src/auth/server/service_handler.h
  type fast_task_info (line 33) | struct fast_task_info
  type fast_task_info (line 34) | struct fast_task_info

FILE: src/auth/server/session_subscribe.c
  type ServerSessionSubscribeContext (line 31) | typedef struct server_session_subscribe_context {
  function set_session_subscribe_entry (line 44) | static void set_session_subscribe_entry(const ServerSessionEntry *session,
  function publish_entry_to_all_subscribers (line 69) | static int publish_entry_to_all_subscribers(
  function publish_session_to_all_subscribers (line 100) | static inline int publish_session_to_all_subscribers(
  function server_session_add_callback (line 109) | static void server_session_add_callback(ServerSessionEntry *session)
  function server_session_del_callback (line 120) | static void server_session_del_callback(ServerSessionEntry *session)
  type ServerSessionMatchParam (line 140) | typedef struct {
  function publish_matched_server_sessions (line 146) | static void publish_matched_server_sessions(
  function user_priv_change_callback (line 188) | static void user_priv_change_callback(const int64_t user_id,
  function pool_priv_change_callback (line 199) | static void pool_priv_change_callback(const int64_t user_id,
  function pool_quota_avail_change_callback (line 210) | static void pool_quota_avail_change_callback(
  function push_all_sessions_to_queue (line 227) | static int push_all_sessions_to_queue(ServerSessionSubscriber *subscriber)
  function subscriber_alloc_init_func (line 274) | int subscriber_alloc_init_func(ServerSessionSubscriber *subscriber, void...
  function session_subscribe_init (line 281) | int session_subscribe_init()
  function session_subscribe_destroy (line 311) | void session_subscribe_destroy()
  function ServerSessionSubscriber (line 315) | ServerSessionSubscriber *session_subscribe_alloc()
  function session_subscribe_register (line 321) | void session_subscribe_register(ServerSessionSubscriber *subscriber)
  function session_subscribe_unregister (line 328) | void session_subscribe_unregister(ServerSessionSubscriber *subscriber)
  function session_subscribe_free_entries (line 333) | void session_subscribe_free_entries(ServerSessionSubscribeEntry *entry)
  function session_subscribe_release (line 344) | void session_subscribe_release(ServerSessionSubscriber *subscriber)
  function session_subscribe_clear_session (line 356) | void session_subscribe_clear_session()

FILE: src/auth/server/session_subscribe.h
  type ServerSessionSubscribeEntry (line 23) | typedef struct auth_session_subscribe_entry {

FILE: src/common/fcfs_global.h
  type FCFSGlobalVars (line 22) | typedef struct fcfs_global_vars {

FILE: src/fuse/fcfs_fused.c
  type fuse_session (line 41) | struct fuse_session
  type fuse_session (line 44) | struct fuse_session
  type fuse_lowlevel_ops (line 45) | struct fuse_lowlevel_ops
  function parse_cmd_options (line 53) | static int parse_cmd_options(int argc, char *argv[])
  function process_cmdline (line 112) | static int process_cmdline(int argc, char *argv[], bool *continue_flag)
  function sig_usr1_handler (line 181) | static void sig_usr1_handler(int sig)
  function setup_user_signal_handler (line 225) | static int setup_user_signal_handler()
  function main (line 244) | int main(int argc, char *argv[])
  function setup_server_env (line 361) | static int setup_server_env(const char *config_filename)
  type fuse_session (line 400) | struct fuse_session
  type fuse_lowlevel_ops (line 401) | struct fuse_lowlevel_ops
  type fuse_args (line 403) | struct fuse_args
  function fuse_exit_handler (line 452) | static void fuse_exit_handler(int sig)
  function mblock_stat_task_func (line 461) | static int mblock_stat_task_func(void *args)
  function setup_mblock_stat_task (line 467) | static int setup_mblock_stat_task()

FILE: src/fuse/fuse_wrapper.c
  type fuse_conn_info_opts (line 34) | struct fuse_conn_info_opts
  type fast_mblock_man (line 35) | struct fast_mblock_man
  function set_operator_by_req (line 37) | static inline void set_operator_by_req(const struct fuse_ctx *fctx,
  function fill_entry_param (line 78) | static inline void fill_entry_param(const FDIRDEntryInfo *dentry,
  function fs_convert_inode (line 88) | static inline int fs_convert_inode(fuse_req_t req,
  function do_reply_attr (line 131) | static inline void do_reply_attr(fuse_req_t req, FDIRDEntryInfo *dentry)
  function fs_do_getattr (line 139) | static void fs_do_getattr(fuse_req_t req, fuse_ino_t ino,
  function fs_do_setattr (line 161) | void fs_do_setattr(fuse_req_t req, fuse_ino_t ino, struct stat *attr,
  function fs_do_lookup (line 294) | static void fs_do_lookup(fuse_req_t req, fuse_ino_t parent, const char *...
  function dentry_list_to_buff (line 323) | static int dentry_list_to_buff(fuse_req_t req, FCFSAPIOpendirSession *se...
  function fs_do_opendir (line 383) | static void fs_do_opendir(fuse_req_t req, fuse_ino_t ino,
  function do_readdir (line 414) | static void do_readdir(fuse_req_t req, fuse_ino_t ino, size_t size,
  function fs_do_readdirplus (line 464) | static void fs_do_readdirplus(fuse_req_t req, fuse_ino_t ino, size_t size,
  function fs_do_releasedir (line 470) | static void fs_do_releasedir(fuse_req_t req, fuse_ino_t ino,
  function do_open (line 484) | static int do_open(fuse_req_t req, FDIRDEntryInfo *dentry,
  function fs_do_access (line 519) | static void fs_do_access(fuse_req_t req, fuse_ino_t ino, int mask)
  function fs_do_create (line 537) | static void fs_do_create(fuse_req_t req, fuse_ino_t parent,
  function do_mknod (line 595) | static void do_mknod(fuse_req_t req, fuse_ino_t parent,
  function fs_do_mknod (line 629) | static void fs_do_mknod(fuse_req_t req, fuse_ino_t parent,
  function fs_do_mkdir (line 635) | static void fs_do_mkdir(fuse_req_t req, fuse_ino_t parent,
  function remove_dentry (line 642) | static int remove_dentry(fuse_req_t req, fuse_ino_t parent,
  function fs_do_rmdir (line 665) | static void fs_do_rmdir(fuse_req_t req, fuse_ino_t parent, const char *n...
  function fs_do_unlink (line 673) | static void fs_do_unlink(fuse_req_t req, fuse_ino_t parent, const char *...
  function fs_do_rename (line 681) | void fs_do_rename(fuse_req_t req, fuse_ino_t oldparent, const char *oldn...
  function fs_do_link (line 721) | static void fs_do_link(fuse_req_t req, fuse_ino_t ino,
  function fs_do_symlink (line 750) | static void fs_do_symlink(fuse_req_t req, const char *link,
  function fs_do_readlink (line 787) | static void fs_do_readlink(fuse_req_t req, fuse_ino_t ino)
  function fs_do_forget (line 803) | static void fs_do_forget(fuse_req_t req, fuse_ino_t ino, uint64_t nlookup)
  function fs_do_forget_multi (line 813) | static void fs_do_forget_multi(fuse_req_t req, size_t count,
  function fs_do_open (line 823) | static void fs_do_open(fuse_req_t req, fuse_ino_t ino,
  function fs_do_flush (line 867) | static void fs_do_flush(fuse_req_t req, fuse_ino_t ino,
  function fs_do_fsync (line 879) | static void fs_do_fsync(fuse_req_t req, fuse_ino_t ino,
  function fs_do_release (line 906) | static void fs_do_release(fuse_req_t req, fuse_ino_t ino,
  function fs_do_read (line 928) | static void fs_do_read(fuse_req_t req, fuse_ino_t ino, size_t size,
  function fs_do_write (line 974) | void fs_do_write(fuse_req_t req, fuse_ino_t ino, const char *buff,
  function fs_do_lseek (line 1008) | void fs_do_lseek(fuse_req_t req, fuse_ino_t ino, off_t offset,
  function fs_do_getlk (line 1028) | static void fs_do_getlk(fuse_req_t req, fuse_ino_t ino,
  function fs_do_setlk (line 1060) | static void fs_do_setlk(fuse_req_t req, fuse_ino_t ino,
  function fs_do_flock (line 1086) | static void fs_do_flock(fuse_req_t req, fuse_ino_t ino,
  function fs_do_statfs (line 1109) | static void fs_do_statfs(fuse_req_t req, fuse_ino_t ino)
  function fs_do_fallocate (line 1126) | static void fs_do_fallocate(fuse_req_t req, fuse_ino_t ino, int mode,
  function fs_do_setxattr (line 1144) | static void fs_do_setxattr(fuse_req_t req, fuse_ino_t ino, const char *n...
  function fs_do_removexattr (line 1169) | static void fs_do_removexattr(fuse_req_t req, fuse_ino_t ino,
  function fs_do_getxattr (line 1194) | static void fs_do_getxattr(fuse_req_t req, fuse_ino_t ino,
  function fs_do_listxattr (line 1249) | static void fs_do_listxattr(fuse_req_t req, fuse_ino_t ino, size_t size)
  function fs_do_init (line 1303) | static void fs_do_init(void *userdata, struct fuse_conn_info *conn)
  function fs_fuse_wrapper_init (line 1309) | int fs_fuse_wrapper_init(struct fuse_lowlevel_ops *ops)

FILE: src/fuse/fuse_wrapper.h
  type fuse_conn_info_opts (line 33) | struct fuse_conn_info_opts
  type fuse_lowlevel_ops (line 35) | struct fuse_lowlevel_ops

FILE: src/fuse/getgroups.c
  function get_last_id (line 28) | static inline int get_last_id(const char *buff, const char *tag_str,
  function fcfs_getgroups (line 52) | int fcfs_getgroups(const pid_t pid, const uid_t fsuid,
  function fcfs_get_groups (line 140) | int fcfs_get_groups(const pid_t pid, const uid_t fsuid,

FILE: src/fuse/global.c
  function load_fuse_config (line 51) | static int load_fuse_config(IniFullContext *ini_ctx)
  function load_additional_groups_config (line 151) | static void load_additional_groups_config(IniFullContext *ini_ctx)
  function additional_groups_config_to_string (line 182) | static void additional_groups_config_to_string(char *buff, const int size)
  function fcfs_fuse_global_init (line 218) | int fcfs_fuse_global_init(const char *config_filename)

FILE: src/fuse/global.h
  type FUSEAllowOthersMode (line 26) | typedef enum {
  type FUSEGlobalVars (line 32) | typedef struct {

FILE: src/fuse/groups_htable.c
  type FCFSGroupHashEntry (line 21) | typedef struct {
  type FCFSGroupOpContext (line 32) | typedef struct {
  function groups_htable_insert_callback (line 39) | static int groups_htable_insert_callback(SFShardingHashEntry *he,
  function fcfs_groups_htable_init (line 103) | int fcfs_groups_htable_init()
  function fcfs_groups_htable_insert (line 131) | int fcfs_groups_htable_insert(const pid_t pid, const uid_t uid,
  function fcfs_groups_htable_find (line 143) | int fcfs_groups_htable_find(const pid_t pid, const uid_t uid,

FILE: src/java/jni/com_fastken_fcfs_FCFSDirectory.c
  function jobject (line 6) | jobject JNICALL Java_com_fastken_fcfs_FCFSDirectory_next
  function Java_com_fastken_fcfs_FCFSDirectory_seek (line 31) | void JNICALL Java_com_fastken_fcfs_FCFSDirectory_seek
  function jlong (line 48) | jlong JNICALL Java_com_fastken_fcfs_FCFSDirectory_tell
  function Java_com_fastken_fcfs_FCFSDirectory_rewind (line 65) | void JNICALL Java_com_fastken_fcfs_FCFSDirectory_rewind
  function Java_com_fastken_fcfs_FCFSDirectory_close (line 82) | void JNICALL Java_com_fastken_fcfs_FCFSDirectory_close

FILE: src/java/jni/com_fastken_fcfs_FCFSFile.c
  function Java_com_fastken_fcfs_FCFSFile_close (line 7) | void JNICALL Java_com_fastken_fcfs_FCFSFile_close
  function throw_file_exception (line 30) | static inline void throw_file_exception(JNIEnv *env,
  function jobject (line 42) | jobject JNICALL Java_com_fastken_fcfs_FCFSFile_stat
  function jobject (line 60) | jobject JNICALL Java_com_fastken_fcfs_FCFSFile_statvfs
  function jbyteArray (line 82) | jbyteArray JNICALL Java_com_fastken_fcfs_FCFSFile_getxattr
  function jobject (line 135) | jobject JNICALL Java_com_fastken_fcfs_FCFSFile_listxattr
  function Java_com_fastken_fcfs_FCFSFile_sync (line 180) | void JNICALL Java_com_fastken_fcfs_FCFSFile_sync
  function Java_com_fastken_fcfs_FCFSFile_datasync (line 190) | void JNICALL Java_com_fastken_fcfs_FCFSFile_datasync
  function Java_com_fastken_fcfs_FCFSFile_write (line 216) | void JNICALL Java_com_fastken_fcfs_FCFSFile_write
  function jint (line 231) | jint JNICALL Java_com_fastken_fcfs_FCFSFile_read
  function jlong (line 248) | jlong JNICALL Java_com_fastken_fcfs_FCFSFile_lseek
  function Java_com_fastken_fcfs_FCFSFile_allocate (line 260) | void JNICALL Java_com_fastken_fcfs_FCFSFile_allocate
  function Java_com_fastken_fcfs_FCFSFile_truncate (line 269) | void JNICALL Java_com_fastken_fcfs_FCFSFile_truncate
  function jboolean (line 278) | jboolean JNICALL Java_com_fastken_fcfs_FCFSFile_lock
  function Java_com_fastken_fcfs_FCFSFile_unlock (line 301) | void JNICALL Java_com_fastken_fcfs_FCFSFile_unlock
  function Java_com_fastken_fcfs_FCFSFile_utimes (line 317) | void JNICALL Java_com_fastken_fcfs_FCFSFile_utimes
  function Java_com_fastken_fcfs_FCFSFile_chown (line 332) | void JNICALL Java_com_fastken_fcfs_FCFSFile_chown
  function Java_com_fastken_fcfs_FCFSFile_chmod (line 341) | void JNICALL Java_com_fastken_fcfs_FCFSFile_chmod
  function Java_com_fastken_fcfs_FCFSFile_setxattr (line 350) | void JNICALL Java_com_fastken_fcfs_FCFSFile_setxattr
  function Java_com_fastken_fcfs_FCFSFile_removexattr (line 371) | void JNICALL Java_com_fastken_fcfs_FCFSFile_removexattr
  function Java_com_fastken_fcfs_FCFSFile_chdir (line 384) | void JNICALL Java_com_fastken_fcfs_FCFSFile_chdir

FILE: src/java/jni/com_fastken_fcfs_FCFSPosixAPI.c
  function Java_com_fastken_fcfs_FCFSPosixAPI_init (line 7) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_init
  function Java_com_fastken_fcfs_FCFSPosixAPI_destroy (line 40) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_destroy
  function jobject (line 79) | jobject JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_opendir
  function jobject (line 97) | jobject JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_open
  function jstring (line 117) | jstring JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_getcwd
  function jobject (line 141) | jobject JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_stat
  function jstring (line 168) | jstring JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_readlink
  function jobject (line 185) | jobject JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_statvfs
  function jbyteArray (line 209) | jbyteArray JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_getxattr
  function jobject (line 278) | jobject JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_listxattr
  function Java_com_fastken_fcfs_FCFSPosixAPI_truncate (line 339) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_truncate
  function Java_com_fastken_fcfs_FCFSPosixAPI_link (line 351) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_link
  function Java_com_fastken_fcfs_FCFSPosixAPI_symlink (line 372) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_symlink
  function Java_com_fastken_fcfs_FCFSPosixAPI_rename (line 387) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_rename
  function Java_com_fastken_fcfs_FCFSPosixAPI_mknod (line 408) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_mknod
  function Java_com_fastken_fcfs_FCFSPosixAPI_mkfifo (line 420) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_mkfifo
  function Java_com_fastken_fcfs_FCFSPosixAPI_access (line 432) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_access
  function jboolean (line 444) | jboolean JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_exists
  function Java_com_fastken_fcfs_FCFSPosixAPI_utimes (line 463) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_utimes
  function Java_com_fastken_fcfs_FCFSPosixAPI_unlink (line 480) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_unlink
  function Java_com_fastken_fcfs_FCFSPosixAPI_mkdir (line 492) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_mkdir
  function Java_com_fastken_fcfs_FCFSPosixAPI_rmdir (line 504) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_rmdir
  function Java_com_fastken_fcfs_FCFSPosixAPI_chown (line 516) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_chown
  function Java_com_fastken_fcfs_FCFSPosixAPI_chmod (line 535) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_chmod
  function Java_com_fastken_fcfs_FCFSPosixAPI_chdir (line 547) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_chdir
  function Java_com_fastken_fcfs_FCFSPosixAPI_setxattr (line 559) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_setxattr
  function Java_com_fastken_fcfs_FCFSPosixAPI_removexattr (line 600) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_removexattr

FILE: src/java/jni/common.c
  function fcfs_jni_throw_exception (line 23) | void fcfs_jni_throw_exception(JNIEnv *env, const char *message)
  function fcfs_jni_throw_null_pointer_exception (line 34) | void fcfs_jni_throw_null_pointer_exception(JNIEnv *env)
  function fcfs_jni_throw_out_of_bounds_exception (line 45) | void fcfs_jni_throw_out_of_bounds_exception(JNIEnv *env, const int index)
  function fcfs_jni_throw_filesystem_exception (line 59) | void fcfs_jni_throw_filesystem_exception(JNIEnv *env,
  function jobject (line 121) | jobject fcfs_jni_convert_to_list(JNIEnv *env,
  function fcfs_jni_convert_open_flags (line 151) | int fcfs_jni_convert_open_flags(const int flags)
  function fcfs_jni_convert_setxattr_flags (line 184) | int fcfs_jni_convert_setxattr_flags(const int flags)

FILE: src/java/jni/global.c
  function Java_com_fastken_fcfs_FCFSPosixAPI_doInit (line 22) | void JNICALL Java_com_fastken_fcfs_FCFSPosixAPI_doInit
  function Java_com_fastken_fcfs_FCFSDirectory_doInit (line 46) | void JNICALL Java_com_fastken_fcfs_FCFSDirectory_doInit
  function Java_com_fastken_fcfs_FCFSDirectory_00024Entry_doInit (line 62) | void JNICALL Java_com_fastken_fcfs_FCFSDirectory_00024Entry_doInit
  function Java_com_fastken_fcfs_FCFSFile_doInit (line 69) | void JNICALL Java_com_fastken_fcfs_FCFSFile_doInit
  function Java_com_fastken_fcfs_FCFSFileStat_doInit (line 85) | void JNICALL Java_com_fastken_fcfs_FCFSFileStat_doInit
  function Java_com_fastken_fcfs_FCFSVFSStat_doInit (line 92) | void JNICALL Java_com_fastken_fcfs_FCFSVFSStat_doInit

FILE: src/java/jni/global.h
  type FCFSJNIGlobalVars (line 22) | typedef struct {

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSConstants.java
  class FCFSConstants (line 3) | public class FCFSConstants {

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSDirectory.java
  class FCFSDirectory (line 5) | public class FCFSDirectory {
    class Entry (line 6) | public static class Entry {
      method doInit (line 10) | private static native void doInit();
      method Entry (line 15) | public Entry(long inode, String name) {
      method getInode (line 20) | public long getInode() {
      method getName (line 24) | public String getName() {
    method doInit (line 29) | private static native void doInit();
    method next (line 35) | public native Entry next();
    method seek (line 36) | public native void seek(long loc);
    method tell (line 37) | public native long tell();
    method rewind (line 38) | public native void rewind();
    method close (line 39) | public native void close();
    method FCFSDirectory (line 43) | public FCFSDirectory(long handler) {
    method setHandler (line 47) | public void setHandler(long handler) {
    method getHandler (line 51) | public long getHandler() {

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSFile.java
  class FCFSFile (line 5) | public class FCFSFile {
    method doInit (line 7) | private static native void doInit();
    method close (line 13) | public native void close();
    method sync (line 14) | public native void sync();
    method datasync (line 15) | public native void datasync();
    method write (line 16) | public native void write(byte[] bs, int off, int len);
    method read (line 17) | public native int read(byte[] bs, int off, int len);
    method lseek (line 18) | public native long lseek(long offset, int whence);
    method allocate (line 19) | public native void allocate(int mode, long offset, long length);
    method truncate (line 20) | public native void truncate(long length);
    method stat (line 21) | public native FCFSFileStat stat();
    method lock (line 22) | public native boolean lock(long position, long length,
    method unlock (line 24) | public native void unlock(long position, long length);
    method utimes (line 25) | public native void utimes(long atime, long mtime);
    method chown (line 26) | public native void chown(int owner, int group);
    method chmod (line 27) | public native void chmod(int mode);
    method setxattr (line 28) | public native void setxattr(String name, byte[] bs,
    method removexattr (line 30) | public native void removexattr(String name);
    method getxattr (line 31) | public native byte[] getxattr(String name);
    method listxattr (line 32) | public native List<String> listxattr();
    method chdir (line 33) | public native void chdir();
    method statvfs (line 34) | public native FCFSVFSStat statvfs();
    method FCFSFile (line 38) | public FCFSFile(int fd) {
    method setFD (line 42) | public void setFD(int fd) {
    method getFD (line 46) | public int getFD() {
    method write (line 50) | public void write(byte[] bs) {
    method read (line 54) | public int read(byte[] bs) {
    method lock (line 58) | public boolean lock(long position, long length, boolean shared)
    method tryLock (line 64) | public boolean tryLock(long position, long length, boolean shared)
    method setxattr (line 70) | public void setxattr(String name, byte[] bs, int flags)
    method setxattr (line 75) | public void setxattr(String name, byte[] bs)

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSFileStat.java
  class FCFSFileStat (line 3) | public class FCFSFileStat {
    method doInit (line 4) | private static native void doInit();
    method FCFSFileStat (line 21) | public FCFSFileStat(long inode, int mode, int links, int uid, int gid,
    method getInode (line 36) | public long getInode() {
    method getMode (line 40) | public long getMode() {
    method getLinks (line 44) | public long getLinks() {
    method getUid (line 48) | public long getUid() {
    method getGid (line 52) | public long getGid() {
    method getRdev (line 56) | public long getRdev() {
    method getSize (line 60) | public long getSize() {
    method getAtime (line 64) | public long getAtime() {
    method getMtime (line 68) | public long getMtime() {
    method getCtime (line 72) | public long getCtime() {
    method toString (line 76) | public String toString() {

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSPosixAPI.java
  class FCFSPosixAPI (line 10) | public class FCFSPosixAPI {
    method doInit (line 15) | private static native void doInit();
    method init (line 17) | private native void init(String ns, String configFilename);
    method destroy (line 18) | private native void destroy();
    method opendir (line 20) | public native FCFSDirectory opendir(String path);
    method open (line 21) | public native FCFSFile open(String path, int flags, int mode);
    method getcwd (line 23) | public native String getcwd();
    method truncate (line 24) | public native void truncate(String path, long length);
    method stat (line 25) | public native FCFSFileStat stat(String path, boolean followlink);
    method link (line 26) | public native void link(String path1, String path2);
    method symlink (line 27) | public native void symlink(String link, String path);
    method readlink (line 28) | public native String readlink(String path);
    method mknod (line 29) | public native void mknod(String path, int mode, int dev);
    method mkfifo (line 30) | public native void mkfifo(String path, int mode);
    method access (line 31) | public native void access(String path, int mode);
    method exists (line 32) | public native boolean exists(String path);
    method utimes (line 33) | public native void utimes(String path, long atime, long mtime);
    method unlink (line 34) | public native void unlink(String path);
    method rename (line 35) | public native void rename(String path1, String path2);
    method mkdir (line 36) | public native void mkdir(String path, int mode);
    method rmdir (line 37) | public native void rmdir(String path);
    method chown (line 38) | public native void chown(String path, int owner, int group, boolean fo...
    method chmod (line 39) | public native void chmod(String path, int mode);
    method statvfs (line 40) | public native FCFSVFSStat statvfs(String path);
    method chdir (line 41) | public native void chdir(String path);
    method setxattr (line 42) | public native void setxattr(String path, String name, byte[] b,
    method removexattr (line 44) | public native void removexattr(String path, String name, boolean follo...
    method getxattr (line 45) | public native byte[] getxattr(String path, String name, boolean follow...
    method listxattr (line 46) | public native List<String> listxattr(String path, boolean followlink);
    method getLibraryFilename (line 50) | public static String getLibraryFilename() {
    method setLibraryFilename (line 59) | public static void setLibraryFilename(String filename) {
    method FCFSPosixAPI (line 73) | private FCFSPosixAPI(String ns, String configFilename) {
    method setHandler (line 77) | public void setHandler(long handler) {
    method getHandler (line 81) | public long getHandler() {
    method finalize (line 85) | protected void finalize() throws Throwable {
    method close (line 90) | private void close() {
    method getInstance (line 102) | public synchronized static FCFSPosixAPI getInstance(String ns, String ...
    method clearInstances (line 117) | public synchronized static void clearInstances() {
    method open (line 126) | public FCFSFile open(String path)
    method setxattr (line 132) | public void setxattr(String path, String name, byte[] b, int flags) {
    method setxattr (line 137) | public void setxattr(String path, String name, byte[] b) {
    method lsetxattr (line 143) | public void lsetxattr(String path, String name, byte[] b, int flags) {
    method lsetxattr (line 148) | public void lsetxattr(String path, String name, byte[] b) {
    method stat (line 154) | public FCFSFileStat stat(String path) {
    method lstat (line 159) | public FCFSFileStat lstat(String path) {
    method main (line 164) | public static void main(String[] args) throws Exception {

FILE: src/java/src/main/java/com/fastken/fcfs/FCFSVFSStat.java
  class FCFSVFSStat (line 3) | public class FCFSVFSStat {
    class Stat (line 4) | public static class Stat {
      method Stat (line 9) | public Stat(long total, long avail, long used) {
      method getTotal (line 15) | public long getTotal() {
      method getAvail (line 19) | public long getAvail() {
      method getUsed (line 23) | public long getUsed() {
      method toString (line 27) | public String toString() {
    method doInit (line 42) | private static native void doInit();
    method FCFSVFSStat (line 44) | public FCFSVFSStat(long spaceTotal, long spaceAvail, long spaceUsed,
    method getSpaceStat (line 51) | public Stat getSpaceStat() {
    method getInodeStat (line 55) | public Stat getInodeStat() {
    method toString (line 59) | public String toString() {

FILE: src/preload/api.c
  function preload_global_init (line 34) | __attribute__ ((constructor)) static void preload_global_init(void)
  function preload_global_destroy (line 92) | __attribute__ ((destructor)) static void preload_global_destroy(void)
  function do_open (line 129) | static inline int do_open(const char *path, int flags, int mode)
  function _open_ (line 144) | int _open_(const char *path, int flags, ...)
  function __open_nocancel (line 157) | int __open_nocancel(const char *path, int flags, ...)
  function open64 (line 170) | int open64(const char *path, int flags, ...)
  function __open (line 183) | int __open(const char *path, int flags, int mode)
  function __open_2_ (line 189) | int __open_2_(const char *path, int flags)
  function __open64_2_ (line 195) | int __open64_2_(const char *path, int flags)
  function do_creat (line 201) | static inline int do_creat(const char *path, mode_t mode)
  function _creat_ (line 210) | int _creat_(const char *path, mode_t mode)
  function creat64 (line 215) | int creat64(const char *path, mode_t mode)
  function do_truncate (line 220) | static inline int do_truncate(const char *path, off_t length)
  function _truncate_ (line 229) | int _truncate_(const char *path, off_t length)
  function truncate64 (line 234) | int truncate64(const char *path, off_t length)
  function lstat (line 239) | int lstat(const char *path, struct stat *buf)
  function do_lxstat (line 250) | static inline int do_lxstat(int ver, const char *path, struct stat *buf)
  function __lxstat_ (line 264) | int __lxstat_(int ver, const char *path, struct stat *buf)
  function __lxstat64 (line 269) | int __lxstat64(int ver, const char *path, struct stat64 *buf)
  function stat (line 274) | int stat(const char *path, struct stat *buf)
  function do_xstat (line 284) | static inline int do_xstat(int ver, const char *path, struct stat *buf)
  function __xstat_ (line 297) | int __xstat_(int ver, const char *path, struct stat *buf)
  function __xstat64 (line 302) | int __xstat64(int ver, const char *path, struct stat64 *buf)
  function link (line 307) | int link(const char *path1, const char *path2)
  function symlink (line 318) | int symlink(const char *link, const char *path)
  function readlink (line 327) | ssize_t readlink(const char *path, char *buff, size_t size)
  function mknod (line 336) | int mknod(const char *path, mode_t mode, dev_t dev)
  function __xmknod (line 345) | int __xmknod(int ver, const char *path, mode_t mode, dev_t *dev)
  function mkfifo (line 357) | int mkfifo(const char *path, mode_t mode)
  function access (line 369) | int access(const char *path, int mode)
  function eaccess (line 380) | int eaccess(const char *path, int mode)
  function euidaccess (line 393) | int euidaccess(const char *path, int mode)
  function utime (line 406) | int utime(const char *path, const struct utimbuf *times)
  function utimes (line 415) | int utimes(const char *path, const struct timeval times[2])
  function unlink (line 424) | int unlink(const char *path)
  function rename (line 433) | int rename(const char *path1, const char *path2)
  function mkdir (line 444) | int mkdir(const char *path, mode_t mode)
  function rmdir (line 453) | int rmdir(const char *path)
  function chown (line 462) | int chown(const char *path, uid_t owner, gid_t group)
  function lchown (line 471) | int lchown(const char *path, uid_t owner, gid_t group)
  function chmod (line 480) | int chmod(const char *path, mode_t mode)
  function do_statvfs (line 489) | static inline int do_statvfs(const char *path, struct statvfs *buf)
  function _statvfs_ (line 502) | int _statvfs_(const char *path, struct statvfs *buf)
  function statvfs64 (line 507) | int statvfs64(const char *path, struct statvfs64 *buf)
  function setxattr (line 512) | int setxattr(const char *path, const char *name,
  function lsetxattr (line 522) | int lsetxattr(const char *path, const char *name,
  function getxattr (line 532) | ssize_t getxattr(const char *path, const char *name, void *value, size_t...
  function lgetxattr (line 541) | ssize_t lgetxattr(const char *path, const char *name, void *value, size_...
  function listxattr (line 550) | ssize_t listxattr(const char *path, char *list, size_t size)
  function llistxattr (line 559) | ssize_t llistxattr(const char *path, char *list, size_t size)
  function removexattr (line 568) | int removexattr(const char *path, const char *name)
  function lremovexattr (line 577) | int lremovexattr(const char *path, const char *name)
  function chdir (line 586) | int chdir(const char *path)
  function chroot (line 608) | int chroot(const char *path)
  function DIR (line 617) | DIR *opendir(const char *path)
  function do_scandir (line 646) | static inline int do_scandir(const char *path, struct dirent ***namelist,
  function _scandir_ (line 659) | int _scandir_(const char *path, struct dirent ***namelist,
  function scandir64 (line 665) | int scandir64(const char * path, struct dirent64 ***namelist,
  function close (line 675) | int close(int fd)
  function fsync (line 687) | int fsync(int fd)
  function fdatasync (line 696) | int fdatasync(int fd)
  function write (line 705) | ssize_t write(int fd, const void *buff, size_t count)
  function do_pwrite (line 714) | static inline ssize_t do_pwrite(int fd, const void *buff,
  function _pwrite_ (line 724) | ssize_t _pwrite_(int fd, const void *buff, size_t count, off_t offset)
  function pwrite64 (line 729) | ssize_t pwrite64(int fd, const void *buff, size_t count, off_t offset)
  function writev (line 734) | ssize_t writev(int fd, const struct iovec *iov, int iovcnt)
  function do_pwritev (line 743) | static inline ssize_t do_pwritev(int fd, const struct iovec *iov,
  function _pwritev_ (line 753) | ssize_t _pwritev_(int fd, const struct iovec *iov, int iovcnt, off_t off...
  function pwritev64 (line 758) | ssize_t pwritev64(int fd, const struct iovec *iov, int iovcnt, off_t off...
  function read (line 763) | ssize_t read(int fd, void *buff, size_t count)
  function __read_chk (line 774) | ssize_t __read_chk(int fd, void *buff, size_t count, size_t size)
  function readahead (line 783) | ssize_t readahead(int fd, off64_t offset, size_t count)
  function do_pread (line 793) | static inline ssize_t do_pread(int fd, void *buff, size_t count, off_t o...
  function _pread_ (line 803) | ssize_t _pread_(int fd, void *buff, size_t count, off_t offset)
  function pread64 (line 808) | ssize_t pread64(int fd, void *buff, size_t count, off_t offset)
  function __pread_chk (line 813) | ssize_t __pread_chk(int fd, void *buff, size_t count,
  function __pread64_chk (line 823) | ssize_t __pread64_chk(int fd, void *buff, size_t count,
  function readv (line 833) | ssize_t readv(int fd, const struct iovec *iov, int iovcnt)
  function do_preadv (line 843) | static inline ssize_t do_preadv(int fd, const struct iovec *iov,
  function _preadv_ (line 853) | ssize_t _preadv_(int fd, const struct iovec *iov, int iovcnt, off_t offset)
  function preadv64 (line 859) | ssize_t preadv64(int fd, const struct iovec *iov, int iovcnt, off_t offset)
  function off_t (line 865) | static inline off_t do_lseek(int fd, off_t offset, int whence)
  function off_t (line 874) | off_t _lseek_(int fd, off_t offset, int whence)
  function off_t (line 880) | off_t __lseek(int fd, off_t offset, int whence)
  function off_t (line 886) | off_t lseek64(int fd, off_t offset, int whence)
  function do_fallocate (line 892) | static inline int do_fallocate(int fd, int mode, off_t offset, off_t len...
  function _fallocate_ (line 901) | int _fallocate_(int fd, int mode, off_t offset, off_t length)
  function fallocate64 (line 906) | int fallocate64(int fd, int mode, off_t offset, off_t length)
  function do_ftruncate (line 911) | static inline int do_ftruncate(int fd, off_t length)
  function _ftruncate_ (line 920) | int _ftruncate_(int fd, off_t length)
  function ftruncate64 (line 925) | int ftruncate64(int fd, off_t length)
  function fstat (line 930) | int fstat(int fd, struct stat *buf)
  function do_fxstat (line 940) | static inline int do_fxstat(int ver, int fd, struct stat *buf)
  function __fxstat_ (line 953) | int __fxstat_(int ver, int fd, struct stat *buf)
  function __fxstat64 (line 959) | int __fxstat64(int ver, int fd, struct stat64 *buf)
  function flock (line 965) | int flock(int fd, int operation)
  function do_fcntl (line 975) | static int do_fcntl(int fd, int cmd, void *arg)
  function _fcntl_ (line 1004) | int _fcntl_(int fd, int cmd, ...)
  function fcntl64 (line 1017) | int fcntl64(int fd, int cmd, ...)
  function futimes (line 1030) | int futimes(int fd, const struct timeval times[2])
  function futimens (line 1042) | int futimens(int fd, const struct timespec times[2])
  function fchown (line 1054) | int fchown(int fd, uid_t owner, gid_t group)
  function fchmod (line 1063) | int fchmod(int fd, mode_t mode)
  function fsetxattr (line 1072) | int fsetxattr(int fd, const char *name, const
  function fgetxattr (line 1082) | ssize_t fgetxattr(int fd, const char *name, void *value, size_t size)
  function flistxattr (line 1091) | ssize_t flistxattr(int fd, char *list, size_t size)
  function fremovexattr (line 1100) | int fremovexattr(int fd, const char *name)
  function fchdir (line 1109) | int fchdir(int fd)
  function do_fstatvfs (line 1128) | static inline int do_fstatvfs(int fd, struct statvfs *buf)
  function _fstatvfs_ (line 1141) | int _fstatvfs_(int fd, struct statvfs *buf)
  function fstatvfs64 (line 1146) | int fstatvfs64(int fd, struct statvfs64 *buf)
  function dup (line 1151) | int dup(int fd)
  function dup2 (line 1161) | int dup2(int fd1, int fd2)
  function DIR (line 1196) | DIR *fdopendir(int fd)
  function symlinkat (line 1224) | int symlinkat(const char *link, int fd, const char *path)
  function do_openat (line 1233) | static inline int do_openat(int fd, const char *path, int flags, int mode)
  function _openat_ (line 1243) | int _openat_(int fd, const char *path, int flags, ...)
  function openat64 (line 1256) | int openat64(int fd, const char *path, int flags, ...)
  function __openat_2_ (line 1269) | int __openat_2_(int fd, const char *path, int flags)
  function __openat64_2 (line 1275) | int __openat64_2(int fd, const char *path, int flags)
  function fstatat (line 1281) | int fstatat(int fd, const char *path, struct stat *buf, int flags)
  function do_fxstatat (line 1294) | static inline int do_fxstatat(int ver, int fd,
  function __fxstatat_ (line 1308) | int __fxstatat_(int ver, int fd, const char *path,
  function __fxstatat64 (line 1314) | int __fxstatat64(int ver, int fd, const char *path,
  function readlinkat (line 1320) | ssize_t readlinkat(int fd, const char *path, char *buff, size_t size)
  function mknodat (line 1329) | int mknodat(int fd, const char *path, mode_t mode, dev_t dev)
  function __xmknodat (line 1338) | int __xmknodat(int ver, int fd, const char *path, mode_t mode, dev_t *dev)
  function mkfifoat (line 1350) | int mkfifoat(int fd, const char *path, mode_t mode)
  function faccessat (line 1362) | int faccessat(int fd, const char *path, int mode, int flags)
  function futimesat (line 1372) | int futimesat(int fd, const char *path, const struct timeval times[2])
  function utimensat (line 1381) | int utimensat(int fd, const char *path, const struct timespec times[2], ...
  function unlinkat (line 1390) | int unlinkat(int fd, const char *path, int flags)
  function mkdirat (line 1399) | int mkdirat(int fd, const char *path, mode_t mode)
  function fchownat (line 1408) | int fchownat(int fd, const char *path, uid_t owner, gid_t group, int flags)
  function fchmodat (line 1417) | int fchmodat(int fd, const char *path, mode_t mode, int flags)
  function linkat (line 1426) | int linkat(int fd1, const char *path1, int fd2, const char *path2, int f...
  function renameat (line 1437) | int renameat(int fd1, const char *path1, int fd2, const char *path2)
  function renameat2 (line 1448) | int renameat2(int fd1, const char *path1, int fd2,
  function do_scandirat (line 1460) | static inline int do_scandirat(int fd, const char *path,
  function _scandirat_ (line 1475) | int _scandirat_(int fd, const char *path, struct dirent ***namelist,
  function scandirat64 (line 1481) | int scandirat64(int fd, const char *path, struct dirent64 ***namelist,
  function closedir (line 1515) | int closedir(DIR *dirp)
  type dirent (line 1538) | struct dirent
  type dirent (line 1556) | struct dirent
  type dirent64 (line 1562) | struct dirent64
  type dirent64 (line 1565) | struct dirent64
  function do_readdir_r (line 1568) | static inline int do_readdir_r(DIR *dirp, struct dirent *entry,
  function _readdir_r_ (line 1588) | int _readdir_r_(DIR *dirp, struct dirent *entry, struct dirent **result)
  function readdir64_r (line 1594) | int readdir64_r(DIR *dirp, struct dirent64 *entry, struct dirent64 **res...
  function seekdir (line 1600) | void seekdir(DIR *dirp, long loc)
  function telldir (line 1615) | long telldir(DIR *dirp)
  function rewinddir (line 1633) | void rewinddir(DIR *dirp)
  function dirfd (line 1648) | int dirfd(DIR *dirp)
  function vdprintf (line 1666) | int vdprintf(int fd, const char *format, va_list ap)
  function dprintf (line 1678) | int dprintf(int fd, const char *format, ...)
  function do_lockf (line 1689) | static inline int do_lockf(int fd, int cmd, off_t len)
  function _lockf_ (line 1702) | int _lockf_(int fd, int cmd, off_t len)
  function lockf64 (line 1707) | int lockf64(int fd, int cmd, off_t len)
  function do_posix_fallocate (line 1712) | static inline int do_posix_fallocate(int fd, off_t offset, off_t len)
  function _posix_fallocate_ (line 1725) | int _posix_fallocate_(int fd, off_t offset, off_t len)
  function posix_fallocate64 (line 1730) | int posix_fallocate64(int fd, off_t offset, off_t len)
  function _posix_fadvise_ (line 1735) | int _posix_fadvise_(int fd, off_t offset, off_t len, int advice)
  function posix_fadvise64 (line 1749) | int posix_fadvise64(int fd, off_t offset, off_t len, int advice)
  function unsetenv (line 1754) | int unsetenv(const char *name)
  function clearenv (line 1765) | int clearenv(void)
  function FILE (line 1778) | static inline FILE *do_fopen(const char *path, const char *mode)
  function FILE (line 1809) | FILE *_fopen_(const char *path, const char *mode)
  function FILE (line 1817) | FILE *fopen64(const char *path, const char *mode)
  function FILE (line 1824) | FILE *_IO_fdopen(int fd, const char *mode)
  function FILE (line 1854) | FILE *fdopen(int fd, const char *mode)
  function FILE (line 1859) | FILE *_freopen_(const char *path, const char *mode, FILE *fp)
  function FILE (line 1886) | FILE *freopen64(const char *path, const char *mode, FILE *fp)
  function fclose (line 1907) | int fclose(FILE *fp)
  function fcloseall (line 1930) | int fcloseall()
  function flockfile (line 1945) | void flockfile(FILE *fp)
  function ftrylockfile (line 1961) | int ftrylockfile(FILE *fp)
  function funlockfile (line 1980) | void funlockfile(FILE *fp)
  function fseek (line 1996) | int fseek(FILE *fp, long offset, int whence)
  function _fseeko_ (line 2017) | int _fseeko_(FILE *fp, off_t offset, int whence)
  function fseeko64 (line 2039) | int fseeko64(FILE *fp, off_t offset, int whence)
  function __fseeko64 (line 2045) | int __fseeko64(FILE *fp, off_t offset, int whence)
  function ftell (line 2051) | long ftell(FILE *fp)
  function _IO_ftell (line 2073) | long _IO_ftell(FILE *fp)
  function off_t (line 2078) | static inline off_t do_ftello(FILE *fp)
  function off_t (line 2098) | off_t _ftello_(FILE *fp)
  function off_t (line 2104) | off_t ftello64(FILE *fp)
  function off_t (line 2110) | off_t __ftello64(FILE *fp)
  function rewind (line 2116) | void rewind(FILE *fp)
  function _fgetpos_ (line 2134) | int _fgetpos_(FILE *fp, fpos_t *pos)
  function fgetpos64 (line 2155) | int fgetpos64(FILE *fp, fpos_t *pos)
  function _IO_fgetpos (line 2160) | int _IO_fgetpos(FILE *fp, fpos_t *pos)
  function _IO_fgetpos64 (line 2165) | int _IO_fgetpos64(FILE *fp, fpos_t *pos)
  function _fsetpos_ (line 2170) | int _fsetpos_(FILE *fp, const fpos_t *pos)
  function fsetpos64 (line 2191) | int fsetpos64(FILE *fp, const fpos_t *pos)
  function _IO_fsetpos (line 2196) | int _IO_fsetpos(FILE *fp, const fpos_t *pos)
  function _IO_fsetpos64 (line 2201) | int _IO_fsetpos64(FILE *fp, const fpos_t *pos)
  function fgetc_unlocked (line 2206) | int fgetc_unlocked(FILE *fp)
  function fputc_unlocked (line 2227) | int fputc_unlocked(int c, FILE *fp)
  function getc_unlocked (line 2246) | int getc_unlocked(FILE *fp)
  function putc_unlocked (line 2265) | int putc_unlocked(int c, FILE *fp)
  function clearerr_unlocked (line 2284) | void clearerr_unlocked(FILE *fp)
  function feof_unlocked (line 2300) | int feof_unlocked(FILE *fp)
  function _IO_feof_unlocked (line 2324) | int _IO_feof_unlocked(FILE *fp)
  function ferror_unlocked (line 2329) | int ferror_unlocked(FILE *fp)
  function _IO_ferror_unlocked (line 2353) | int _IO_ferror_unlocked(FILE *fp)
  function fileno_unlocked (line 2358) | int fileno_unlocked(FILE *fp)
  function fflush_unlocked (line 2379) | int fflush_unlocked(FILE *fp)
  function fread_unlocked (line 2402) | size_t fread_unlocked(void *buff, size_t size, size_t n, FILE *fp)
  function fwrite_unlocked (line 2430) | size_t fwrite_unlocked(const void *buff, size_t size, size_t n, FILE *fp)
  function __libc_readline_unlocked (line 2473) | ssize_t __libc_readline_unlocked (FILE *fp, char *buff, size_t size)
  function fputs_unlocked (line 2496) | int fputs_unlocked(const char *s, FILE *fp)
  function clearerr (line 2515) | void clearerr(FILE *fp)
  function _IO_feof (line 2531) | int _IO_feof(FILE *fp)
  function _feof_ (line 2553) | int _feof_(FILE *fp)
  function _ferror_ (line 2558) | int _ferror_(FILE *fp)
  function _IO_ferror (line 2579) | int _IO_ferror(FILE *fp)
  function fileno (line 2584) | int fileno(FILE *fp)
  function fgetc (line 2605) | int fgetc(FILE *fp)
  function getc (line 2651) | int getc(FILE *fp)
  function ungetc (line 2672) | int ungetc(int c, FILE *fp)
  function fputc (line 2692) | int fputc(int c, FILE *fp)
  function fputs (line 2711) | int fputs(const char *s, FILE *fp)
  function putc (line 2734) | int putc(int c, FILE *fp)
  function fread (line 2753) | size_t fread(void *buff, size_t size, size_t nmemb, FILE *fp)
  function fwrite (line 2776) | size_t fwrite(const void *buff, size_t size, size_t nmemb, FILE *fp)
  function vfprintf (line 2796) | int vfprintf(FILE *fp, const char *format, va_list ap)
  function fprintf (line 2815) | int fprintf(FILE *fp, const char *format, ...)
  function __vfprintf_chk (line 2827) | int __vfprintf_chk(FILE *fp, int flag, const char *format, va_list ap)
  function __fprintf_chk (line 2848) | int __fprintf_chk(FILE *fp, int flag, const char *format, ...)
  function getdelim (line 2860) | ssize_t getdelim(char **line, size_t *size, int delim, FILE *fp)
  function __getdelim (line 2882) | ssize_t __getdelim(char **line, size_t *size, int delim, FILE *fp)
  function getline (line 2888) | ssize_t getline(char **line, size_t *size, FILE *fp)
  function _IO_getline (line 2908) | ssize_t _IO_getline(char **line, size_t *size, FILE *fp)
  function vfscanf (line 2913) | int vfscanf(FILE *fp, const char *format, va_list ap)
  function fscanf (line 2936) | int fscanf(FILE *fp, const char *format, ...)
  function setvbuf (line 2948) | int setvbuf(FILE *fp, char *buf, int mode, size_t size)
  function _IO_setvbuf (line 2968) | int _IO_setvbuf(FILE *fp, char *buf, int mode, size_t size)
  function setbuf (line 2973) | void setbuf(FILE *fp, char *buf)
  function setbuffer (line 2989) | void setbuffer(FILE *fp, char *buf, size_t size)
  function _IO_setbuffer (line 3005) | void _IO_setbuffer(FILE *fp, char *buf, size_t size)
  function setlinebuf (line 3010) | void setlinebuf(FILE *fp)
  function fflush (line 3026) | int fflush(FILE *fp)
  function _IO_fflush (line 3049) | int _IO_fflush(FILE *fp)
  function __uflow (line 3054) | int __uflow(FILE *fp)
  function __overflow (line 3073) | int __overflow(FILE *fp, int ch)

FILE: src/preload/api.h
  type dirent (line 42) | struct dirent
  type dirent64 (line 44) | struct dirent64
  type dirent (line 46) | struct dirent
  type dirent (line 46) | struct dirent
  type dirent64 (line 49) | struct dirent64
  type dirent64 (line 49) | struct dirent64
  type iovec (line 72) | struct iovec
  type iovec (line 74) | struct iovec
  type iovec (line 77) | struct iovec
  type iovec (line 94) | struct iovec
  type iovec (line 96) | struct iovec
  type iovec (line 99) | struct iovec
  type stat (line 118) | struct stat
  type stat64 (line 120) | struct stat64
  type stat (line 122) | struct stat
  type timeval (line 130) | struct timeval
  type timespec (line 132) | struct timespec
  type statvfs (line 149) | struct statvfs
  type statvfs64 (line 151) | struct statvfs64
  type stat (line 175) | struct stat
  type stat64 (line 179) | struct stat64
  type stat (line 181) | struct stat
  type timeval (line 193) | struct timeval
  type timespec (line 196) | struct timespec
  type dirent (line 213) | struct dirent
  type dirent64 (line 217) | struct dirent64
  type dirent64 (line 218) | struct dirent64
  type dirent64 (line 219) | struct dirent64
  type dirent64 (line 220) | struct dirent64
  type stat (line 244) | struct stat
  type stat64 (line 247) | struct stat64
  type stat (line 249) | struct stat
  type stat (line 251) | struct stat
  type stat64 (line 254) | struct stat64
  type stat (line 256) | struct stat
  type utimbuf (line 276) | struct utimbuf
  type timeval (line 278) | struct timeval
  type statvfs (line 294) | struct statvfs
  type statvfs64 (line 296) | struct statvfs64
  type dirent (line 328) | struct dirent
  type dirent64 (line 332) | struct dirent64
  type dirent64 (line 333) | struct dirent64
  type dirent64 (line 334) | struct dirent64
  type dirent64 (line 335) | struct dirent64

FILE: src/preload/global.c
  function dlsym_papi (line 53) | static int dlsym_papi()
  function dlsym_capi (line 111) | static int dlsym_capi()
  function dlsym_all (line 173) | static inline int dlsym_all()
  function fcfs_preload_global_init (line 184) | int fcfs_preload_global_init()

FILE: src/preload/types.h
  type DIR (line 22) | typedef struct __dirstream DIR;
  type FCFSPreloadDIRWrapper (line 28) | typedef struct fcfs_preload_dir_wrapper {
  type FCFSPreloadFILEWrapper (line 33) | typedef struct fcfs_preload_file_wrapper {
  type FCFSPreloadGlobalVars (line 38) | typedef struct fcfs_preload_global_vars {

FILE: src/tools/fcfs_active_test.c
  function usage (line 28) | static void usage(char *argv[])
  function main (line 36) | int main(int argc, char *argv[])

FILE: src/tools/fcfs_pool_stat.c
  function usage (line 29) | static void usage(char *argv[])
  function main (line 35) | int main(int argc, char *argv[])

FILE: src/vote/client/client_func.c
  function fcfs_vote_client_do_init_ex (line 24) | static int fcfs_vote_client_do_init_ex(FCFSVoteClientContext *client_ctx,
  function fcfs_vote_client_log_config_ex (line 52) | void fcfs_vote_client_log_config_ex(FCFSVoteClientContext *client_ctx,
  function fcfs_vote_client_load_from_file_ex1 (line 68) | int fcfs_vote_client_load_from_file_ex1(FCFSVoteClientContext *client_ctx,
  function fcfs_vote_client_init_ex2 (line 93) | int fcfs_vote_client_init_ex2(FCFSVoteClientContext *client_ctx,
  function fcfs_vote_client_init_for_server (line 107) | int fcfs_vote_client_init_for_server(IniFullContext *ini_ctx,
  function fcfs_vote_client_destroy_ex (line 123) | void fcfs_vote_client_destroy_ex(FCFSVoteClientContext *client_ctx)

FILE: src/vote/client/client_func.h
  function fcfs_vote_client_load_from_file_ex (line 52) | static inline int fcfs_vote_client_load_from_file_ex(FCFSVoteClientContext
  function fcfs_vote_client_init_ex1 (line 64) | static inline int fcfs_vote_client_init_ex1(FCFSVoteClientContext *clien...

FILE: src/vote/client/client_global.h
  type FCFSVoteClientGlobalVars (line 23) | typedef struct fcfs_vote_client_global_vars {

FILE: src/vote/client/client_proto.c
  function get_spec_connection (line 26) | static inline int get_spec_connection(FCFSVoteClientContext *client_ctx,
  function make_connection (line 34) | static inline int make_connection(FCFSVoteClientContext *client_ctx,
  function get_connection (line 42) | static int get_connection(FCFSVoteClientContext *client_ctx,
  function vote_client_proto_get_master_connection_ex (line 74) | int vote_client_proto_get_master_connection_ex(FCFSVoteClientContext
  function fcfs_vote_client_cluster_stat_ex (line 115) | int fcfs_vote_client_cluster_stat_ex(FCFSVoteClientContext *client_ctx,
  function vote_client_proto_join_ex (line 211) | int vote_client_proto_join_ex(FCFSVoteClientContext *client_ctx,
  function vote_client_proto_get_vote_ex (line 245) | int vote_client_proto_get_vote_ex(FCFSVoteClientContext *client_ctx,
  function vote_client_proto_notify_next_leader_ex (line 273) | int vote_client_proto_notify_next_leader_ex(FCFSVoteClientContext *clien...
  function vote_client_proto_active_check_ex (line 294) | int vote_client_proto_active_check_ex(FCFSVoteClientContext
  function fcfs_vote_client_get_vote_ex (line 316) | int fcfs_vote_client_get_vote_ex(FCFSVoteClientContext *client_ctx,
  function fcfs_vote_client_notify_next_leader_ex (line 341) | int fcfs_vote_client_notify_next_leader_ex(FCFSVoteClientContext

FILE: src/vote/client/client_proto.h
  type FCFSVoteClientClusterStatEntry (line 26) | typedef struct fcfs_vote_client_cluster_stat_ex_entry {
  type FCFSVoteClientJoinRequest (line 34) | typedef struct fcfs_vote_client_join_request {
  function vote_client_proto_pre_set_next_leader_ex (line 60) | static inline int vote_client_proto_pre_set_next_leader_ex(
  function vote_client_proto_commit_next_leader_ex (line 67) | static inline int vote_client_proto_commit_next_leader_ex(
  function vote_client_proto_close_connection_ex (line 77) | static inline void vote_client_proto_close_connection_ex(
  function fcfs_vote_client_join_ex (line 83) | static inline int fcfs_vote_client_join_ex(FCFSVoteClientContext *client...

FILE: src/vote/client/client_types.h
  type FCFSVoteClientServerEntry (line 27) | typedef struct fcfs_vote_client_server_entry {
  type FCFSVoteClientContext (line 33) | typedef struct fcfs_vote_client_context {

FILE: src/vote/client/tools/fvote_cluster_stat.c
  function usage (line 27) | static void usage(char *argv[])
  function output (line 33) | static void output(FCFSVoteClientClusterStatEntry *stats, const int count)
  function main (line 50) | int main(int argc, char *argv[])

FILE: src/vote/common/vote_global.h
  type FCFSVoteGlobalVars (line 22) | typedef struct fcfs_vote_global_vars {

FILE: src/vote/common/vote_proto.c
  function fcfs_vote_proto_init (line 18) | void fcfs_vote_proto_init()

FILE: src/vote/common/vote_proto.h
  type SFCommonProtoHeader (line 47) | typedef SFCommonProtoHeader  FCFSVoteProtoHeader;
  type FCFSVoteProtoClientJoinReq (line 49) | typedef struct fcfs_vote_proto_client_join_req {
  type SFProtoGetServerResp (line 60) | typedef SFProtoGetServerResp FCFSVoteProtoGetServerResp;
  type FCFSVoteProtoGetServerStatusReq (line 62) | typedef struct fcfs_vote_proto_get_server_status_req {
  type FCFSVoteProtoGetServerStatusResp (line 68) | typedef struct fcfs_vote_proto_get_server_status_resp {
  type FCFSVoteProtoJoinMasterReq (line 74) | typedef struct fcfs_vote_proto_join_master_req {
  type FCFSVoteProtoClusterStatRespBodyHeader (line 80) | typedef struct fcfs_vote_proto_cluster_stat_resp_body_header {
  type FCFSVoteProtoClusterStatRespBodyPart (line 85) | typedef struct fcfs_vote_proto_cluster_stat_resp_body_part {

FILE: src/vote/server/cluster_handler.c
  function cluster_handler_init (line 47) | int cluster_handler_init()
  function cluster_handler_destroy (line 52) | int cluster_handler_destroy()
  function cluster_recv_timeout_callback (line 57) | int cluster_recv_timeout_callback(struct fast_task_info *task)
  function cluster_task_finish_cleanup (line 71) | void cluster_task_finish_cleanup(struct fast_task_info *task)
  function cluster_check_config_sign (line 94) | static int cluster_check_config_sign(struct fast_task_info *task,
  function cluster_deal_get_server_status (line 116) | static int cluster_deal_get_server_status(struct fast_task_info *task)
  function cluster_deal_join_master (line 147) | static int cluster_deal_join_master(struct fast_task_info *task)
  function cluster_deal_ping_master (line 206) | static int cluster_deal_ping_master(struct fast_task_info *task)
  function cluster_deal_next_master (line 234) | static int cluster_deal_next_master(struct fast_task_info *task)
  function cluster_process (line 268) | static int cluster_process(struct fast_task_info *task)
  function cluster_deal_task (line 321) | int cluster_deal_task(struct fast_task_info *task, const int stage)

FILE: src/vote/server/cluster_handler.h
  type fast_task_info (line 34) | struct fast_task_info
  type fast_task_info (line 35) | struct fast_task_info
  type fast_task_info (line 36) | struct fast_task_info

FILE: src/vote/server/cluster_info.c
  function init_cluster_server_array (line 23) | static int init_cluster_server_array()
  function find_myself_in_cluster_config (line 51) | static int find_myself_in_cluster_config(const char *filename)
  function FCFSVoteClusterServerInfo (line 126) | FCFSVoteClusterServerInfo *fcfs_vote_get_server_by_id(const int server_id)
  function cluster_info_init (line 138) | int cluster_info_init(const char *cluster_config_filename)

FILE: src/vote/server/cluster_relationship.c
  type FCFSVoteClusterServerStatus (line 29) | typedef struct fcfs_vote_cluster_server_status {
  type FCFSVoteClusterServerDetectEntry (line 35) | typedef struct fcfs_vote_cluster_server_detect_entry {
  type FCFSVoteClusterServerDetectArray (line 40) | typedef struct fcfs_vote_cluster_server_detect_array {
  type FCFSVoteClusterRelationshipContext (line 47) | typedef struct fcfs_vote_cluster_relationship_context {
  function proto_get_server_status (line 63) | static int proto_get_server_status(ConnectionInfo *conn,
  function init_inactive_server_array (line 124) | static void init_inactive_server_array()
  function cluster_unset_master (line 144) | static inline bool cluster_unset_master(FCFSVoteClusterServerInfo *master)
  function proto_join_master (line 149) | static int proto_join_master(ConnectionInfo *conn, const int network_tim...
  function proto_ping_master (line 176) | static int proto_ping_master(ConnectionInfo *conn, const int network_tim...
  function cluster_cmp_server_status (line 194) | static int cluster_cmp_server_status(const void *p1, const void *p2)
  function cluster_get_server_status_ex (line 213) | static int cluster_get_server_status_ex(FCFSVoteClusterServerStatus
  function do_check_brainsplit (line 240) | static int do_check_brainsplit(FCFSVoteClusterServerInfo *cs)
  function cluster_check_brainsplit (line 270) | static int cluster_check_brainsplit(int *inactive_count)
  function master_check (line 300) | static int master_check()
  function cluster_get_master (line 330) | static int cluster_get_master(FCFSVoteClusterServerStatus *server_status,
  function do_notify_master_changed (line 401) | static int do_notify_master_changed(FCFSVoteClusterServerInfo *cs,
  function cluster_relationship_pre_set_master (line 437) | int cluster_relationship_pre_set_master(FCFSVoteClusterServerInfo *master)
  function cluster_relationship_set_master (line 456) | static int cluster_relationship_set_master(FCFSVoteClusterServerInfo
  function cluster_relationship_commit_master (line 504) | int cluster_relationship_commit_master(FCFSVoteClusterServerInfo *master)
  function cluster_relationship_trigger_reselect_master (line 529) | void cluster_relationship_trigger_reselect_master()
  function cluster_notify_next_master (line 543) | static int cluster_notify_next_master(FCFSVoteClusterServerInfo *cs,
  function cluster_commit_next_master (line 561) | static int cluster_commit_next_master(FCFSVoteClusterServerInfo *cs,
  function notify_next_master (line 578) | static int notify_next_master(cluster_notify_next_master_func notify_func,
  function cluster_notify_master_changed (line 609) | static inline int cluster_notify_master_changed(
  function cluster_select_master (line 629) | static int cluster_select_master()
  function cluster_ping_master (line 759) | static int cluster_ping_master(FCFSVoteClusterServerInfo *master,
  function cluster_relationship_init (line 880) | int cluster_relationship_init()
  function cluster_relationship_destroy (line 904) | int cluster_relationship_destroy()
  function cluster_relationship_add_to_inactive_sarray (line 909) | void cluster_relationship_add_to_inactive_sarray(FCFSVoteClusterServerIn...
  function cluster_relationship_remove_from_inactive_sarray (line 944) | void cluster_relationship_remove_from_inactive_sarray(FCFSVoteClusterSer...

FILE: src/vote/server/common_handler.c
  function fcfs_vote_get_cmd_log_level (line 39) | static int fcfs_vote_get_cmd_log_level(const int cmd)
  function common_handler_init (line 52) | void common_handler_init()
  function fcfs_vote_deal_get_master (line 68) | int fcfs_vote_deal_get_master(struct fast_task_info *task,

FILE: src/vote/server/common_handler.h
  type fast_task_info (line 33) | struct fast_task_info

FILE: src/vote/server/fcfs_voted.c
  function process_cmdline (line 56) | static int process_cmdline(int argc, char *argv[], bool *continue_flag)
  function main (line 104) | int main(int argc, char *argv[])
  function setup_server_env (line 211) | static int setup_server_env(const char *config_filename)

FILE: src/vote/server/server_func.c
  function log_cluster_server_config (line 33) | static void log_cluster_server_config()
  function server_log_configs (line 47) | static void server_log_configs()
  function load_master_election_config (line 77) | static int load_master_election_config(const char *cluster_filename)
  function load_cluster_config (line 106) | static int load_cluster_config(IniFullContext *ini_ctx,
  function server_load_config (line 133) | int server_load_config(const char *filename)

FILE: src/vote/server/server_global.h
  type VoteServerGlobalVars (line 25) | typedef struct server_global_vars {

FILE: src/vote/server/server_types.h
  type FCFSVoteClusterServerInfo (line 44) | typedef struct fcfs_vote_cluster_server_info {
  type FCFSVoteClusterServerArray (line 49) | typedef struct fcfs_vote_cluster_server_array {
  type FCFSVoteServicePeerInfo (line 54) | typedef struct fcfs_vote_service_peer_info {
  type VoteServerTaskArg (line 60) | typedef struct server_task_arg {

FILE: src/vote/server/service_group_htable.c
  type FCFSVoteSharedLockArray (line 23) | typedef struct fcfs_vote_shared_lock_array {
  type FCFSVoteServiceGroupHtable (line 28) | typedef struct fcfs_vote_service_group_htable {
  type FCFSVoteServiceGroupContext (line 33) | typedef struct fcfs_vote_service_group_context {
  function service_group_htable_init (line 41) | int service_group_htable_init()
  function service_group_htable_get (line 82) | int service_group_htable_get(const short service_id, const int group_id,
  function service_group_htable_unset_task (line 161) | void service_group_htable_unset_task(FCFSVoteServiceGroupInfo *group)
  function service_group_htable_clear_tasks (line 174) | void service_group_htable_clear_tasks()

FILE: src/vote/server/service_group_htable.h
  type FCFSVoteServiceGroupInfo (line 24) | typedef struct fcfs_vote_service_group_info {
  type fast_task_info (line 43) | struct fast_task_info

FILE: src/vote/server/service_handler.c
  function service_handler_init (line 47) | int service_handler_init()
  function service_handler_destroy (line 52) | int service_handler_destroy()
  function service_recv_timeout_callback (line 57) | int service_recv_timeout_callback(struct fast_task_info *task)
  function service_task_finish_cleanup (line 73) | void service_task_finish_cleanup(struct fast_task_info *task)
  function service_deal_cluster_stat (line 103) | static int service_deal_cluster_stat(struct fast_task_info *task)
  function service_check_config_sign (line 138) | static int service_check_config_sign(struct fast_task_info *task,
  function service_deal_client_join (line 163) | static int service_deal_client_join(struct fast_task_info *task)
  function service_check_login (line 262) | static inline int service_check_login(struct fast_task_info *task)
  function service_deal_get_vote (line 275) | static int service_deal_get_vote(struct fast_task_info *task)
  function service_deal_active_check (line 296) | static int service_deal_active_check(struct fast_task_info *task)
  function service_deal_next_leader (line 323) | static int service_deal_next_leader(struct fast_task_info *task)
  function service_process (line 389) | static int service_process(struct fast_task_info *task)
  function service_deal_task (line 440) | int service_deal_task(struct fast_task_info *task, const int stage)

FILE: src/vote/server/service_handler.h
  type fast_task_info (line 33) | struct fast_task_info
  type fast_task_info (line 34) | struct fast_task_info
  type fast_task_info (line 35) | struct fast_task_info
Condensed preview — 261 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,664K chars).
[
  {
    "path": ".gitignore",
    "chars": 1119,
    "preview": "# Makefile.in\nsrc/api/Makefile\nsrc/api/tests/Makefile\nsrc/preload/Makefile\nsrc/fuse/Makefile\nsrc/tools/Makefile\nsrc/auth"
  },
  {
    "path": "FastCFS-auth.spec.in",
    "chars": 2655,
    "preview": "%define FastCFSAuthClient    FastCFS-auth-client\n%define FastCFSAuthDevel     FastCFS-auth-devel\n%define FastCFSAuthConf"
  },
  {
    "path": "FastCFS-vote.spec.in",
    "chars": 2506,
    "preview": "%define FastCFSVoteClient    FastCFS-vote-client\n%define FastCFSVoteDevel     FastCFS-vote-devel\n%define FastCFSVoteConf"
  },
  {
    "path": "FastCFS.spec.in",
    "chars": 4789,
    "preview": "%define FastCFSFused        FastCFS-fused\n%define FastCFSUtils        FastCFS-utils\n%define FastCFSAPI          FastCFS-"
  },
  {
    "path": "LICENSE",
    "chars": 34523,
    "preview": "                    GNU AFFERO GENERAL PUBLIC LICENSE\n                       Version 3, 19 November 2007\n\n Copyright (C)"
  },
  {
    "path": "README-zh_CN.md",
    "chars": 3604,
    "preview": "# FastCFS -- 可以跑数据库的高性能通用分布式文件系统\n\n[English](README.md) | 简体中文\n\n## 1. 简介\n\nFastCFS 是一款强一致性、高性能、高可用、支持百亿级海量文件的通用分布式文件系统,可以作"
  },
  {
    "path": "README.md",
    "chars": 5588,
    "preview": "# FastCFS -- a high performance general distributed file system for databases, K8s and KVM etc.\n\nEnglish | [Chinese](REA"
  },
  {
    "path": "conf/full/fuse.conf",
    "chars": 11835,
    "preview": "# the base path to store log files\n# this path must exist\nbase_path = /opt/fastcfs/fcfs\n\n# the mount point (local path) "
  },
  {
    "path": "conf/full/papi.conf",
    "chars": 9291,
    "preview": "# the base path to store log files\n# this path must exist\nbase_path = /opt/fastcfs/fcfs\n\n# the virtual mount point\nmount"
  },
  {
    "path": "conf/fuse.conf",
    "chars": 2507,
    "preview": "# the base path to store log files\n# this path must exist\nbase_path = /opt/fastcfs/fcfs\n\n# the mount point (local path) "
  },
  {
    "path": "conf/papi.conf",
    "chars": 1227,
    "preview": "# the base path to store log files\n# this path must exist\nbase_path = /opt/fastcfs/fcfs\n\n# the virtual mount point\nmount"
  },
  {
    "path": "debian/changelog",
    "chars": 7553,
    "preview": "fastcfs (5.5.0-1) unstable; urgency=medium\n\n  * upgrade to 5.5.0-1\n\n -- YuQing <384681@qq.com>  Sun, 23 Nov 2025 10:53:2"
  },
  {
    "path": "debian/compat",
    "chars": 3,
    "preview": "11\n"
  },
  {
    "path": "debian/control",
    "chars": 5992,
    "preview": "Source: fastcfs\nSection: admin\nPriority: optional\nMaintainer: YuQing <384681@qq.com>\nBuild-Depends: debhelper (>=11~),\n "
  },
  {
    "path": "debian/copyright",
    "chars": 36139,
    "preview": "Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: fastcfs\nSource: <url://example"
  },
  {
    "path": "debian/fastcfs-api-dev.install",
    "chars": 25,
    "preview": "usr/include/fastcfs/api/*"
  },
  {
    "path": "debian/fastcfs-api-libs.install",
    "chars": 22,
    "preview": "usr/lib/libfcfsapi.so*"
  },
  {
    "path": "debian/fastcfs-api-tests.install",
    "chars": 133,
    "preview": "usr/bin/fcfs_beachmark\nusr/bin/fcfs_test_file_op\nusr/bin/fcfs_test_file_copy\nusr/bin/fcfs_test_papi_copy\nusr/bin/fcfs_te"
  },
  {
    "path": "debian/fastcfs-auth-client.install",
    "chars": 120,
    "preview": "usr/lib/libfcfsauthclient.so*\nusr/bin/fcfs_user\nusr/bin/fcfs_pool\nusr/bin/fauth_list_servers\nusr/bin/fauth_cluster_stat\n"
  },
  {
    "path": "debian/fastcfs-auth-config.install",
    "chars": 48,
    "preview": "etc/fastcfs/auth/*.conf\netc/fastcfs/auth/keys/*\n"
  },
  {
    "path": "debian/fastcfs-auth-dev.install",
    "chars": 27,
    "preview": "usr/include/fastcfs/auth/*\n"
  },
  {
    "path": "debian/fastcfs-auth-server-config.install",
    "chars": 39,
    "preview": "usr/lib/systemd/system/fastauth.service"
  },
  {
    "path": "debian/fastcfs-auth-server.dirs",
    "chars": 16,
    "preview": "opt/fastcfs/auth"
  },
  {
    "path": "debian/fastcfs-auth-server.install",
    "chars": 18,
    "preview": "usr/bin/fcfs_authd"
  },
  {
    "path": "debian/fastcfs-fuse-config.install",
    "chars": 23,
    "preview": "etc/fastcfs/fcfs/*.conf"
  },
  {
    "path": "debian/fastcfs-fused.dirs",
    "chars": 33,
    "preview": "opt/fastcfs/fuse\nopt/fastcfs/fcfs"
  },
  {
    "path": "debian/fastcfs-fused.install",
    "chars": 18,
    "preview": "usr/bin/fcfs_fused"
  },
  {
    "path": "debian/fastcfs-utils.install",
    "chars": 47,
    "preview": "usr/bin/fcfs_active_test\nusr/bin/fcfs_pool_stat"
  },
  {
    "path": "debian/fastcfs-vote-client.install",
    "chars": 57,
    "preview": "usr/lib/libfcfsvoteclient.so*\nusr/bin/fvote_cluster_stat\n"
  },
  {
    "path": "debian/fastcfs-vote-config.install",
    "chars": 24,
    "preview": "etc/fastcfs/vote/*.conf\n"
  },
  {
    "path": "debian/fastcfs-vote-dev.install",
    "chars": 27,
    "preview": "usr/include/fastcfs/vote/*\n"
  },
  {
    "path": "debian/fastcfs-vote-server.dirs",
    "chars": 16,
    "preview": "opt/fastcfs/vote"
  },
  {
    "path": "debian/fastcfs-vote-server.install",
    "chars": 18,
    "preview": "usr/bin/fcfs_voted"
  },
  {
    "path": "debian/rules",
    "chars": 1939,
    "preview": "#!/usr/bin/make -f\n\nexport DESTDIR = $(CURDIR)/debian/tmp\nexport FUSE_CONFDIR=$(DESTDIR)/etc/fastcfs/fcfs/\nexport AUTH_C"
  },
  {
    "path": "debian/source/format",
    "chars": 12,
    "preview": "3.0 (quilt)\n"
  },
  {
    "path": "debian/substvars",
    "chars": 252,
    "preview": "libfastcommon:Version=1.0.83\nlibserverframe:Version=1.2.11\nfastcfs-auth-config:Version=2.0.0\nfastcfs-vote-config:Version"
  },
  {
    "path": "debian/watch",
    "chars": 111,
    "preview": "version=3\nopts=\"mode=git\" https://github.com/happyfish100/FastCFS.git \\\n   refs/tags/v([\\d\\.]+) debian uupdate\n"
  },
  {
    "path": "docs/APT-INSTALL-zh_CN.md",
    "chars": 1990,
    "preview": "\n## 支持Debian 10及以上版本,Ubuntu 18.04及以上版本 和 Deepin 20及以上版本,amd64 和arm64 两种架构。\n\n\n### 1. 配置 apt 存储库\n\n配置 apt 存储库和签名密钥,以使系统的包管理"
  },
  {
    "path": "docs/AUTH-zh_CN.md",
    "chars": 2768,
    "preview": "\n# Auth (认证模块)配置及运行\n\n如果你不需要使用存储池或访问权限控制,可以跳过本文档。\n\n本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请自行对应。\n\n为了防脑"
  },
  {
    "path": "docs/CONFIGURE-zh_CN.md",
    "chars": 7396,
    "preview": "\n# 配置及运行\n\n本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请自行对应。\n\nFastCFS集群配置包含如下五部分:\n\n* fastDIR server(服务实例)配"
  },
  {
    "path": "docs/Easy-install-detail-zh_CN.md",
    "chars": 2473,
    "preview": "# 快速体验FastCFS\n\n以CentOS 8为例,用单个服务节点,以一键安装的方式体验下FastCFS。 此方式仅供体验使用,不适合在生产环境使用. \n\n## 1. 获得最新的代码\n\n```\ngit clone https://gite"
  },
  {
    "path": "docs/FAQ-zh_CN.md",
    "chars": 3394,
    "preview": "# FAQ\n\n## 1. 服务器最低配置要求\n\n2核CPU、4G内存、10G硬盘\n\n## 2. 网络连接异常\n\n当日志出现`Connection refused`或者`Transport endpoint is not connected`"
  },
  {
    "path": "docs/INSTALL-zh_CN.md",
    "chars": 3862,
    "preview": "# FastCFS安装手册\n\n## 1、fastcfs.sh 脚本统一安装\n\n通过执行fastcfs.sh脚本,可自动安装软件包,并能根据配置文件模版自动生成集群相关配置文件。\n\nfastcfs.sh 命令参数说明:\n\n```\n* inst"
  },
  {
    "path": "docs/INSTALL.md",
    "chars": 3187,
    "preview": "### 1. install libaio devel\n\nfor CentOS or REHL:\n```\nyum install libaio-devel -y\n```\n\nfor Unbuntu or Debian:\n```\napt ins"
  },
  {
    "path": "docs/ReleaseNotes.md",
    "chars": 1991,
    "preview": "## FastCFS V3.1.0 发布,主要改进如下:\n### 新特性\n1. [fdir] 对核心组件FastDIR进行改进,实现了LRU淘汰算法,以有限内存支持海量文件\n   分布式目录服务FastDIR的淘汰算法具有两大特性:\n   "
  },
  {
    "path": "docs/TODO-zh_CN.md",
    "chars": 154,
    "preview": "# TODO List\n\n欢迎有志之士参与完善!\n\n## 一、测试与反馈\n\n## 二、对外接口\n\n### 1. 对象存储\n\n#### 1.1 S3\n\n#### 1.2 OSS\n\n#### 1.3 OBS\n\n#### 1.4 COS\n\n###"
  },
  {
    "path": "docs/VoteNode-zh_CN.md",
    "chars": 2365,
    "preview": "\n# Vote Node (选举节点)配置及运行\n\n如果你不需要实现双副本防脑裂(即双活互备防脑裂),可以跳过本文档。\n\n本文档以FastCFS RPM包设定的路径(配置文件目录和程序工作目录等)进行说明,如果你采用自助编译安装方式的话,请"
  },
  {
    "path": "docs/YUM-INSTALL-Diy-5nodes-zh_CN.md",
    "chars": 15204,
    "preview": "### 安装的集群架构\nFastCFS支持大规模的集群,下面以最为典型的最小化集群的部署方式,说明下自定义安装的过程。更大规模的安装方式可参照此过程扩展安装。\n1. 节点类型和数量:共计5个节点,3个服务端节点(3副本策略),2客户端节点\n"
  },
  {
    "path": "docs/YUM-INSTALL-zh_CN.md",
    "chars": 2671,
    "preview": "\n## yum安装方式\n\nyum 安装方式支持intel的x86_64和ARM的aarch64架构,主要用于测试和生产环境搭建。\n支持的Linux发行版如下:\n* CentOS & CentOS Stream\n* Fedora\n* Rock"
  },
  {
    "path": "docs/benchmark-step-by-step.md",
    "chars": 2697,
    "preview": "\n## FastCFS性能测试参考文档\n\n服务器之间需要实现免密登录,集群部署参见:[FastCFS集群部署工具介绍](fcfs-ops-tool-zh_CN.md)\n\n### 集群快速部署\n\n在施压服务器(即client机器)上执行如下命"
  },
  {
    "path": "docs/benchmark.md",
    "chars": 2913,
    "preview": "\n## FastCFS vs. Ceph benchmark under 3 nodes cluster (three copies of data)\n\n<table border=1 cellspacing=0 cellpadding=4"
  },
  {
    "path": "docs/cluster-expansion-zh_CN.md",
    "chars": 2877,
    "preview": "\n# FastCFS集群扩容手册\n\nFastCFS集群三个服务组件:fauth、fdir 和fstore,下面将分别介绍这三个服务组件的扩容方法和步骤。\n\n## 1. fauth(认证服务)\n\n认证服务的用户和权限等数据保存在fdir中,服"
  },
  {
    "path": "docs/fcfs-ops-tool-zh_CN.md",
    "chars": 8503,
    "preview": "# FastCFS 运维工具介绍\n\n* [fcfs.sh](#fcfs.sh) -- 用于管理 FastCFS 集群的快捷运维工具\n* [fcfs_conf.sh](#fcfs_conf.sh) -- 用于快速创建集群配置文件的工具\n\n##"
  },
  {
    "path": "docs/fcfs-ops-tool.md",
    "chars": 12805,
    "preview": "# FastCFS ops tools introduction\n\n* [fcfs.sh](#fcfs.sh) -- a ops tool for quickly manage FastCFS clusters\n* [fcfs_conf.s"
  },
  {
    "path": "docs/index.md",
    "chars": 3423,
    "preview": "# FastCFS -- a high performance general distributed file system for databases, K8s and VM etc.\n\nEnglish | [Chinese](./RE"
  },
  {
    "path": "docs/shared-storage-guide-zh_CN.md",
    "chars": 1403,
    "preview": "# 共享数据配置指南\n\nFastCFS客户端缓存默认是开启的,这主要针对独享数据场景(对同一文件单节点读写),也可以支持非实时场景下对同一文件一写多读。\n\n如果将FastCFS作为Oracle RAC等系统的共享存储(对同一文件多节点写入和"
  },
  {
    "path": "docs/version-history-zh_CN.md",
    "chars": 492,
    "preview": "# FastCFS 重大版本一览\n\n* V1.0:2020年12月第一个版本(历时12个月)\n* V2.0:2021年4月支持k8s(历时3个月)\n* V3.0:2021年12月实现fdir存储插件,支持百亿级海量文件(历时6个月)\n* V"
  },
  {
    "path": "docs/versions.json",
    "chars": 128,
    "preview": "[\n  {\"version\": \"v3.1.0\", \"title\": \"v3.2.0\", \"aliases\": [\"latest\"]},\n  {\"version\": \"v3.1.0\", \"title\": \"v3.1.0\", \"aliases"
  },
  {
    "path": "fastcfs.sh",
    "chars": 13741,
    "preview": "#!/bin/bash\n#\n# fastcfs install, config and start a local fastcfs cluster on Linux.\n# fastcfs's primary goals are to be "
  },
  {
    "path": "helloWorld.sh",
    "chars": 560,
    "preview": "#!/bin/bash\n\necho \"just for FastCFS demo: 1 fdir instance and 1 fstore instance\"\n\nmounted_path=/opt/fastcfs/fuse\n\n./fast"
  },
  {
    "path": "libfuse_setup.sh",
    "chars": 5766,
    "preview": "#!/bin/bash\n\nYUM_OS_ARRAY=(Red Rocky Oracle Fedora CentOS AlmaLinux Alibaba Anolis Amazon)\n\nget_gcc_version() {\n  old_la"
  },
  {
    "path": "make.sh",
    "chars": 8413,
    "preview": "ENABLE_STATIC_LIB=0\nENABLE_SHARED_LIB=1\nTARGET_PREFIX=$DESTDIR/usr\nTARGET_CONF_PATH=$DESTDIR/etc/fdir\n\nmodule=''\nexclude"
  },
  {
    "path": "mkdocs.yml",
    "chars": 1628,
    "preview": "site_name: FastCFS Docs\nsite_description:  'FastCFS Documents,Version: v3.2.0'\n\nrepo_name: GitHub\nrepo_url: https://gith"
  },
  {
    "path": "shell/Dockerfile",
    "chars": 132,
    "preview": "FROM nginx:mainline-alpine\n# COPY dependency.2.0.1.settings /usr/share/nginx/html/\nCOPY conf.2.3.0.tpl.tar.gz /usr/share"
  },
  {
    "path": "shell/conf_tpl_tar.sh",
    "chars": 2736,
    "preview": "#!/bin/bash\n#\n# conf_tpl_tar.sh is a tool for quickly pack FastCFS cluster config files to template tar.\n# this is for F"
  },
  {
    "path": "shell/fcfs.settings",
    "chars": 240,
    "preview": "# FastCFS cluster ops settings be used with shell fcfs.sh\n# This settings file must be placed at same path with fcfs.sh\n"
  },
  {
    "path": "shell/fcfs.sh",
    "chars": 51301,
    "preview": "#!/bin/bash\n#\n# fcfs.sh is a ops tool for quickly deploy FastCFS clusters.\n# It only relying on SSH access to the server"
  },
  {
    "path": "shell/fcfs_conf.settings",
    "chars": 424,
    "preview": "# FastCFS cluster ops settings be used with shell fcfs_conf.sh\n# This settings file must be placed at same path with fcf"
  },
  {
    "path": "shell/fcfs_conf.sh",
    "chars": 15331,
    "preview": "#!/bin/bash\n#\n# fcfs_conf.sh is a ops tool for quickly generate FastCFS cluster config files.\n# It only relying on bash "
  },
  {
    "path": "shell/template/dependency.2.0.1.settings",
    "chars": 349,
    "preview": "# FastCFS cluster's dependent libs version settings.\n# Ops shell fcfs.sh will use it to install appropriate version libs"
  },
  {
    "path": "src/api/Makefile.in",
    "chars": 2199,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I../common -I../include\nLIB_PATH = $(LIBS) -lfsclient -lfsap"
  },
  {
    "path": "src/api/async_reporter.c",
    "chars": 11557,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/async_reporter.h",
    "chars": 4642,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api.c",
    "chars": 32203,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api.h",
    "chars": 7827,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_allocator.c",
    "chars": 2691,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_allocator.h",
    "chars": 1523,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_file.c",
    "chars": 46953,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_file.h",
    "chars": 11259,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_types.h",
    "chars": 4691,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_util.c",
    "chars": 3937,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/fcfs_api_util.h",
    "chars": 26893,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/inode_htable.c",
    "chars": 3836,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/inode_htable.h",
    "chars": 2119,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/api_types.h",
    "chars": 2171,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/capi.c",
    "chars": 17582,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/capi.h",
    "chars": 4609,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/fd_manager.c",
    "chars": 6469,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/fd_manager.h",
    "chars": 1414,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/papi.c",
    "chars": 65089,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/papi.h",
    "chars": 17684,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/posix_api.c",
    "chars": 4366,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/std/posix_api.h",
    "chars": 8625,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/tests/Makefile.in",
    "chars": 656,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I../../include\nLIB_PATH = -L.. $(LIBS) -lfcfsapi -lfsapi -lf"
  },
  {
    "path": "src/api/tests/fcfs_beachmark.c",
    "chars": 18787,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/tests/fcfs_test_file_copy.c",
    "chars": 5728,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/tests/fcfs_test_file_op.c",
    "chars": 6740,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/tests/fcfs_test_papi_copy.c",
    "chars": 9991,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/api/tests/fcfs_test_read_ahead.c",
    "chars": 14968,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/Makefile.in",
    "chars": 2435,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I../common\nLIB_PATH = $(LIBS) -lfastcommon -lserverframe\nTAR"
  },
  {
    "path": "src/auth/client/client_func.c",
    "chars": 5264,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_func.h",
    "chars": 3071,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_global.c",
    "chars": 726,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_global.h",
    "chars": 1340,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_proto.c",
    "chars": 39100,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_proto.h",
    "chars": 4280,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/client_types.h",
    "chars": 2031,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/fcfs_auth_client.c",
    "chars": 12864,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/fcfs_auth_client.h",
    "chars": 5670,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/fcfs_auth_for_server.c",
    "chars": 2805,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/fcfs_auth_for_server.h",
    "chars": 2862,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/session_regenerate.c",
    "chars": 2490,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/session_regenerate.h",
    "chars": 807,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/session_sync.c",
    "chars": 9453,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/session_sync.h",
    "chars": 816,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/simple_connection_manager.c",
    "chars": 9864,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/simple_connection_manager.h",
    "chars": 1036,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/Makefile.in",
    "chars": 614,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I../../common -I/usr/local/include\nLIB_PATH = -L.. $(LIBS) -"
  },
  {
    "path": "src/auth/client/tools/fauth_cluster_stat.c",
    "chars": 2691,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/fauth_list_servers.c",
    "chars": 2042,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/fcfs_pool.c",
    "chars": 18366,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/fcfs_user.c",
    "chars": 11512,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/tool_func.c",
    "chars": 4806,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/client/tools/tool_func.h",
    "chars": 1955,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_func.c",
    "chars": 7653,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_func.h",
    "chars": 3330,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_global.c",
    "chars": 707,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_global.h",
    "chars": 929,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_proto.c",
    "chars": 5108,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_proto.h",
    "chars": 10654,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/auth_types.h",
    "chars": 4110,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/server_session.c",
    "chars": 20272,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/common/server_session.h",
    "chars": 3525,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/conf/auth.conf",
    "chars": 412,
    "preview": "# enable / disable authentication\n# default value is false\nauth_enabled = false\n\n# the username for login\n# default valu"
  },
  {
    "path": "src/auth/conf/client.conf",
    "chars": 134,
    "preview": "# the base path to store log files\nbase_path = /opt/fastcfs/auth\n\n# config the cluster servers\ncluster_config_filename ="
  },
  {
    "path": "src/auth/conf/cluster.conf",
    "chars": 1011,
    "preview": "\n[master-election]\n# the quorum for master election\n# set quorum to majority to avoid brain-split\n# value list:\n##  any:"
  },
  {
    "path": "src/auth/conf/full/auth.conf",
    "chars": 412,
    "preview": "# enable / disable authentication\n# default value is false\nauth_enabled = false\n\n# the username for login\n# default valu"
  },
  {
    "path": "src/auth/conf/full/client.conf",
    "chars": 537,
    "preview": "# connect timeout in seconds\n# default value is 10\n# Note: in the intranet network (LAN), 10 seconds is enough.\nconnect_"
  },
  {
    "path": "src/auth/conf/full/cluster.conf",
    "chars": 1245,
    "preview": "\n[master-election]\n# the quorum for master election\n# set quorum to majority to avoid brain-split\n# value list:\n##  any:"
  },
  {
    "path": "src/auth/conf/full/server.conf",
    "chars": 5375,
    "preview": "# connect timeout in seconds\n# default value is 10\n# Note: in the intranet network (LAN), 10 seconds is enough.\n# do NOT"
  },
  {
    "path": "src/auth/conf/full/session.conf",
    "chars": 836,
    "preview": "\n# the capacity (bucket count) of session hashtable\n# default value is 10949\nhashtable_capacity = 10949\n\n# the shared al"
  },
  {
    "path": "src/auth/conf/keys/session_validate.key",
    "chars": 32,
    "preview": "dd7702749e369c7e8139d6ca3bf443ce"
  },
  {
    "path": "src/auth/conf/server.conf",
    "chars": 1627,
    "preview": "# the base path to store log files\n# this path must be exist\nbase_path = /opt/fastcfs/auth\n\n# max concurrent connections"
  },
  {
    "path": "src/auth/conf/session.conf",
    "chars": 145,
    "preview": "# the secret key filename for session validation\n# the file content is 32 bytes hex characters\nvalidate_key_filename = k"
  },
  {
    "path": "src/auth/server/Makefile.in",
    "chars": 1078,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I.. -I../common -I../../include\nLIB_PATH = $(LIBS) -lfdircli"
  },
  {
    "path": "src/auth/server/cluster_handler.c",
    "chars": 23477,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/cluster_handler.h",
    "chars": 1517,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/cluster_info.c",
    "chars": 5166,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/cluster_info.h",
    "chars": 995,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/cluster_relationship.c",
    "chars": 37882,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/cluster_relationship.h",
    "chars": 1298,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/common_handler.c",
    "chars": 3199,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/common_handler.h",
    "chars": 992,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/auth_db.c",
    "chars": 36998,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/auth_db.h",
    "chars": 4719,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/dao.c",
    "chars": 724,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/dao.h",
    "chars": 1447,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/func.c",
    "chars": 1277,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/func.h",
    "chars": 5211,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/granted_pool.c",
    "chars": 4924,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/granted_pool.h",
    "chars": 1181,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/storage_pool.c",
    "chars": 5388,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/storage_pool.h",
    "chars": 1504,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/types.h",
    "chars": 4360,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/user.c",
    "chars": 7360,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/dao/user.h",
    "chars": 1296,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/pool_usage_updater.c",
    "chars": 4990,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/db/pool_usage_updater.h",
    "chars": 865,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/fcfs_authd.c",
    "chars": 6043,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/server_func.c",
    "chars": 13013,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/server_func.h",
    "chars": 835,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/server_global.c",
    "chars": 688,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/server_global.h",
    "chars": 5217,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/server_types.h",
    "chars": 3712,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/service_handler.c",
    "chars": 39705,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/service_handler.h",
    "chars": 1230,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/session_subscribe.c",
    "chars": 10767,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/auth/server/session_subscribe.h",
    "chars": 1586,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/common/fcfs_global.c",
    "chars": 698,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/common/fcfs_global.h",
    "chars": 901,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/Makefile.in",
    "chars": 691,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nINC_PATH = -I.. -I../common -I../include\nLIB_PATH = -L../api $(LIBS) -lf"
  },
  {
    "path": "src/fuse/fcfs_fused.c",
    "chars": 13952,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/fuse_wrapper.c",
    "chars": 39294,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/fuse_wrapper.h",
    "chars": 1078,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/getgroups.c",
    "chars": 4382,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/getgroups.h",
    "chars": 1012,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/global.c",
    "chars": 12123,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/global.h",
    "chars": 2365,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/groups_htable.c",
    "chars": 4620,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/fuse/groups_htable.h",
    "chars": 1081,
    "preview": "/*\n * Copyright (c) 2020 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/java/jni/Makefile.in",
    "chars": 925,
    "preview": ".SUFFIXES: .c .o .lo\n\nCOMPILE = $(CC) $(CFLAGS)\nPREFIX = $(TARGET_PREFIX)\nINC_PATH = -I/usr/local/include $(INCLUDES)\nLI"
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSConstants.h",
    "chars": 1970,
    "preview": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class com_fastken_fcfs_FCFSConstant"
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSDirectory.c",
    "chars": 2396,
    "preview": "#include \"fastcfs/api/std/posix_api.h\"\n#include \"global.h\"\n#include \"common.h\"\n#include \"com_fastken_fcfs_FCFSDirectory."
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSDirectory.h",
    "chars": 1418,
    "preview": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class com_fastken_fcfs_FCFSDirector"
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSFile.c",
    "chars": 11043,
    "preview": "\n#include \"fastcfs/api/std/posix_api.h\"\n#include \"global.h\"\n#include \"common.h\"\n#include \"com_fastken_fcfs_FCFSFile.h\"\n\n"
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSFile.h",
    "chars": 4287,
    "preview": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class com_fastken_fcfs_FCFSFile */\n"
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSPosixAPI.c",
    "chars": 18895,
    "preview": "\n#include \"fastcfs/api/std/posix_api.h\"\n#include \"global.h\"\n#include \"common.h\"\n#include \"com_fastken_fcfs_FCFSPosixAPI."
  },
  {
    "path": "src/java/jni/com_fastken_fcfs_FCFSPosixAPI.h",
    "chars": 6574,
    "preview": "/* DO NOT EDIT THIS FILE - it is machine generated */\n#include <jni.h>\n/* Header for class com_fastken_fcfs_FCFSPosixAPI"
  },
  {
    "path": "src/java/jni/common.c",
    "chars": 5502,
    "preview": "/*\n * Copyright (c) 2022 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  },
  {
    "path": "src/java/jni/common.h",
    "chars": 1300,
    "preview": "/*\n * Copyright (c) 2022 YuQing <384681@qq.com>\n *\n * This program is free software: you can use, redistribute, and/or m"
  }
]

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

About this extraction

This page contains the full source code of the happyfish100/FastCFS GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 261 files (1.5 MB), approximately 424.8k tokens, and a symbol index with 1651 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!