diff --git a/changes/ticket13762 b/changes/ticket13762
new file mode 100644
index 0000000000000000000000000000000000000000..7b1976f6546bfc030eee63db7d9aa21df87f80fd
--- /dev/null
+++ b/changes/ticket13762
@@ -0,0 +1,5 @@
+  o Minor features:
+    - Suppress "router info incompatible with extra info" message when
+      reading extrainfo documents from cache. (This message got loud
+      around 0.2.6.2-alpha, when we fixed bug 9812.) Closes ticket
+      13762.
\ No newline at end of file
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index d3734238ebd8d46b596307428f01557ab07c8fa4..b5e58a4623352f4f7a342f8387a9ba27def27595 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -2753,7 +2753,7 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri)
  * corresponding router in rl-\>routers or rl-\>old_routers.  Return the status
  * of inserting <b>ei</b>.  Free <b>ei</b> if it isn't inserted. */
 MOCK_IMPL(STATIC was_router_added_t,
-extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei))
+extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible))
 {
   was_router_added_t r;
   const char *compatibility_error_msg;
@@ -2775,11 +2775,13 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei))
   }
   if (routerinfo_incompatible_with_extrainfo(ri, ei, sd,
                                              &compatibility_error_msg)) {
+    const int severity = warn_if_incompatible ? LOG_WARN : LOG_INFO;
     r = (ri->cache_info.extrainfo_is_bogus) ?
       ROUTER_BAD_EI : ROUTER_NOT_IN_CONSENSUS;
 
-    log_warn(LD_DIR,"router info incompatible with extra info (reason: %s)",
-             compatibility_error_msg);
+    log_fn(severity,LD_DIR,
+           "router info incompatible with extra info (reason: %s)",
+           compatibility_error_msg);
 
     goto done;
   }
@@ -3325,7 +3327,7 @@ router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg,
   if (msg) *msg = NULL;
   /*XXXX023 Do something with msg */
 
-  inserted = extrainfo_insert(router_get_routerlist(), ei);
+  inserted = extrainfo_insert(router_get_routerlist(), ei, !from_cache);
 
   if (WRA_WAS_ADDED(inserted) && !from_cache)
     signed_desc_append_to_journal(&ei->cache_info,
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index d7e15db87ea631bef1754d6f37f86d4b5a8a5edf..0d22543a274cbcef62f1cd4e588963ee82fc4c57 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -227,7 +227,7 @@ STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
 MOCK_DECL(int, router_descriptor_is_older_than, (const routerinfo_t *router,
                                                  int seconds));
 MOCK_DECL(STATIC was_router_added_t, extrainfo_insert,
-          (routerlist_t *rl, extrainfo_t *ei));
+          (routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible));
 
 #endif
 
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index c6594f8359a5f09fa7e4f4220e02e1e4e115e3cc..a8c6c6fad4e8086d44e6848e32a92e165574e740 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -714,9 +714,10 @@ mock_get_by_ei_desc_digest(const char *d)
 
 static smartlist_t *mock_ei_insert_list = NULL;
 static was_router_added_t
-mock_ei_insert(routerlist_t *rl, extrainfo_t *ei)
+mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)
 {
   (void) rl;
+  (void) warn_if_incompatible;
   smartlist_add(mock_ei_insert_list, ei);
   return ROUTER_ADDED_SUCCESSFULLY;
 }