store_disk_space_test.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package storage
  2. import (
  3. "testing"
  4. "github.com/seaweedfs/seaweedfs/weed/storage/needle"
  5. )
  6. func TestHasFreeDiskLocation(t *testing.T) {
  7. testCases := []struct {
  8. name string
  9. isDiskSpaceLow bool
  10. maxVolumeCount int32
  11. currentVolumes int
  12. expected bool
  13. }{
  14. {
  15. name: "low disk space prevents allocation",
  16. isDiskSpaceLow: true,
  17. maxVolumeCount: 10,
  18. currentVolumes: 5,
  19. expected: false,
  20. },
  21. {
  22. name: "normal disk space and available volume count allows allocation",
  23. isDiskSpaceLow: false,
  24. maxVolumeCount: 10,
  25. currentVolumes: 5,
  26. expected: true,
  27. },
  28. {
  29. name: "volume count at max prevents allocation",
  30. isDiskSpaceLow: false,
  31. maxVolumeCount: 2,
  32. currentVolumes: 2,
  33. expected: false,
  34. },
  35. {
  36. name: "volume count over max prevents allocation",
  37. isDiskSpaceLow: false,
  38. maxVolumeCount: 2,
  39. currentVolumes: 3,
  40. expected: false,
  41. },
  42. {
  43. name: "volume count just under max allows allocation",
  44. isDiskSpaceLow: false,
  45. maxVolumeCount: 2,
  46. currentVolumes: 1,
  47. expected: true,
  48. },
  49. {
  50. name: "max volume count is 0 allows allocation",
  51. isDiskSpaceLow: false,
  52. maxVolumeCount: 0,
  53. currentVolumes: 100,
  54. expected: true,
  55. },
  56. {
  57. name: "max volume count is 0 but low disk space prevents allocation",
  58. isDiskSpaceLow: true,
  59. maxVolumeCount: 0,
  60. currentVolumes: 100,
  61. expected: false,
  62. },
  63. }
  64. for _, tc := range testCases {
  65. t.Run(tc.name, func(t *testing.T) {
  66. // setup
  67. diskLocation := &DiskLocation{
  68. volumes: make(map[needle.VolumeId]*Volume),
  69. isDiskSpaceLow: tc.isDiskSpaceLow,
  70. MaxVolumeCount: tc.maxVolumeCount,
  71. }
  72. for i := 0; i < tc.currentVolumes; i++ {
  73. diskLocation.volumes[needle.VolumeId(i+1)] = &Volume{}
  74. }
  75. store := &Store{
  76. Locations: []*DiskLocation{diskLocation},
  77. }
  78. // act
  79. result := store.hasFreeDiskLocation(diskLocation)
  80. // assert
  81. if result != tc.expected {
  82. t.Errorf("Expected hasFreeDiskLocation() = %v; want %v for volumes:%d/%d, lowSpace:%v",
  83. result, tc.expected, len(diskLocation.volumes), diskLocation.MaxVolumeCount, diskLocation.isDiskSpaceLow)
  84. }
  85. })
  86. }
  87. }