diff --git a/.rubocop_todo/layout/line_length.yml b/.rubocop_todo/layout/line_length.yml
index ea079e765f41b9fa0bee9c1308621fa71bff4042..5f9a6d282c886057598f0f7395bcf85e8440b9f9 100644
--- a/.rubocop_todo/layout/line_length.yml
+++ b/.rubocop_todo/layout/line_length.yml
@@ -985,7 +985,6 @@ Layout/LineLength:
     - 'ee/app/services/geo/event_service.rb'
     - 'ee/app/services/geo/file_registry_removal_service.rb'
     - 'ee/app/services/geo/framework_repository_sync_service.rb'
-    - 'ee/app/services/geo/hashed_storage_attachments_migration_service.rb'
     - 'ee/app/services/geo/request_service.rb'
     - 'ee/app/services/geo/verification_state_backfill_service.rb'
     - 'ee/app/services/gitlab_subscriptions/plan_upgrade_service.rb'
@@ -2061,7 +2060,6 @@ Layout/LineLength:
     - 'ee/spec/services/geo/blob_download_service_spec.rb'
     - 'ee/spec/services/geo/container_repository_sync_spec.rb'
     - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
-    - 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
     - 'ee/spec/services/gitlab_subscriptions/check_future_renewal_service_spec.rb'
     - 'ee/spec/services/gitlab_subscriptions/create_service_spec.rb'
     - 'ee/spec/services/groups/memberships/export_service_spec.rb'
diff --git a/.rubocop_todo/rails/time_zone.yml b/.rubocop_todo/rails/time_zone.yml
index afe92cc4ad7f8404a832af0d1d7037430e642a80..85593dce598a8763e24f33075945e0fa66b115c8 100644
--- a/.rubocop_todo/rails/time_zone.yml
+++ b/.rubocop_todo/rails/time_zone.yml
@@ -11,7 +11,6 @@ Rails/TimeZone:
     - 'ee/spec/lib/gitlab/geo/base_request_spec.rb'
     - 'ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb'
     - 'ee/spec/lib/gitlab/geo/log_cursor/events/event_spec.rb'
-    - 'ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb'
     - 'ee/spec/lib/gitlab/geo/log_cursor/logger_spec.rb'
     - 'lib/api/helpers.rb'
     - 'lib/api/sidekiq_metrics.rb'
diff --git a/.rubocop_todo/rspec/expect_change.yml b/.rubocop_todo/rspec/expect_change.yml
index c5f56901f5e7c0e754735b520e6fbf8de96cc006..0e83d5d76b78c77c08ca4d6254af1699c1d3b074 100644
--- a/.rubocop_todo/rspec/expect_change.yml
+++ b/.rubocop_todo/rspec/expect_change.yml
@@ -22,7 +22,6 @@ RSpec/ExpectChange:
     - 'ee/spec/lib/gitlab/compliance_management/violations/approved_by_committer_spec.rb'
     - 'ee/spec/lib/gitlab/compliance_management/violations/approved_by_insufficient_users_spec.rb'
     - 'ee/spec/lib/gitlab/compliance_management/violations/approved_by_merge_request_author_spec.rb'
-    - 'ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb'
     - 'ee/spec/lib/gitlab/instrumentation/elasticsearch_transport_spec.rb'
     - 'ee/spec/lib/gitlab/legacy_github_import/project_creator_spec.rb'
     - 'ee/spec/lib/quality/seeders/vulnerabilities_spec.rb'
@@ -134,7 +133,6 @@ RSpec/ExpectChange:
     - 'ee/spec/services/iterations/roll_over_issues_service_spec.rb'
     - 'ee/spec/services/projects/alerting/notify_service_spec.rb'
     - 'ee/spec/services/projects/destroy_service_spec.rb'
-    - 'ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
     - 'ee/spec/services/projects/transfer_service_spec.rb'
     - 'ee/spec/services/protected_environments/create_service_spec.rb'
     - 'ee/spec/services/quality_management/test_cases/create_service_spec.rb'
diff --git a/.rubocop_todo/rspec/feature_category.yml b/.rubocop_todo/rspec/feature_category.yml
index 826aee1d3ae090c818e17346c23c07715cfbdc95..d5b9845951e08a9ea5cd1ce1a4c6b043093897a6 100644
--- a/.rubocop_todo/rspec/feature_category.yml
+++ b/.rubocop_todo/rspec/feature_category.yml
@@ -1378,7 +1378,6 @@ RSpec/FeatureCategory:
     - 'ee/spec/services/projects/gitlab_projects_import_service_spec.rb'
     - 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
     - 'ee/spec/services/projects/group_links/update_service_spec.rb'
-    - 'ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
     - 'ee/spec/services/projects/import_export/export_service_spec.rb'
     - 'ee/spec/services/projects/import_service_spec.rb'
     - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
