aboutsummaryrefslogtreecommitdiff
path: root/objectstore/packed/idx_open.go
diff options
context:
space:
mode:
authorGravatar Runxi Yu2026-03-04 08:26:56 +0800
committerGravatar Runxi Yu2026-03-04 08:59:53 +0800
commitab7501be34032fb9e5c48726a68ae90a917af9eb (patch)
tree20d005647569befea8133e953c3270e8fd2a2a5b /objectstore/packed/idx_open.go
parent*: gofumpt (diff)
signatureNo signature
*: Lint
Diffstat (limited to 'objectstore/packed/idx_open.go')
-rw-r--r--objectstore/packed/idx_open.go40
1 files changed, 35 insertions, 5 deletions
diff --git a/objectstore/packed/idx_open.go b/objectstore/packed/idx_open.go
index c00a7bac..c3c97e4d 100644
--- a/objectstore/packed/idx_open.go
+++ b/objectstore/packed/idx_open.go
@@ -43,16 +43,21 @@ func (store *Store) candidateForPack(packName string) (packCandidate, bool) {
store.candidatesMu.RLock()
candidate, ok := store.candidateByPack[packName]
store.candidatesMu.RUnlock()
+
return candidate, ok
}
// openIndex returns one opened and parsed index, caching it by pack basename.
func (store *Store) openIndex(candidate packCandidate) (*idxFile, error) {
store.idxMu.RLock()
- if index, ok := store.idxByPack[candidate.packName]; ok {
+
+ index, ok := store.idxByPack[candidate.packName]
+ if ok {
store.idxMu.RUnlock()
+
return index, nil
}
+
store.idxMu.RUnlock()
index, err := openIdxFile(store.root, candidate.idxName, candidate.packName, store.algo)
@@ -61,13 +66,19 @@ func (store *Store) openIndex(candidate packCandidate) (*idxFile, error) {
}
store.idxMu.Lock()
- if existing, ok := store.idxByPack[candidate.packName]; ok {
+
+ existing, ok := store.idxByPack[candidate.packName]
+ if ok {
store.idxMu.Unlock()
+
_ = index.close()
+
return existing, nil
}
+
store.idxByPack[candidate.packName] = index
store.idxMu.Unlock()
+
return index, nil
}
@@ -77,24 +88,32 @@ func openIdxFile(root *os.Root, idxName, packName string, algo objectid.Algorith
if err != nil {
return nil, err
}
+
info, err := file.Stat()
if err != nil {
_ = file.Close()
+
return nil, err
}
+
size := info.Size()
if size < 0 || size > int64(int(^uint(0)>>1)) {
_ = file.Close()
+
return nil, fmt.Errorf("objectstore/packed: idx %q has unsupported size", idxName)
}
+
fd, err := intconv.UintptrToInt(file.Fd())
if err != nil {
_ = file.Close()
+
return nil, err
}
+
data, err := syscall.Mmap(fd, 0, int(size), syscall.PROT_READ, syscall.MAP_PRIVATE)
if err != nil {
_ = file.Close()
+
return nil, err
}
@@ -105,27 +124,38 @@ func openIdxFile(root *os.Root, idxName, packName string, algo objectid.Algorith
file: file,
data: data,
}
- if err := index.parse(); err != nil {
+
+ err = index.parse()
+ if err != nil {
_ = index.close()
+
return nil, err
}
+
return index, nil
}
// close unmaps and closes one idx handle.
func (index *idxFile) close() error {
var closeErr error
+
if index.data != nil {
- if err := syscall.Munmap(index.data); err != nil && closeErr == nil {
+ err := syscall.Munmap(index.data)
+ if err != nil && closeErr == nil {
closeErr = err
}
+
index.data = nil
}
+
if index.file != nil {
- if err := index.file.Close(); err != nil && closeErr == nil {
+ err := index.file.Close()
+ if err != nil && closeErr == nil {
closeErr = err
}
+
index.file = nil
}
+
return closeErr
}