Multiple server threads are now used, allowing simultaneous fetching of form data and loading of bug markers, etc.

This commit is contained in:
Jamie Greunbaum 2024-06-19 15:37:17 -04:00
parent 0fbb9a0fbe
commit fba901b368
4 changed files with 66 additions and 63 deletions

View File

@ -12,21 +12,25 @@ const UNRESOLVED_TAG : StringName = &"UNRESOLVED"
const IN_PROGRESS_TAG : StringName = &"IN_PROGRESS"
const RESOLVED_TAG : StringName = &"RESOLVED"
var __bugbot_server_thread : Thread
var __bugbot_return_list_of_bugs_thread : Thread
var __bugbot_prepare_form_thread : Thread
var __bugbot_send_form_data_thread : Thread
func _init():
__bugbot_server_thread = Thread.new()
__bugbot_return_list_of_bugs_thread = Thread.new()
__bugbot_prepare_form_thread = Thread.new()
__bugbot_send_form_data_thread = Thread.new()
func _return_list_of_bugs(map_name:String, callback:Callable) -> int:
return __start_thread_with_callback(__return_list_of_bugs_thread.bind(map_name, callback))
return __start_thread_with_callback(__bugbot_return_list_of_bugs_thread, __return_list_of_bugs_thread.bind(__bugbot_return_list_of_bugs_thread, map_name, callback))
func _prepare_form(callback:Callable) -> int:
return __start_thread_with_callback(__prepare_form_thread.bind(callback))
return __start_thread_with_callback(__bugbot_prepare_form_thread, __prepare_form_thread.bind(__bugbot_prepare_form_thread, callback))
func _send_form_data(data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> int:
return __start_thread_with_callback(__send_form_data_thread.bind(data, map_name, bug_position, bug_normal, callback))
return __start_thread_with_callback(__bugbot_send_form_data_thread, __send_form_data_thread.bind(__bugbot_send_form_data_thread, data, map_name, bug_position, bug_normal, callback))
static func _create_new_server_api() -> BugbotServerAPI:
@ -58,18 +62,17 @@ func __get_http_client_chunk_response(http_client:HTTPClient) -> String:
return response_body.get_string_from_utf8()
return ""
func __start_thread_with_callback(thread_function:Callable) -> int:
if not __bugbot_server_thread:
func __start_thread_with_callback(thread:Thread, thread_function:Callable) -> int:
if not thread:
printerr("Server thread is null.")
return BugbotServerError.THREAD_NULL
if __bugbot_server_thread.is_started():
if thread.is_started():
printerr("Server thread is currently busy.")
return BugbotServerError.THREAD_BUSY;
__bugbot_server_thread = Thread.new()
__bugbot_server_thread.start(thread_function)
thread.start(thread_function)
return BugbotServerError.OK
func __validate_server_response(_response:Variant) -> int:
func __validate_server_response(_thread:Thread, _response:Variant) -> int:
return Error.OK
@ -89,17 +92,17 @@ func __create_header_data(content_length:int = -1) -> Array:
return []
func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
func __return_list_of_bugs_thread(thread:Thread, map_name:String, callback:Callable) -> void:
print("Insert list of ", _current_server_api(), " bugs here.")
callback.call_deferred([])
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __prepare_form_thread(callback:Callable) -> void:
func __prepare_form_thread(thread:Thread, callback:Callable) -> void:
print("Prepare ", _current_server_api(), " form here.")
callback.call_deferred([])
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
func __send_form_data_thread(thread:Thread, data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
print("Send ", _current_server_api(), " form data here.")
callback.call_deferred([])
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")

View File

@ -17,7 +17,7 @@ const DEFAULT_RESOLVED_STATUSES : Array = [&"RESOLVED", &"VERIFIED"]
#endregion
func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
func __return_list_of_bugs_thread(thread:Thread, map_name:String, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/bugzilla/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -54,7 +54,7 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
var response_string : String = __get_http_client_chunk_response(http_client)
var response_data := JSON.parse_string(response_string)
if __validate_server_response(response_data) != Error.OK:
if __validate_server_response(thread, response_data) != Error.OK:
return
var bug_array : Array = []
@ -76,9 +76,9 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
bug_array.append(bug)
callback.call_deferred(bug_array)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __prepare_form_thread(callback:Callable) -> void:
func __prepare_form_thread(thread:Thread, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/bugzilla/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -97,7 +97,7 @@ func __prepare_form_thread(callback:Callable) -> void:
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var product_response_string : String = __get_http_client_chunk_response(http_client)
var product_response : Dictionary = JSON.parse_string(product_response_string)
if __validate_server_response(product_response) != Error.OK:
if __validate_server_response(thread, product_response) != Error.OK:
return
api_url = "field/bug?"
@ -109,7 +109,7 @@ func __prepare_form_thread(callback:Callable) -> void:
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var fields_response_string : String = __get_http_client_chunk_response(http_client)
var fields_response : Dictionary = JSON.parse_string(fields_response_string)
if __validate_server_response(fields_response) != Error.OK:
if __validate_server_response(thread, fields_response) != Error.OK:
return
var tag_lists : Array
@ -123,7 +123,7 @@ func __prepare_form_thread(callback:Callable) -> void:
var product_info : Dictionary = product_response["products"][0]
if product_info["name"] != product_name:
printerr("Incorrect product found.")
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
return
for component:Dictionary in product_info["components"]:
@ -146,9 +146,9 @@ func __prepare_form_thread(callback:Callable) -> void:
tag_lists[BugbotTagArray.OS].append({ "name": os["name"], "id": os["sort_key"] })
callback.call_deferred(tag_lists)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
func __send_form_data_thread(thread:Thread, data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/bugzilla/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -188,7 +188,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var post_response_string : String = __get_http_client_chunk_response(http_client)
var post_response : Dictionary = JSON.parse_string(post_response_string)
if __validate_server_response(post_response) != Error.OK:
if __validate_server_response(thread, post_response) != Error.OK:
return
post_data["id"] = post_response["id"]
@ -209,7 +209,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
var bug_data : BugbotBugData = __create_bug_data_from_server_response(post_data, map_name, label_dict, false)
callback.call_deferred(bug_data)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func _current_server_api() -> String:
@ -238,14 +238,14 @@ func __create_header_data(content_length:int = -1) -> Array:
header.append("Content-Length: " + String.num_uint64(content_length))
return header
func __validate_server_response(_response:Variant) -> int:
func __validate_server_response(_thread:Thread, _response:Variant) -> int:
# If the response has a message field, make the assumption that this is
# because the response was an error code.
if (_response.has("error") and _response["error"] == true) or _response.has("message"):
var error_data : BugbotErrorData = BugbotErrorData.new()
error_data.message = _response["message"]
printerr(error_data.message)
__bugbot_server_thread.call_deferred("wait_to_finish")
_thread.call_deferred("wait_to_finish")
return Error.FAILED
return Error.OK

View File

@ -22,7 +22,7 @@ const DEFAULT_RESOLVED_STATUSES : Array = []
#endregion
func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
func __return_list_of_bugs_thread(thread:Thread, map_name:String, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/gitea/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -39,7 +39,7 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
var response_string : String = __get_http_client_chunk_response(http_client)
var response_data := JSON.parse_string(response_string)
if __validate_server_response(response_data) != Error.OK:
if __validate_server_response(thread, response_data) != Error.OK:
return
var bug_array : Array
@ -59,9 +59,9 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
bug_array.append(bug)
callback.call_deferred(bug_array)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __prepare_form_thread(callback:Callable) -> void:
func __prepare_form_thread(thread:Thread, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/gitea/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -78,7 +78,7 @@ func __prepare_form_thread(callback:Callable) -> void:
var response_string : String = __get_http_client_chunk_response(http_client)
var response_data : Variant = JSON.parse_string(response_string)
if __validate_server_response(response_data) != Error.OK:
if __validate_server_response(thread, response_data) != Error.OK:
return
var tag_lists : Array
@ -113,9 +113,9 @@ func __prepare_form_thread(callback:Callable) -> void:
tag_lists[BugbotTagArray.SEVERITY].append(label_in)
callback.call_deferred(tag_lists)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
func __send_form_data_thread(thread:Thread, data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/gitea/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
@ -130,7 +130,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
http_client.poll()
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var response_data : Variant = JSON.parse_string(__get_http_client_chunk_response(http_client))
if __validate_server_response(response_data) != Error.OK:
if __validate_server_response(thread, response_data) != Error.OK:
return
# Collect the label IDs for each label we want to apply to this issue
@ -171,7 +171,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
http_client.poll()
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var post_response_data : Variant = JSON.parse_string(__get_http_client_chunk_response(http_client))
if __validate_server_response(post_response_data) != Error.OK:
if __validate_server_response(thread, post_response_data) != Error.OK:
return
var label_dict : Dictionary = {
@ -187,7 +187,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
var bug_data : BugbotBugData = __create_bug_data_from_server_response(post_response_data, map_name, label_dict, false, assigned_as_in_progress)
callback.call_deferred(bug_data)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func _current_server_api() -> String:
@ -222,7 +222,7 @@ func __create_header_data(content_length:int = -1) -> Array:
header.append("Content-Length: " + String.num_uint64(content_length))
return header
func __validate_server_response(_response:Variant) -> int:
func __validate_server_response(_thread:Thread, _response:Variant) -> int:
# If the response has a message field, make the assumption that this is
# because the response was an error code.
if _response.has("message"):
@ -231,7 +231,7 @@ func __validate_server_response(_response:Variant) -> int:
error_data.message = _response["message"]
error_data.url = _response["url"]
printerr(error_data.message)
__bugbot_server_thread.call_deferred("wait_to_finish")
_thread.call_deferred("wait_to_finish")
return Error.FAILED
return Error.OK

View File

@ -25,16 +25,16 @@ const DEFAULT_RESOLVED_STATUSES : Array = [&"Done"]
#endregion
func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
func __return_list_of_bugs_thread(thread:Thread, map_name:String, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/jira/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
return
var header_data : Array = __create_header_data()
var server_data : BugbotJiraServerData = __get_server_data(http_client, header_data)
var server_data : BugbotJiraServerData = __get_server_data(thread, http_client, header_data)
if not server_data:
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
return
var map_name_field : String = ProjectSettings.get_setting("bugbot/reporting/jira/map_name_field", DEFAULT_MAP_NAME_FIELD)
@ -89,7 +89,7 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var issue_response_string : String = __get_http_client_chunk_response(http_client)
var issue_response : Dictionary = JSON.parse_string(issue_response_string)
if __validate_server_response(issue_response) != Error.OK:
if __validate_server_response(thread, issue_response) != Error.OK:
return
var bug_array : Array
@ -109,18 +109,18 @@ func __return_list_of_bugs_thread(map_name:String, callback:Callable) -> void:
if bug: bug_array.append(bug)
callback.call_deferred(bug_array)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __prepare_form_thread(callback:Callable) -> void:
func __prepare_form_thread(thread:Thread, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/jira/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
return
var header_data : Array = __create_header_data()
var server_data : BugbotJiraServerData = __get_server_data(http_client, header_data)
var server_data : BugbotJiraServerData = __get_server_data(thread, http_client, header_data)
if not server_data:
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
return
var tag_lists : Array
@ -165,18 +165,18 @@ func __prepare_form_thread(callback:Callable) -> void:
continue
callback.call_deferred(tag_lists)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
func __send_form_data_thread(thread:Thread, data:Dictionary, map_name:String, bug_position:Vector3, bug_normal:Vector3, callback:Callable) -> void:
var http_client : HTTPClient = HTTPClient.new()
if __connect_to_server(http_client, ProjectSettings.get_setting("bugbot/reporting/jira/server", DEFAULT_SERVER)) != HTTPClient.STATUS_CONNECTED:
printerr("Could not connect to server.")
return
var header_data : Array = __create_header_data()
var server_data : BugbotJiraServerData = __get_server_data(http_client, header_data)
var server_data : BugbotJiraServerData = __get_server_data(thread, http_client, header_data)
if not server_data:
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
return
var bug_issue_type : String = ProjectSettings.get_setting("bugbot/reporting/jira/bug_issue_type", DEFAULT_BUG_ISSUE_TYPE)
@ -212,7 +212,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
http_client.poll()
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var post_response_data : Variant = JSON.parse_string(__get_http_client_chunk_response(http_client))
if __validate_server_response(post_response_data) != Error.OK:
if __validate_server_response(thread, post_response_data) != Error.OK:
return
var bug_data : BugbotBugData = BugbotBugData.new()
@ -227,7 +227,7 @@ func __send_form_data_thread(data:Dictionary, map_name:String, bug_position:Vect
bug_data.resolution = BugbotServerAPI.UNRESOLVED_TAG
callback.call_deferred(bug_data)
__bugbot_server_thread.call_deferred("wait_to_finish")
thread.call_deferred("wait_to_finish")
func _current_server_api() -> String:
@ -261,7 +261,7 @@ func __generate_auth_string() -> String:
var api_key : String = ProjectSettings.get_setting("bugbot/reporting/jira/API_key", DEFAULT_API_KEY)
return Marshalls.utf8_to_base64(email.to_lower() + ":" + api_key)
func __validate_server_response(_response:Variant) -> int:
func __validate_server_response(_thread:Thread, _response:Variant) -> int:
# If the response has an errorMessages field, make the assumption that this
# is because the response was an error code.
if _response.has("errors"):
@ -274,7 +274,7 @@ func __validate_server_response(_response:Variant) -> int:
error_data.code = 1
error_data.message = message
printerr(error_data.message)
__bugbot_server_thread.call_deferred("wait_to_finish")
_thread.call_deferred("wait_to_finish")
return Error.FAILED
if _response.has("errorMessages"):
for message:String in _response["errorMessages"]:
@ -282,7 +282,7 @@ func __validate_server_response(_response:Variant) -> int:
error_data.code = 1
error_data.message = message
printerr(error_data.message)
__bugbot_server_thread.call_deferred("wait_to_finish")
_thread.call_deferred("wait_to_finish")
return Error.FAILED
return Error.OK
@ -356,7 +356,7 @@ func __create_bug_data_from_server_response(bug_in:Dictionary, map_name:String,
return bug
func __get_server_data(http_client:HTTPClient, header_data:Array) -> BugbotJiraServerData:
func __get_server_data(thread:Thread, http_client:HTTPClient, header_data:Array) -> BugbotJiraServerData:
var server_data : BugbotJiraServerData = BugbotJiraServerData.new()
server_data.timestamp = Time.get_ticks_msec()
@ -368,7 +368,7 @@ func __get_server_data(http_client:HTTPClient, header_data:Array) -> BugbotJiraS
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var project_response_string : String = __get_http_client_chunk_response(http_client)
var project_response : Array = JSON.parse_string(project_response_string)
if __validate_server_response(project_response) != Error.OK:
if __validate_server_response(thread, project_response) != Error.OK:
return
server_data.project_name = _get_project_name()
@ -392,7 +392,7 @@ func __get_server_data(http_client:HTTPClient, header_data:Array) -> BugbotJiraS
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var issue_response_string : String = __get_http_client_chunk_response(http_client)
var issue_response : Dictionary = JSON.parse_string(issue_response_string)
if __validate_server_response(issue_response) != Error.OK:
if __validate_server_response(thread, issue_response) != Error.OK:
return
var bug_issue_type : String = ProjectSettings.get_setting("bugbot/reporting/jira/bug_issue_type", DEFAULT_BUG_ISSUE_TYPE)
@ -411,7 +411,7 @@ func __get_server_data(http_client:HTTPClient, header_data:Array) -> BugbotJiraS
assert(http_client.get_status() == HTTPClient.STATUS_BODY or http_client.get_status() == HTTPClient.STATUS_CONNECTED)
var fields_response_string : String = __get_http_client_chunk_response(http_client)
var fields_response : Dictionary = JSON.parse_string(fields_response_string)
if __validate_server_response(fields_response) != Error.OK:
if __validate_server_response(thread, fields_response) != Error.OK:
return
var map_name_field_name : String = ProjectSettings.get_setting("bugbot/reporting/jira/map_name_field", DEFAULT_MAP_NAME_FIELD)