Changeset 608 in code
- Timestamp:
- Oct 6, 2021, 9:41:39 AM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/msgstore_fs.go
r591 r608 15 15 ) 16 16 17 const fsMessageStoreMaxTries = 100 17 const ( 18 fsMessageStoreMaxFiles = 20 19 fsMessageStoreMaxTries = 100 20 ) 18 21 19 22 func escapeFilename(unsafe string) (safe string) { … … 66 69 } 67 70 71 type fsMessageStoreFile struct { 72 *os.File 73 lastUse time.Time 74 } 75 68 76 // fsMessageStore is a per-user on-disk store for IRC messages. 69 77 type fsMessageStore struct { 70 78 root string 71 79 72 files map[string]*os.File // indexed by entity 80 // Write-only files used by Append 81 files map[string]*fsMessageStoreFile // indexed by entity 73 82 } 74 83 … … 79 88 return &fsMessageStore{ 80 89 root: filepath.Join(root, escapeFilename(username)), 81 files: make(map[string]* os.File),90 files: make(map[string]*fsMessageStoreFile), 82 91 } 83 92 } … … 127 136 } 128 137 129 // TODO: enforce maximum open file handles (LRU cache of file handles)130 138 f := ms.files[entity] 131 139 … … 133 141 path := ms.logPath(network, entity, t) 134 142 if f == nil || f.Name() != path { 135 if f != nil {136 f.Close()137 }138 139 143 dir := filepath.Dir(path) 140 144 if err := os.MkdirAll(dir, 0750); err != nil { … … 142 146 } 143 147 144 var err error 145 f, err = os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0640) 148 ff, err := os.OpenFile(path, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0640) 146 149 if err != nil { 147 150 return "", fmt.Errorf("failed to open message log file %q: %v", path, err) 148 151 } 149 152 153 if f != nil { 154 f.Close() 155 } 156 f = &fsMessageStoreFile{File: ff} 150 157 ms.files[entity] = f 151 158 } 152 159 153 msgID, err := nextFSMsgID(network, entity, t, f) 160 f.lastUse = time.Now() 161 162 if len(ms.files) > fsMessageStoreMaxFiles { 163 entities := make([]string, 0, len(ms.files)) 164 for name := range ms.files { 165 entities = append(entities, name) 166 } 167 sort.Slice(entities, func(i, j int) bool { 168 a, b := entities[i], entities[j] 169 return ms.files[a].lastUse.Before(ms.files[b].lastUse) 170 }) 171 entities = entities[0 : len(entities)-fsMessageStoreMaxFiles] 172 for _, name := range entities { 173 ms.files[name].Close() 174 delete(ms.files, name) 175 } 176 } 177 178 msgID, err := nextFSMsgID(network, entity, t, f.File) 154 179 if err != nil { 155 180 return "", fmt.Errorf("failed to generate message ID: %v", err)
Note:
See TracChangeset
for help on using the changeset viewer.