Skip to content

Commit fda596c

Browse files
authored
Fix connection receive timeout for single requests (neo4j#1166)
Resets and non-pipeline requests were not triggering the connection receive timeout. The problem happened because of the timeout mechanics only started when pending observers are set. However, the current observer should be also be considered for this use case.
1 parent 33d88ca commit fda596c

File tree

5 files changed

+49
-8
lines changed

5 files changed

+49
-8
lines changed

packages/bolt-connection/src/bolt/response-handler.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export default class ResponseHandler {
7676
this._transformMetadata = transformMetadata || NO_OP_IDENTITY
7777
this._observer = Object.assign(
7878
{
79-
onPendingObserversChange: NO_OP,
79+
onObserversCountChange: NO_OP,
8080
onError: NO_OP,
8181
onFailure: NO_OP,
8282
onErrorApplyTransformation: NO_OP_IDENTITY
@@ -156,7 +156,11 @@ export default class ResponseHandler {
156156
*/
157157
_updateCurrentObserver () {
158158
this._currentObserver = this._pendingObservers.shift()
159-
this._observer.onPendingObserversChange(this._pendingObservers.length)
159+
this._observer.onObserversCountChange(this._observersCount)
160+
}
161+
162+
get _observersCount () {
163+
return this._currentObserver == null ? this._pendingObservers.length : this._pendingObservers.length + 1
160164
}
161165

162166
_queueObserver (observer) {
@@ -169,7 +173,7 @@ export default class ResponseHandler {
169173
} else {
170174
this._pendingObservers.push(observer)
171175
}
172-
this._observer.onPendingObserversChange(this._pendingObservers.length)
176+
this._observer.onObserversCountChange(this._observersCount)
173177
return true
174178
}
175179

packages/bolt-connection/src/connection/connection-channel.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export function createChannelConnection (
6767
server: conn.server,
6868
log: conn.logger,
6969
observer: {
70-
onPendingObserversChange: conn._handleOngoingRequestsNumberChange.bind(conn),
70+
onObserversCountChange: conn._handleOngoingRequestsNumberChange.bind(conn),
7171
onError: conn._handleFatalError.bind(conn),
7272
onFailure: conn._resetOnFailure.bind(conn),
7373
onProtocolError: conn._handleProtocolError.bind(conn),

packages/bolt-connection/test/bolt/response-handler.test.js

+33
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ const {
2222
logger: { Logger }
2323
} = internal
2424

25+
const SUCCESS = 0x70 // 0111 0000 // SUCCESS <metadata>
2526
const FAILURE = 0x7f // 0111 1111 // FAILURE <metadata>
2627

2728
describe('response-handler', () => {
@@ -69,4 +70,36 @@ describe('response-handler', () => {
6970
expect(receivedError.code).toBe(expectedError.code)
7071
})
7172
})
73+
74+
it('should keep track of observers and notify onObserversCountChange()', () => {
75+
const observer = {
76+
onObserversCountChange: jest.fn()
77+
}
78+
const responseHandler = new ResponseHandler({ observer, log: Logger.noOp() })
79+
80+
responseHandler._queueObserver({})
81+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(1)
82+
83+
responseHandler._queueObserver({})
84+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(2)
85+
86+
responseHandler._queueObserver({})
87+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(3)
88+
89+
const success = {
90+
signature: SUCCESS,
91+
fields: [{}]
92+
}
93+
94+
responseHandler.handleResponse(success)
95+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(2)
96+
97+
responseHandler.handleResponse(success)
98+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(1)
99+
100+
responseHandler.handleResponse(success)
101+
expect(observer.onObserversCountChange).toHaveBeenLastCalledWith(0)
102+
103+
expect(observer.onObserversCountChange).toHaveBeenCalledTimes(6)
104+
})
72105
})

packages/neo4j-driver-deno/lib/bolt-connection/bolt/response-handler.js

+7-3
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export default class ResponseHandler {
7676
this._transformMetadata = transformMetadata || NO_OP_IDENTITY
7777
this._observer = Object.assign(
7878
{
79-
onPendingObserversChange: NO_OP,
79+
onObserversCountChange: NO_OP,
8080
onError: NO_OP,
8181
onFailure: NO_OP,
8282
onErrorApplyTransformation: NO_OP_IDENTITY
@@ -156,7 +156,11 @@ export default class ResponseHandler {
156156
*/
157157
_updateCurrentObserver () {
158158
this._currentObserver = this._pendingObservers.shift()
159-
this._observer.onPendingObserversChange(this._pendingObservers.length)
159+
this._observer.onObserversCountChange(this._observersCount)
160+
}
161+
162+
get _observersCount () {
163+
return this._currentObserver == null ? this._pendingObservers.length : this._pendingObservers.length + 1
160164
}
161165

162166
_queueObserver (observer) {
@@ -169,7 +173,7 @@ export default class ResponseHandler {
169173
} else {
170174
this._pendingObservers.push(observer)
171175
}
172-
this._observer.onPendingObserversChange(this._pendingObservers.length)
176+
this._observer.onObserversCountChange(this._observersCount)
173177
return true
174178
}
175179

packages/neo4j-driver-deno/lib/bolt-connection/connection/connection-channel.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ export function createChannelConnection (
6767
server: conn.server,
6868
log: conn.logger,
6969
observer: {
70-
onPendingObserversChange: conn._handleOngoingRequestsNumberChange.bind(conn),
70+
onObserversCountChange: conn._handleOngoingRequestsNumberChange.bind(conn),
7171
onError: conn._handleFatalError.bind(conn),
7272
onFailure: conn._resetOnFailure.bind(conn),
7373
onProtocolError: conn._handleProtocolError.bind(conn),

0 commit comments

Comments
 (0)