github.com/code-to-go/safepool.lib@v0.0.0-20221205180519-ee25e63c226e/pool/replica.go (about) 1 package pool 2 3 import ( 4 "path" 5 6 "github.com/code-to-go/safepool.lib/core" 7 "github.com/code-to-go/safepool.lib/transport" 8 ) 9 10 func (p *Pool) replica() { 11 for _, e := range p.exchangers { 12 if e != p.e { 13 err := p.syncAccess(e) 14 if !core.IsErr(err, "cannot sync access between %s and %s: %v", p.e, e) { 15 p.syncContent(e) 16 } 17 } 18 } 19 } 20 21 func (p *Pool) syncAccess(e transport.Exchanger) error { 22 name := path.Join(p.Name, ".access") 23 _, err := e.Stat(name) 24 if err == nil { 25 _, err := p.ImportAccess(e) 26 if core.IsErr(err, "cannot import access file from %s: %v", e) { 27 return err 28 } 29 } 30 31 err = p.ExportAccessFile(e) 32 if core.IsErr(err, "cannot export access file to %s: %v", e) { 33 return err 34 } 35 return err 36 } 37 38 func (p *Pool) syncContent(e transport.Exchanger) error { 39 ls, err := p.e.ReadDir(p.Name, 0) 40 if core.IsErr(err, "cannot read file list from %s: %v", p.e) { 41 return err 42 } 43 44 m := map[string]bool{} 45 for _, l := range ls { 46 n := l.Name() 47 if n[0] != '.' { 48 m[l.Name()] = true 49 } 50 } 51 52 ls, _ = e.ReadDir(p.Name, 0) 53 for _, l := range ls { 54 n := l.Name() 55 if n[0] != '.' && !m[n] { 56 n = path.Join(p.Name, n) 57 _ = transport.CopyFile(p.e, n, e, n) 58 } 59 delete(m, n) 60 } 61 62 for n := range m { 63 n = path.Join(p.Name, n) 64 err = transport.CopyFile(e, n, p.e, n) 65 core.IsErr(err, "cannot clone '%s': %v", n) 66 } 67 68 return nil 69 }