diff --git a/hgext/sqlitestore.py b/hgext/sqlitestore.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_aGdleHQvc3FsaXRlc3RvcmUucHk=..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_aGdleHQvc3FsaXRlc3RvcmUucHk= 100644
--- a/hgext/sqlitestore.py
+++ b/hgext/sqlitestore.py
@@ -743,7 +743,7 @@
                     )
 
                 if duplicaterevisioncb:
-                    duplicaterevisioncb(self, node)
+                    duplicaterevisioncb(self, self.rev(node))
                 empty = False
                 continue
 
@@ -754,7 +754,7 @@
                 text = None
                 storedelta = (deltabase, delta)
 
-            self._addrawrevision(
+            rev = self._addrawrevision(
                 node,
                 text,
                 transaction,
@@ -766,7 +766,7 @@
             )
 
             if addrevisioncb:
-                addrevisioncb(self, node)
+                addrevisioncb(self, rev)
             empty = False
 
         return not empty
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL2NoYW5nZWdyb3VwLnB5..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL2NoYW5nZWdyb3VwLnB5 100644
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -318,7 +318,7 @@
             efilesset = set()
             cgnodes = []
 
-            def ondupchangelog(cl, node):
-                if cl.rev(node) < clstart:
-                    cgnodes.append(node)
+            def ondupchangelog(cl, rev):
+                if rev < clstart:
+                    cgnodes.append(cl.node(rev))
 
@@ -324,6 +324,5 @@
 
-            def onchangelog(cl, node):
-                rev = cl.rev(node)
+            def onchangelog(cl, rev):
                 ctx = cl.changelogrevision(rev)
                 efilesset.update(ctx.files)
                 repo.register_changeset(rev, ctx)
diff --git a/mercurial/changelog.py b/mercurial/changelog.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL2NoYW5nZWxvZy5weQ==..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL2NoYW5nZWxvZy5weQ== 100644
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -610,8 +610,8 @@
         just to access this is costly."""
         return self.changelogrevision(rev).branchinfo
 
-    def _nodeduplicatecallback(self, transaction, node):
+    def _nodeduplicatecallback(self, transaction, rev):
         # keep track of revisions that got "re-added", eg: unbunde of know rev.
         #
         # We track them in a list to preserve their order from the source bundle
         duplicates = transaction.changes.setdefault(b'revduplicates', [])
@@ -614,5 +614,5 @@
         # keep track of revisions that got "re-added", eg: unbunde of know rev.
         #
         # We track them in a list to preserve their order from the source bundle
         duplicates = transaction.changes.setdefault(b'revduplicates', [])
-        duplicates.append(self.rev(node))
+        duplicates.append(rev)
diff --git a/mercurial/exchangev2.py b/mercurial/exchangev2.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL2V4Y2hhbmdldjIucHk=..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL2V4Y2hhbmdldjIucHk= 100644
--- a/mercurial/exchangev2.py
+++ b/mercurial/exchangev2.py
@@ -358,6 +358,6 @@
         # Linkrev for changelog is always self.
         return len(cl)
 
-    def ondupchangeset(cl, node):
-        added.append(node)
+    def ondupchangeset(cl, rev):
+        added.append(cl.node(rev))
 
@@ -363,4 +363,4 @@
 
-    def onchangeset(cl, node):
+    def onchangeset(cl, rev):
         progress.increment()
 
@@ -365,4 +365,3 @@
         progress.increment()
 
-        rev = cl.rev(node)
         revision = cl.changelogrevision(rev)
@@ -368,5 +367,5 @@
         revision = cl.changelogrevision(rev)
-        added.append(node)
+        added.append(cl.node(rev))
 
         # We need to preserve the mapping of changelog revision to node
         # so we can set the linkrev accordingly when manifests are added.
@@ -537,8 +536,8 @@
             # Chomp off header object.
             next(objs)
 
-            def onchangeset(cl, node):
-                added.append(node)
+            def onchangeset(cl, rev):
+                added.append(cl.node(rev))
 
             rootmanifest.addgroup(
                 iterrevisions(objs, progress),
diff --git a/mercurial/interfaces/repository.py b/mercurial/interfaces/repository.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL2ludGVyZmFjZXMvcmVwb3NpdG9yeS5weQ==..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL2ludGVyZmFjZXMvcmVwb3NpdG9yeS5weQ== 100644
--- a/mercurial/interfaces/repository.py
+++ b/mercurial/interfaces/repository.py
@@ -774,8 +774,9 @@
         This used to be the default when ``addrevisioncb`` was provided up to
         Mercurial 5.8.
 
-        ``addrevisioncb`` should be called for each node as it is committed.
-        ``duplicaterevisioncb`` should be called for each pre-existing node.
+        ``addrevisioncb`` should be called for each new rev as it is committed.
+        ``duplicaterevisioncb`` should be called for all revs with a
+        pre-existing node.
 
         ``maybemissingparents`` is a bool indicating whether the incoming
         data may reference parents/ancestor revisions that aren't present.
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL3JldmxvZy5weQ==..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL3JldmxvZy5weQ== 100644
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -2419,5 +2419,6 @@
                 link = linkmapper(linknode)
                 flags = flags or REVIDX_DEFAULT_FLAGS
 
-                if self.index.has_node(node):
+                rev = self.index.get_rev(node)
+                if rev is not None:
                     # this can happen if two branches make the same change
@@ -2423,3 +2424,3 @@
                     # this can happen if two branches make the same change
-                    self._nodeduplicatecallback(transaction, node)
+                    self._nodeduplicatecallback(transaction, rev)
                     if duplicaterevisioncb:
@@ -2425,5 +2426,5 @@
                     if duplicaterevisioncb:
-                        duplicaterevisioncb(self, node)
+                        duplicaterevisioncb(self, rev)
                     empty = False
                     continue
 
@@ -2461,7 +2462,7 @@
                 # We're only using addgroup() in the context of changegroup
                 # generation so the revision data can always be handled as raw
                 # by the flagprocessor.
-                self._addrevision(
+                rev = self._addrevision(
                     node,
                     None,
                     transaction,
@@ -2477,7 +2478,7 @@
                 )
 
                 if addrevisioncb:
-                    addrevisioncb(self, node)
+                    addrevisioncb(self, rev)
                 empty = False
 
                 if not dfh and not self._inline:
diff --git a/mercurial/testing/storage.py b/mercurial/testing/storage.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_bWVyY3VyaWFsL3Rlc3Rpbmcvc3RvcmFnZS5weQ==..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_bWVyY3VyaWFsL3Rlc3Rpbmcvc3RvcmFnZS5weQ== 100644
--- a/mercurial/testing/storage.py
+++ b/mercurial/testing/storage.py
@@ -1129,7 +1129,8 @@
         with self._maketransactionfn() as tr:
             nodes = []
 
-            def onchangeset(cl, node):
+            def onchangeset(cl, rev):
+                node = cl.node(rev)
                 nodes.append(node)
                 cb(cl, node)
 
@@ -1133,8 +1134,8 @@
                 nodes.append(node)
                 cb(cl, node)
 
-            def ondupchangeset(cl, node):
-                nodes.append(node)
+            def ondupchangeset(cl, rev):
+                nodes.append(cl.node(rev))
 
             f.addgroup(
                 [],
@@ -1163,7 +1164,8 @@
         with self._maketransactionfn() as tr:
             nodes = []
 
-            def onchangeset(cl, node):
+            def onchangeset(cl, rev):
+                node = cl.node(rev)
                 nodes.append(node)
                 cb(cl, node)
 
@@ -1167,8 +1169,8 @@
                 nodes.append(node)
                 cb(cl, node)
 
-            def ondupchangeset(cl, node):
-                nodes.append(node)
+            def ondupchangeset(cl, rev):
+                nodes.append(cl.node(rev))
 
             f.addgroup(
                 deltas,
@@ -1217,8 +1219,8 @@
         with self._maketransactionfn() as tr:
             newnodes = []
 
-            def onchangeset(cl, node):
-                newnodes.append(node)
+            def onchangeset(cl, rev):
+                newnodes.append(cl.node(rev))
 
             f.addgroup(
                 deltas,
diff --git a/tests/simplestorerepo.py b/tests/simplestorerepo.py
index f7b61ad3c64ae0c7eb81da6cb1559d6006b51c0f_dGVzdHMvc2ltcGxlc3RvcmVyZXBvLnB5..7a93b7b3dc2d3b23af5a44321ac3c72ccaf6e6a1_dGVzdHMvc2ltcGxlc3RvcmVyZXBvLnB5 100644
--- a/tests/simplestorerepo.py
+++ b/tests/simplestorerepo.py
@@ -550,7 +550,7 @@
 
             if node in self._indexbynode:
                 if duplicaterevisioncb:
-                    duplicaterevisioncb(self, node)
+                    duplicaterevisioncb(self, self.rev(node))
                 empty = False
                 continue
 
@@ -560,8 +560,8 @@
             else:
                 text = mdiff.patch(self.revision(deltabase), delta)
 
-            self._addrawrevision(
+            rev = self._addrawrevision(
                 node, text, transaction, linkrev, p1, p2, flags
             )
 
             if addrevisioncb:
@@ -564,8 +564,8 @@
                 node, text, transaction, linkrev, p1, p2, flags
             )
 
             if addrevisioncb:
-                addrevisioncb(self, node)
+                addrevisioncb(self, rev)
             empty = False
         return not empty