From a0b15d006ddae4a22bb6edf63c66dd62dfdfd73c Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Sat, 31 May 2014 23:32:47 +0200 Subject: [PATCH] Handle write errors while saving index cache --- model/model.go | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/model/model.go b/model/model.go index 2cff2f0f6..fc01ba1e2 100644 --- a/model/model.go +++ b/model/model.go @@ -567,7 +567,10 @@ func (m *Model) broadcastIndexLoop() { idx := m.protocolIndex(repo) indexWg.Add(1) go func() { - m.saveIndex(repo, m.indexDir, idx) + err := m.saveIndex(repo, m.indexDir, idx) + if err != nil { + l.Warnln("Saving index for %q: %v", repo, err) + } indexWg.Done() }() @@ -688,7 +691,10 @@ func (m *Model) SaveIndexes(dir string) { m.rmut.RLock() for repo := range m.repoCfgs { fs := m.protocolIndex(repo) - m.saveIndex(repo, dir, fs) + err := m.saveIndex(repo, dir, fs) + if err != nil { + l.Warnln("Saving index for %q: %v", repo, err) + } } m.rmut.RUnlock() } @@ -702,26 +708,43 @@ func (m *Model) LoadIndexes(dir string) { m.rmut.RUnlock() } -func (m *Model) saveIndex(repo string, dir string, fs []protocol.FileInfo) { +func (m *Model) saveIndex(repo string, dir string, fs []protocol.FileInfo) error { id := fmt.Sprintf("%x", sha1.Sum([]byte(m.repoCfgs[repo].Directory))) name := id + ".idx.gz" name = filepath.Join(dir, name) idxf, err := os.Create(name + ".tmp") if err != nil { - return + return err } gzw := gzip.NewWriter(idxf) - protocol.IndexMessage{ + n, err := protocol.IndexMessage{ Repository: repo, Files: fs, }.EncodeXDR(gzw) - gzw.Close() - idxf.Close() + if err != nil { + gzw.Close() + idxf.Close() + return err + } - osutil.Rename(name+".tmp", name) + err = gzw.Close() + if err != nil { + return err + } + + err = idxf.Close() + if err != nil { + return err + } + + if debug { + l.Debugln("wrote index,", n, "bytes uncompressed") + } + + return osutil.Rename(name+".tmp", name) } func (m *Model) loadIndex(repo string, dir string) []protocol.FileInfo {