diff --git a/cloud/filestore/libs/service_kikimr/service.cpp b/cloud/filestore/libs/service_kikimr/service.cpp index 446d129ab3..406e9a40b2 100644 --- a/cloud/filestore/libs/service_kikimr/service.cpp +++ b/cloud/filestore/libs/service_kikimr/service.cpp @@ -291,6 +291,32 @@ class TKikimrFileStore final std::move(response))); } + template<> + void ExecuteRequest( + TCallContextPtr callContext, + std::shared_ptr request, + TPromise response) + { + Y_UNUSED(callContext); + Y_UNUSED(request); + Y_UNUSED(TFsyncMethod::RequestName); + + response.SetValue(TFsyncMethod::TResponse()); + } + + template<> + void ExecuteRequest( + TCallContextPtr callContext, + std::shared_ptr request, + TPromise response) + { + Y_UNUSED(callContext); + Y_UNUSED(request); + Y_UNUSED(TFsyncDirMethod::RequestName); + + response.SetValue(TFsyncDirMethod::TResponse()); + } + template void ExecuteStreamRequest( TCallContextPtr callContext, diff --git a/cloud/filestore/libs/service_kikimr/service_ut.cpp b/cloud/filestore/libs/service_kikimr/service_ut.cpp index aa9592cc4e..87923bbbd6 100644 --- a/cloud/filestore/libs/service_kikimr/service_ut.cpp +++ b/cloud/filestore/libs/service_kikimr/service_ut.cpp @@ -69,7 +69,7 @@ struct TTestServiceActor final //////////////////////////////////////////////////////////////////////////////// -Y_UNIT_TEST_SUITE(TIndexStoreTest) +Y_UNIT_TEST_SUITE(KikimrFileStore) { Y_UNIT_TEST(ShouldHandleRequests) { @@ -86,17 +86,87 @@ Y_UNIT_TEST_SUITE(TIndexStoreTest) auto service = CreateKikimrFileStore(actorSystem); service->Start(); - auto context = MakeIntrusive(); - auto request = std::make_shared(); + { + auto context = MakeIntrusive(); + auto request = std::make_shared(); - auto future = service->CreateFileStore( - std::move(context), - std::move(request)); + auto future = service->CreateFileStore( + std::move(context), + std::move(request)); - actorSystem->DispatchEvents(WaitTimeout); + actorSystem->DispatchEvents(WaitTimeout); + + const auto& response = future.GetValue(WaitTimeout); + UNIT_ASSERT(!HasError(response)); + } + + { + auto context = MakeIntrusive(); + auto request = std::make_shared(); + + auto future = service->CreateNode( + std::move(context), + std::move(request)); + + actorSystem->DispatchEvents(WaitTimeout); + + const auto& response = future.GetValue(WaitTimeout); + UNIT_ASSERT(!HasError(response)); + } + + service->Stop(); + } + + Y_UNIT_TEST(ShouldHandleFsyncRequestsOutsideActorSystem) + { + auto serviceActor = std::make_unique(); + serviceActor->FsyncHandler = + [] (const TEvService::TEvFsyncRequest::TPtr& ev) { + Y_UNUSED(ev); + UNIT_ASSERT_C(false, "fsync called in actor system"); + return std::make_unique(); + }; - const auto& response = future.GetValue(WaitTimeout); - UNIT_ASSERT(!HasError(response)); + serviceActor->FsyncDirHandler = + [] (const TEvService::TEvFsyncDirRequest::TPtr& ev) { + Y_UNUSED(ev); + UNIT_ASSERT_C(false, "fsyncdir called in actor system"); + return std::make_unique(); + }; + + auto actorSystem = MakeIntrusive(); + actorSystem->RegisterTestService(std::move(serviceActor)); + + auto service = CreateKikimrFileStore(actorSystem); + service->Start(); + + { + auto context = MakeIntrusive(); + auto request = std::make_shared(); + + auto future = service->Fsync( + std::move(context), + std::move(request)); + + actorSystem->DispatchEvents(WaitTimeout); + + const auto& response = future.GetValue(WaitTimeout); + UNIT_ASSERT(!HasError(response)); + } + + { + auto context = MakeIntrusive(); + auto request = std::make_shared(); + + auto future = service->FsyncDir( + std::move(context), + std::move(request)); + + actorSystem->DispatchEvents(WaitTimeout); + + const auto& response = future.GetValue(WaitTimeout); + UNIT_ASSERT(!HasError(response)); + } service->Stop(); } diff --git a/cloud/filestore/libs/storage/api/components.h b/cloud/filestore/libs/storage/api/components.h index fb93e03c18..d8de97ce3f 100644 --- a/cloud/filestore/libs/storage/api/components.h +++ b/cloud/filestore/libs/storage/api/components.h @@ -18,13 +18,12 @@ namespace NCloud::NFileStore::NStorage { #define FILESTORE_ACTORS(xxx) \ xxx(SCHEMESHARD) \ xxx(SERVICE) \ - xxx(SERVICE_PART2) \ + xxx(SERVICE_WORKER) \ xxx(SERVICE_PROXY) \ xxx(TABLET) \ xxx(TABLET_WORKER) \ xxx(TABLET_PROXY) \ xxx(SS_PROXY) \ - xxx(SERVICE_WORKER) \ // FILESTORE_ACTORS #define FILESTORE_COMPONENTS(xxx) \ @@ -81,8 +80,6 @@ struct TFileStoreEvents END }; - static_assert(SERVICE_END + 1 == SERVICE_PART2_START, - "SERVICE_PART2 should follow SERVICE since SERVICE has more than 100 events"); static_assert(END < EventSpaceEnd(NKikimr::TKikimrEvents::ES_FILESTORE), "END expected to be < EventSpaceEnd(NKikimr::TKikimrEvents::ES_FILESTORE)"); }; diff --git a/cloud/filestore/libs/storage/api/service.h b/cloud/filestore/libs/storage/api/service.h index 866b266a57..ed70e74442 100644 --- a/cloud/filestore/libs/storage/api/service.h +++ b/cloud/filestore/libs/storage/api/service.h @@ -266,17 +266,20 @@ struct TEvService EvExecuteActionRequest = EvBegin + 95, EvExecuteActionResponse, - EvFsyncRequest = EvBegin + 97, + EvEnd, + + // These events are never handled in actor system. + // We need to specify them here to avoid breaking template code + // which generates handlers for all events in actor system + EvFsyncRequest = TFileStoreEvents::END + 1, EvFsyncResponse, - EvFsyncDirRequest = EvBegin + 99, + EvFsyncDirRequest, EvFsyncDirResponse, - - EvEnd }; - static_assert(EvEnd < (int)TFileStoreEvents::SERVICE_PART2_END, - "EvEnd expected to be < TFileStoreEvents::SERVICE_PART2_END"); + static_assert(EvEnd < (int)TFileStoreEvents::SERVICE_END, + "EvEnd expected to be < TFileStoreEvents::SERVICE_END"); FILESTORE_SERVICE(FILESTORE_DECLARE_PROTO_EVENTS, NProto) diff --git a/cloud/filestore/libs/storage/service/service_actor.cpp b/cloud/filestore/libs/storage/service/service_actor.cpp index 7651896332..f118e70381 100644 --- a/cloud/filestore/libs/storage/service/service_actor.cpp +++ b/cloud/filestore/libs/storage/service/service_actor.cpp @@ -182,4 +182,26 @@ void TStorageServiceActor::HandleUnregisterLocalFileStore( } } +void TStorageServiceActor::HandleFsync( + const TEvService::TEvFsyncRequest::TPtr& ev, + const TActorContext& ctx) +{ + Y_UNUSED(ev); + Y_UNUSED(ctx); + + // Fsync is handled in service_kikimr + Y_ABORT(); +} + +void TStorageServiceActor::HandleFsyncDir( + const TEvService::TEvFsyncDirRequest::TPtr& ev, + const TActorContext& ctx) +{ + Y_UNUSED(ev); + Y_UNUSED(ctx); + + // FsyncDir is handled in service_kikimr + Y_ABORT(); +} + } // namespace NCloud::NFileStore::NStorage diff --git a/cloud/filestore/libs/storage/service/service_actor_fsync.cpp b/cloud/filestore/libs/storage/service/service_actor_fsync.cpp deleted file mode 100644 index 86dab1567a..0000000000 --- a/cloud/filestore/libs/storage/service/service_actor_fsync.cpp +++ /dev/null @@ -1,27 +0,0 @@ -#include "service_actor.h" - -namespace NCloud::NFileStore::NStorage { - -using namespace NActors; - -using namespace NKikimr; - -//////////////////////////////////////////////////////////////////////////////// - -void TStorageServiceActor::HandleFsync( - const TEvService::TEvFsyncRequest::TPtr& ev, - const TActorContext& ctx) -{ - auto response = std::make_unique(); - NCloud::Reply(ctx, *ev, std::move(response)); -} - -void TStorageServiceActor::HandleFsyncDir( - const TEvService::TEvFsyncDirRequest::TPtr& ev, - const TActorContext& ctx) -{ - auto response = std::make_unique(); - NCloud::Reply(ctx, *ev, std::move(response)); -} - -} // namespace NCloud::NFileStore::NStorage diff --git a/cloud/filestore/libs/storage/service/service_ut.cpp b/cloud/filestore/libs/storage/service/service_ut.cpp index 0749ad30b9..c4dcea1bbf 100644 --- a/cloud/filestore/libs/storage/service/service_ut.cpp +++ b/cloud/filestore/libs/storage/service/service_ut.cpp @@ -5809,41 +5809,6 @@ Y_UNIT_TEST_SUITE(TStorageServiceTest) UNIT_ASSERT_VALUES_EQUAL(lastCompactionMapRangeId, 29); } - - Y_UNIT_TEST(ShouldFsyncFileAndDir) - { - TTestEnv env; - env.CreateSubDomain("nfs"); - - ui32 nodeIdx = env.CreateNode("nfs"); - - TServiceClient service(env.GetRuntime(), nodeIdx); - service.CreateFileStore("test", 1'000); - - auto headers = service.InitSession("test", "client"); - - ui64 fileNodeId = - service - .CreateNode(headers, TCreateNodeArgs::File(RootNodeId, "file")) - ->Record.GetNode() - .GetId(); - - ui64 fileHandle = - service - .CreateHandle(headers, "test", fileNodeId, "", TCreateHandleArgs::RDWR) - ->Record.GetHandle(); - - ui64 dirNodeId = - service - .CreateNode(headers, TCreateNodeArgs::Directory(RootNodeId, "dir")) - ->Record.GetNode() - .GetId(); - - for (auto datasync: {true, false}) { - service.Fsync(headers, "test", fileNodeId, fileHandle, datasync); - service.FsyncDir(headers, "test", dirNodeId, datasync); - } - } } } // namespace NCloud::NFileStore::NStorage diff --git a/cloud/filestore/libs/storage/service/ya.make b/cloud/filestore/libs/storage/service/ya.make index 366b6e2ba6..27ca295533 100644 --- a/cloud/filestore/libs/storage/service/ya.make +++ b/cloud/filestore/libs/storage/service/ya.make @@ -25,7 +25,6 @@ SRCS( service_actor_destroyfs.cpp service_actor_destroysession.cpp service_actor_forward.cpp - service_actor_fsync.cpp service_actor_getfsinfo.cpp service_actor_getnodeattr.cpp service_actor_getsessionevents.cpp diff --git a/cloud/filestore/libs/storage/testlib/service_client.h b/cloud/filestore/libs/storage/testlib/service_client.h index 3d06bcdbe3..05ea2244e4 100644 --- a/cloud/filestore/libs/storage/testlib/service_client.h +++ b/cloud/filestore/libs/storage/testlib/service_client.h @@ -444,36 +444,6 @@ class TServiceClient return request; } - std::unique_ptr CreateFsyncRequest( - const THeaders& headers, - const TString& fileSystemId, - const ui64 nodeId, - const ui64 handle, - bool dataSync) - { - auto request = std::make_unique(); - headers.Fill(request->Record); - request->Record.SetFileSystemId(fileSystemId); - request->Record.SetNodeId(nodeId); - request->Record.SetHandle(handle); - request->Record.SetDataSync(dataSync); - return request; - } - - std::unique_ptr CreateFsyncDirRequest( - const THeaders& headers, - const TString& fileSystemId, - const ui64 nodeId, - bool dataSync) - { - auto request = std::make_unique(); - headers.Fill(request->Record); - request->Record.SetFileSystemId(fileSystemId); - request->Record.SetNodeId(nodeId); - request->Record.SetDataSync(dataSync); - return request; - } - std::unique_ptr CreateSetNodeXAttrRequest( const THeaders& headers, const TString& fileSystemId,