MCPcopy Create free account
hub / github.com/GoEdgeLab/EdgeNode / openWriter

Method openWriter

internal/caches/storage_file.go:478–727  ·  view source on GitHub ↗
(key string, expiredAt int64, status int, headerSize int, bodySize int64, maxSize int64, isPartial bool, isFlushing bool)

Source from the content-addressed store, hash-verified

476}
477
478func (this *FileStorage) openWriter(key string, expiredAt int64, status int, headerSize int, bodySize int64, maxSize int64, isPartial bool, isFlushing bool) (Writer, error) {
479 // 是否正在退出
480 if teaconst.IsQuiting {
481 return nil, ErrWritingUnavailable
482 }
483
484 // 是否已忽略
485 if maxSize > 0 && this.ignoreKeys.Has(types.String(maxSize)+"$"+key) {
486 return nil, ErrEntityTooLarge
487 }
488
489 // 检查磁盘是否超出容量
490 // 需要在内存缓存之前执行,避免成功写进到了内存缓存,但无法刷到磁盘
491 var capacityBytes = this.diskCapacityBytes()
492 if capacityBytes > 0 && capacityBytes <= this.TotalDiskSize()+(32<<20 /** 余量 **/) {
493 return nil, NewCapacityError("write file cache failed: over disk size, current: " + types.String(this.TotalDiskSize()) + ", capacity: " + types.String(capacityBytes))
494 }
495
496 // 先尝试内存缓存
497 // 我们限定仅小文件优先存在内存中
498 var maxMemorySize = FileToMemoryMaxSize
499 if maxSize > 0 && maxSize < maxMemorySize {
500 maxMemorySize = maxSize
501 }
502 var memoryStorage = this.memoryStorage
503 if !isFlushing && !isPartial && memoryStorage != nil && ((bodySize > 0 && bodySize < maxMemorySize) || bodySize < 0) {
504 writer, err := memoryStorage.OpenWriter(key, expiredAt, status, headerSize, bodySize, maxMemorySize, false)
505 if err == nil {
506 return writer, nil
507 }
508
509 // 如果队列满了,则等待
510 if errors.Is(err, ErrWritingQueueFull) {
511 return nil, err
512 }
513
514 if IsCapacityError(err) && bodySize > 0 && memoryStorage.totalDirtySize > (128<<20) {
515 return nil, err
516 }
517 }
518
519 // 是否正在写入
520 var isOk = false
521 sharedWritingFileKeyLocker.Lock()
522 _, ok := sharedWritingFileKeyMap[key]
523 if ok {
524 sharedWritingFileKeyLocker.Unlock()
525 return nil, fmt.Errorf("%w(001)", ErrFileIsWriting)
526 }
527
528 sharedWritingFileKeyMap[key] = zero.New()
529 sharedWritingFileKeyLocker.Unlock()
530 defer func() {
531 if !isOk {
532 sharedWritingFileKeyLocker.Lock()
533 delete(sharedWritingFileKeyMap, key)
534 sharedWritingFileKeyLocker.Unlock()
535 }

Callers 3

OpenWriterMethod · 0.95
OpenFlushWriterMethod · 0.95
hotLoopMethod · 0.45

Calls 15

diskCapacityBytesMethod · 0.95
TotalDiskSizeMethod · 0.95
subDirMethod · 0.95
removeCacheFileMethod · 0.95
NewFunction · 0.92
NewCapacityErrorFunction · 0.85
IsCapacityErrorFunction · 0.85
NewPartialFileReaderFunction · 0.85
NewPartialRangesFunction · 0.85
NewPartialFileWriterFunction · 0.85
ErrorfMethod · 0.80
RangesMethod · 0.80

Tested by

no test coverage detected