github.com/weaviate/weaviate@v1.24.6/usecases/replica/config.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package replica 13 14 import ( 15 "fmt" 16 17 "github.com/weaviate/weaviate/entities/models" 18 "github.com/weaviate/weaviate/entities/replication" 19 ) 20 21 type nodeCounter interface { 22 NodeCount() int 23 } 24 25 func ValidateConfig(class *models.Class, globalCfg replication.GlobalConfig) error { 26 if class.ReplicationConfig == nil { 27 class.ReplicationConfig = &models.ReplicationConfig{Factor: int64(globalCfg.MinimumFactor)} 28 return nil 29 } 30 31 if class.ReplicationConfig.Factor > 0 && class.ReplicationConfig.Factor < int64(globalCfg.MinimumFactor) { 32 return fmt.Errorf("invalid replication factor: setup requires a minimum replication factor of %d: got %d", 33 globalCfg.MinimumFactor, class.ReplicationConfig.Factor) 34 } 35 36 if class.ReplicationConfig.Factor < 1 { 37 class.ReplicationConfig.Factor = int64(globalCfg.MinimumFactor) 38 } 39 40 return nil 41 } 42 43 func ValidateConfigUpdate(old, updated *models.Class, nodeCounter nodeCounter) error { 44 // This is not possible if schema is being updated via by a client. 45 // But for a test object that wasn't created by a client, it is. 46 if old.ReplicationConfig == nil { 47 old.ReplicationConfig = &models.ReplicationConfig{Factor: 1} 48 } 49 50 if updated.ReplicationConfig == nil { 51 updated.ReplicationConfig = &models.ReplicationConfig{Factor: 1} 52 } 53 54 if old.ReplicationConfig.Factor != updated.ReplicationConfig.Factor { 55 nc := nodeCounter.NodeCount() 56 if int(updated.ReplicationConfig.Factor) > nc { 57 return fmt.Errorf("cannot scale to %d replicas, cluster has only %d nodes", 58 updated.ReplicationConfig.Factor, nc) 59 } 60 } 61 62 return nil 63 }