openForWrite will create or open pack file n for writes, create a lock visible external to the process and seek to the end of the file ready for appending new data. This function is not thread safe, s.mu should be locked by the caller.
(n int)
| 245 | // appending new data. |
| 246 | // This function is not thread safe, s.mu should be locked by the caller. |
| 247 | func (s *storage) openForWrite(n int) error { |
| 248 | fn := s.filename(n) |
| 249 | l, err := lock.Lock(fn + ".lock") |
| 250 | if err != nil { |
| 251 | return err |
| 252 | } |
| 253 | f, err := os.OpenFile(fn, os.O_RDWR|os.O_CREATE, 0666) |
| 254 | if err != nil { |
| 255 | l.Close() |
| 256 | return err |
| 257 | } |
| 258 | openFdsVar.Add(s.root, 1) |
| 259 | debug.Printf("diskpacked: opened for write %q", fn) |
| 260 | |
| 261 | s.size, err = f.Seek(0, io.SeekEnd) |
| 262 | if err != nil { |
| 263 | f.Close() |
| 264 | l.Close() |
| 265 | return err |
| 266 | } |
| 267 | |
| 268 | s.writer = f |
| 269 | s.writeLock = l |
| 270 | return nil |
| 271 | } |
| 272 | |
| 273 | // closePack opens any pack file currently open for writing. |
| 274 | func (s *storage) closePack() error { |