123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- /*
- * EliasDB
- *
- * Copyright 2016 Matthias Ladkau. All rights reserved.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- */
- package cluster
- import (
- "math"
- "testing"
- "devt.de/krotik/eliasdb/cluster/manager"
- )
- func TestSimpleDataReplicationMainDB(t *testing.T) {
- // Set a low distribution range
- defaultDistributionRange = 10
- defer func() { defaultDistributionRange = math.MaxUint64 }()
- // Setup a cluster
- manager.FreqHousekeeping = 5
- defer func() { manager.FreqHousekeeping = 1000 }()
- // Disable the transfer worker for this test
- runTransferWorker = false
- defer func() { runTransferWorker = true }()
- // Create a cluster with 3 members and a replication factor of 2
- cluster3, ms := createCluster(3, 2)
- // Debug output
- // manager.LogDebug = manager.LogInfo
- // log.SetOutput(os.Stderr)
- // defer func() { log.SetOutput(ioutil.Discard) }()
- for i, dd := range cluster3 {
- dd.Start()
- defer dd.Close()
- if i > 0 {
- err := dd.MemberManager.JoinCluster(cluster3[0].MemberManager.Name(), cluster3[0].MemberManager.NetAddr())
- if err != nil {
- t.Error(err)
- return
- }
- }
- }
- // Main DB should be empty at this point
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- TestClusterMember-1 MemberStorageManager MainDB
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- // Insert a string
- main := cluster3[1].MainDB()
- main["test1"] = "123"
- cluster3[1].FlushMain()
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- test1 - "123"
- transfer: [TestClusterMember-1] - SetMain null "{\"test1\":\"123\"}"
- TestClusterMember-1 MemberStorageManager MainDB
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- // Run the transfer worker
- runTransferWorker = true
- ms[0].transferWorker()
- runTransferWorker = false
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- test1 - "123"
- TestClusterMember-1 MemberStorageManager MainDB
- test1 - "123"
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- // Simulate a failure on member 0
- manager.MemberErrors = make(map[string]error)
- defer func() { manager.MemberErrors = nil }()
- manager.MemberErrors[cluster3[0].MemberManager.Name()] = &testNetError{}
- // Insert another string
- main = cluster3[2].MainDB()
- if len(main) != 1 {
- t.Error("MainDB should have only one entry at this point:", main)
- return
- }
- main["test2"] = "456"
- cluster3[2].FlushMain()
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- test1 - "123"
- TestClusterMember-1 MemberStorageManager MainDB
- test1 - "123"
- test2 - "456"
- transfer: [TestClusterMember-0] - SetMain null "{\"test1\":\"123\",\"test2\":\"456\"}"
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- // Simulate a member 0 is working again
- manager.MemberErrors = make(map[string]error)
- defer func() { manager.MemberErrors = nil }()
- delete(manager.MemberErrors, cluster3[0].MemberManager.Name())
- // Run the transfer worker
- runTransferWorker = true
- ms[0].transferWorker()
- ms[1].transferWorker()
- ms[2].transferWorker()
- runTransferWorker = false
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- test1 - "123"
- test2 - "456"
- TestClusterMember-1 MemberStorageManager MainDB
- test1 - "123"
- test2 - "456"
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- main = cluster3[2].MainDB()
- if len(main) != 2 {
- t.Error("MainDB should have two entries at this point:", main)
- return
- }
- // Remove from main DB
- main = cluster3[1].MainDB()
- delete(main, "test1")
- cluster3[1].FlushMain()
- runTransferWorker = true
- ms[0].transferWorker()
- ms[1].transferWorker()
- ms[2].transferWorker()
- runTransferWorker = false
- if res := clusterLayout(ms, ""); res != `
- TestClusterMember-0 MemberStorageManager MainDB
- test2 - "456"
- TestClusterMember-1 MemberStorageManager MainDB
- test2 - "456"
- TestClusterMember-2 MemberStorageManager MainDB
- `[1:] {
- t.Error("Unexpected cluster storage layout: ", res)
- return
- }
- }
|