cubefs
83 строки · 1.7 Кб
1/*
2* Regression Test Case
3* - fix: overlapping extents lost due to concurrent client appending keys
4*
5* Steps:
6* - mount the same volume to <path1> and <path2>
7* - go run main.go <path1>/testfile <path2>/testfile
8*
9* Expected results:
10* - Pass: fsync outPath1 gets IO error due to conflict extents.
11* - Fail: fsync succedded, but reading the file gets IO error due toextents not exist.
12*/
13
14package main15
16import (17"fmt"18"os"19)
20
21func main() {22if len(os.Args) != 3 {23fmt.Printf("Invalid num of args, expecting 2 args!\n")24return25}26
27// Note that outPath1 and outPath2 should point to the same underlying file28// in CubeFS but through different mount point.29outPath1 := os.Args[1]30outPath2 := os.Args[2]31data := "aoifjiwjefojwofoiwenfowepojpjoipgnoirngo\n"32
33file1, err := os.OpenFile(outPath1, os.O_WRONLY|os.O_CREATE, 0o666)34if err != nil {35fmt.Println(err)36return37}38defer file1.Close()39file2, err := os.OpenFile(outPath2, os.O_WRONLY|os.O_CREATE, 0o666)40if err != nil {41fmt.Println(err)42return43}44defer file2.Close()45
46// NeedAfterAlloc to write to normal extent, so avoid writing to the beginning 1M47file1.Seek(1*1024*1024, 0)48file2.Seek(1*1024*1024, 0)49
50_, err = file1.Write([]byte(data))51if err != nil {52fmt.Println(err)53return54}55if err = file1.Sync(); err != nil {56fmt.Println(err)57return58}59
60for i := 0; i < 2; i++ {61_, err = file2.Write([]byte(data))62if err != nil {63fmt.Println(err)64return65}66}67if err = file2.Sync(); err != nil {68fmt.Println(err)69return70}71
72_, err = file1.Write([]byte(data))73if err != nil {74fmt.Println(err)75return76}77if err = file1.Sync(); err != nil {78fmt.Println(err)79return80}81
82return83}
84