2
0
mirror of https://github.com/esiur/esiur-js.git synced 2025-05-06 04:22:58 +00:00

dead lock avoidance

This commit is contained in:
Ahmed Zamil 2024-07-16 10:02:04 +03:00
parent 2d04c5402f
commit 6cdcd85c56
3 changed files with 32 additions and 12 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "esiur", "name": "esiur",
"version": "2.3.2", "version": "2.3.3",
"description": "Distributed Object Framework", "description": "Distributed Object Framework",
"main": "esiur.js", "main": "esiur.js",
"type": "module", "type": "module",

View File

@ -97,6 +97,8 @@ import AuthorizationResultsResponse from '../../Security/Membership/Authorizatio
import IIPAuthPacketIAuthHeader from '../../Net/Packets/IIPAuthPacketIAuthHeader.js'; import IIPAuthPacketIAuthHeader from '../../Net/Packets/IIPAuthPacketIAuthHeader.js';
import AuthorizationRequest from '../../Security/Membership/AuthorizationRequest.js'; import AuthorizationRequest from '../../Security/Membership/AuthorizationRequest.js';
import DistributedResourceAttachRequestInfo from './DistributedResourceAttachRequestInfo.js';
export default class DistributedConnection extends IStore { export default class DistributedConnection extends IStore {
// fields // fields
@ -1486,18 +1488,18 @@ export default class DistributedConnection extends IStore {
&& this.#session.remoteMethod == AuthenticationMethod.None) && this.#session.remoteMethod == AuthenticationMethod.None)
{ {
// change to Map<byte, object> for compatibility // change to Map<byte, object> for compatibility
let headers = Codec.compose(session.localHeaders, this); let headers = Codec.compose(this.#session.localHeaders, this);
this.#sendParams() this.#sendParams()
.addUint8(IIPAuthPacketInitialize.TokenNoAuth) .addUint8(IIPAuthPacketInitialize.TokenNoAuth)
.addDC(headers) .addDC(headers)
.done(); .done();
} }
else if (session.localMethod == AuthenticationMethod.None else if (this.#session.localMethod == AuthenticationMethod.None
&& session.remoteMethod == AuthenticationMethod.None) && this.#session.remoteMethod == AuthenticationMethod.None)
{ {
// change to Map<byte, object> for compatibility // change to Map<byte, object> for compatibility
let headers = Codec.compose(session.localHeaders, this); let headers = Codec.compose(this.#session.localHeaders, this);
// @REVIEW: MITM Attack can still occure // @REVIEW: MITM Attack can still occure
this.#sendParams() this.#sendParams()
@ -1565,7 +1567,7 @@ export default class DistributedConnection extends IStore {
this.#resourceRequests.values.forEach((x) => { this.#resourceRequests.values.forEach((x) => {
try { try {
x.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed")); x.reply.triggerError(new AsyncException(ErrorType.Management, 0, "Connection closed"));
} catch (ex) { } } catch (ex) { }
}); });
@ -2956,13 +2958,19 @@ export default class DistributedConnection extends IStore {
resource = this.#neededResources.item(id); resource = this.#neededResources.item(id);
let request = this.#resourceRequests.item(id); let requestInfo = this.#resourceRequests.item(id);
if (request != null) { if (requestInfo != null) {
if (resource != null && (requestSequence?.includes(id) ?? false)) if (resource != null && (requestSequence?.includes(id) ?? false)){
return new AsyncReply(resource); return new AsyncReply(resource);
else }
return request; else if (resource != null && requestInfo.requestSequence.includes(id)) {
console.log("Avoid deadlock...", id, requestSequence, requestInfo.requestSequence );
return new AsyncReply(resource);
}
else {
return requestInfo.reply;
}
} }
else if (resource != null && !resource._p.suspended) { else if (resource != null && !resource._p.suspended) {
@ -2973,11 +2981,12 @@ export default class DistributedConnection extends IStore {
var reply = new AsyncReply(); var reply = new AsyncReply();
this.#resourceRequests.set(id, reply);
var newSequence = var newSequence =
requestSequence != null ? [...requestSequence, id] : [id]; requestSequence != null ? [...requestSequence, id] : [id];
this.#resourceRequests.set(id, new DistributedResourceAttachRequestInfo(reply, newSequence));
var self = this; var self = this;
this.#sendRequest(IIPPacketAction.AttachResource) this.#sendRequest(IIPPacketAction.AttachResource)

View File

@ -0,0 +1,11 @@
export default class DistributedResourceAttachRequestInfo
{
reply;
requestSequence;
constructor(reply, requestSequence){
this.reply = reply;
this.requestSequence = requestSequence;
}
}