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  }