Browse Source
Add an End-to-End workflow for FUSE mount (#3562)
Add an End-to-End workflow for FUSE mount (#3562)
* Add an e2e workflow to test FUSE mount * Fix deadlocks during concurrent r/wpull/3572/head
Patrick Schmidt
2 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 192 additions and 11 deletions
-
4.github/workflows/codeql.yml
-
89.github/workflows/e2e.yml
-
30docker/Dockerfile.e2e
-
1docker/Dockerfile.local
-
14docker/Makefile
-
53docker/compose/e2e-mount.yml
-
8weed/mount/filehandle.go
-
4weed/mount/weedfs_file_read.go
@ -0,0 +1,89 @@ |
|||||
|
name: "End to End" |
||||
|
|
||||
|
on: |
||||
|
push: |
||||
|
branches: [ master ] |
||||
|
pull_request: |
||||
|
branches: [ master ] |
||||
|
|
||||
|
concurrency: |
||||
|
group: ${{ github.head_ref }}/e2e |
||||
|
cancel-in-progress: true |
||||
|
|
||||
|
permissions: |
||||
|
contents: read |
||||
|
|
||||
|
defaults: |
||||
|
run: |
||||
|
working-directory: docker |
||||
|
|
||||
|
jobs: |
||||
|
e2e: |
||||
|
name: FUSE Mount |
||||
|
runs-on: ubuntu-22.04 |
||||
|
timeout-minutes: 15 |
||||
|
steps: |
||||
|
- name: Set up Go 1.x |
||||
|
uses: actions/setup-go@268d8c0ca0432bb2cf416faae41297df9d262d7f # v2 |
||||
|
with: |
||||
|
go-version: ^1.13 |
||||
|
id: go |
||||
|
|
||||
|
- name: Check out code into the Go module directory |
||||
|
uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b # v2 |
||||
|
|
||||
|
- name: Install dependencies |
||||
|
run: | |
||||
|
sudo apt-get update |
||||
|
sudo apt-get install -y fuse |
||||
|
|
||||
|
- name: Start SeaweedFS |
||||
|
timeout-minutes: 5 |
||||
|
run: make build_e2e && docker compose -f ./compose/e2e-mount.yml up --wait |
||||
|
|
||||
|
- name: Run FIO |
||||
|
timeout-minutes: 5 |
||||
|
run: | |
||||
|
echo "Starting FIO at: $(date)" |
||||
|
# Concurrent r/w |
||||
|
echo 'Run randrw with size=16M bs=4k' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randrw --bs=4k --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 |
||||
|
|
||||
|
echo 'Run randrw with size=16M bs=128k' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randrw --bs=128k --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 |
||||
|
|
||||
|
echo 'Run randrw with size=16M bs=1m' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randrw --bs=1m --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 |
||||
|
|
||||
|
# Verified write |
||||
|
echo 'Run randwrite with size=16M bs=4k' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randwrite --bs=4k --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 --do_verify=0 --verify=crc32c --verify_backlog=1 |
||||
|
|
||||
|
echo 'Run randwrite with size=16M bs=128k' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randwrite --bs=128k --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 --do_verify=0 --verify=crc32c --verify_backlog=1 |
||||
|
|
||||
|
echo 'Run randwrite with size=16M bs=1m' |
||||
|
docker compose -f ./compose/e2e-mount.yml exec mount timeout -k5 40 fio --name=fiotest --filename=/mnt/seaweedfs/fiotest --size=16M --rw=randwrite --bs=1m --direct=1 --numjobs=8 --ioengine=libaio --iodepth=32 --group_reporting --runtime=30 --time_based=1 --do_verify=0 --verify=crc32c --verify_backlog=1 |
||||
|
|
||||
|
- name: Save logs |
||||
|
if: always() |
||||
|
run: | |
||||
|
docker compose -f ./compose/e2e-mount.yml logs > output.log |
||||
|
echo 'Showing last 500 log lines of mount service:' |
||||
|
docker compose -f ./compose/e2e-mount.yml logs --tail 500 mount |
||||
|
|
||||
|
- name: Check for data races |
||||
|
if: always() |
||||
|
continue-on-error: true # TODO: remove this comment to enable build failure on data races (after all are fixed) |
||||
|
run: grep -A50 'DATA RACE' output.log && exit 1 || exit 0 |
||||
|
|
||||
|
- name: Archive logs |
||||
|
if: always() |
||||
|
uses: actions/upload-artifact@v3 |
||||
|
with: |
||||
|
name: output-logs |
||||
|
path: docker/output.log |
||||
|
|
||||
|
- name: Cleanup |
||||
|
if: always() |
||||
|
run: docker compose -f ./compose/e2e-mount.yml down --volumes --remove-orphans --rmi all |
@ -0,0 +1,30 @@ |
|||||
|
FROM ubuntu:22.04 |
||||
|
|
||||
|
LABEL author="Chris Lu" |
||||
|
|
||||
|
RUN apt-get update && apt-get install -y curl fio fuse |
||||
|
RUN mkdir -p /etc/seaweedfs /data/filerldb2 |
||||
|
|
||||
|
COPY ./weed /usr/bin/ |
||||
|
COPY ./filer.toml /etc/seaweedfs/filer.toml |
||||
|
COPY ./entrypoint.sh /entrypoint.sh |
||||
|
|
||||
|
# volume server grpc port |
||||
|
EXPOSE 18080 |
||||
|
# volume server http port |
||||
|
EXPOSE 8080 |
||||
|
# filer server grpc port |
||||
|
EXPOSE 18888 |
||||
|
# filer server http port |
||||
|
EXPOSE 8888 |
||||
|
# master server shared grpc port |
||||
|
EXPOSE 19333 |
||||
|
# master server shared http port |
||||
|
EXPOSE 9333 |
||||
|
|
||||
|
VOLUME /data |
||||
|
WORKDIR /data |
||||
|
|
||||
|
RUN chmod +x /entrypoint.sh |
||||
|
|
||||
|
ENTRYPOINT ["/entrypoint.sh"] |
@ -0,0 +1,53 @@ |
|||||
|
version: '3.9' |
||||
|
|
||||
|
services: |
||||
|
master: |
||||
|
image: chrislusf/seaweedfs:e2e |
||||
|
command: "-v=4 master -ip=master -ip.bind=0.0.0.0 -raftBootstrap" |
||||
|
healthcheck: |
||||
|
test: [ "CMD", "curl", "--fail", "-I", "http://localhost:9333/cluster/healthz" ] |
||||
|
interval: 1s |
||||
|
timeout: 60s |
||||
|
|
||||
|
volume: |
||||
|
image: chrislusf/seaweedfs:e2e |
||||
|
command: "-v=4 volume -mserver=master:9333 -ip=volume -ip.bind=0.0.0.0 -preStopSeconds=1" |
||||
|
healthcheck: |
||||
|
test: [ "CMD", "curl", "--fail", "-I", "http://localhost:8080/healthz" ] |
||||
|
interval: 1s |
||||
|
timeout: 30s |
||||
|
depends_on: |
||||
|
master: |
||||
|
condition: service_healthy |
||||
|
|
||||
|
filer: |
||||
|
image: chrislusf/seaweedfs:e2e |
||||
|
command: "-v=4 filer -master=master:9333 -ip=filer -ip.bind=0.0.0.0" |
||||
|
healthcheck: |
||||
|
test: [ "CMD", "curl", "--fail", "-I", "http://localhost:8888" ] |
||||
|
interval: 1s |
||||
|
timeout: 30s |
||||
|
depends_on: |
||||
|
volume: |
||||
|
condition: service_healthy |
||||
|
|
||||
|
mount: |
||||
|
image: chrislusf/seaweedfs:e2e |
||||
|
command: "-v=4 mount -filer=filer:8888 -filer.path=/ -dirAutoCreate -dir=/mnt/seaweedfs" |
||||
|
cap_add: |
||||
|
- SYS_ADMIN |
||||
|
devices: |
||||
|
- /dev/fuse |
||||
|
security_opt: |
||||
|
- apparmor:unconfined |
||||
|
deploy: |
||||
|
resources: |
||||
|
limits: |
||||
|
memory: 4096m |
||||
|
healthcheck: |
||||
|
test: [ "CMD", "mountpoint", "-q", "--", "/mnt/seaweedfs" ] |
||||
|
interval: 1s |
||||
|
timeout: 30s |
||||
|
depends_on: |
||||
|
filer: |
||||
|
condition: service_healthy |
Write
Preview
Loading…
Cancel
Save
Reference in new issue