@@ -382,7 +382,7 @@ describe('TaskClaiming', () => {
382
382
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
383
383
384
384
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
385
- 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 3; updateErrors: 0; getErrors: 0;' ,
385
+ 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 3; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
386
386
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
387
387
) ;
388
388
@@ -547,7 +547,7 @@ describe('TaskClaiming', () => {
547
547
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
548
548
549
549
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
550
- 'task claimer claimed: 2; stale: 0; conflicts: 0; missing: 1; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
550
+ 'task claimer claimed: 2; stale: 0; conflicts: 0; missing: 1; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
551
551
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
552
552
) ;
553
553
@@ -640,7 +640,7 @@ describe('TaskClaiming', () => {
640
640
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
641
641
642
642
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
643
- 'task claimer claimed: 2; stale: 0; conflicts: 0; missing: 1; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
643
+ 'task claimer claimed: 2; stale: 0; conflicts: 0; missing: 1; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
644
644
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
645
645
) ;
646
646
@@ -733,7 +733,7 @@ describe('TaskClaiming', () => {
733
733
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
734
734
735
735
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
736
- 'task claimer claimed: 2; stale: 1; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
736
+ 'task claimer claimed: 2; stale: 1; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
737
737
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
738
738
) ;
739
739
@@ -832,7 +832,7 @@ describe('TaskClaiming', () => {
832
832
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
833
833
834
834
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
835
- 'task claimer claimed: 4; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
835
+ 'task claimer claimed: 4; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
836
836
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
837
837
) ;
838
838
@@ -958,7 +958,7 @@ describe('TaskClaiming', () => {
958
958
unwrap ( resultOrErr ) as ClaimOwnershipResult ;
959
959
960
960
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
961
- 'task claimer claimed: 4; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
961
+ 'task claimer claimed: 4; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
962
962
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
963
963
) ;
964
964
@@ -1121,7 +1121,7 @@ describe('TaskClaiming', () => {
1121
1121
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
1122
1122
1123
1123
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
1124
- 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 1;' ,
1124
+ 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 1; malformed data errors: 0 ' ,
1125
1125
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1126
1126
) ;
1127
1127
expect ( taskManagerLogger . error ) . toHaveBeenCalledWith (
@@ -1249,7 +1249,7 @@ describe('TaskClaiming', () => {
1249
1249
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
1250
1250
1251
1251
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
1252
- 'task claimer claimed: 3; stale: 0; conflicts: 1; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
1252
+ 'task claimer claimed: 3; stale: 0; conflicts: 1; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
1253
1253
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1254
1254
) ;
1255
1255
expect ( taskManagerLogger . warn ) . toHaveBeenCalledWith (
@@ -1489,7 +1489,7 @@ describe('TaskClaiming', () => {
1489
1489
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
1490
1490
1491
1491
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
1492
- 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 1; getErrors: 0;' ,
1492
+ 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 1; getErrors: 0; malformed data errors: 0 ' ,
1493
1493
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1494
1494
) ;
1495
1495
expect ( taskManagerLogger . error ) . toHaveBeenCalledWith (
@@ -1622,7 +1622,7 @@ describe('TaskClaiming', () => {
1622
1622
expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
1623
1623
1624
1624
expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
1625
- 'task claimer claimed: 3; stale: 0; conflicts: 1; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0;' ,
1625
+ 'task claimer claimed: 3; stale: 0; conflicts: 1; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 0 ' ,
1626
1626
{ tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1627
1627
) ;
1628
1628
expect ( taskManagerLogger . error ) . not . toHaveBeenCalled ( ) ;
@@ -1787,6 +1787,125 @@ describe('TaskClaiming', () => {
1787
1787
expect ( store . bulkGet ) . not . toHaveBeenCalled ( ) ;
1788
1788
} ) ;
1789
1789
1790
+ test ( 'should handle malformed errors when claiming tasks' , async ( ) => {
1791
+ const store = taskStoreMock . create ( { taskManagerId : 'test-test' } ) ;
1792
+ store . convertToSavedObjectIds . mockImplementation ( ( ids ) => ids . map ( ( id ) => `task:${ id } ` ) ) ;
1793
+
1794
+ const fetchedTasks = [
1795
+ mockInstance ( { id : `id-1` , taskType : 'report' } ) ,
1796
+ mockInstance ( { id : `id-2` , taskType : 'report' } ) ,
1797
+ mockInstance ( {
1798
+ id : `id-3` ,
1799
+ taskType : 'yawn' ,
1800
+ schedule : {
1801
+ interval : 'PT1M' ,
1802
+ } ,
1803
+ } ) ,
1804
+ mockInstance ( { id : `id-4` , taskType : 'report' } ) ,
1805
+ ] ;
1806
+
1807
+ const { versionMap, docLatestVersions } = getVersionMapsFromTasks ( fetchedTasks ) ;
1808
+ store . msearch . mockResolvedValueOnce ( { docs : fetchedTasks , versionMap } ) ;
1809
+ store . getDocVersions . mockResolvedValueOnce ( docLatestVersions ) ;
1810
+ store . bulkPartialUpdate . mockResolvedValueOnce (
1811
+ [ fetchedTasks [ 0 ] , fetchedTasks [ 1 ] , fetchedTasks [ 3 ] ] . map ( getPartialUpdateResult )
1812
+ ) ;
1813
+ store . bulkGet . mockResolvedValueOnce ( [
1814
+ asOk ( fetchedTasks [ 0 ] ) ,
1815
+ asOk ( fetchedTasks [ 1 ] ) ,
1816
+ asOk ( fetchedTasks [ 3 ] ) ,
1817
+ ] ) ;
1818
+
1819
+ const taskClaiming = new TaskClaiming ( {
1820
+ logger : taskManagerLogger ,
1821
+ strategy : CLAIM_STRATEGY_MGET ,
1822
+ definitions : taskDefinitions ,
1823
+ taskStore : store ,
1824
+ excludedTaskTypes : [ ] ,
1825
+ maxAttempts : 2 ,
1826
+ getAvailableCapacity : ( ) => 10 ,
1827
+ taskPartitioner,
1828
+ } ) ;
1829
+
1830
+ const resultOrErr = await taskClaiming . claimAvailableTasksIfCapacityIsAvailable ( {
1831
+ claimOwnershipUntil : new Date ( ) ,
1832
+ } ) ;
1833
+
1834
+ if ( ! isOk < ClaimOwnershipResult , FillPoolResult > ( resultOrErr ) ) {
1835
+ expect ( resultOrErr ) . toBe ( undefined ) ;
1836
+ }
1837
+
1838
+ const result = unwrap ( resultOrErr ) as ClaimOwnershipResult ;
1839
+
1840
+ expect ( apm . startTransaction ) . toHaveBeenCalledWith (
1841
+ TASK_MANAGER_MARK_AS_CLAIMED ,
1842
+ TASK_MANAGER_TRANSACTION_TYPE
1843
+ ) ;
1844
+ expect ( mockApmTrans . end ) . toHaveBeenCalledWith ( 'success' ) ;
1845
+
1846
+ expect ( taskManagerLogger . debug ) . toHaveBeenCalledWith (
1847
+ 'task claimer claimed: 3; stale: 0; conflicts: 0; missing: 0; capacity reached: 0; updateErrors: 0; getErrors: 0; malformed data errors: 1' ,
1848
+ { tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1849
+ ) ;
1850
+
1851
+ expect ( taskManagerLogger . error ) . toHaveBeenCalledWith (
1852
+ 'Error validating task schema id-3:yawn during claim: "Invalid interval \\"PT1M\\". Intervals must be of the form {number}m. Example: 5m."' ,
1853
+ { tags : [ 'taskClaiming' , 'claimAvailableTasksMget' ] }
1854
+ ) ;
1855
+
1856
+ expect ( store . msearch . mock . calls [ 0 ] [ 0 ] ?. [ 0 ] ) . toMatchObject ( {
1857
+ size : 40 ,
1858
+ seq_no_primary_term : true ,
1859
+ } ) ;
1860
+
1861
+ expect ( store . getDocVersions ) . toHaveBeenCalledWith ( [
1862
+ 'task:id-1' ,
1863
+ 'task:id-2' ,
1864
+ 'task:id-3' ,
1865
+ 'task:id-4' ,
1866
+ ] ) ;
1867
+
1868
+ expect ( store . bulkPartialUpdate ) . toHaveBeenCalledTimes ( 1 ) ;
1869
+ expect ( store . bulkPartialUpdate ) . toHaveBeenCalledWith ( [
1870
+ {
1871
+ id : fetchedTasks [ 0 ] . id ,
1872
+ version : fetchedTasks [ 0 ] . version ,
1873
+ scheduledAt : fetchedTasks [ 0 ] . runAt ,
1874
+ attempts : 1 ,
1875
+ ownerId : 'test-test' ,
1876
+ retryAt : new Date ( '1970-01-01T00:05:30.000Z' ) ,
1877
+ status : 'running' ,
1878
+ startedAt : new Date ( '1970-01-01T00:00:00.000Z' ) ,
1879
+ } ,
1880
+ {
1881
+ id : fetchedTasks [ 1 ] . id ,
1882
+ version : fetchedTasks [ 1 ] . version ,
1883
+ scheduledAt : fetchedTasks [ 1 ] . runAt ,
1884
+ attempts : 1 ,
1885
+ ownerId : 'test-test' ,
1886
+ retryAt : new Date ( '1970-01-01T00:05:30.000Z' ) ,
1887
+ status : 'running' ,
1888
+ startedAt : new Date ( '1970-01-01T00:00:00.000Z' ) ,
1889
+ } ,
1890
+ {
1891
+ id : fetchedTasks [ 3 ] . id ,
1892
+ version : fetchedTasks [ 3 ] . version ,
1893
+ scheduledAt : fetchedTasks [ 3 ] . runAt ,
1894
+ attempts : 1 ,
1895
+ ownerId : 'test-test' ,
1896
+ retryAt : new Date ( '1970-01-01T00:05:30.000Z' ) ,
1897
+ status : 'running' ,
1898
+ startedAt : new Date ( '1970-01-01T00:00:00.000Z' ) ,
1899
+ } ,
1900
+ ] ) ;
1901
+
1902
+ expect ( store . bulkGet ) . toHaveBeenCalledWith ( [ 'id-1' , 'id-2' , 'id-4' ] ) ;
1903
+
1904
+ expect ( result . stats . tasksUpdated ) . toEqual ( 3 ) ;
1905
+ expect ( result . stats . tasksClaimed ) . toEqual ( 3 ) ;
1906
+ expect ( result . stats . tasksErrors ) . toEqual ( 1 ) ;
1907
+ } ) ;
1908
+
1790
1909
test ( 'it should filter for specific partitions and tasks without partitions' , async ( ) => {
1791
1910
const taskManagerId = uuidv4 ( ) ;
1792
1911
const definitions = new TaskTypeDictionary ( mockLogger ( ) ) ;
0 commit comments