]> Sergey Matveev's repositories - mmc.git/commitdiff
fsnotify optimisation
authorSergey Matveev <stargrave@stargrave.org>
Sat, 11 Mar 2023 19:44:33 +0000 (22:44 +0300)
committerSergey Matveev <stargrave@stargrave.org>
Sat, 11 Mar 2023 19:44:33 +0000 (22:44 +0300)
cmd/mmc/main.go
cmd/rd/main.go
go.mod
go.sum
lock.go

index 85cb7594573ae8dbaa1dfc1465aed231f0fa38d4..99e9f3aba5f48cdcf0cc08c4fe907d1a801b7d35 100644 (file)
@@ -197,7 +197,6 @@ func main() {
                go func(u *model.User) {
                        var dc *model.Channel
                        for {
-                               time.Sleep(mmc.SleepTime)
                                fd, err := os.OpenFile(pth, os.O_RDONLY, os.FileMode(0666))
                                if err != nil {
                                        continue
@@ -310,7 +309,6 @@ func main() {
                }
                go func(ch *model.Channel) {
                        for {
-                               time.Sleep(mmc.SleepTime)
                                fd, err := os.OpenFile(pth, os.O_RDONLY, os.FileMode(0666))
                                if err != nil {
                                        continue
index 4bb8b2439cefcdccbeafdc6c69f7d3d733fa5b5b..0d7e70b65e9280fef79d140c3ff71deb134e62fe 100644 (file)
@@ -23,8 +23,8 @@ import (
        "log"
        "os"
        "path"
-       "time"
 
+       "github.com/fsnotify/fsnotify"
        "github.com/mattermost/mattermost-server/v6/model"
        "go.cypherpunks.ru/recfile"
        "go.stargrave.org/mmc"
@@ -84,16 +84,22 @@ func main() {
        for _, m := range ms {
                printPost(m)
        }
-       fi, err := fd.Stat()
+
+       watcher, err := fsnotify.NewWatcher()
        if err != nil {
                log.Fatalln(err)
        }
-       size := fi.Size()
+       if err = watcher.Add(pth); err != nil {
+               log.Fatalln(err)
+       }
        for {
-               time.Sleep(mmc.SleepTime)
-               fi, err = os.Stat(pth)
-               if fi.Size() == size {
-                       continue
+               select {
+               case err = <-watcher.Errors:
+                       log.Fatalln(err)
+               case event := <-watcher.Events:
+                       if !event.Has(fsnotify.Write) {
+                               continue
+                       }
                }
                unlock, err = mmc.Lock(lockPth)
                if err != nil {
@@ -110,7 +116,6 @@ func main() {
                        }
                        printPost(m)
                }
-               size = fi.Size()
                unlock()
        }
 }
diff --git a/go.mod b/go.mod
index 081477196a57f093ef42fce0fea9ad07836d49a1..59f35f0dbd95c6ff52ef4c19f71697e7cea5e32b 100644 (file)
--- a/go.mod
+++ b/go.mod
@@ -4,6 +4,7 @@ go 1.20
 
 require (
        github.com/davecgh/go-spew v1.1.1
+       github.com/fsnotify/fsnotify v1.6.0
        github.com/mattermost/mattermost-server/v6 v6.7.2
        go.cypherpunks.ru/recfile v0.5.1
        golang.org/x/sys v0.6.0
diff --git a/go.sum b/go.sum
index 2fd506e987cb531dcbee19e39e95d2e7c05bd2f8..092d7fff012d1de628bab963f1bd0a6f177136db 100644 (file)
--- a/go.sum
+++ b/go.sum
@@ -435,6 +435,8 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
 github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU=
+github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
+github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw=
 github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA=
 github.com/gabriel-vasile/mimetype v1.3.1/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8=
@@ -1697,6 +1699,7 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220403205710-6acee93ad0eb/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
diff --git a/lock.go b/lock.go
index e1a4b40240e7504327afa1339866ec713d54b2f2..271b39cab6527b376a76df0b07a11ba03f16197a 100644 (file)
--- a/lock.go
+++ b/lock.go
@@ -37,7 +37,7 @@ func Lock(what string) (func(), error) {
                Type:   unix.F_WRLCK,
                Whence: io.SeekStart,
        }
-       if err = unix.FcntlFlock(fd.Fd(), unix.F_SETLK, &flock); err != nil {
+       if err = unix.FcntlFlock(fd.Fd(), unix.F_SETLKW, &flock); err != nil {
                fd.Close()
                return dummy, err
        }