Geo: LFS files stopped synching due to duplicate inserts

Zendesk: https://gitlab.zendesk.com/agent/tickets/162494

In geo.log, we see these duplicate errors happened in close proximity:

{
  "severity": "ERROR",
  "time": "2020-06-29T07:13:19.558Z",
  "correlation_id": "83b5e65ae1f07e07880aa5d217747c7f",
  "class": "Geo::RegistryConsistencyService",
  "host": "***",
  "message": "Error while backfilling Geo::LfsObjectRegistry",
  "job_id": "c1b0a016861ae61fa1cc4ac4",
  "error": "PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint \"index_lfs_object_registry_on_lfs_object_id\"\nDETAIL:  Key (lfs_object_id)=(175772) already exists.\n"
}
{
  "severity": "ERROR",
  "time": "2020-06-29T07:13:19.559Z",
  "correlation_id": "83b5e65ae1f07e07880aa5d217747c7f",
  "class": "Geo::Secondary::RegistryConsistencyWorker",
  "host": "***",
  "message": "Error while backfilling all",
  "job_id": "c1b0a016861ae61fa1cc4ac4",
  "error": "PG::UniqueViolation: ERROR:  duplicate key value violates unique constraint \"index_lfs_object_registry_on_lfs_object_id\"\nDETAIL:  Key (lfs_object_id)=(175772) already exists.\n"
}

This suggests a single SQL statement may have contained duplicate keys. In the PostgreSQL logs, you can see that 27151 is included twice:

INSERT INTO "lfs_object_registry" (
  "created_at", "retry_at", "bytes", 
  "lfs_object_id", "retry_count", 
  "missing_on_primary", "success", 
  "sha256"
) 
VALUES 
  (
    '2020-06-28 21:28:05.082523', NULL, 
    NULL, 27025, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.082722', NULL, 
    NULL, 27026, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.082810', NULL, 
    NULL, 27033, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.082870', NULL, 
    NULL, 27034, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.082934', NULL, 
    NULL, 27035, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.082999', NULL, 
    NULL, 27036, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083063', NULL, 
    NULL, 27037, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083126', NULL, 
    NULL, 27038, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083192', NULL, 
    NULL, 27039, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083256', NULL, 
    NULL, 27040, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083320', NULL, 
    NULL, 27046, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083386', NULL, 
    NULL, 27047, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083450', NULL, 
    NULL, 27054, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083514', NULL, 
    NULL, 27059, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083583', NULL, 
    NULL, 27150, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083640', NULL, 
    NULL, 27151, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083712', NULL, 
    NULL, 27151, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083782', NULL, 
    NULL, 27060, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083854', NULL, 
    NULL, 27062, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083923', NULL, 
    NULL, 27077, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.083984', NULL, 
    NULL, 27076, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084073', NULL, 
    NULL, 27066, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084153', NULL, 
    NULL, 27080, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084224', NULL, 
    NULL, 27063, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084288', NULL, 
    NULL, 27070, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084366', NULL, 
    NULL, 26993, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084432', NULL, 
    NULL, 27008, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084491', NULL, 
    NULL, 26990, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084559', NULL, 
    NULL, 26879, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084617', NULL, 
    NULL, 26979, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084684', NULL, 
    NULL, 26986, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084748', NULL, 
    NULL, 26988, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084814', NULL, 
    NULL, 26991, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084877', NULL, 
    NULL, 27006, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.084939', NULL, 
    NULL, 26980, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085008', NULL, 
    NULL, 27007, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085065', NULL, 
    NULL, 27009, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085128', NULL, 
    NULL, 27026, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085195', NULL, 
    NULL, 27025, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085257', NULL, 
    NULL, 27025, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085328', NULL, 
    NULL, 27026, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085386', NULL, 
    NULL, 27046, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085453', NULL, 
    NULL, 27047, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085526', NULL, 
    NULL, 27025, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085589', NULL, 
    NULL, 27026, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085657', NULL, 
    NULL, 26871, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085714', NULL, 
    NULL, 26869, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085778', NULL, 
    NULL, 26863, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085841', NULL, 
    NULL, 26866, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085914', NULL, 
    NULL, 26867, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.085977', NULL, 
    NULL, 26868, NULL, FALSE, FALSE, NULL
  ), 
  (
    '2020-06-28 21:28:05.086041', NULL, 
    NULL, 26870, NULL, FALSE, FALSE, NULL
  ) RETURNING "id"

This suggests find_registry_differences may be including dupes? https://gitlab.com/gitlab-org/gitlab/blob/d27df23488648bd313621661d22a9d180457f2dc/ee/app/services/geo/registry_consistency_service.rb#L55-61

Edited by Catalin Irimie