diff --git a/.rubocop_todo/rspec/named_subject.yml b/.rubocop_todo/rspec/named_subject.yml
index ff8e1ef5391bd9dfe470397a492fe670cc2f9f5e..4e4aa25c4176fc9c79697caeb7b284c9033271e4 100644
--- a/.rubocop_todo/rspec/named_subject.yml
+++ b/.rubocop_todo/rspec/named_subject.yml
@@ -429,7 +429,6 @@ RSpec/NamedSubject:
     - 'ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb'
     - 'ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb'
     - 'ee/spec/lib/gitlab/geo/log_cursor/events/event_spec.rb'
-    - 'ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb'
     - 'ee/spec/lib/gitlab/geo/oauth/session_spec.rb'
     - 'ee/spec/lib/gitlab/geo/registry_batcher_spec.rb'
     - 'ee/spec/lib/gitlab/geo/replication/blob_retriever_spec.rb'
@@ -1040,7 +1039,6 @@ RSpec/NamedSubject:
     - 'ee/spec/services/geo/file_registry_removal_service_spec.rb'
     - 'ee/spec/services/geo/framework_repository_sync_service_spec.rb'
     - 'ee/spec/services/geo/graphql_request_service_spec.rb'
-    - 'ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
     - 'ee/spec/services/geo/metrics_update_service_spec.rb'
     - 'ee/spec/services/geo/replication_toggle_request_service_spec.rb'
     - 'ee/spec/services/gitlab_subscriptions/activate_service_spec.rb'
@@ -1098,7 +1096,6 @@ RSpec/NamedSubject:
     - 'ee/spec/services/projects/gitlab_projects_import_service_spec.rb'
     - 'ee/spec/services/projects/group_links/create_service_spec.rb'
     - 'ee/spec/services/projects/group_links/destroy_service_spec.rb'
-    - 'ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
     - 'ee/spec/services/projects/import_export/export_service_spec.rb'
     - 'ee/spec/services/projects/import_service_spec.rb'
     - 'ee/spec/services/projects/mark_for_deletion_service_spec.rb'
diff --git a/app/services/projects/hashed_storage/migrate_attachments_service.rb b/app/services/projects/hashed_storage/migrate_attachments_service.rb
index 40c4fd5376c3f8391e652fa931c5144340a2a94c..a61ea4595332aeb630382a27bcd31c1444594824 100644
--- a/app/services/projects/hashed_storage/migrate_attachments_service.rb
+++ b/app/services/projects/hashed_storage/migrate_attachments_service.rb
@@ -63,5 +63,3 @@ def find_old_attachments_path(project)
     end
   end
 end
-
-Projects::HashedStorage::MigrateAttachmentsService.prepend_mod_with('Projects::HashedStorage::MigrateAttachmentsService')
diff --git a/ee/app/models/geo/event_log.rb b/ee/app/models/geo/event_log.rb
index 05876d557d081afb7c12191b0598561e7c0d913b..676a381c9b03765d7d0e9d77f715513bf34a54e6 100644
--- a/ee/app/models/geo/event_log.rb
+++ b/ee/app/models/geo/event_log.rb
@@ -3,8 +3,14 @@
 module Geo
   class EventLog < ApplicationRecord
     include IgnorableColumns
+
     ignore_column :geo_event_id_convert_to_bigint, remove_with: '16.11', remove_after: '2024-03-21'
 
+    ignore_columns %i[
+      hashed_storage_migrated_event_id
+      hashed_storage_attachments_event_id
+    ], remove_with: '17.0', remove_after: '2024-05-16'
+
     include Geo::Model
     include ::EachBatch
 
@@ -15,8 +21,6 @@ class EventLog < ApplicationRecord
                        Geo::RepositoryRenamedEvent
                        Geo::RepositoriesChangedEvent
                        Geo::ResetChecksumEvent
-                       Geo::HashedStorageMigratedEvent
-                       Geo::HashedStorageAttachmentsEvent
                        Geo::Event].freeze
 
     belongs_to :cache_invalidation_event,
@@ -43,14 +47,6 @@ class EventLog < ApplicationRecord
       class_name: 'Geo::RepositoriesChangedEvent',
       foreign_key: :repositories_changed_event_id
 
-    belongs_to :hashed_storage_migrated_event,
-      class_name: 'Geo::HashedStorageMigratedEvent',
-      foreign_key: :hashed_storage_migrated_event_id
-
-    belongs_to :hashed_storage_attachments_event,
-      class_name: 'Geo::HashedStorageAttachmentsEvent',
-      foreign_key: :hashed_storage_attachments_event_id
-
     belongs_to :reset_checksum_event,
       class_name: 'Geo::ResetChecksumEvent',
       foreign_key: :reset_checksum_event_id
@@ -86,8 +82,6 @@ def event
         repository_deleted_event ||
         repository_renamed_event ||
         repositories_changed_event ||
