From 6620ca4475cabdef0408cc1fd5a3931c1a7c9a6a Mon Sep 17 00:00:00 2001 From: auxten Date: Wed, 5 Dec 2018 16:31:57 +0800 Subject: [PATCH 01/13] Add new cloudflare.com DNSKEY --- test/GNTE/conf/node_0/config.yaml | 1 + test/GNTE/conf/node_1/config.yaml | 1 + test/GNTE/conf/node_2/config.yaml | 1 + test/GNTE/conf/node_c/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.2/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.3/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.4/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.5/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.6/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.7/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.8/config.yaml | 1 + test/GNTE/conf/node_miner_10.250.100.9/config.yaml | 1 + test/bootstrap.yaml | 1 + test/fuse/node_0/config.yaml | 1 + test/fuse/node_1/config.yaml | 1 + test/fuse/node_2/config.yaml | 1 + test/fuse/node_c/config.yaml | 1 + test/fuse/node_miner_0/config.yaml | 1 + test/fuse/node_miner_1/config.yaml | 1 + test/fuse/node_miner_2/config.yaml | 1 + test/integration/node_0/config.yaml | 1 + test/integration/node_1/config.yaml | 1 + test/integration/node_2/config.yaml | 1 + test/integration/node_c/config.yaml | 1 + test/integration/node_miner_0/config.yaml | 1 + test/integration/node_miner_1/config.yaml | 1 + test/integration/node_miner_2/config.yaml | 1 + test/leak/client.yaml | 1 + test/leak/leader.yaml | 1 + test/mainchain/node_0/config.yaml | 1 + test/mainchain/node_1/config.yaml | 1 + test/mainchain/node_2/config.yaml | 1 + test/mainchain/node_c/config.yaml | 1 + test/mainchain/node_miner_0/config.yaml | 1 + test/mainchain/node_miner_1/config.yaml | 1 + test/mainchain/node_miner_2/config.yaml | 1 + test/mainchain/node_multi_0/config.yaml | 1 + test/mainchain/node_multi_1/config.yaml | 1 + test/mainchain/node_multi_2/config.yaml | 1 + test/mainchain/node_standalone/config.yaml | 1 + test/node_0/config.yaml | 1 + test/node_1/config.yaml | 1 + test/node_2/config.yaml | 1 + test/node_c/config.yaml | 1 + test/node_standalone/config.yaml | 1 + test/node_standalone/config2.yaml | 1 + test/observation/node_0/config.yaml | 1 + test/observation/node_1/config.yaml | 1 + test/observation/node_2/config.yaml | 1 + test/observation/node_c/config.yaml | 1 + test/observation/node_miner_0/config.yaml | 1 + test/observation/node_miner_1/config.yaml | 1 + test/observation/node_miner_2/config.yaml | 1 + test/observation/node_observer/config.yaml | 1 + test/pool/client.yaml | 1 + test/pool/leader.yaml | 1 + test/service/node_0/config.yaml | 1 + test/service/node_1/config.yaml | 1 + test/service/node_2/config.yaml | 1 + test/service/node_adapter/config.yaml | 1 + test/service/node_c/config.yaml | 1 + test/service/node_miner_0/config.yaml | 1 + test/service/node_miner_1/config.yaml | 1 + test/service/node_miner_2/config.yaml | 1 + test/service/node_mysql_adapter/config.yaml | 1 + test/service/node_observer/config.yaml | 1 + 66 files changed, 66 insertions(+) diff --git a/test/GNTE/conf/node_0/config.yaml b/test/GNTE/conf/node_0/config.yaml index d0f183e52..5999a7e55 100644 --- a/test/GNTE/conf/node_0/config.yaml +++ b/test/GNTE/conf/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/GNTE/conf/node_1/config.yaml b/test/GNTE/conf/node_1/config.yaml index 70f6ca0f8..15df963f9 100644 --- a/test/GNTE/conf/node_1/config.yaml +++ b/test/GNTE/conf/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/GNTE/conf/node_2/config.yaml b/test/GNTE/conf/node_2/config.yaml index c1321a15c..5cbac829d 100644 --- a/test/GNTE/conf/node_2/config.yaml +++ b/test/GNTE/conf/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/GNTE/conf/node_c/config.yaml b/test/GNTE/conf/node_c/config.yaml index 75aa1975c..242705fbb 100644 --- a/test/GNTE/conf/node_c/config.yaml +++ b/test/GNTE/conf/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml index 2a301d150..11f86f067 100644 --- a/test/GNTE/conf/node_miner_10.250.100.2/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml index 1106c28bb..af4ebc1fd 100644 --- a/test/GNTE/conf/node_miner_10.250.100.3/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.3/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml index b19dace89..451175275 100644 --- a/test/GNTE/conf/node_miner_10.250.100.4/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.4/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml index a09d83606..c89c325cf 100755 --- a/test/GNTE/conf/node_miner_10.250.100.5/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.5/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00eda359cd2aa0920cdd37b083b896cb18cd26b3bd51744d1b4f127830f820f2" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml index b96505d19..7e20eae29 100755 --- a/test/GNTE/conf/node_miner_10.250.100.6/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.6/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "0017017845ff9f9f7e8599d308652eb8ce480e689fbd49afb6b44cc9726cf84b" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml index 5370e24f6..e88979235 100755 --- a/test/GNTE/conf/node_miner_10.250.100.7/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.7/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "0075b97519d0a5cf9f7269a61b82bb3e082a5e7d796604e877ee28d08491979a" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml index bc633a6fc..94c0a66dd 100755 --- a/test/GNTE/conf/node_miner_10.250.100.8/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.8/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "0060bb3394f5185f760af690b0c124a70acbaf952fd79d794a0d394c37d7c0bc" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml index 887064529..b233b95c4 100755 --- a/test/GNTE/conf/node_miner_10.250.100.9/config.yaml +++ b/test/GNTE/conf/node_miner_10.250.100.9/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "004e5cf49e88f6e35e344f35d73ffe6232d4ebe93a63a825e171b8f6f2a88859" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/bootstrap.yaml b/test/bootstrap.yaml index 08c2c7c50..7b4ba2b29 100644 --- a/test/bootstrap.yaml +++ b/test/bootstrap.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: true diff --git a/test/fuse/node_0/config.yaml b/test/fuse/node_0/config.yaml index 9919e977e..b190fe355 100644 --- a/test/fuse/node_0/config.yaml +++ b/test/fuse/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/fuse/node_1/config.yaml b/test/fuse/node_1/config.yaml index caaa118d5..504bf58e2 100644 --- a/test/fuse/node_1/config.yaml +++ b/test/fuse/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/fuse/node_2/config.yaml b/test/fuse/node_2/config.yaml index 18c3409d0..3cca205f2 100644 --- a/test/fuse/node_2/config.yaml +++ b/test/fuse/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/fuse/node_c/config.yaml b/test/fuse/node_c/config.yaml index d90eca3fe..b01fdbbf4 100644 --- a/test/fuse/node_c/config.yaml +++ b/test/fuse/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/fuse/node_miner_0/config.yaml b/test/fuse/node_miner_0/config.yaml index 448bb795f..93253c1e1 100644 --- a/test/fuse/node_miner_0/config.yaml +++ b/test/fuse/node_miner_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/fuse/node_miner_1/config.yaml b/test/fuse/node_miner_1/config.yaml index 558ca1cb1..54b02f8bc 100644 --- a/test/fuse/node_miner_1/config.yaml +++ b/test/fuse/node_miner_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/fuse/node_miner_2/config.yaml b/test/fuse/node_miner_2/config.yaml index e6edd4d68..8ca540e29 100644 --- a/test/fuse/node_miner_2/config.yaml +++ b/test/fuse/node_miner_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/integration/node_0/config.yaml b/test/integration/node_0/config.yaml index af162afb2..9548dfbf1 100644 --- a/test/integration/node_0/config.yaml +++ b/test/integration/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/integration/node_1/config.yaml b/test/integration/node_1/config.yaml index 0aa1f5a9b..ed74ff6c3 100644 --- a/test/integration/node_1/config.yaml +++ b/test/integration/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/integration/node_2/config.yaml b/test/integration/node_2/config.yaml index 8f36e3ab9..fa4f7dc68 100644 --- a/test/integration/node_2/config.yaml +++ b/test/integration/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/integration/node_c/config.yaml b/test/integration/node_c/config.yaml index fe9fa6eb2..f710dc823 100644 --- a/test/integration/node_c/config.yaml +++ b/test/integration/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/integration/node_miner_0/config.yaml b/test/integration/node_miner_0/config.yaml index 8fd498a09..caf22c309 100644 --- a/test/integration/node_miner_0/config.yaml +++ b/test/integration/node_miner_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/integration/node_miner_1/config.yaml b/test/integration/node_miner_1/config.yaml index a2b44aaf6..b375805c4 100644 --- a/test/integration/node_miner_1/config.yaml +++ b/test/integration/node_miner_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/integration/node_miner_2/config.yaml b/test/integration/node_miner_2/config.yaml index 900670988..8d8ed7429 100644 --- a/test/integration/node_miner_2/config.yaml +++ b/test/integration/node_miner_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/leak/client.yaml b/test/leak/client.yaml index 89911d9ef..d31330f6e 100644 --- a/test/leak/client.yaml +++ b/test/leak/client.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/leak/leader.yaml b/test/leak/leader.yaml index 330ee46b5..db3098e14 100644 --- a/test/leak/leader.yaml +++ b/test/leak/leader.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_0/config.yaml b/test/mainchain/node_0/config.yaml index 866534570..b212ca348 100644 --- a/test/mainchain/node_0/config.yaml +++ b/test/mainchain/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_1/config.yaml b/test/mainchain/node_1/config.yaml index c53b9fba4..455bf210b 100644 --- a/test/mainchain/node_1/config.yaml +++ b/test/mainchain/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_2/config.yaml b/test/mainchain/node_2/config.yaml index b15a972b7..f00b915d4 100644 --- a/test/mainchain/node_2/config.yaml +++ b/test/mainchain/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_c/config.yaml b/test/mainchain/node_c/config.yaml index 9c509ef03..9cf42891b 100644 --- a/test/mainchain/node_c/config.yaml +++ b/test/mainchain/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_miner_0/config.yaml b/test/mainchain/node_miner_0/config.yaml index b5f65dc73..b7a496d61 100644 --- a/test/mainchain/node_miner_0/config.yaml +++ b/test/mainchain/node_miner_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/mainchain/node_miner_1/config.yaml b/test/mainchain/node_miner_1/config.yaml index 8d88cd5c9..2c49ebd8a 100644 --- a/test/mainchain/node_miner_1/config.yaml +++ b/test/mainchain/node_miner_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/mainchain/node_miner_2/config.yaml b/test/mainchain/node_miner_2/config.yaml index 3e67adecf..779402323 100644 --- a/test/mainchain/node_miner_2/config.yaml +++ b/test/mainchain/node_miner_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/mainchain/node_multi_0/config.yaml b/test/mainchain/node_multi_0/config.yaml index a0b088db4..e70ffd415 100644 --- a/test/mainchain/node_multi_0/config.yaml +++ b/test/mainchain/node_multi_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_multi_1/config.yaml b/test/mainchain/node_multi_1/config.yaml index c92846f87..5c0fc2a6b 100644 --- a/test/mainchain/node_multi_1/config.yaml +++ b/test/mainchain/node_multi_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_multi_2/config.yaml b/test/mainchain/node_multi_2/config.yaml index 8d5f46eee..2d1c650f0 100644 --- a/test/mainchain/node_multi_2/config.yaml +++ b/test/mainchain/node_multi_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/mainchain/node_standalone/config.yaml b/test/mainchain/node_standalone/config.yaml index a0b088db4..e70ffd415 100644 --- a/test/mainchain/node_standalone/config.yaml +++ b/test/mainchain/node_standalone/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_0/config.yaml b/test/node_0/config.yaml index 9c2327abb..f47c4cf22 100644 --- a/test/node_0/config.yaml +++ b/test/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_1/config.yaml b/test/node_1/config.yaml index be088389f..4f6a0a249 100644 --- a/test/node_1/config.yaml +++ b/test/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_2/config.yaml b/test/node_2/config.yaml index 0e05b138f..96baa43ea 100644 --- a/test/node_2/config.yaml +++ b/test/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_c/config.yaml b/test/node_c/config.yaml index b23931038..36d58d9ce 100644 --- a/test/node_c/config.yaml +++ b/test/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_standalone/config.yaml b/test/node_standalone/config.yaml index b5709bde4..604658ac2 100644 --- a/test/node_standalone/config.yaml +++ b/test/node_standalone/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/node_standalone/config2.yaml b/test/node_standalone/config2.yaml index 7921f4cd1..3cd844de8 100644 --- a/test/node_standalone/config2.yaml +++ b/test/node_standalone/config2.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/observation/node_0/config.yaml b/test/observation/node_0/config.yaml index 5f28396f8..d47987c9c 100644 --- a/test/observation/node_0/config.yaml +++ b/test/observation/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/observation/node_1/config.yaml b/test/observation/node_1/config.yaml index 1d4a67dcd..4eef1664a 100644 --- a/test/observation/node_1/config.yaml +++ b/test/observation/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/observation/node_2/config.yaml b/test/observation/node_2/config.yaml index af8bc1911..91c286918 100644 --- a/test/observation/node_2/config.yaml +++ b/test/observation/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/observation/node_c/config.yaml b/test/observation/node_c/config.yaml index 098da0e36..569a2bfb5 100644 --- a/test/observation/node_c/config.yaml +++ b/test/observation/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/observation/node_miner_0/config.yaml b/test/observation/node_miner_0/config.yaml index 43934a95e..05d7a724f 100644 --- a/test/observation/node_miner_0/config.yaml +++ b/test/observation/node_miner_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/observation/node_miner_1/config.yaml b/test/observation/node_miner_1/config.yaml index 400a21ad9..e49f53b51 100644 --- a/test/observation/node_miner_1/config.yaml +++ b/test/observation/node_miner_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/observation/node_miner_2/config.yaml b/test/observation/node_miner_2/config.yaml index edeb37ebc..69e57496a 100644 --- a/test/observation/node_miner_2/config.yaml +++ b/test/observation/node_miner_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/observation/node_observer/config.yaml b/test/observation/node_observer/config.yaml index 3a344a39f..55ef693f6 100644 --- a/test/observation/node_observer/config.yaml +++ b/test/observation/node_observer/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "0000037c786c744967bf536e58d51f24c074f14f693b1daedef88bf9efb92349" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/pool/client.yaml b/test/pool/client.yaml index 7bc3f1165..342f14f39 100644 --- a/test/pool/client.yaml +++ b/test/pool/client.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/pool/leader.yaml b/test/pool/leader.yaml index 400fb667d..a49763f6e 100644 --- a/test/pool/leader.yaml +++ b/test/pool/leader.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_0/config.yaml b/test/service/node_0/config.yaml index b346a58a2..6b5b43471 100644 --- a/test/service/node_0/config.yaml +++ b/test/service/node_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_1/config.yaml b/test/service/node_1/config.yaml index 0c0d2bf5f..38894accc 100644 --- a/test/service/node_1/config.yaml +++ b/test/service/node_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000381d46fd6cf7742d7fb94e2422033af989c0e348b5781b3219599a3af35" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_2/config.yaml b/test/service/node_2/config.yaml index 47d526619..c86182e5c 100644 --- a/test/service/node_2/config.yaml +++ b/test/service/node_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000000172580063ded88e010556b0aca2851265be8845b1ef397e8fce6ab5582" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_adapter/config.yaml b/test/service/node_adapter/config.yaml index aeefebf7f..3070a5784 100644 --- a/test/service/node_adapter/config.yaml +++ b/test/service/node_adapter/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_c/config.yaml b/test/service/node_c/config.yaml index aeefebf7f..3070a5784 100644 --- a/test/service/node_c/config.yaml +++ b/test/service/node_c/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_miner_0/config.yaml b/test/service/node_miner_0/config.yaml index 4c981fcb7..ca3f3dd69 100644 --- a/test/service/node_miner_0/config.yaml +++ b/test/service/node_miner_0/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005aa62048f85da4ae9698ed59c14ec0d48a88a07c15a32265634e7e64ade" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/service/node_miner_1/config.yaml b/test/service/node_miner_1/config.yaml index e41bbbb9f..f8aba6764 100644 --- a/test/service/node_miner_1/config.yaml +++ b/test/service/node_miner_1/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000005f4f22c06f76c43c4f48d5a7ec1309cc94030cbf9ebae814172884ac8b5" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/service/node_miner_2/config.yaml b/test/service/node_miner_2/config.yaml index 00d4caed0..b3f87924e 100644 --- a/test/service/node_miner_2/config.yaml +++ b/test/service/node_miner_2/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "000003f49592f83d0473bddb70d543f1096b4ffed5e5f942a3117e256b7052b8" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com BlockProducer: PublicKey: "02c76216704d797c64c58bc11519fb68582e8e63de7e5b3b2dbbbe8733efe5fd24" NodeID: 00000bef611d346c0cbe1beaa76e7f0ed705a194fdf9ac3a248ec70e9c198bf9 diff --git a/test/service/node_mysql_adapter/config.yaml b/test/service/node_mysql_adapter/config.yaml index 3045d1535..37d23a707 100644 --- a/test/service/node_mysql_adapter/config.yaml +++ b/test/service/node_mysql_adapter/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "00000f3b43288fe99831eb533ab77ec455d13e11fc38ec35a42d4edd17aa320d" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false diff --git a/test/service/node_observer/config.yaml b/test/service/node_observer/config.yaml index 9f6dff35a..0e731f457 100644 --- a/test/service/node_observer/config.yaml +++ b/test/service/node_observer/config.yaml @@ -8,6 +8,7 @@ ThisNodeID: "0000037c786c744967bf536e58d51f24c074f14f693b1daedef88bf9efb92349" ValidDNSKeys: koPbw9wmYZ7ggcjnQ6ayHyhHaDNMYELKTqT+qRGrZpWSccr/lBcrm10Z1PuQHB3Azhii+sb0PYFkH1ruxLhe5g==: cloudflare.com mdsswUyr3DPW132mOi8V9xESWE8jTo0dxCjjnopKl+GqJxpVXckHAeF+KkxLbxILfDLUT0rAK9iUzy1L53eKGQ==: cloudflare.com + oJMRESz5E4gYzS/q6XDrvU1qMPYIjCWzJaOau8XNEZeqCYKD5ar0IRd8KqXXFJkqmVfRvMGPmM1x8fGAa2XhSA==: cloudflare.com MinNodeIDDifficulty: 2 DNSSeed: EnforcedDNSSEC: false From 0c337ad0f26870961b94229034ec347b5abd2558 Mon Sep 17 00:00:00 2001 From: auxten Date: Wed, 5 Dec 2018 16:32:55 +0800 Subject: [PATCH 02/13] If smux session dead, cancel the context passed to RPC through Envelope --- Gopkg.lock | 6 +++--- Gopkg.toml | 4 ++++ proto/proto.go | 22 ++++++++++++++++++---- rpc/codec.go | 7 ++++++- rpc/rpcutil.go | 2 +- rpc/server.go | 8 +++++++- vendor/github.com/xtaci/smux/stream.go | 6 ++++++ worker/db.go | 4 ++-- 8 files changed, 47 insertions(+), 12 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index dca93369b..f938ce406 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -559,12 +559,12 @@ source = "github.com/CovenantSQL/usql" [[projects]] - digest = "1:07aaea55c778d9f0461a429eb19a134f17e9ac3232a5a28b16dfe57c637889bc" + branch = "master" + digest = "1:fd9ee7072a8121eb2a1592611023924f00492432ef923e561110e4c5e380f285" name = "github.com/xtaci/smux" packages = ["."] pruneopts = "UT" - revision = "545ecee9d2a96ef4cf3c420c6b4095ac313fe870" - version = "v1.09" + revision = "6cf098d439391c8f8f6a485f8928f47575b6002e" [[projects]] digest = "1:4619abe2e9ceabced45ff40a4826866c48f264bb58384efe799a8fb83c2256e0" diff --git a/Gopkg.toml b/Gopkg.toml index 89678703c..0b2e9a1b8 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -61,6 +61,10 @@ name = "github.com/CovenantSQL/xurls" branch = "master" +[[override]] + name = "github.com/xtaci/smux" + branch = "master" + [[override]] name = "github.com/siddontang/go-mysql" source = "github.com/CovenantSQL/go-mysql" diff --git a/proto/proto.go b/proto/proto.go index 2f5a812f8..936536449 100644 --- a/proto/proto.go +++ b/proto/proto.go @@ -18,6 +18,7 @@ package proto import ( + "context" "time" ) @@ -30,19 +31,22 @@ type EnvelopeAPI interface { GetTTL() time.Duration GetExpire() time.Duration GetNodeID() *RawNodeID + GetContext() context.Context SetVersion(string) SetTTL(time.Duration) SetExpire(time.Duration) SetNodeID(*RawNodeID) + SetContext(context.Context) } // Envelope is the protocol header type Envelope struct { - Version string `json:"v"` - TTL time.Duration `json:"t"` - Expire time.Duration `json:"e"` - NodeID *RawNodeID `json:"id"` + Version string `json:"v"` + TTL time.Duration `json:"t"` + Expire time.Duration `json:"e"` + NodeID *RawNodeID `json:"id"` + _ctx context.Context `json:"-"` } // PingReq is Ping RPC request @@ -120,6 +124,11 @@ func (e *Envelope) GetNodeID() *RawNodeID { return e.NodeID } +// GetContext returns context from envelop which is set in server Accept +func (e *Envelope) GetContext() context.Context { + return e._ctx +} + // SetVersion implements EnvelopeAPI.SetVersion func (e *Envelope) SetVersion(ver string) { e.Version = ver @@ -140,5 +149,10 @@ func (e *Envelope) SetNodeID(nodeID *RawNodeID) { e.NodeID = nodeID } +// SetContext set a ctx in envelope +func (e *Envelope) SetContext(ctx context.Context) { + e._ctx = ctx +} + // DatabaseID is database name, will be generated from UUID type DatabaseID string diff --git a/rpc/codec.go b/rpc/codec.go index 63b8f53cc..3d5a58f06 100644 --- a/rpc/codec.go +++ b/rpc/codec.go @@ -17,6 +17,7 @@ package rpc import ( + "context" "net/rpc" "github.com/CovenantSQL/CovenantSQL/proto" @@ -26,13 +27,15 @@ import ( type NodeAwareServerCodec struct { rpc.ServerCodec NodeID *proto.RawNodeID + Ctx context.Context } // NewNodeAwareServerCodec returns new NodeAwareServerCodec with normal rpc.ServerCode and proto.RawNodeID -func NewNodeAwareServerCodec(codec rpc.ServerCodec, nodeID *proto.RawNodeID) *NodeAwareServerCodec { +func NewNodeAwareServerCodec(codec rpc.ServerCodec, nodeID *proto.RawNodeID, ctx context.Context) *NodeAwareServerCodec { return &NodeAwareServerCodec{ ServerCodec: codec, NodeID: nodeID, + Ctx: ctx, } } @@ -51,6 +54,8 @@ func (nc *NodeAwareServerCodec) ReadRequestBody(body interface{}) (err error) { if r, ok := body.(proto.EnvelopeAPI); ok { // inject node id to rpc envelope r.SetNodeID(nc.NodeID) + // inject context + r.SetContext(nc.Ctx) } return diff --git a/rpc/rpcutil.go b/rpc/rpcutil.go index d39b12c86..84dc678c3 100644 --- a/rpc/rpcutil.go +++ b/rpc/rpcutil.go @@ -106,7 +106,7 @@ func (c *PersistentCaller) Call(method string, args interface{}, reply interface } // Reconnect tries to rebuild RPC client -func (c *PersistentCaller) Reconnect(method string) (err error) { +func (c *PersistentCaller) Reconnect(method string) (err error) { c.Lock() c.Close() c.client = nil diff --git a/rpc/server.go b/rpc/server.go index 159ad76a0..a81add856 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -17,6 +17,7 @@ package rpc import ( + "context" "io" "net" "net/rpc" @@ -149,7 +150,12 @@ sessionLoop: } break sessionLoop } - nodeAwareCodec := NewNodeAwareServerCodec(utils.GetMsgPackServerCodec(muxConn), remoteNodeID) + ctx, cancelFunc := context.WithCancel(context.Background()) + go func() { + <-muxConn.GetDieCh() + cancelFunc() + }() + nodeAwareCodec := NewNodeAwareServerCodec(utils.GetMsgPackServerCodec(muxConn), remoteNodeID, ctx) go s.rpcServer.ServeCodec(nodeAwareCodec) } } diff --git a/vendor/github.com/xtaci/smux/stream.go b/vendor/github.com/xtaci/smux/stream.go index 2ce00d2d9..2a2b82fcc 100644 --- a/vendor/github.com/xtaci/smux/stream.go +++ b/vendor/github.com/xtaci/smux/stream.go @@ -146,6 +146,12 @@ func (s *Stream) Close() error { } } +// GetDieCh returns a readonly chan which can be readable +// when the stream is to be closed. +func (s *Stream) GetDieCh() <-chan struct{} { + return s.die +} + // SetReadDeadline sets the read deadline as defined by // net.Conn.SetReadDeadline. // A zero time value disables the deadline. diff --git a/worker/db.go b/worker/db.go index ba2c7289f..96095d271 100644 --- a/worker/db.go +++ b/worker/db.go @@ -17,9 +17,9 @@ package worker import ( - "context" "os" "path/filepath" + //"runtime/trace" "sync" "time" @@ -296,7 +296,7 @@ func (db *Database) writeQuery(request *types.Request) (response *types.Response // call kayak runtime Process var result interface{} - if result, _, err = db.kayakRuntime.Apply(context.Background(), request); err != nil { + if result, _, err = db.kayakRuntime.Apply(request.GetContext(), request); err != nil { err = errors.Wrap(err, "apply failed") return } From 75c42c204575d16e1cdd7302dc6ebe24f9040e57 Mon Sep 17 00:00:00 2001 From: leventeliu Date: Wed, 5 Dec 2018 17:06:37 +0800 Subject: [PATCH 03/13] Add context support for slow functions --- sqlchain/chain.go | 154 ++++++++++++++++++------------------------- sqlchain/observer.go | 8 +-- sqlchain/runtime.go | 28 +++++--- xenomint/state.go | 81 ++++++++++++++++++----- 4 files changed, 148 insertions(+), 123 deletions(-) diff --git a/sqlchain/chain.go b/sqlchain/chain.go index a95f81c45..e40a777b4 100644 --- a/sqlchain/chain.go +++ b/sqlchain/chain.go @@ -18,6 +18,7 @@ package sqlchain import ( "bytes" + "context" "encoding/binary" "fmt" "os" @@ -112,8 +113,8 @@ type Chain struct { st *x.State cl *rpc.Caller rt *runtime + ctx context.Context // ctx is the root context of Chain - stopCh chan struct{} blocks chan *types.Block heights chan int32 responses chan *types.ResponseHeader @@ -132,8 +133,6 @@ type Chain struct { observerReplicators map[proto.NodeID]*observerReplicator // replCh defines the replication trigger channel for replication check. replCh chan struct{} - // replWg defines the waitGroups for running replications. - replWg sync.WaitGroup // Cached fileds, may need to renew some of this fields later. // @@ -143,6 +142,11 @@ type Chain struct { // NewChain creates a new sql-chain struct. func NewChain(c *Config) (chain *Chain, err error) { + return NewChainWithContext(context.Background(), c) +} + +// NewChainWithContext creates a new sql-chain struct with context. +func NewChainWithContext(ctx context.Context, c *Config) (chain *Chain, err error) { // TODO(leventeliu): this is a rough solution, you may also want to clean database file and // force rebuilding. var fi os.FileInfo @@ -202,8 +206,8 @@ func NewChain(c *Config) (chain *Chain, err error) { ai: newAckIndex(), st: state, cl: rpc.NewCaller(), - rt: newRunTime(c), - stopCh: make(chan struct{}), + rt: newRunTime(ctx, c), + ctx: ctx, blocks: make(chan *types.Block), heights: make(chan int32, 1), responses: make(chan *types.ResponseHeader), @@ -229,6 +233,12 @@ func NewChain(c *Config) (chain *Chain, err error) { // LoadChain loads the chain state from the specified database and rebuilds a memory index. func LoadChain(c *Config) (chain *Chain, err error) { + return LoadChainWithContext(context.Background(), c) +} + +// LoadChainWithContext loads the chain state from the specified database and rebuilds +// a memory index with context. +func LoadChainWithContext(ctx context.Context, c *Config) (chain *Chain, err error) { // Open LevelDB for block and state bdbFile := c.ChainFilePrefix + "-block-state.ldb" bdb, err := leveldb.OpenFile(bdbFile, &leveldbConf) @@ -272,8 +282,8 @@ func LoadChain(c *Config) (chain *Chain, err error) { ai: newAckIndex(), st: xstate, cl: rpc.NewCaller(), - rt: newRunTime(c), - stopCh: make(chan struct{}), + rt: newRunTime(ctx, c), + ctx: ctx, blocks: make(chan *types.Block), heights: make(chan int32, 1), responses: make(chan *types.ResponseHeader), @@ -537,7 +547,7 @@ func (c *Chain) produceBlockV2(now time.Time) (err error) { frs []*types.Request qts []*x.QueryTracker ) - if frs, qts, err = c.st.CommitEx(); err != nil { + if frs, qts, err = c.st.CommitExWithContext(c.rt.ctx); err != nil { return } var block = &types.Block{ @@ -609,28 +619,28 @@ func (c *Chain) produceBlockV2(now time.Time) (err error) { go func(id proto.NodeID) { defer wg.Done() resp := &MuxAdviseNewBlockResp{} - if err := c.cl.CallNode( - id, route.SQLCAdviseNewBlock.String(), req, resp); err != nil { + if err := c.cl.CallNodeWithContext( + c.rt.ctx, id, route.SQLCAdviseNewBlock.String(), req, resp, + ); err != nil { log.WithFields(log.Fields{ "peer": c.rt.getPeerInfoString(), "time": c.rt.getChainTimeString(), "curr_turn": c.rt.getNextTurn(), "using_timestamp": now.Format(time.RFC3339Nano), "block_hash": block.BlockHash().String(), - }).WithError(err).Error( - "Failed to advise new block") + }).WithError(err).Error("Failed to advise new block") } }(s) } } wg.Wait() // fire replication to observers - c.startStopReplication() + c.startStopReplication(c.rt.ctx) return } func (c *Chain) syncHead() { - // Try to fetch if the the block of the current turn is not advised yet + // Try to fetch if the block of the current turn is not advised yet if h := c.rt.getNextTurn() - 1; c.rt.getHead().Height < h { var err error req := &MuxFetchBlockReq{ @@ -739,16 +749,10 @@ func (c *Chain) runCurrentTurn(now time.Time) { } // mainCycle runs main cycle of the sql-chain. -func (c *Chain) mainCycle() { - defer func() { - c.rt.wg.Done() - // Signal worker goroutines to stop - close(c.stopCh) - }() - +func (c *Chain) mainCycle(ctx context.Context) { for { select { - case <-c.rt.stopCh: + case <-ctx.Done(): return default: c.syncHead() @@ -795,24 +799,26 @@ func (c *Chain) sync() (err error) { return } -func (c *Chain) processBlocks() { - rsCh := make(chan struct{}) - rsWG := &sync.WaitGroup{} +func (c *Chain) processBlocks(ctx context.Context) { + var ( + cld, ccl = context.WithCancel(ctx) + wg = &sync.WaitGroup{} + ) + returnStash := func(stash []*types.Block) { - defer rsWG.Done() + defer wg.Done() for _, block := range stash { select { case c.blocks <- block: - case <-rsCh: + case <-cld.Done(): return } } } defer func() { - close(rsCh) - rsWG.Wait() - c.rt.wg.Done() + ccl() + wg.Wait() }() var stash []*types.Block @@ -825,7 +831,7 @@ func (c *Chain) processBlocks() { "stashs": len(stash), }).Debug("Read new height from channel") if stash != nil { - rsWG.Add(1) + wg.Add(1) go returnStash(stash) stash = nil } @@ -863,30 +869,8 @@ func (c *Chain) processBlocks() { } } // fire replication to observers - c.startStopReplication() - case <-c.stopCh: - return - } - } -} - -func (c *Chain) processResponses() { - // TODO(leventeliu): implement that - defer c.rt.wg.Done() - for { - select { - case <-c.stopCh: - return - } - } -} - -func (c *Chain) processAcks() { - // TODO(leventeliu): implement that - defer c.rt.wg.Done() - for { - select { - case <-c.stopCh: + c.startStopReplication(c.rt.ctx) + case <-ctx.Done(): return } } @@ -898,16 +882,9 @@ func (c *Chain) Start() (err error) { return } - c.rt.wg.Add(1) - go c.processBlocks() - c.rt.wg.Add(1) - go c.processResponses() - c.rt.wg.Add(1) - go c.processAcks() - c.rt.wg.Add(1) - go c.mainCycle() - c.rt.wg.Add(1) - go c.replicationCycle() + c.rt.goFunc(c.processBlocks) + c.rt.goFunc(c.mainCycle) + c.rt.goFunc(c.replicationCycle) c.rt.startService(c) return } @@ -923,7 +900,7 @@ func (c *Chain) Stop() (err error) { log.WithFields(log.Fields{ "peer": c.rt.getPeerInfoString(), "time": c.rt.getChainTimeString(), - }).Debug("Chain service stopped") + }).Debug("Chain service and workers stopped") // Close LevelDB file var ierr error if ierr = c.bdb.Close(); ierr != nil && err == nil { @@ -1040,7 +1017,7 @@ func (c *Chain) CheckAndPushNewBlock(block *types.Block) (err error) { // } // Replicate local state from the new block - if err = c.st.ReplayBlock(block); err != nil { + if err = c.st.ReplayBlockWithContext(c.rt.ctx, block); err != nil { return } @@ -1159,10 +1136,9 @@ func (c *Chain) getBilling(low, high int32) (req *pt.BillingRequest, err error) return } -func (c *Chain) collectBillingSignatures(billings *pt.BillingRequest) { - defer c.rt.wg.Done() +func (c *Chain) collectBillingSignatures(ctx context.Context, billings *pt.BillingRequest) { // Process sign billing responses, note that range iterating over channel will only break if - // the channle is closed + // the channel is closed req := &MuxSignBillingReq{ Envelope: proto.Envelope{ // TODO(leventeliu): Add fields. @@ -1212,7 +1188,9 @@ func (c *Chain) collectBillingSignatures(billings *pt.BillingRequest) { } var resp interface{} - if err = c.cl.CallNode(bpNodeID, route.MCCAdviseBillingRequest.String(), bpReq, resp); err != nil { + if err = c.cl.CallNodeWithContext( + ctx, bpNodeID, route.MCCAdviseBillingRequest.String(), bpReq, resp, + ); err != nil { return } }() @@ -1232,12 +1210,13 @@ func (c *Chain) collectBillingSignatures(billings *pt.BillingRequest) { defer rpcWG.Done() resp := &MuxSignBillingResp{} - if err := c.cl.CallNode(id, route.SQLCSignBilling.String(), req, resp); err != nil { + if err := c.cl.CallNodeWithContext( + ctx, id, route.SQLCSignBilling.String(), req, resp, + ); err != nil { log.WithFields(log.Fields{ "peer": c.rt.getPeerInfoString(), "time": c.rt.getChainTimeString(), - }).WithError(err).Error( - "Failed to send sign billing request") + }).WithError(err).Error("Failed to send sign billing request") } respC <- &resp.SignBillingResp @@ -1268,8 +1247,7 @@ func (c *Chain) LaunchBilling(low, high int32) (err error) { return } - c.rt.wg.Add(1) - go c.collectBillingSignatures(req) + c.rt.goFunc(func(ctx context.Context) { c.collectBillingSignatures(ctx, req) }) return } @@ -1307,7 +1285,7 @@ func (c *Chain) addSubscription(nodeID proto.NodeID, startHeight int32) (err err c.observerLock.Lock() defer c.observerLock.Unlock() c.observers[nodeID] = startHeight - c.startStopReplication() + c.startStopReplication(c.rt.ctx) return } @@ -1316,15 +1294,15 @@ func (c *Chain) cancelSubscription(nodeID proto.NodeID) (err error) { c.observerLock.Lock() defer c.observerLock.Unlock() delete(c.observers, nodeID) - c.startStopReplication() + c.startStopReplication(c.rt.ctx) return } -func (c *Chain) startStopReplication() { +func (c *Chain) startStopReplication(ctx context.Context) { if c.replCh != nil { select { case c.replCh <- struct{}{}: - case <-c.stopCh: + case <-ctx.Done(): default: } } @@ -1344,10 +1322,9 @@ func (c *Chain) populateObservers() { } } else { // start new replication routine - c.replWg.Add(1) replicator := newObserverReplicator(nodeID, startHeight, c) c.observerReplicators[nodeID] = replicator - go replicator.run() + c.rt.goFunc(replicator.run) } } @@ -1360,12 +1337,7 @@ func (c *Chain) populateObservers() { } } -func (c *Chain) replicationCycle() { - defer func() { - c.replWg.Wait() - c.rt.wg.Done() - }() - +func (c *Chain) replicationCycle(ctx context.Context) { for { select { case <-c.replCh: @@ -1375,7 +1347,7 @@ func (c *Chain) replicationCycle() { for _, replicator := range c.observerReplicators { replicator.tick() } - case <-c.stopCh: + case <-ctx.Done(): return } } @@ -1384,7 +1356,7 @@ func (c *Chain) replicationCycle() { // Query queries req from local chain state and returns the query results in resp. func (c *Chain) Query(req *types.Request) (resp *types.Response, err error) { var ref *x.QueryTracker - if ref, resp, err = c.st.Query(req); err != nil { + if ref, resp, err = c.st.QueryWithContext(c.rt.ctx, req); err != nil { return } if err = resp.Sign(c.pk); err != nil { @@ -1403,7 +1375,7 @@ func (c *Chain) Replay(req *types.Request, resp *types.Response) (err error) { case types.ReadQuery: return case types.WriteQuery: - return c.st.Replay(req, resp) + return c.st.ReplayWithContext(c.rt.ctx, req, resp) default: err = ErrInvalidRequest } diff --git a/sqlchain/observer.go b/sqlchain/observer.go index e1fa19960..5e293578c 100644 --- a/sqlchain/observer.go +++ b/sqlchain/observer.go @@ -17,6 +17,7 @@ package sqlchain import ( + "context" "sync" "github.com/CovenantSQL/CovenantSQL/proto" @@ -59,7 +60,6 @@ func newObserverReplicator(nodeID proto.NodeID, startHeight int32, c *Chain) *ob func (r *observerReplicator) setNewHeight(newHeight int32) { r.replLock.Lock() defer r.replLock.Unlock() - r.height = newHeight } @@ -241,15 +241,13 @@ func (r *observerReplicator) tick() { default: } } -func (r *observerReplicator) run() { - defer r.c.replWg.Done() - +func (r *observerReplicator) run(ctx context.Context) { for { select { case <-r.triggerCh: // replication r.replicate() - case <-r.c.stopCh: + case <-ctx.Done(): r.stop() return case <-r.stopCh: diff --git a/sqlchain/runtime.go b/sqlchain/runtime.go index b1935558d..14cdabf32 100644 --- a/sqlchain/runtime.go +++ b/sqlchain/runtime.go @@ -17,6 +17,7 @@ package sqlchain import ( + "context" "fmt" "sync" "time" @@ -29,8 +30,9 @@ import ( // runtime represents a chain runtime state. type runtime struct { - wg sync.WaitGroup - stopCh chan struct{} + wg *sync.WaitGroup + ctx context.Context + cancel context.CancelFunc // chainInitTime is the initial cycle time, when the Genesis blcok is produced. chainInitTime time.Time @@ -85,9 +87,13 @@ type runtime struct { } // newRunTime returns a new sql-chain runtime instance with the specified config. -func newRunTime(c *Config) (r *runtime) { +func newRunTime(ctx context.Context, c *Config) (r *runtime) { + var cld, ccl = context.WithCancel(ctx) r = &runtime{ - stopCh: make(chan struct{}), + wg: &sync.WaitGroup{}, + ctx: cld, + cancel: ccl, + databaseID: c.DatabaseID, period: c.Period, tick: c.Tick, @@ -204,11 +210,7 @@ func (r *runtime) getQueryGas(t types.QueryType) uint64 { // stop sends a signal to the Runtime stop channel by closing it. func (r *runtime) stop() { r.stopService() - select { - case <-r.stopCh: - default: - close(r.stopCh) - } + r.cancel() r.wg.Wait() } @@ -328,3 +330,11 @@ func (r *runtime) setHead(head *state) { defer r.stateMutex.Unlock() r.head = head } + +func (r *runtime) goFunc(f func(context.Context)) { + r.wg.Add(1) + go func() { + defer r.wg.Done() + f(r.ctx) + }() +} diff --git a/xenomint/state.go b/xenomint/state.go index 8599cf012..73cf0a7a7 100644 --- a/xenomint/state.go +++ b/xenomint/state.go @@ -17,6 +17,7 @@ package xenomint import ( + "context" "database/sql" "io" "strings" @@ -107,7 +108,7 @@ func (s *State) Close(commit bool) (err error) { return } } else { - // Only rollback to last commmit point + // Only rollback to last commit point if err = s.rollback(); err != nil { return } @@ -199,10 +200,13 @@ func buildTypeNamesFromSQLColumnTypes(types []*sql.ColumnType) (names []string) type sqlQuerier interface { Query(query string, args ...interface{}) (*sql.Rows, error) + QueryContext(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) } func readSingle( - qer sqlQuerier, q *types.Query) (names []string, types []string, data [][]interface{}, err error, + ctx context.Context, qer sqlQuerier, q *types.Query, +) ( + names []string, types []string, data [][]interface{}, err error, ) { var ( rows *sql.Rows @@ -214,7 +218,7 @@ func readSingle( if _, pattern, args, err = convertQueryAndBuildArgs(q.Pattern, q.Args); err != nil { return } - if rows, err = qer.Query(pattern, args...); err != nil { + if rows, err = qer.QueryContext(ctx, pattern, args...); err != nil { return } defer rows.Close() @@ -253,6 +257,12 @@ func buildRowsFromNativeData(data [][]interface{}) (rows []types.ResponseRow) { } func (s *State) read(req *types.Request) (ref *QueryTracker, resp *types.Response, err error) { + return s.readWithContext(context.Background(), req) +} + +func (s *State) readWithContext( + ctx context.Context, req *types.Request) (ref *QueryTracker, resp *types.Response, err error, +) { var ( ierr error cnames, ctypes []string @@ -260,7 +270,7 @@ func (s *State) read(req *types.Request) (ref *QueryTracker, resp *types.Respons ) // TODO(leventeliu): no need to run every read query here. for i, v := range req.Payload.Queries { - if cnames, ctypes, data, ierr = readSingle(s.strg.DirtyReader(), &v); ierr != nil { + if cnames, ctypes, data, ierr = readSingle(ctx, s.strg.DirtyReader(), &v); ierr != nil { err = errors.Wrapf(ierr, "query at #%d failed", i) // Add to failed pool list s.pool.setFailed(req) @@ -288,7 +298,9 @@ func (s *State) read(req *types.Request) (ref *QueryTracker, resp *types.Respons return } -func (s *State) readTx(req *types.Request) (ref *QueryTracker, resp *types.Response, err error) { +func (s *State) readTx( + ctx context.Context, req *types.Request) (ref *QueryTracker, resp *types.Response, err error, +) { var ( tx *sql.Tx id uint64 @@ -315,7 +327,7 @@ func (s *State) readTx(req *types.Request) (ref *QueryTracker, resp *types.Respo } for i, v := range req.Payload.Queries { - if cnames, ctypes, data, ierr = readSingle(querier, &v); ierr != nil { + if cnames, ctypes, data, ierr = readSingle(ctx, querier, &v); ierr != nil { err = errors.Wrapf(ierr, "query at #%d failed", i) // Add to failed pool list s.pool.setFailed(req) @@ -343,7 +355,9 @@ func (s *State) readTx(req *types.Request) (ref *QueryTracker, resp *types.Respo return } -func (s *State) writeSingle(q *types.Query) (res sql.Result, err error) { +func (s *State) writeSingle( + ctx context.Context, q *types.Query) (res sql.Result, err error, +) { var ( containsDDL bool pattern string @@ -353,7 +367,7 @@ func (s *State) writeSingle(q *types.Query) (res sql.Result, err error) { if containsDDL, pattern, args, err = convertQueryAndBuildArgs(q.Pattern, q.Args); err != nil { return } - if res, err = s.unc.Exec(pattern, args...); err == nil { + if res, err = s.unc.ExecContext(ctx, pattern, args...); err == nil { if containsDDL { atomic.StoreUint32(&s.hasSchemaChange, 1) } @@ -373,7 +387,9 @@ func (s *State) rollbackTo(savepoint uint64) { s.unc.Exec("ROLLBACK TO \"?\"", savepoint) } -func (s *State) write(req *types.Request) (ref *QueryTracker, resp *types.Response, err error) { +func (s *State) write( + ctx context.Context, req *types.Request) (ref *QueryTracker, resp *types.Response, err error, +) { var ( savepoint uint64 query = &QueryTracker{Req: req} @@ -390,7 +406,7 @@ func (s *State) write(req *types.Request) (ref *QueryTracker, resp *types.Respon savepoint = s.getID() for i, v := range req.Payload.Queries { var res sql.Result - if res, ierr = s.writeSingle(&v); ierr != nil { + if res, ierr = s.writeSingle(ctx, &v); ierr != nil { err = errors.Wrapf(ierr, "execute at #%d failed", i) // Add to failed pool list s.pool.setFailed(req) @@ -426,7 +442,7 @@ func (s *State) write(req *types.Request) (ref *QueryTracker, resp *types.Respon return } -func (s *State) replay(req *types.Request, resp *types.Response) (err error) { +func (s *State) replay(ctx context.Context, req *types.Request, resp *types.Response) (err error) { var ( ierr error savepoint uint64 @@ -443,7 +459,7 @@ func (s *State) replay(req *types.Request, resp *types.Response) (err error) { return } for i, v := range req.Payload.Queries { - if _, ierr = s.writeSingle(&v); ierr != nil { + if _, ierr = s.writeSingle(ctx, &v); ierr != nil { err = errors.Wrapf(ierr, "execute at #%d failed", i) s.rollbackTo(savepoint) return @@ -457,6 +473,12 @@ func (s *State) replay(req *types.Request, resp *types.Response) (err error) { // ReplayBlock replays the queries from block. It also checks and skips some preceding pooled // queries. func (s *State) ReplayBlock(block *types.Block) (err error) { + return s.ReplayBlockWithContext(context.Background(), block) +} + +// ReplayBlockWithContext replays the queries from block with context. It also checks and +// skips some preceding pooled queries. +func (s *State) ReplayBlockWithContext(ctx context.Context, block *types.Block) (err error) { var ( ierr error lastsp uint64 // Last savepoint @@ -488,7 +510,7 @@ func (s *State) ReplayBlock(block *types.Block) (err error) { s.rollbackTo(lastsp) return } - if _, ierr = s.writeSingle(&v); ierr != nil { + if _, ierr = s.writeSingle(ctx, &v); ierr != nil { err = errors.Wrapf(ierr, "execute at %d:%d failed", i, j) s.rollbackTo(lastsp) return @@ -501,7 +523,7 @@ func (s *State) ReplayBlock(block *types.Block) (err error) { for _, r := range block.FailedReqs { s.pool.removeFailed(r) } - // Check if the current transaction is ok to commit + // Check if the current transaction is OK to commit if s.pool.matchLast(lastsp) { if err = s.uncCommit(); err != nil { // FATAL ERROR @@ -541,13 +563,21 @@ func (s *State) commit() (err error) { // CommitEx commits the current transaction and returns all the pooled queries. func (s *State) CommitEx() (failed []*types.Request, queries []*QueryTracker, err error) { + return s.CommitExWithContext(context.Background()) +} + +// CommitExWithContext commits the current transaction and returns all the pooled queries +// with context. +func (s *State) CommitExWithContext( + ctx context.Context) (failed []*types.Request, queries []*QueryTracker, err error, +) { s.Lock() defer s.Unlock() if err = s.uncCommit(); err != nil { // FATAL ERROR return } - if s.unc, err = s.strg.Writer().Begin(); err != nil { + if s.unc, err = s.strg.Writer().BeginTx(ctx, nil); err != nil { // FATAL ERROR return } @@ -586,11 +616,19 @@ func (s *State) getLocalTime() time.Time { // Query does the query(ies) in req, pools the request and persists any change to // the underlying storage. func (s *State) Query(req *types.Request) (ref *QueryTracker, resp *types.Response, err error) { + return s.QueryWithContext(context.Background(), req) +} + +// QueryWithContext does the query(ies) in req, pools the request and persists any change to +// the underlying storage. +func (s *State) QueryWithContext( + ctx context.Context, req *types.Request) (ref *QueryTracker, resp *types.Response, err error, +) { switch req.Header.QueryType { case types.ReadQuery: - return s.readTx(req) + return s.readTx(ctx, req) case types.WriteQuery: - return s.write(req) + return s.write(ctx, req) default: err = ErrInvalidRequest } @@ -599,6 +637,13 @@ func (s *State) Query(req *types.Request) (ref *QueryTracker, resp *types.Respon // Replay replays a write log from other peer to replicate storage state. func (s *State) Replay(req *types.Request, resp *types.Response) (err error) { + return s.ReplayWithContext(context.Background(), req, resp) +} + +// ReplayWithContext replays a write log from other peer to replicate storage state with context. +func (s *State) ReplayWithContext( + ctx context.Context, req *types.Request, resp *types.Response) (err error, +) { // NOTE(leventeliu): in the current implementation, failed requests are not tracked in remote // nodes (while replaying via Replay calls). Because we don't want to actually replay read // queries in all synchronized nodes, meanwhile, whether a request will fail or not @@ -609,7 +654,7 @@ func (s *State) Replay(req *types.Request, resp *types.Response) (err error) { case types.ReadQuery: return case types.WriteQuery: - return s.replay(req, resp) + return s.replay(ctx, req, resp) default: err = ErrInvalidRequest } From 80751eab47fb9caf49b9a5ee8fbdcbf8c04b24a5 Mon Sep 17 00:00:00 2001 From: leventeliu Date: Wed, 5 Dec 2018 17:16:20 +0800 Subject: [PATCH 04/13] Use request context for query and replay, instead of chain runtime context --- sqlchain/chain.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sqlchain/chain.go b/sqlchain/chain.go index e40a777b4..4b488a201 100644 --- a/sqlchain/chain.go +++ b/sqlchain/chain.go @@ -1356,7 +1356,9 @@ func (c *Chain) replicationCycle(ctx context.Context) { // Query queries req from local chain state and returns the query results in resp. func (c *Chain) Query(req *types.Request) (resp *types.Response, err error) { var ref *x.QueryTracker - if ref, resp, err = c.st.QueryWithContext(c.rt.ctx, req); err != nil { + // TODO(leventeliu): we're using an external context passed by request. Make sure that + // cancelling will be propagated to this context before chain instance stops. + if ref, resp, err = c.st.QueryWithContext(req.GetContext(), req); err != nil { return } if err = resp.Sign(c.pk); err != nil { @@ -1375,7 +1377,7 @@ func (c *Chain) Replay(req *types.Request, resp *types.Response) (err error) { case types.ReadQuery: return case types.WriteQuery: - return c.st.ReplayWithContext(c.rt.ctx, req, resp) + return c.st.ReplayWithContext(req.GetContext(), req, resp) default: err = ErrInvalidRequest } From e35728d559df8b59ae628082490f44fc192bf682 Mon Sep 17 00:00:00 2001 From: leventeliu Date: Wed, 5 Dec 2018 18:00:28 +0800 Subject: [PATCH 05/13] Return background context if not set --- proto/proto.go | 3 +++ proto/proto_test.go | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/proto/proto.go b/proto/proto.go index 936536449..1e04c2999 100644 --- a/proto/proto.go +++ b/proto/proto.go @@ -126,6 +126,9 @@ func (e *Envelope) GetNodeID() *RawNodeID { // GetContext returns context from envelop which is set in server Accept func (e *Envelope) GetContext() context.Context { + if e._ctx == nil { + return context.Background() + } return e._ctx } diff --git a/proto/proto_test.go b/proto/proto_test.go index 82428d995..50db0d90e 100644 --- a/proto/proto_test.go +++ b/proto/proto_test.go @@ -17,6 +17,7 @@ package proto import ( + "context" "testing" "time" @@ -41,5 +42,11 @@ func TestEnvelope_GetSet(t *testing.T) { env.SetVersion("0.0.1") So(env.GetVersion(), ShouldEqual, "0.0.1") + + ctx := env.GetContext() + So(ctx, ShouldEqual, context.Background()) + cldCtx, _ := context.WithCancel(ctx) + env.SetContext(cldCtx) + So(env.GetContext(), ShouldEqual, cldCtx) }) } From ea5bf559c2cc2fb73a0e0dfd98eba5514d664947 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 7 Dec 2018 12:03:34 +0800 Subject: [PATCH 06/13] Move context to the first arg --- rpc/codec.go | 2 +- rpc/server.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/rpc/codec.go b/rpc/codec.go index 3d5a58f06..98f38ce33 100644 --- a/rpc/codec.go +++ b/rpc/codec.go @@ -31,7 +31,7 @@ type NodeAwareServerCodec struct { } // NewNodeAwareServerCodec returns new NodeAwareServerCodec with normal rpc.ServerCode and proto.RawNodeID -func NewNodeAwareServerCodec(codec rpc.ServerCodec, nodeID *proto.RawNodeID, ctx context.Context) *NodeAwareServerCodec { +func NewNodeAwareServerCodec(ctx context.Context, codec rpc.ServerCodec, nodeID *proto.RawNodeID) *NodeAwareServerCodec { return &NodeAwareServerCodec{ ServerCodec: codec, NodeID: nodeID, diff --git a/rpc/server.go b/rpc/server.go index a81add856..3a56db669 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -155,7 +155,7 @@ sessionLoop: <-muxConn.GetDieCh() cancelFunc() }() - nodeAwareCodec := NewNodeAwareServerCodec(utils.GetMsgPackServerCodec(muxConn), remoteNodeID, ctx) + nodeAwareCodec := NewNodeAwareServerCodec(ctx, utils.GetMsgPackServerCodec(muxConn), remoteNodeID) go s.rpcServer.ServeCodec(nodeAwareCodec) } } From ca80080b35e4e004505f347cdae5c2c4c59eddbf Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 7 Dec 2018 11:56:24 +0800 Subject: [PATCH 07/13] Mock query context for db_test.go --- worker/db_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worker/db_test.go b/worker/db_test.go index 36561d5bc..e1689cb0e 100644 --- a/worker/db_test.go +++ b/worker/db_test.go @@ -18,6 +18,7 @@ package worker import ( "bytes" + "context" "fmt" "io/ioutil" "math/rand" @@ -631,6 +632,7 @@ func buildQueryEx(queryType types.QueryType, connID uint64, seqNo uint64, timeSh Queries: realQueries, }, } + query.SetContext(context.Background()) err = query.Sign(privateKey) From 1a85ba06967089d50afd7c1bfdbf0f248687ef55 Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 7 Dec 2018 17:46:31 +0800 Subject: [PATCH 08/13] Add test for query cancel, tobe debuged --- cmd/cql-minerd/integration_test.go | 47 ++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index bd6237d67..e5314fd2b 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -35,7 +35,10 @@ import ( "time" "github.com/CovenantSQL/CovenantSQL/client" + "github.com/CovenantSQL/CovenantSQL/conf" "github.com/CovenantSQL/CovenantSQL/crypto/asymmetric" + "github.com/CovenantSQL/CovenantSQL/proto" + "github.com/CovenantSQL/CovenantSQL/rpc" "github.com/CovenantSQL/CovenantSQL/utils" "github.com/CovenantSQL/CovenantSQL/utils/log" "github.com/CovenantSQL/go-sqlite3-encrypt" @@ -316,7 +319,7 @@ func stopNodes() { func TestFullProcess(t *testing.T) { log.SetLevel(log.DebugLevel) - Convey("test full process", t, func() { + Convey("test full process", t, func(c C) { startNodes() defer stopNodes() var err error @@ -384,11 +387,49 @@ func TestFullProcess(t *testing.T) { So(err, ShouldBeNil) So(resultBytes, ShouldResemble, []byte("ha\001ppy")) + Convey("test query cancel", func(c C) { + wg := sync.WaitGroup{} + wg.Add(1) + go func() { + // sleep 10s + _, er := db.Exec("INSERT INTO test VALUES(sleep(10000000000))") + if er != nil { + log.Errorf("insert sleep: %v", er) + } + wg.Done() + }() + time.Sleep(time.Second) + go func() { + db.Exec("UPDATE test SET test = 100;") + }() + time.Sleep(time.Second) + for _, n := range conf.GConf.KnownNodes { + if n.Role == proto.Miner { + rpc.GetSessionPoolInstance().Remove(n.ID) + } + } + time.Sleep(time.Second) + + row := db.QueryRow("SELECT * FROM test WHERE test = 4 LIMIT 1") + var result int + err = row.Scan(&result) + c.So(err, ShouldBeNil) + c.So(result, ShouldEqual, 4) + wg.Wait() + time.Sleep(10 * time.Second) + row = db.QueryRow("SELECT * FROM test WHERE test = 10000000000 LIMIT 1") + err = row.Scan(&result) + c.So(err, ShouldBeNil) + c.So(result, ShouldEqual, 4) + + c.So(err, ShouldBeNil) + }) + err = db.Close() So(err, ShouldBeNil) - err = client.Drop(dsn) - So(err, ShouldBeNil) + //err = client.Drop(dsn) + //So(err, ShouldBeNil) }) } From f112e3fa4c33dd4e1c8188df45124840ec513e6d Mon Sep 17 00:00:00 2001 From: auxten Date: Fri, 7 Dec 2018 17:47:12 +0800 Subject: [PATCH 09/13] Fix xenomint race --- xenomint/sqlite/sqlite.go | 21 ++++++++++++++++++++- xenomint/state.go | 14 +++++++------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/xenomint/sqlite/sqlite.go b/xenomint/sqlite/sqlite.go index 0ea8bf846..0c2780250 100644 --- a/xenomint/sqlite/sqlite.go +++ b/xenomint/sqlite/sqlite.go @@ -18,22 +18,41 @@ package sqlite import ( "database/sql" + "time" "github.com/CovenantSQL/CovenantSQL/storage" + "github.com/CovenantSQL/CovenantSQL/utils/log" "github.com/CovenantSQL/go-sqlite3-encrypt" ) const ( - serializableDriver = "sqlite3" + serializableDriver = "sqlite3-custom" dirtyReadDriver = "sqlite3-dirty-reader" ) func init() { + sleepFunc := func(t int64) int64 { + log.Info("sqlite func sleep start") + time.Sleep(time.Duration(t)) + log.Info("sqlite func sleep end") + return t + } sql.Register(dirtyReadDriver, &sqlite3.SQLiteDriver{ ConnectHook: func(c *sqlite3.SQLiteConn) (err error) { if _, err = c.Exec("PRAGMA read_uncommitted=1", nil); err != nil { return } + if err = c.RegisterFunc("sleep", sleepFunc, true); err != nil { + return + } + return + }, + }) + sql.Register(serializableDriver, &sqlite3.SQLiteDriver{ + ConnectHook: func(c *sqlite3.SQLiteConn) (err error) { + if err = c.RegisterFunc("sleep", sleepFunc, true); err != nil { + return + } return }, }) diff --git a/xenomint/state.go b/xenomint/state.go index 73cf0a7a7..05834e9e4 100644 --- a/xenomint/state.go +++ b/xenomint/state.go @@ -68,20 +68,21 @@ func NewState(nodeID proto.NodeID, strg xi.Storage) (s *State, err error) { } func (s *State) incSeq() { - s.current++ + atomic.AddUint64(&s.current, 1) } func (s *State) setNextTxID() { - s.origin = s.current - s.cmpoint = s.current + current := s.getID() + s.origin = current + s.cmpoint = current } func (s *State) setCommitPoint() { - s.cmpoint = s.current + s.cmpoint = s.getID() } func (s *State) rollbackID(id uint64) { - s.current = id + atomic.StoreUint64(&s.current, id) } // InitTx sets the initial id of the current transaction. This method is not safe for concurrency @@ -89,7 +90,7 @@ func (s *State) rollbackID(id uint64) { func (s *State) InitTx(id uint64) { s.origin = id s.cmpoint = id - s.current = id + s.rollbackID(id) s.setSavepoint() } @@ -605,7 +606,6 @@ func (s *State) rollback() (err error) { s.Lock() defer s.Unlock() s.rollbackTo(s.cmpoint) - s.current = s.cmpoint return } From 5f4deb4d964e96f60633320423e0c62d6266c3e0 Mon Sep 17 00:00:00 2001 From: Qi Xiao Date: Mon, 10 Dec 2018 15:00:49 +0800 Subject: [PATCH 10/13] Fix query cancellation feature --- cmd/cql-minerd/integration_test.go | 52 +++++++++++++++++++++++----- kayak/runtime.go | 55 +++++++++++++++--------------- rpc/rpcutil.go | 21 ++++++------ worker/db_storage.go | 4 +++ xenomint/state.go | 21 +++++++++++- 5 files changed, 106 insertions(+), 47 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index e5314fd2b..3d9b4b581 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -387,7 +387,7 @@ func TestFullProcess(t *testing.T) { So(err, ShouldBeNil) So(resultBytes, ShouldResemble, []byte("ha\001ppy")) - Convey("test query cancel", func(c C) { + Convey("test query cancel", FailureContinues, func(c C) { wg := sync.WaitGroup{} wg.Add(1) go func() { @@ -400,7 +400,8 @@ func TestFullProcess(t *testing.T) { }() time.Sleep(time.Second) go func() { - db.Exec("UPDATE test SET test = 100;") + _, err = db.Exec("UPDATE test SET test = 100;") + c.So(err, ShouldNotBeNil) }() time.Sleep(time.Second) for _, n := range conf.GConf.KnownNodes { @@ -410,17 +411,52 @@ func TestFullProcess(t *testing.T) { } time.Sleep(time.Second) - row := db.QueryRow("SELECT * FROM test WHERE test = 4 LIMIT 1") + // ensure connection + db.Query("SELECT 1") + var result int - err = row.Scan(&result) + err = db.QueryRow("SELECT * FROM test WHERE test = 4 LIMIT 1").Scan(&result) c.So(err, ShouldBeNil) c.So(result, ShouldEqual, 4) + wg.Wait() - time.Sleep(10 * time.Second) + time.Sleep(30 * time.Second) + + go func() { + _, err = db.Query("SELECT * FROM test WHERE test = sleep(10000000000)") + // call write query using read query interface + //_, err = db.Query("INSERT INTO test VALUES(sleep(10000000000))") + c.So(err, ShouldNotBeNil) + }() + time.Sleep(time.Second) + for _, n := range conf.GConf.KnownNodes { + if n.Role == proto.Miner { + rpc.GetSessionPoolInstance().Remove(n.ID) + } + } + + time.Sleep(time.Second) + + // ensure connection + db.Query("SELECT 1") + + time.Sleep(time.Second) + + func() { + rows, err := db.Query("SELECT * FROM test") + c.So(err, ShouldBeNil) + defer rows.Close() + var res int + for rows.Next() { + err = rows.Scan(&res) + c.So(err, ShouldBeNil) + log.WithField("record", res).Info("got record from test database") + } + }() row = db.QueryRow("SELECT * FROM test WHERE test = 10000000000 LIMIT 1") err = row.Scan(&result) c.So(err, ShouldBeNil) - c.So(result, ShouldEqual, 4) + c.So(result, ShouldEqual, 10000000000) c.So(err, ShouldBeNil) }) @@ -428,8 +464,8 @@ func TestFullProcess(t *testing.T) { err = db.Close() So(err, ShouldBeNil) - //err = client.Drop(dsn) - //So(err, ShouldBeNil) + err = client.Drop(dsn) + So(err, ShouldBeNil) }) } diff --git a/kayak/runtime.go b/kayak/runtime.go index 8c763ceda..1858a803f 100644 --- a/kayak/runtime.go +++ b/kayak/runtime.go @@ -35,7 +35,7 @@ import ( const ( // commit channel window size - commitWindow = 10 + commitWindow = 0 // prepare window trackerWindow = 10 ) @@ -246,6 +246,7 @@ func (r *Runtime) Shutdown() (err error) { // Apply defines entry for Leader node. func (r *Runtime) Apply(ctx context.Context, req interface{}) (result interface{}, logIndex uint64, err error) { var commitFuture <-chan *commitResult + var cResult *commitResult var tmStart, tmLeaderPrepare, tmFollowerPrepare, tmCommitEnqueue, tmLeaderRollback, tmRollback, tmCommitDequeue, tmLeaderCommit, tmCommit time.Time @@ -350,37 +351,36 @@ func (r *Runtime) Apply(ctx context.Context, req interface{}) (result interface{ tmCommitEnqueue = time.Now() - select { - case cResult := <-commitFuture: - if cResult != nil { - logIndex = prepareLog.Index - result = cResult.result - err = cResult.err - - tmCommitDequeue = cResult.start - dbCost = cResult.dbCost - tmLeaderCommit = time.Now() - - // wait until context deadline or commit done - if cResult.rpc != nil { - cResult.rpc.get(ctx) - } - } else { - log.Fatal("IMPOSSIBLE BRANCH") - select { - case <-ctx.Done(): - err = errors.Wrap(ctx.Err(), "process commit timeout") - goto ROLLBACK - default: - } - } - case <-ctx.Done(): - // pipeline commit timeout + if commitFuture == nil { logIndex = prepareLog.Index err = errors.Wrap(ctx.Err(), "enqueue commit timeout") goto ROLLBACK } + cResult = <-commitFuture + if cResult != nil { + logIndex = prepareLog.Index + result = cResult.result + err = cResult.err + + tmCommitDequeue = cResult.start + dbCost = cResult.dbCost + tmLeaderCommit = time.Now() + + // wait until context deadline or commit done + if cResult.rpc != nil { + cResult.rpc.get(ctx) + } + } else { + log.Fatal("IMPOSSIBLE BRANCH") + select { + case <-ctx.Done(): + err = errors.Wrap(ctx.Err(), "process commit timeout") + goto ROLLBACK + default: + } + } + tmCommit = time.Now() return @@ -572,6 +572,7 @@ func (r *Runtime) leaderCommitResult(ctx context.Context, reqPayload interface{} select { case <-ctx.Done(): + res = nil case r.commitCh <- req: } diff --git a/rpc/rpcutil.go b/rpc/rpcutil.go index 84dc678c3..d439dee95 100644 --- a/rpc/rpcutil.go +++ b/rpc/rpcutil.go @@ -23,6 +23,7 @@ import ( "math/rand" "net" "net/rpc" + "strings" "sync" "github.com/CovenantSQL/CovenantSQL/crypto/kms" @@ -65,6 +66,7 @@ func (c *PersistentCaller) initClient(isAnonymous bool) (err error) { c.Lock() defer c.Unlock() if c.client == nil { + log.Debug("init new rpc client") var conn net.Conn conn, err = DialToNode(c.TargetID, c.pool, isAnonymous) if err != nil { @@ -93,11 +95,13 @@ func (c *PersistentCaller) Call(method string, args interface{}, reply interface if err == io.EOF || err == io.ErrUnexpectedEOF || err == io.ErrClosedPipe || - err == rpc.ErrShutdown { + err == rpc.ErrShutdown || + strings.Contains(strings.ToLower(err.Error()), "shut down") || + strings.Contains(strings.ToLower(err.Error()), "broken pipe") { // if got EOF, retry once - err = c.Reconnect(method) - if err != nil { - log.WithField("rpc", method).WithError(err).Error("reconnect failed") + reconnectErr := c.ResetClient(method) + if reconnectErr != nil { + log.WithField("rpc", method).WithError(reconnectErr).Error("reconnect failed") } } log.WithField("rpc", method).WithError(err).Error("call RPC failed") @@ -105,17 +109,12 @@ func (c *PersistentCaller) Call(method string, args interface{}, reply interface return } -// Reconnect tries to rebuild RPC client -func (c *PersistentCaller) Reconnect(method string) (err error) { +// ResetClient resets client. +func (c *PersistentCaller) ResetClient(method string) (err error) { c.Lock() c.Close() c.client = nil c.Unlock() - err = c.initClient(method == route.DHTPing.String()) - if err != nil { - log.WithField("rpc", method).WithError(err).Error("second init client for RPC failed") - return - } return } diff --git a/worker/db_storage.go b/worker/db_storage.go index b56f6bbee..1b49fce83 100644 --- a/worker/db_storage.go +++ b/worker/db_storage.go @@ -19,6 +19,7 @@ package worker import ( "bytes" "container/list" + "context" "github.com/CovenantSQL/CovenantSQL/types" "github.com/CovenantSQL/CovenantSQL/utils" @@ -99,6 +100,9 @@ func (db *Database) Commit(rawReq interface{}) (result interface{}, err error) { return } + // reset context, commit should never be canceled + req.SetContext(context.Background()) + // execute return db.chain.Query(req) } diff --git a/xenomint/state.go b/xenomint/state.go index 05834e9e4..e22f82c42 100644 --- a/xenomint/state.go +++ b/xenomint/state.go @@ -310,15 +310,18 @@ func (s *State) readTx( data [][]interface{} querier sqlQuerier ) - id = s.getID() if atomic.LoadUint32(&s.hasSchemaChange) == 1 { // lock transaction s.Lock() defer s.Unlock() + id = s.getID() s.setSavepoint() querier = s.unc defer s.rollbackTo(id) + + // TODO(): should detect query type, any timeout write query will cause underlying transaction to rollback } else { + id = s.getID() if tx, ierr = s.strg.DirtyReader().Begin(); ierr != nil { err = errors.Wrap(ierr, "open tx failed") return @@ -327,6 +330,16 @@ func (s *State) readTx( defer tx.Rollback() } + defer func() { + if ctx.Err() != nil { + log.WithError(ctx.Err()).WithFields(log.Fields{ + "req": req, + "id": id, + "dirtyRead": atomic.LoadUint32(&s.hasSchemaChange) != 1, + }).Warning("read query canceled") + } + }() + for i, v := range req.Payload.Queries { if cnames, ctypes, data, ierr = readSingle(ctx, querier, &v); ierr != nil { err = errors.Wrapf(ierr, "query at #%d failed", i) @@ -399,6 +412,12 @@ func (s *State) write( lastInsertID int64 ) + defer func() { + if ctx.Err() != nil { + log.WithError(err).WithField("req", req).Warning("write query canceled") + } + }() + // TODO(leventeliu): savepoint is a sqlite-specified solution for nested transaction. if err = func() (err error) { var ierr error From 8c3b60bc09754e8c791ca035d6379bb89a1c74b6 Mon Sep 17 00:00:00 2001 From: Qi Xiao Date: Mon, 10 Dec 2018 15:59:20 +0800 Subject: [PATCH 11/13] Add more comments to clarify test purposes --- cmd/cql-minerd/integration_test.go | 32 ++++++++++-------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/cmd/cql-minerd/integration_test.go b/cmd/cql-minerd/integration_test.go index bdcbc5afa..eacb16bce 100644 --- a/cmd/cql-minerd/integration_test.go +++ b/cmd/cql-minerd/integration_test.go @@ -388,19 +388,20 @@ func TestFullProcess(t *testing.T) { So(resultBytes, ShouldResemble, []byte("ha\001ppy")) Convey("test query cancel", FailureContinues, func(c C) { + /* test cancel write query */ wg := sync.WaitGroup{} wg.Add(1) go func() { - // sleep 10s - _, er := db.Exec("INSERT INTO test VALUES(sleep(10000000000))") - if er != nil { - log.Errorf("insert sleep: %v", er) - } - wg.Done() + defer wg.Done() + db.Exec("INSERT INTO test VALUES(sleep(10000000000))") }() time.Sleep(time.Second) + wg.Add(1) go func() { + defer wg.Done() + var err error _, err = db.Exec("UPDATE test SET test = 100;") + // should be canceled c.So(err, ShouldNotBeNil) }() time.Sleep(time.Second) @@ -414,14 +415,15 @@ func TestFullProcess(t *testing.T) { // ensure connection db.Query("SELECT 1") + // test before write operation complete var result int err = db.QueryRow("SELECT * FROM test WHERE test = 4 LIMIT 1").Scan(&result) c.So(err, ShouldBeNil) c.So(result, ShouldEqual, 4) wg.Wait() - time.Sleep(30 * time.Second) + /* test cancel read query */ go func() { _, err = db.Query("SELECT * FROM test WHERE test = sleep(10000000000)") // call write query using read query interface @@ -434,25 +436,11 @@ func TestFullProcess(t *testing.T) { rpc.GetSessionPoolInstance().Remove(n.ID) } } - time.Sleep(time.Second) - // ensure connection db.Query("SELECT 1") - time.Sleep(time.Second) - - func() { - rows, err := db.Query("SELECT * FROM test") - c.So(err, ShouldBeNil) - defer rows.Close() - var res int - for rows.Next() { - err = rows.Scan(&res) - c.So(err, ShouldBeNil) - log.WithField("record", res).Info("got record from test database") - } - }() + /* test long running write query */ row = db.QueryRow("SELECT * FROM test WHERE test = 10000000000 LIMIT 1") err = row.Scan(&result) c.So(err, ShouldBeNil) From a5f5be896b3f4ccd7dc8930539b2df0b715dc640 Mon Sep 17 00:00:00 2001 From: Qi Xiao Date: Tue, 11 Dec 2018 10:01:38 +0800 Subject: [PATCH 12/13] Avoid passing chain runtime context to xenomint state on block producing --- sqlchain/chain.go | 2 +- xenomint/state.go | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/sqlchain/chain.go b/sqlchain/chain.go index 4b488a201..de75dac87 100644 --- a/sqlchain/chain.go +++ b/sqlchain/chain.go @@ -547,7 +547,7 @@ func (c *Chain) produceBlockV2(now time.Time) (err error) { frs []*types.Request qts []*x.QueryTracker ) - if frs, qts, err = c.st.CommitExWithContext(c.rt.ctx); err != nil { + if frs, qts, err = c.st.CommitEx(); err != nil { return } var block = &types.Block{ diff --git a/xenomint/state.go b/xenomint/state.go index e22f82c42..d6a986d61 100644 --- a/xenomint/state.go +++ b/xenomint/state.go @@ -105,6 +105,8 @@ func (s *State) Close(commit bool) (err error) { } if s.unc != nil { if commit { + s.Lock() + defer s.Unlock() if err = s.uncCommit(); err != nil { return } @@ -113,6 +115,8 @@ func (s *State) Close(commit bool) (err error) { if err = s.rollback(); err != nil { return } + s.Lock() + defer s.Unlock() if err = s.uncCommit(); err != nil { return } From 4aad36c207aa8b10ccd7634f33574778c447b077 Mon Sep 17 00:00:00 2001 From: leventeliu Date: Tue, 11 Dec 2018 11:05:13 +0800 Subject: [PATCH 13/13] Fix starvation on unbuffered channel --- sqlchain/chain.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/sqlchain/chain.go b/sqlchain/chain.go index de75dac87..326619662 100644 --- a/sqlchain/chain.go +++ b/sqlchain/chain.go @@ -582,7 +582,12 @@ func (c *Chain) produceBlockV2(now time.Time) (err error) { return } // Send to pending list - c.blocks <- block + select { + case c.blocks <- block: + case <-c.rt.ctx.Done(): + err = c.rt.ctx.Err() + return + } log.WithFields(log.Fields{ "peer": c.rt.getPeerInfoString(), "time": c.rt.getChainTimeString(), @@ -672,7 +677,12 @@ func (c *Chain) syncHead() { "Failed to fetch block from peer") } else { statBlock(resp.Block) - c.blocks <- resp.Block + select { + case c.blocks <- resp.Block: + case <-c.rt.ctx.Done(): + err = c.rt.ctx.Err() + return + } log.WithFields(log.Fields{ "peer": c.rt.getPeerInfoString(), "time": c.rt.getChainTimeString(),