            :entry-title entry-title)))
 
 (defn- handle-delete-response
-  "Handle response received from ingest service to a delete request. Status codes which do not
-  fall between 200 and 299 or not equal to 409 will cause an exception which in turn causes the
-  corresponding queue event to be put back in the queue to be retried."
+  "Handle response received from ingest service to a delete request. Returns true if the source
+  granule deletion event need to be retried. Status codes which do not fall between 200 and 299
+  or not equal to 404 or 409 will cause an exception which in turn causes the corresponding queue
+  event to be put back in the queue to be retried indefinitely. Status code 404 will be retried
+  twice. Other status codes are treated as success."
   [response granule-ur retry-count]
-  (let [{:keys [status body]} response]
+  (let [{:keys [status body]} response
+        retry-count (or retry-count 0)
+        needs-retry (when (and (= status 404)
+                               (< retry-count num-retries-delete-not-found))
+                      true)]
     (cond
       (<= 200 status 299)
       (info (format "Deleted virtual granule [%s] with the following response: [%s]"

            [cmr.common.util :as u :refer [defn-timed]]
            [cmr.virtual-product.config :as config]
            [cmr.virtual-product.data.source-to-virtual-mapping :as svm]))

(defmulti handle-ingest-event
  "Handles an ingest event. Checks if it is an event that should be applied to virtual granules. If

      ;;    maximum number of retries for an event. After the retries, the delete event will be
      ;;    considered as a success.
      (= status 404)
      (if (< retry-count num-retries-delete-not-found)
        (info (format (str "Received a response with status code [404] and the following "
                           "response body when deleting the virtual granule [%s] : [%s]. "
                           "The delete request will be retried.")
                      granule-ur (pr-str body)))
        (info (format (str "The number of retries has exceeded the maximum retry count."
                           "The delete event for the virtual granule [%s] will be ignored")
                      granule-ur)))

      ;; Conflict (status code 409)
      ;; This would occurs if a delete event with lower revision-id is consumed after an event with