-        hashed_storage_migrated_event ||
-        hashed_storage_attachments_event ||
         reset_checksum_event ||
         cache_invalidation_event ||
         geo_event
diff --git a/ee/app/models/geo/hashed_storage_attachments_event.rb b/ee/app/models/geo/hashed_storage_attachments_event.rb
deleted file mode 100644
index b27534cb8d0af6a84def1db6f37b427aef6099fc..0000000000000000000000000000000000000000
--- a/ee/app/models/geo/hashed_storage_attachments_event.rb
+++ /dev/null
@@ -1,12 +0,0 @@
-# frozen_string_literal: true
-
-module Geo
-  class HashedStorageAttachmentsEvent < ApplicationRecord
-    include Geo::Model
-    include Geo::Eventable
-
-    belongs_to :project
-
-    validates :project, :old_attachments_path, :new_attachments_path, presence: true
-  end
-end
diff --git a/ee/app/models/geo/hashed_storage_migrated_event.rb b/ee/app/models/geo/hashed_storage_migrated_event.rb
deleted file mode 100644
index 24b85b2f2485dbc92b75a083943a22c93f92fcdd..0000000000000000000000000000000000000000
--- a/ee/app/models/geo/hashed_storage_migrated_event.rb
+++ /dev/null
@@ -1,14 +0,0 @@
-# frozen_string_literal: true
-
-module Geo
-  class HashedStorageMigratedEvent < ApplicationRecord
-    include Geo::Model
-    include Geo::Eventable
-
-    belongs_to :project
-
-    validates :project, :repository_storage_name,
-      :old_disk_path, :new_disk_path, :old_wiki_disk_path,
-      :new_wiki_disk_path, :new_storage_version, presence: true
-  end
-end
diff --git a/ee/app/services/ee/projects/hashed_storage/migrate_attachments_service.rb b/ee/app/services/ee/projects/hashed_storage/migrate_attachments_service.rb
deleted file mode 100644
index 0bbbb80d4b058748d7e17330760f34fda57cd64b..0000000000000000000000000000000000000000
--- a/ee/app/services/ee/projects/hashed_storage/migrate_attachments_service.rb
+++ /dev/null
@@ -1,24 +0,0 @@
-# frozen_string_literal: true
-
-module EE
-  module Projects
-    module HashedStorage
-      module MigrateAttachmentsService
-        extend ::Gitlab::Utils::Override
-
-        override :execute
-        def execute
-          super do
-            break true if skipped?
-
-            ::Geo::HashedStorageAttachmentsEventStore.new(
-              project,
-              old_attachments_path: old_disk_path,
-              new_attachments_path: new_disk_path
-            ).create!
-          end
-        end
-      end
-    end
-  end
-end
diff --git a/ee/app/services/geo/hashed_storage_attachments_event_store.rb b/ee/app/services/geo/hashed_storage_attachments_event_store.rb
deleted file mode 100644
index 1d53bf56a5efa5da56e86c11e9b4508f82697cc3..0000000000000000000000000000000000000000
--- a/ee/app/services/geo/hashed_storage_attachments_event_store.rb
+++ /dev/null
@@ -1,25 +0,0 @@
-# frozen_string_literal: true
-
-module Geo
-  class HashedStorageAttachmentsEventStore < EventStore
-    self.event_type = :hashed_storage_attachments_event
-
-    private
-
-    def build_event
-      Geo::HashedStorageAttachmentsEvent.new(
-        project: project,
-        old_attachments_path: old_attachments_path,
-        new_attachments_path: new_attachments_path
-      )
-    end
-
-    def old_attachments_path
-      params.fetch(:old_attachments_path)
-    end
-
-    def new_attachments_path
-      params.fetch(:new_attachments_path)
-    end
-  end
-end
diff --git a/ee/app/services/geo/hashed_storage_attachments_migration_service.rb b/ee/app/services/geo/hashed_storage_attachments_migration_service.rb
deleted file mode 100644
index 064f3b55161962ce3059e22dea95597f00d5fd8f..0000000000000000000000000000000000000000
--- a/ee/app/services/geo/hashed_storage_attachments_migration_service.rb
+++ /dev/null
@@ -1,57 +0,0 @@
-# frozen_string_literal: true
-
-module Geo
-  AttachmentMigrationError = Class.new(StandardError)
-
-  class HashedStorageAttachmentsMigrationService
-    include ::Gitlab::Geo::LogHelpers
-
-    attr_reader :project_id, :old_attachments_path, :new_attachments_path
-
-    def initialize(project_id, old_attachments_path:, new_attachments_path:)
-      @project_id = project_id
-      @old_attachments_path = old_attachments_path
-      @new_attachments_path = new_attachments_path
-    end
-
-    def async_execute
-      Geo::HashedStorageAttachmentsMigrationWorker.perform_async(
-        project_id,
-        old_attachments_path,
-        new_attachments_path
-      )
-    end
-
-    def execute
-      origin = File.join(FileUploader.root, old_attachments_path)
-      target = File.join(FileUploader.root, new_attachments_path)
-      move_folder!(origin, target)
-    end
-
-    private
-
-    def project
-      @project ||= Project.find(project_id)
-    end
-
-    def move_folder!(old_path, new_path)
-      unless File.directory?(old_path)
-        log_info("Skipped attachments migration to Hashed Storage, source path doesn't exist or is not a directory", project_id: project.id, source: old_path, target: new_path)
-        return
-      end
-
-      if File.exist?(new_path)
-        log_error("Cannot migrate attachments to Hashed Storage, target path already exist", project_id: project.id, source: old_path, target: new_path)
-        raise AttachmentMigrationError, "Target path '#{new_path}' already exist"
-      end
-
-      # Create hashed storage base path folder
-      FileUtils.mkdir_p(File.dirname(new_path))
-
-      FileUtils.mv(old_path, new_path)
-      log_info("Migrated project attachments to Hashed Storage", project_id: project.id, source: old_path, target: new_path)
-
-      true
-    end
-  end
-end
diff --git a/ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb b/ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb
index 82dce390b2eebd0c8c0d19316482371f44b9491a..cf18b7f6dc9637587bf5711dc5be0591e82f0f28 100644
--- a/ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb
+++ b/ee/app/workers/geo/hashed_storage_attachments_migration_worker.rb
@@ -10,12 +10,8 @@ class HashedStorageAttachmentsMigrationWorker # rubocop:disable Scalability/Idem
 
     loggable_arguments 1, 2
 
