mirror of
https://github.com/gnosygnu/xowa.git
synced 2024-10-27 20:34:16 +00:00
HTTP Server: Fix random deadlocks when serving multiple concurrent requests
This commit is contained in:
parent
93bac15244
commit
5e668b96c7
@ -43,28 +43,30 @@ class Http_server_wkr implements Gfo_invk {
|
||||
this.socket = socket;
|
||||
}
|
||||
public void Run(){
|
||||
Http_request_itm request = null;
|
||||
try {
|
||||
client_rdr.Stream_(socket.Get_input_stream());
|
||||
client_wtr.Stream_(socket.Get_output_stream());
|
||||
request = request_parser.Parse(client_rdr);
|
||||
this.data__client = new Http_data__client(request.Host(), socket.Ip_address());
|
||||
byte[] url_bry = request.Url();
|
||||
if (Bry_.Eq(url_bry, Url__home)) url_bry = server_mgr.Home(); // "localhost:8080" comes thru as url of "/"; transform to custom home page; DATE:2015-10-11
|
||||
switch (request.Type()) {
|
||||
case Http_request_itm.Type_get: Process_get(request, url_bry); break;
|
||||
case Http_request_itm.Type_post: Process_post(request); break;
|
||||
synchronized (client_rdr) { // LOCK:else http_server may sometimes deadlock when serving multiple parallel requests; // DATE:2018-03-11
|
||||
Http_request_itm request = null;
|
||||
try {
|
||||
client_rdr.Stream_(socket.Get_input_stream());
|
||||
client_wtr.Stream_(socket.Get_output_stream());
|
||||
request = request_parser.Parse(client_rdr);
|
||||
this.data__client = new Http_data__client(request.Host(), socket.Ip_address());
|
||||
byte[] url_bry = request.Url();
|
||||
if (Bry_.Eq(url_bry, Url__home)) url_bry = server_mgr.Home(); // "localhost:8080" comes thru as url of "/"; transform to custom home page; DATE:2015-10-11
|
||||
switch (request.Type()) {
|
||||
case Http_request_itm.Type_get: Process_get(request, url_bry); break;
|
||||
case Http_request_itm.Type_post: Process_post(request); break;
|
||||
}
|
||||
client_wtr.Rls(); // client_rdr.Rls(); socket.Rls();
|
||||
}
|
||||
client_wtr.Rls(); // client_rdr.Rls(); socket.Rls();
|
||||
}
|
||||
catch (Exception e) {
|
||||
String request_str = request == null ? "<<NULL>>" : request.To_str(tmp_bfr, Bool_.N);
|
||||
server_wtr.Write_str_w_nl(String_.Format("failed to process request;\nrequest={0}\nerr_msg={1}", request_str, Err_.Message_gplx_full(e)));
|
||||
}
|
||||
finally {
|
||||
if (uid != -1) { // only release if uid was acquired; DATE:2015-10-11
|
||||
server_mgr.Wkr_pool().Del(uid);
|
||||
server_mgr.Uid_pool().Del(uid);
|
||||
catch (Exception e) {
|
||||
String request_str = request == null ? "<<NULL>>" : request.To_str(tmp_bfr, Bool_.N);
|
||||
server_wtr.Write_str_w_nl(String_.Format("failed to process request;\nrequest={0}\nerr_msg={1}", request_str, Err_.Message_gplx_full(e)));
|
||||
}
|
||||
finally {
|
||||
if (uid != -1) { // only release if uid was acquired; DATE:2015-10-11
|
||||
server_mgr.Wkr_pool().Del(uid);
|
||||
server_mgr.Uid_pool().Del(uid);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ public class Xoh_head_itm__graph extends Xoh_head_itm__base {
|
||||
Xopg_tag_wtr_.Add__xologger(tags, http_root);
|
||||
Xopg_tag_wtr_.Add__xolog(tags, http_root, false);
|
||||
Xopg_tag_wtr_.Add__xoajax(tags, http_root, app);
|
||||
Add__xograph(tags, http_root, page, version_is_1);
|
||||
Add__xograph(tags, http_root, page, version_is_1, version_is_2);
|
||||
|
||||
// write tags
|
||||
int len = tags.Len();
|
||||
@ -51,7 +51,7 @@ public class Xoh_head_itm__graph extends Xoh_head_itm__base {
|
||||
}
|
||||
|
||||
private static final byte[] Js__graph_exec = Bry_.new_a7("xo.xtns.graph.exec();");
|
||||
private static void Add__xograph(Xopg_tag_mgr tags, Io_url http_root, Xoae_page page, boolean version_is_1) {
|
||||
private static void Add__xograph(Xopg_tag_mgr tags, Io_url http_root, Xoae_page page, boolean version_is_1, boolean version_is_2) {
|
||||
Io_url base_dir = http_root.GenSubDir_nest("bin", "any", "xowa", "html", "res", "src", "xowa", "core");
|
||||
tags.Add(Xopg_tag_itm.New_js_file(base_dir.GenSubFil_nest("Html_.js")));
|
||||
|
||||
@ -59,15 +59,17 @@ public class Xoh_head_itm__graph extends Xoh_head_itm__base {
|
||||
Io_url xtn_dir = http_root.GenSubDir_nest("bin", "any", "xowa", "xtns", "Graph");
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "d3.js")));
|
||||
// tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "d3-global.js"))); // XOWA: unused b/c module is not available
|
||||
if (version_is_1) {
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "vega1", "vega.js")));
|
||||
}
|
||||
else {
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "d3.layout.cloud.js")));
|
||||
|
||||
// if v2 and v2, prefer v2;
|
||||
if (version_is_2) {
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "d3.layout.cloud.js")));
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "vega2", "vega.js")));
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "graph2.compiled.js")));
|
||||
// tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("modules", "graph2.js")));
|
||||
}
|
||||
else {
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("lib", "vega1", "vega.js")));
|
||||
}
|
||||
tags.Add(Xopg_tag_itm.New_js_file(xtn_dir.GenSubFil_nest("Xograph.js")));
|
||||
}
|
||||
}
|
||||
|
@ -37,6 +37,11 @@ public class Graph_xnde implements Xox_xnde {
|
||||
|
||||
// get version; NOTE: default is 2; REF: https://noc.wikimedia.org/conf/InitialiseSettings.php.txt and 'wgGraphDefaultVegaVer' => ['default' => 2]; also, extension.json and "GraphDefaultVegaVer": 2
|
||||
Json_doc jdoc = app.Utl__json_parser().Parse(json);
|
||||
if (jdoc == null) {
|
||||
Gfo_usr_dlg_.Instance.Warn_many("", "", "invalid json; page=~{0}", ctx.Page().Url().To_bry_full_wo_qargs());
|
||||
return;
|
||||
}
|
||||
|
||||
int version = jdoc.Get_val_as_int_or(Bry_.new_a7("version"), 2);
|
||||
itm_graph.Version_(wpg.Url(), version);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user