removeParentDependencyKey.lua 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. --[[
  2. Check if this job has a parent. If so we will just remove it from
  3. the parent child list, but if it is the last child we should move the parent to "wait/paused"
  4. which requires code from "moveToFinished"
  5. ]]
  6. -- Includes
  7. --- @include "addJobInTargetList"
  8. --- @include "destructureJobKey"
  9. --- @include "getTargetQueueList"
  10. --- @include "removeJobKeys"
  11. local function _moveParentToWait(parentPrefix, parentId, emitEvent)
  12. local parentTarget, isPausedOrMaxed = getTargetQueueList(parentPrefix .. "meta", parentPrefix .. "active",
  13. parentPrefix .. "wait", parentPrefix .. "paused")
  14. addJobInTargetList(parentTarget, parentPrefix .. "marker", "RPUSH", isPausedOrMaxed, parentId)
  15. if emitEvent then
  16. local parentEventStream = parentPrefix .. "events"
  17. rcall("XADD", parentEventStream, "*", "event", "waiting", "jobId", parentId, "prev", "waiting-children")
  18. end
  19. end
  20. local function removeParentDependencyKey(jobKey, hard, parentKey, baseKey, debounceId)
  21. if parentKey then
  22. local parentDependenciesKey = parentKey .. ":dependencies"
  23. local result = rcall("SREM", parentDependenciesKey, jobKey)
  24. if result > 0 then
  25. local pendingDependencies = rcall("SCARD", parentDependenciesKey)
  26. if pendingDependencies == 0 then
  27. local parentId = getJobIdFromKey(parentKey)
  28. local parentPrefix = getJobKeyPrefix(parentKey, parentId)
  29. local numRemovedElements = rcall("ZREM", parentPrefix .. "waiting-children", parentId)
  30. if numRemovedElements == 1 then
  31. if hard then -- remove parent in same queue
  32. if parentPrefix == baseKey then
  33. removeParentDependencyKey(parentKey, hard, nil, baseKey, nil)
  34. removeJobKeys(parentKey)
  35. if debounceId then
  36. rcall("DEL", parentPrefix .. "de:" .. debounceId)
  37. end
  38. else
  39. _moveParentToWait(parentPrefix, parentId)
  40. end
  41. else
  42. _moveParentToWait(parentPrefix, parentId, true)
  43. end
  44. end
  45. end
  46. return true
  47. end
  48. else
  49. local parentAttributes = rcall("HMGET", jobKey, "parentKey", "deid")
  50. local missedParentKey = parentAttributes[1]
  51. if( (type(missedParentKey) == "string") and missedParentKey ~= ""
  52. and (rcall("EXISTS", missedParentKey) == 1)) then
  53. local parentDependenciesKey = missedParentKey .. ":dependencies"
  54. local result = rcall("SREM", parentDependenciesKey, jobKey)
  55. if result > 0 then
  56. local pendingDependencies = rcall("SCARD", parentDependenciesKey)
  57. if pendingDependencies == 0 then
  58. local parentId = getJobIdFromKey(missedParentKey)
  59. local parentPrefix = getJobKeyPrefix(missedParentKey, parentId)
  60. local numRemovedElements = rcall("ZREM", parentPrefix .. "waiting-children", parentId)
  61. if numRemovedElements == 1 then
  62. if hard then
  63. if parentPrefix == baseKey then
  64. removeParentDependencyKey(missedParentKey, hard, nil, baseKey, nil)
  65. removeJobKeys(missedParentKey)
  66. if parentAttributes[2] then
  67. rcall("DEL", parentPrefix .. "de:" .. parentAttributes[2])
  68. end
  69. else
  70. _moveParentToWait(parentPrefix, parentId)
  71. end
  72. else
  73. _moveParentToWait(parentPrefix, parentId, true)
  74. end
  75. end
  76. end
  77. return true
  78. end
  79. end
  80. end
  81. return false
  82. end