-    def perform(project_id, old_attachments_path, new_attachments_path)
-      Geo::HashedStorageAttachmentsMigrationService.new(
-        project_id,
-        old_attachments_path: old_attachments_path,
-        new_attachments_path: new_attachments_path
-      ).execute
+    def perform(_project_id, _old_attachments_path, _new_attachments_path)
+      # no-op
     end
   end
 end
diff --git a/ee/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event.rb b/ee/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event.rb
index bf77dc84af8575f53a02f3b2c7fd1a80fa72a188..d31a4e20b981c97e965d289f72866e3a3f7845e3 100644
--- a/ee/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event.rb
+++ b/ee/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event.rb
@@ -8,28 +8,7 @@ class HashedStorageAttachmentsEvent
           include BaseEvent
 
           def process
-            job_id = hashed_storage_attachments_migrate
-            log_event(job_id)
-          end
-
-          private
-
-          def hashed_storage_attachments_migrate
-            # Must always schedule, regardless of shard health
-            ::Geo::HashedStorageAttachmentsMigrationService.new(
-              event.project_id,
-              old_attachments_path: event.old_attachments_path,
-              new_attachments_path: event.new_attachments_path
-            ).async_execute
-          end
-
-          def log_event(job_id)
-            super(
-              'Migrating attachments to hashed storage',
-              project_id: event.project_id,
-              old_attachments_path: event.old_attachments_path,
-              new_attachments_path: event.new_attachments_path,
-              job_id: job_id)
+            # no-op
           end
         end
       end
diff --git a/ee/spec/factories/geo/event_log.rb b/ee/spec/factories/geo/event_log.rb
index 27a5f49d7b906f3cddbcaca91498a0325637054c..1bb95ba17978ebff13014e038a02403882df7a52 100644
--- a/ee/spec/factories/geo/event_log.rb
+++ b/ee/spec/factories/geo/event_log.rb
@@ -18,14 +18,6 @@
       repository_renamed_event factory: :geo_repository_renamed_event
     end
 
-    trait :hashed_storage_migration_event do
-      hashed_storage_migrated_event factory: :geo_hashed_storage_migrated_event
-    end
-
-    trait :hashed_storage_attachments_event do
-      hashed_storage_attachments_event factory: :geo_hashed_storage_attachments_event
-    end
-
     trait :reset_checksum_event do
       reset_checksum_event factory: :geo_reset_checksum_event
     end
@@ -80,24 +72,6 @@
     new_path { "#{project.path}_new" }
   end
 
