*/
const GETHEADER_LIST = 1;
+ /**
+ * The unique request ID.
+ * @var string
+ */
+ private static $reqId;
+
/**
* Lazy-init response object
* @var WebResponse
* @since 1.27
*/
public static function getRequestId() {
- static $reqId;
-
- if ( !$reqId ) {
- $reqId = isset( $_SERVER['UNIQUE_ID'] )
+ if ( !self::$reqId ) {
+ self::$reqId = isset( $_SERVER['UNIQUE_ID'] )
? $_SERVER['UNIQUE_ID'] : wfRandomString( 24 );
}
- return $reqId;
+ return self::$reqId;
+ }
+
+ /**
+ * Override the unique request ID. This is for sub-requests, such as jobs,
+ * that wish to use the same id but are not part of the same execution context.
+ *
+ * @param string $id
+ * @since 1.27
+ */
+ public static function overrideRequestId( $id ) {
+ self::$reqId = $id;
}
/**
// expensive jobs may set this to true
$this->removeDuplicates = false;
+
+ if ( !isset( $this->params['requestId'] ) ) {
+ $this->params['requestId'] = WebRequest::getRequestId();
+ }
}
/**
: null;
}
+ /**
+ * @return string|null Id of the request that created this job. Follows
+ * jobs recursively, allowing to track the id of the request that started a
+ * job when jobs insert jobs which insert other jobs.
+ * @since 1.27
+ */
+ public function getRequestId() {
+ return isset( $this->params['requestId'] )
+ ? $this->params['requestId']
+ : null;
+ }
+
/**
* @return int|null UNIX timestamp of when the job was runnable, or null
* @since 1.26
unset( $info['params']['rootJobTimestamp'] );
// Likewise for jobs with different delay times
unset( $info['params']['jobReleaseTimestamp'] );
+ // Identical jobs from different requests should count as duplicates
+ unset( $info['params']['requestId'] );
// Queues pack and hash this array, so normalize the order
ksort( $info['params'] );
}
$popTime = time();
$jType = $job->getType();
+ WebRequest::overrideRequestId( $job->getRequestId() );
+
// Back off of certain jobs for a while (for throttling and for errors)
$ttw = $this->getBackoffTimeToWait( $job );
if ( $ttw > 0 ) {
->method( '__toString' )
->will( $this->returnValue( '{STRING_OBJ_VAL}' ) );
+ $requestId = 'requestId=' . WebRequest::getRequestId();
+
return [
[
$this->getMockJob( false ),
- 'someCommand '
+ 'someCommand ' . $requestId
],
[
$this->getMockJob( [ 'key' => 'val' ] ),
- 'someCommand key=val'
+ 'someCommand key=val ' . $requestId
],
[
$this->getMockJob( [ 'key' => [ 'inkey' => 'inval' ] ] ),
- 'someCommand key={"inkey":"inval"}'
+ 'someCommand key={"inkey":"inval"} ' . $requestId
],
[
$this->getMockJob( [ 'val1' ] ),
- 'someCommand 0=val1'
+ 'someCommand 0=val1 ' . $requestId
],
[
$this->getMockJob( [ 'val1', 'val2' ] ),
- 'someCommand 0=val1 1=val2'
+ 'someCommand 0=val1 1=val2 ' . $requestId
],
[
$this->getMockJob( [ new stdClass() ] ),
- 'someCommand 0=object(stdClass)'
+ 'someCommand 0=object(stdClass) ' . $requestId
],
[
$this->getMockJob( [ $mockToStringObj ] ),
- 'someCommand 0={STRING_OBJ_VAL}'
+ 'someCommand 0={STRING_OBJ_VAL} ' . $requestId
],
[
$this->getMockJob( [
'rootJobSignature=45868e99bba89064e4483743ebb9b682ef95c1a7 ' .
'rootJobTimestamp=20160309110158 masterPos=' .
'{"file":"db1023-bin.001288","pos":"308257743","asOfTime":1457521464.3814} ' .
- 'triggeredRecursive=1'
+ 'triggeredRecursive=1 ' .
+ $requestId
],
];
}