(key string, expiredAt int64, status int, headerSize int, bodySize int64, maxSize int64, isPartial bool, isFlushing bool)
| 476 | } |
| 477 | |
| 478 | func (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 | } |
no test coverage detected