-  factory :geo_hashed_storage_migrated_event, class: 'Geo::HashedStorageMigratedEvent' do
-    project { association(:project, :repository) }
-
-    repository_storage_name { project.repository_storage }
-    old_disk_path { project.path_with_namespace }
-    new_disk_path { "#{project.path_with_namespace}_new" }
-    old_wiki_disk_path { project.wiki.path_with_namespace }
-    new_wiki_disk_path { "#{project.wiki.path_with_namespace}_new" }
-    new_storage_version { Project::HASHED_STORAGE_FEATURES[:repository] }
-  end
-
-  factory :geo_hashed_storage_attachments_event, class: 'Geo::HashedStorageAttachmentsEvent' do
-    project { association(:project, :repository) }
-
-    old_attachments_path { Storage::LegacyProject.new(project).disk_path }
-    new_attachments_path { Storage::Hashed.new(project).disk_path }
-  end
-
   factory :geo_reset_checksum_event, class: 'Geo::ResetChecksumEvent' do
     project
   end
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
index bba07dc39e38d26a7ebb212b639e4caa5b1c9403..9098dac28f7131cb7c2ca76f1e4c57ceff42f401 100644
--- a/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
+++ b/ee/spec/lib/gitlab/geo/log_cursor/daemon_spec.rb
@@ -142,80 +142,6 @@
         daemon.find_and_handle_events!
       end
     end
-
-    context 'when node has namespace restrictions' do
-      let(:group_1) { create(:group) }
-      let(:group_2) { create(:group) }
-      let(:project) { create(:project, group: group_1) }
-      let(:hashed_storage_attachments_event) { create(:geo_hashed_storage_attachments_event, project: project) }
-      let(:event_log) { create(:geo_event_log, hashed_storage_attachments_event: hashed_storage_attachments_event) }
-      let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
-      let!(:registry) { create(:geo_project_repository_registry, :synced, project: project) }
-
-      before do
-        allow(Gitlab::ShardHealthCache).to receive(:healthy_shard?).with('default').and_return(true)
-        allow(Gitlab::Geo::Logger).to receive(:info).and_call_original
-      end
-
-      it 'detects when an event was skipped' do
-        updated_event = create(:geo_hashed_storage_attachments_event, project: project)
-        new_event = create(:geo_event_log, id: event_log.id + 2, hashed_storage_attachments_event: updated_event)
-
-        daemon.find_and_handle_events!
-
-        create(:geo_event_log, id: event_log.id + 1)
-
-        expect(read_gaps).to eq([event_log.id + 1])
-
-        expect(::Geo::EventLogState.last_processed.id).to eq(new_event.id)
-      end
-
-      it 'detects when an event was skipped between batches' do
-        updated_event = create(:geo_hashed_storage_attachments_event, project: project)
-        new_event = create(:geo_event_log, hashed_storage_attachments_event: updated_event)
-
-        daemon.find_and_handle_events!
-
-        create(:geo_event_log, id: new_event.id + 3, hashed_storage_attachments_event: updated_event)
-
-        daemon.find_and_handle_events!
-
-        create(:geo_event_log, id: new_event.id + 1, hashed_storage_attachments_event: updated_event)
-        create(:geo_event_log, id: new_event.id + 2, hashed_storage_attachments_event: updated_event)
-
-        expect(read_gaps).to eq([new_event.id + 1, new_event.id + 2])
-      end
-
-      it "logs a message if an associated event can't be found" do
-        new_event = create(:geo_event_log)
-
-        expect(Gitlab::Geo::Logger).to receive(:warn)
-                                        .with(hash_including(
-                                                class: 'Gitlab::Geo::LogCursor::Daemon',
-                                                message: '#handle_single_event: unknown event',
-                                                event_log_id: new_event.id))
-
-        daemon.find_and_handle_events!
-
-        expect(::Geo::EventLogState.last_processed.id).to eq(new_event.id)
-      end
-
-      it 'logs a message for skipped events' do
-        secondary.update!(selective_sync_type: 'namespaces', namespaces: [group_2])
-
-        expect(Gitlab::Geo::Logger).to receive(:info).with(hash_including(
-                                                             :pid,
-                                                             :cursor_delay_s,
-                                                             message: 'Skipped event',
-                                                             class: 'Gitlab::Geo::LogCursor::Daemon',
-                                                             event_log_id: event_log.id,
-                                                             event_id: hashed_storage_attachments_event.id,
-                                                             event_type: 'Geo::HashedStorageAttachmentsEvent',
-                                                             project_id: project.id))
-
-        daemon.find_and_handle_events!
-      end
-    end
   end
 
   describe '#handle_events' do
