| 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 clusterimport (	"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 MainDBTestClusterMember-1 MemberStorageManager MainDBTestClusterMember-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 MainDBtest1 - "123"transfer: [TestClusterMember-1] - SetMain null "{\"test1\":\"123\"}"TestClusterMember-1 MemberStorageManager MainDBTestClusterMember-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 MainDBtest1 - "123"TestClusterMember-1 MemberStorageManager MainDBtest1 - "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 MainDBtest1 - "123"TestClusterMember-1 MemberStorageManager MainDBtest1 - "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 MainDBtest1 - "123"test2 - "456"TestClusterMember-1 MemberStorageManager MainDBtest1 - "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 MainDBtest2 - "456"TestClusterMember-1 MemberStorageManager MainDBtest2 - "456"TestClusterMember-2 MemberStorageManager MainDB`[1:] {		t.Error("Unexpected cluster storage layout: ", res)		return	}}
 |