orchestrator icon indicating copy to clipboard operation
orchestrator copied to clipboard

API response of api/status to a follower node in raft mode returns RaftHealthyMembers field of null

Open geek981108 opened this issue 3 years ago • 0 comments

Background

Topology

Raft mode with:

  • 192.168.7.50: Follower
  • 192.168.7.51: Follower
  • 192.168.7.52: Leader

Request API

api/status

Response Example

Followers:

{
	"Code": "OK",
	"Message": "Application node is healthy",
	"Details": {
		"Healthy": true,
		"Hostname": "ecs-22dfc66mki113jo2941m",
		"Token": "76987b1fdac8522b2867b0637b30f64e437d30a42866d3a21ce9920a6772ba60",
		"IsActiveNode": false,
		"ActiveNode": {
			"Hostname": "192.168.7.52:10008",
			"Token": "",
			"AppVersion": "",
			"FirstSeenActive": "",
			"LastSeenActive": "",
			"ExtraInfo": "",
			"Command": "",
			"DBBackend": "",
			"LastReported": "0001-01-01T00:00:00Z"
		},
		"Error": null,
		"AvailableNodes": [{
			"Hostname": "ecs-22dfc66mki113jo2941m",
			"Token": "76987b1fdac8522b2867b0637b30f64e437d30a42866d3a21ce9920a6772ba60",
			"AppVersion": "3.2.6",
			"FirstSeenActive": "2022-03-17T09:35:29Z",
			"LastSeenActive": "2022-03-17T12:27:50Z",
			"ExtraInfo": "",
			"Command": "",
			"DBBackend": "/usr/local/orchestrator/orchestrator.sqlite3",
			"LastReported": "0001-01-01T00:00:00Z"
		}],
		"RaftLeader": "192.168.7.52:10008",
		"IsRaftLeader": false,
		"RaftLeaderURI": "http://192.168.7.52:3000",
		"RaftAdvertise": "192.168.7.51",
		"RaftHealthyMembers": null
	}
}

Leader:

{
	"Code": "OK",
	"Message": "Application node is healthy",
	"Details": {
		"Healthy": true,
		"Hostname": "ecs-4rn1v6e2772s1rry7guq",
		"Token": "1ccf60cf5a82b4c24a55fdcf28926ebb12fde4cbf17cbb3c88efd616e85e7069",
		"IsActiveNode": true,
		"ActiveNode": {
			"Hostname": "192.168.7.52:10008",
			"Token": "",
			"AppVersion": "",
			"FirstSeenActive": "",
			"LastSeenActive": "",
			"ExtraInfo": "",
			"Command": "",
			"DBBackend": "",
			"LastReported": "0001-01-01T00:00:00Z"
		},
		"Error": null,
		"AvailableNodes": [{
			"Hostname": "ecs-4rn1v6e2772s1rry7guq",
			"Token": "1ccf60cf5a82b4c24a55fdcf28926ebb12fde4cbf17cbb3c88efd616e85e7069",
			"AppVersion": "3.2.6",
			"FirstSeenActive": "2022-03-17T09:35:29Z",
			"LastSeenActive": "2022-03-17T12:30:26Z",
			"ExtraInfo": "",
			"Command": "",
			"DBBackend": "/usr/local/orchestrator/orchestrator.sqlite3",
			"LastReported": "0001-01-01T00:00:00Z"
		}],
		"RaftLeader": "192.168.7.52:10008",
		"IsRaftLeader": true,
		"RaftLeaderURI": "http://192.168.7.52:3000",
		"RaftAdvertise": "192.168.7.52",
		"RaftHealthyMembers": ["192.168.7.52", "192.168.7.51", "192.168.7.50"]
	}
}

Problems

When an API of status check called for followers, it gaves field RaftHealthyMembers null which is confused.

Expect

When an API of status check called for followers, it gaves field RaftHealthyMembers same result of leader node.

Solution

Make a replication of request to leader node when status check API called and get RaftHealthyMembers from it to replace follower one.

geek981108 avatar Mar 17 '22 14:03 geek981108