diff --git a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb b/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
deleted file mode 100644
index 74266a2275bbaa1ec3d8b70f5083f563983e68fc..0000000000000000000000000000000000000000
--- a/ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb
+++ /dev/null
@@ -1,32 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Gitlab::Geo::LogCursor::Events::HashedStorageAttachmentsEvent,
-  :clean_gitlab_redis_shared_state,
-  feature_category: :geo_replication do
-  let(:logger) { Gitlab::Geo::LogCursor::Logger.new(described_class, Logger::INFO) }
-  let(:event_log) { create(:geo_event_log, :hashed_storage_attachments_event) }
-  let!(:event_log_state) { create(:geo_event_log_state, event_id: event_log.id - 1) }
-  let(:hashed_storage_attachments_event) { event_log.hashed_storage_attachments_event }
-  let(:project) { hashed_storage_attachments_event.project }
-  let(:old_attachments_path) { hashed_storage_attachments_event.old_attachments_path }
-  let(:new_attachments_path) { hashed_storage_attachments_event.new_attachments_path }
-
-  subject { described_class.new(hashed_storage_attachments_event, Time.now, logger) }
-
-  around do |example|
-    Sidekiq::Testing.fake! { example.run }
-  end
-
-  describe '#process' do
-    it 'schedules a Geo::HashedStorageAttachmentsMigrationWorker' do
-      expect(::Geo::HashedStorageAttachmentsMigrationWorker).to receive(:perform_async)
-        .with(project.id, old_attachments_path, new_attachments_path)
-
-      subject.process
-    end
-
-    it_behaves_like 'logs event source info'
-  end
-end
diff --git a/ee/spec/models/geo/event_log_spec.rb b/ee/spec/models/geo/event_log_spec.rb
index bb6ec34ec6c44264b3618b1bcf87438b28f40049..3dd3cdca5b21e7a40b12e9384712ccbf96e7904f 100644
--- a/ee/spec/models/geo/event_log_spec.rb
+++ b/ee/spec/models/geo/event_log_spec.rb
@@ -11,8 +11,6 @@
     it { is_expected.to belong_to(:repository_renamed_event).class_name('Geo::RepositoryRenamedEvent').with_foreign_key('repository_renamed_event_id') }
     it { is_expected.to belong_to(:repository_updated_event).class_name('Geo::RepositoryUpdatedEvent').with_foreign_key('repository_updated_event_id') }
     it { is_expected.to belong_to(:reset_checksum_event).class_name('Geo::ResetChecksumEvent').with_foreign_key('reset_checksum_event_id') }
-    it { is_expected.to belong_to(:hashed_storage_migrated_event).class_name('Geo::HashedStorageMigratedEvent').with_foreign_key('hashed_storage_migrated_event_id') }
-    it { is_expected.to belong_to(:hashed_storage_attachments_event).class_name('Geo::HashedStorageAttachmentsEvent').with_foreign_key('hashed_storage_attachments_event_id') }
   end
 
   describe '.next_unprocessed_event' do
@@ -84,20 +82,6 @@
       expect(subject.event).to eq repositories_changed_event
     end
 
-    it 'returns hashed_storage_migrated_event when set' do
-      hashed_storage_migrated_event = build(:geo_hashed_storage_migrated_event)
-      subject.hashed_storage_migrated_event = hashed_storage_migrated_event
-
-      expect(subject.event).to eq hashed_storage_migrated_event
-    end
-
-    it 'returns hashed_storage_attachments_event when set' do
-      hashed_storage_attachments_event = build(:geo_hashed_storage_attachments_event)
-      subject.hashed_storage_attachments_event = hashed_storage_attachments_event
-
-      expect(subject.event).to eq hashed_storage_attachments_event
-    end
-
     it 'returns reset_checksum_event when set' do
       reset_checksum_event = build(:geo_reset_checksum_event)
       subject.reset_checksum_event = reset_checksum_event
diff --git a/ee/spec/models/geo/hashed_storage_migrated_event_spec.rb b/ee/spec/models/geo/hashed_storage_migrated_event_spec.rb
deleted file mode 100644
index 5e1a5280303e6f3f3363facc09fcd504c01aeb24..0000000000000000000000000000000000000000
--- a/ee/spec/models/geo/hashed_storage_migrated_event_spec.rb
+++ /dev/null
@@ -1,19 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Geo::HashedStorageMigratedEvent, type: :model, feature_category: :geo_replication do
-  describe 'relationships' do
-    it { is_expected.to belong_to(:project) }
-  end
-
-  describe 'validations' do
-    it { is_expected.to validate_presence_of(:project) }
-    it { is_expected.to validate_presence_of(:repository_storage_name) }
-    it { is_expected.to validate_presence_of(:old_disk_path) }
-    it { is_expected.to validate_presence_of(:new_disk_path) }
-    it { is_expected.to validate_presence_of(:old_wiki_disk_path) }
-    it { is_expected.to validate_presence_of(:new_wiki_disk_path) }
-    it { is_expected.to validate_presence_of(:new_storage_version) }
-  end
-end
diff --git a/ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb b/ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb
deleted file mode 100644
index 9ce1cf7d36c8c28311f98729eef484d17c1c3dcd..0000000000000000000000000000000000000000
--- a/ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb
+++ /dev/null
@@ -1,39 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Geo::HashedStorageAttachmentsEventStore, feature_category: :geo_replication do
-  include EE::GeoHelpers
-
-  let_it_be(:secondary_node) { create(:geo_node) }
-
-  let(:project) { create(:project, path: 'bar') }
-  let(:attachments_event) { build(:geo_hashed_storage_attachments_event, project: project) }
-  let(:old_attachments_path) { attachments_event.old_attachments_path }
-  let(:new_attachments_path) { attachments_event.new_attachments_path }
-
-  subject { described_class.new(project, old_storage_version: 1, new_storage_version: 2, old_attachments_path: old_attachments_path, new_attachments_path: new_attachments_path) }
-
-  before do
-    TestEnv.clean_test_path
-  end
-
-  describe '#create!' do
-    it_behaves_like 'a Geo event store', Geo::HashedStorageAttachmentsEvent
-
-    context 'when running on a primary node' do
-      before do
-        stub_primary_node
-      end
-
-      it 'tracks project attributes' do
-        subject.create!
-
-        expect(Geo::HashedStorageAttachmentsEvent.last).to have_attributes(
-          old_attachments_path: old_attachments_path,
-          new_attachments_path: new_attachments_path
-        )
-      end
-    end
-  end
-end
diff --git a/ee/spec/services/geo/hashed_storage_attachments_migration_service_spec.rb b/ee/spec/services/geo/hashed_storage_attachments_migration_service_spec.rb
deleted file mode 100644
index fb4d66b7318a6709357a3f9897c2d88b9b122ca1..0000000000000000000000000000000000000000
--- a/ee/spec/services/geo/hashed_storage_attachments_migration_service_spec.rb
+++ /dev/null
@@ -1,87 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-def base_path(storage)
-  File.join(FileUploader.root, storage.disk_path)
-end
-
-RSpec.describe Geo::HashedStorageAttachmentsMigrationService, feature_category: :geo_replication do
-  let!(:project) { create(:project, :legacy_storage) }
-
-  let(:legacy_storage) { Storage::LegacyProject.new(project) }
-  let(:hashed_storage) { Storage::Hashed.new(project) }
-
-  let!(:upload) { Upload.find_by(path: file_uploader.upload_path) }
-  let(:file_uploader) { build(:file_uploader, project: project) }
-  let(:old_path) { File.join(base_path(legacy_storage), upload.path) }
-  let(:new_path) { File.join(base_path(hashed_storage), upload.path) }
-
-  subject(:service) do
-    described_class.new(
-      project.id,
-      old_attachments_path: legacy_storage.disk_path,
-      new_attachments_path: hashed_storage.disk_path
-    )
-  end
-
-  describe '#execute' do
-    context 'when succeeds' do
-      it 'moves attachments to hashed storage layout' do
-        expect(File.file?(old_path)).to be_truthy
-        expect(File.file?(new_path)).to be_falsey
-        expect(File.exist?(base_path(legacy_storage))).to be_truthy
-        expect(File.exist?(base_path(hashed_storage))).to be_falsey
-        expect(FileUtils).to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage)).and_call_original
-
-        service.execute
-
-        expect(File.exist?(base_path(hashed_storage))).to be_truthy
-        expect(File.exist?(base_path(legacy_storage))).to be_falsey
-        expect(File.file?(old_path)).to be_falsey
-        expect(File.file?(new_path)).to be_truthy
-      end
-    end
-
-    context 'when original folder does not exist anymore' do
-      before do
-        FileUtils.rm_rf(base_path(legacy_storage))
-      end
-
-      it 'skips moving folders and go to next' do
-        expect(FileUtils).not_to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage))
-
-        service.execute
-
-        expect(File.exist?(base_path(hashed_storage))).to be_falsey
-        expect(File.file?(new_path)).to be_falsey
-      end
-    end
-
-    context 'when target folder already exists' do
-      before do
-        FileUtils.mkdir_p(base_path(hashed_storage))
-      end
-
-      it 'raises AttachmentMigrationError' do
-        expect(FileUtils).not_to receive(:mv).with(base_path(legacy_storage), base_path(hashed_storage))
-
-        expect { service.execute }.to raise_error(::Geo::AttachmentMigrationError)
-      end
-    end
-  end
-
-  describe '#async_execute' do
-    it 'starts the worker' do
-      expect(Geo::HashedStorageAttachmentsMigrationWorker).to receive(:perform_async)
-
-      service.async_execute
-    end
-
-    it 'returns job id' do
-      allow(Geo::HashedStorageAttachmentsMigrationWorker).to receive(:perform_async).and_return('foo')
-
-      expect(service.async_execute).to eq('foo')
-    end
-  end
-end
diff --git a/ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb b/ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
deleted file mode 100644
index c24751c8992d7327e15167566f58077f2f4bab4c..0000000000000000000000000000000000000000
--- a/ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb
+++ /dev/null
@@ -1,60 +0,0 @@
-# frozen_string_literal: true
-
-require 'spec_helper'
-
-RSpec.describe Projects::HashedStorage::MigrateAttachmentsService do
-  include EE::GeoHelpers
-
-  let(:project) { create(:project, storage_version: 1) }
-  let(:legacy_storage) { Storage::LegacyProject.new(project) }
-  let(:hashed_storage) { Storage::Hashed.new(project) }
-  let(:old_attachments_path) { legacy_storage.disk_path }
-  let(:new_attachments_path) { hashed_storage.disk_path }
-
-  let_it_be(:primary) { create(:geo_node, :primary) }
-  let_it_be(:secondary) { create(:geo_node) }
-
-  subject { described_class.new(project: project, old_disk_path: old_attachments_path) }
-
-  before do
-    stub_current_geo_node(primary)
-  end
-
-  describe '#execute' do
-    context 'on success' do
-      before do
-        TestEnv.clean_test_path
-        FileUtils.mkdir_p(File.join(FileUploader.root, old_attachments_path))
-      end
-
-      it 'returns true' do
-        expect(subject.execute).to be_truthy
-      end
-
-      it 'creates a Geo::HashedStorageAttachmentsEvent' do
-        expect { subject.execute }.to change(Geo::EventLog, :count).by(1)
-
-        event = Geo::EventLog.last.event
-
-        expect(event).to be_a(Geo::HashedStorageAttachmentsEvent)
-        expect(event).to have_attributes(
-          old_attachments_path: old_attachments_path,
-          new_attachments_path: new_attachments_path
-        )
-      end
-    end
-
-    context 'on failure' do
-      it 'does not create a Geo event when skipped' do
-        expect { subject.execute }
-          .not_to change { Geo::HashedStorageAttachmentsEvent.count }
-      end
-
-      it 'does not create a Geo event on failure' do
-        expect(subject).to receive(:move_folder!).and_raise(::Projects::HashedStorage::AttachmentMigrationError)
-        expect { subject.execute }.to raise_error(::Projects::HashedStorage::AttachmentMigrationError)
-        expect(Geo::HashedStorageAttachmentsEvent.count).to eq(0)
-      end
-    end
-  end
-end
diff --git a/spec/support/rspec_order_todo.yml b/spec/support/rspec_order_todo.yml
index a3e59c074a42264937e2292dd8d82076c5f8cd5a..9917ba0998a38717d9c39b4a75a34784c40d3bc7 100644
--- a/spec/support/rspec_order_todo.yml
+++ b/spec/support/rspec_order_todo.yml
@@ -1320,7 +1320,6 @@
 - './ee/spec/lib/gitlab/geo/log_cursor/event_logs_spec.rb'
 - './ee/spec/lib/gitlab/geo/log_cursor/events/cache_invalidation_event_spec.rb'
 - './ee/spec/lib/gitlab/geo/log_cursor/events/event_spec.rb'
-- './ee/spec/lib/gitlab/geo/log_cursor/events/hashed_storage_attachments_event_spec.rb'
 - './ee/spec/lib/gitlab/geo/log_cursor/lease_spec.rb'
 - './ee/spec/lib/gitlab/geo/log_cursor/logger_spec.rb'
 - './ee/spec/lib/gitlab/geo/logger_spec.rb'
@@ -1659,7 +1658,6 @@
 - './ee/spec/models/geo/event_log_state_spec.rb'
 - './ee/spec/models/geo/every_geo_event_spec.rb'
 - './ee/spec/models/geo/group_wiki_repository_registry_spec.rb'
-- './ee/spec/models/geo/hashed_storage_migrated_event_spec.rb'
 - './ee/spec/models/geo/job_artifact_registry_spec.rb'
 - './ee/spec/models/geo/lfs_object_registry_spec.rb'
 - './ee/spec/models/geo/merge_request_diff_registry_spec.rb'
@@ -2595,8 +2593,6 @@
 - './ee/spec/services/geo/file_registry_removal_service_spec.rb'
 - './ee/spec/services/geo/framework_repository_sync_service_spec.rb'
 - './ee/spec/services/geo/graphql_request_service_spec.rb'
-- './ee/spec/services/geo/hashed_storage_attachments_event_store_spec.rb'
-- './ee/spec/services/geo/hashed_storage_attachments_migration_service_spec.rb'
 - './ee/spec/services/geo/metrics_update_service_spec.rb'
 - './ee/spec/services/geo/node_create_service_spec.rb'
 - './ee/spec/services/geo/node_status_request_service_spec.rb'
@@ -2702,7 +2698,6 @@
 - './ee/spec/services/projects/group_links/create_service_spec.rb'
 - './ee/spec/services/projects/group_links/destroy_service_spec.rb'
 - './ee/spec/services/projects/group_links/update_service_spec.rb'
-- './ee/spec/services/projects/hashed_storage/migrate_attachments_service_spec.rb'
 - './ee/spec/services/projects/import_export/export_service_spec.rb'
 - './ee/spec/services/projects/import_service_spec.rb'
 - './ee/spec/services/projects/mark_for_deletion_service_spec.rb'