From def53569be290b61d352383bc9961912cbd9b7cd Mon Sep 17 00:00:00 2001 From: Lucian Wischik Date: Thu, 10 Oct 2019 23:29:38 -0700 Subject: [PATCH] a provider for decl-service Summary: A "provider" is a generic concept that encompases how ASTs will be provided to the server, how file-contents will be provided to the server, how decls will be provided to the typechecker, how fixmes will be provided to the typechecker, how parser-options will be provided to the parser. Waleed already made a "local memory provider" with a few hand-carved cases for what sIDE will want provided. Here I'm doing the same kind of thing for what provisions there'll be when we use the new architecture (i.e. no shared-mem, and a decl service). This diff merely introduces the new provider kind, in provider_config.ml. The rest of the changes are sticking in "not yet implemented" in a bunch of places that match on provider. Reviewed By: arxanas Differential Revision: D17826505 fbshipit-source-id: 9d4346f867537619b24c3bdf2191adb32e926020 --- hphp/hack/src/providers/ast_provider.ml | 2 + hphp/hack/src/providers/decl_provider.ml | 29 ++++++++++++ hphp/hack/src/providers/file_provider.ml | 52 ++++++++++++++-------- hphp/hack/src/providers/parser_options_provider.ml | 8 +++- hphp/hack/src/providers/provider_config.ml | 3 ++ hphp/hack/src/providers/provider_config.mli | 4 ++ .../rearchitecture_proposal_1/hh_mapreduce/dune | 1 + .../hh_mapreduce/typecheck.ml | 1 + 8 files changed, 79 insertions(+), 21 deletions(-) diff --git a/hphp/hack/src/providers/ast_provider.ml b/hphp/hack/src/providers/ast_provider.ml index 293479ee229..bddb03c1d31 100644 --- a/hphp/hack/src/providers/ast_provider.ml +++ b/hphp/hack/src/providers/ast_provider.ml @@ -267,6 +267,8 @@ let get_ast ?(full = false) file_name = ~full file_name (ServerCommandTypes.FileName (Relative_path.to_absolute file_name))) + | Provider_config.Decl_service _ -> + failwith "Ast_provider.get_ast not supported with decl memory provider" let find_class_in_file ?(full = false) ?(case_insensitive = false) file_name class_name = diff --git a/hphp/hack/src/providers/decl_provider.ml b/hphp/hack/src/providers/decl_provider.ml index ee27cd14bab..24a865f1db2 100644 --- a/hphp/hack/src/providers/decl_provider.ml +++ b/hphp/hack/src/providers/decl_provider.ml @@ -55,6 +55,8 @@ let get_fun (fun_name : fun_key) : fun_decl option = in let result : fun_decl option = Obj.obj result in result + | Provider_config.Decl_service _ -> + failwith "Decl_provider.get_fun not yet impl. for decl memory provider" let get_class (class_name : class_key) : class_decl option = match Provider_config.get_backend () with @@ -74,6 +76,8 @@ let get_class (class_name : class_key) : class_decl option = in let result : class_decl option = Obj.obj result in result + | Provider_config.Decl_service _ -> + failwith "Decl_provider.get_class not yet impl. for decl memory provider" let convert_class_elt_to_fun_decl class_elt_opt : fun_decl option = Typing_defs.( @@ -143,6 +147,8 @@ let get_typedef (typedef_name : string) : typedef_decl option = in let result : typedef_decl option = Obj.obj result in result + | Provider_config.Decl_service _ -> + failwith "Decl_provider.get_typedef not yet impl. for decl memory provider" let get_record_def (record_name : string) : record_def_decl option = match Provider_config.get_backend () with @@ -171,6 +177,9 @@ let get_record_def (record_name : string) : record_def_decl option = in let result : record_def_decl option = Obj.obj result in result + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.get_record_def not yet impl. for decl memory provider" let get_gconst (gconst_name : string) : gconst_decl option = match Provider_config.get_backend () with @@ -197,6 +206,8 @@ let get_gconst (gconst_name : string) : gconst_decl option = in let result : gconst_decl option = Obj.obj result in result + | Provider_config.Decl_service _ -> + failwith "Decl_provider.get_gconst not yet impl. for decl memory provider" let invalidate_fun (fun_name : fun_key) : unit = match Provider_config.get_backend () with @@ -209,6 +220,9 @@ let invalidate_fun (fun_name : fun_key) : unit = Memory_bounded_lru_cache.remove decl_cache (Provider_config.Fun_decl fun_name) + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_fun not yet impl. for decl memory provider" let invalidate_class (class_name : class_key) : unit = match Provider_config.get_backend () with @@ -220,6 +234,9 @@ let invalidate_class (class_name : class_key) : unit = Memory_bounded_lru_cache.remove decl_cache (Provider_config.Class_decl class_name) + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_class not yet impl. for decl memory provider" let invalidate_record_def (record_name : record_def_key) : unit = match Provider_config.get_backend () with @@ -232,6 +249,9 @@ let invalidate_record_def (record_name : record_def_key) : unit = Memory_bounded_lru_cache.remove decl_cache (Provider_config.Record_decl record_name) + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_record_def not yet impl. for decl memory provider" let invalidate_typedef (typedef_name : typedef_key) : unit = match Provider_config.get_backend () with @@ -244,6 +264,9 @@ let invalidate_typedef (typedef_name : typedef_key) : unit = Memory_bounded_lru_cache.remove decl_cache (Provider_config.Typedef_decl typedef_name) + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_typedef not yet impl. for decl memory provider" let invalidate_gconst (gconst_name : gconst_key) : unit = match Provider_config.get_backend () with @@ -256,6 +279,9 @@ let invalidate_gconst (gconst_name : gconst_key) : unit = Memory_bounded_lru_cache.remove decl_cache (Provider_config.Gconst_decl gconst_name) + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_gconst not yet impl. for decl memory provider" let invalidate_context_decls ~(ctx : Provider_context.t) = match Provider_config.get_backend () with @@ -278,6 +304,9 @@ let invalidate_context_decls ~(ctx : Provider_context.t) = (* Don't attempt to invalidate decls with shared memory, as we may not be running in the master process where that's allowed. *) () + | Provider_config.Decl_service _ -> + failwith + "Decl_provider.invalidate_context_decls not yet impl. for decl memory provider" let local_changes_push_stack () = (* For now, decl production still writes into shared memory, even when we're diff --git a/hphp/hack/src/providers/file_provider.ml b/hphp/hack/src/providers/file_provider.ml index 8f3d6720f04..5090a389a41 100644 --- a/hphp/hack/src/providers/file_provider.ml +++ b/hphp/hack/src/providers/file_provider.ml @@ -42,8 +42,9 @@ let get fn = | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.get fn - | Provider_config.Local_memory _ -> - failwith "File_provider.get not supported with local memory provider" + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + failwith "File_provider.get not supported with local/decl memory provider" let get_unsafe fn = match Provider_config.get_backend () with @@ -54,9 +55,10 @@ let get_unsafe fn = | Some contents -> contents | None -> failwith ("File not found: " ^ Relative_path.to_absolute fn) end - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith - "File_provider.get_unsafe not supported with local memory provider" + "File_provider.get_unsafe not supported with local/decl memory provider" let get_contents fn = match Provider_config.get_backend () with @@ -73,7 +75,9 @@ let get_contents fn = FileHeap.add fn (Disk contents); Some contents end - | Provider_config.Local_memory _ -> read_file_contents_from_disk fn + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + read_file_contents_from_disk fn let get_ide_contents_unsafe fn = match Provider_config.get_backend () with @@ -84,68 +88,78 @@ let get_ide_contents_unsafe fn = | Some (Ide f) -> f | _ -> failwith ("IDE file not found: " ^ Relative_path.to_absolute fn) end - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith ( "File_provider.get_ide_contents_unsafe not supported " - ^ "with local memory provider" ) + ^ "with local/decl memory provider" ) let provide_file fn contents = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.add fn contents - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith - "File_provider.provide_file not supported with local memory provider" + "File_provider.provide_file not supported with local/decl memory provider" let provide_file_hint fn contents = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.write_around fn contents - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith - "File_provider.provide_file_hint not supported with local memory provider" + "File_provider.provide_file_hint not supported with local/decl memory provider" let remove_batch paths = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.remove_batch paths - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith - "File_provider.remove_batch not supported with local memory provider" + "File_provider.remove_batch not supported with local/decl memory provider" let local_changes_push_stack () = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.LocalChanges.push_stack () - | Provider_config.Local_memory _ -> () + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + () let local_changes_pop_stack () = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.LocalChanges.pop_stack () - | Provider_config.Local_memory _ -> () + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + () let local_changes_commit_batch paths = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.LocalChanges.commit_batch paths - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith ( "File_provider.local_changes_commit_batch not supported " - ^ "with local memory provider" ) + ^ "with local/decl memory provider" ) let local_changes_revert_batch paths = match Provider_config.get_backend () with | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> FileHeap.LocalChanges.revert_batch paths - | Provider_config.Local_memory _ -> + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> failwith ( "File_provider.local_changes_revert_batch not supported " - ^ "with local memory provider" ) + ^ "with local/decl memory provider" ) diff --git a/hphp/hack/src/providers/parser_options_provider.ml b/hphp/hack/src/providers/parser_options_provider.ml index cf23a26e30b..18293c59350 100644 --- a/hphp/hack/src/providers/parser_options_provider.ml +++ b/hphp/hack/src/providers/parser_options_provider.ml @@ -31,7 +31,9 @@ let get_opt () : ParserOptions.t option = | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> Store.get () - | Provider_config.Local_memory _ -> !local_memory_popt + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + !local_memory_popt let get () : ParserOptions.t = match get_opt () with @@ -50,7 +52,9 @@ let set (popt : ParserOptions.t) : unit = | Provider_config.Lru_shared_memory | Provider_config.Shared_memory -> Store.add () popt - | Provider_config.Local_memory _ -> local_memory_popt := Some popt + | Provider_config.Local_memory _ + | Provider_config.Decl_service _ -> + local_memory_popt := Some popt end | Some _ -> (* We end up invoking ServerInit.init after setting the global parser diff --git a/hphp/hack/src/providers/provider_config.ml b/hphp/hack/src/providers/provider_config.ml index b2c585b0b6e..f5800107757 100644 --- a/hphp/hack/src/providers/provider_config.ml +++ b/hphp/hack/src/providers/provider_config.ml @@ -28,6 +28,7 @@ type backend = | Lru_shared_memory | Shared_memory | Local_memory of { decl_cache: decl_cache } + | Decl_service of unit let backend_ref = ref Shared_memory @@ -40,4 +41,6 @@ let set_local_memory_backend ~(max_size_in_words : int) : unit = Local_memory { decl_cache = Memory_bounded_lru_cache.make ~max_size_in_words } +let set_decl_service_backend () : unit = backend_ref := Decl_service () + let get_backend () : backend = !backend_ref diff --git a/hphp/hack/src/providers/provider_config.mli b/hphp/hack/src/providers/provider_config.mli index c41500cc11b..4432cdcfc48 100644 --- a/hphp/hack/src/providers/provider_config.mli +++ b/hphp/hack/src/providers/provider_config.mli @@ -21,6 +21,8 @@ type backend = private | Lru_shared_memory | Shared_memory | Local_memory of { decl_cache: decl_cache } + (* In Decl_service, 'unit' left for further expansion *) + | Decl_service of unit val set_lru_shared_memory_backend : unit -> unit @@ -28,4 +30,6 @@ val set_shared_memory_backend : unit -> unit val set_local_memory_backend : max_size_in_words:int -> unit +val set_decl_service_backend : unit -> unit + val get_backend : unit -> backend diff --git a/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/dune b/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/dune index afdf9af54f3..582eb231434 100644 --- a/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/dune +++ b/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/dune @@ -20,6 +20,7 @@ naming parser_options_provider pos + provider_config provider_context provider_utils relative_path diff --git a/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/typecheck.ml b/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/typecheck.ml index aa17262958b..11c1c4de123 100644 --- a/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/typecheck.ml +++ b/hphp/hack/src/rearchitecture_proposal_1/hh_mapreduce/typecheck.ml @@ -44,6 +44,7 @@ let global_init_and_get_tcopt ~(root : Path.t) ~(hhi_root : Path.t) : }; } in + Provider_config.set_decl_service_backend (); Parser_options_provider.set server_env.ServerEnv.popt; GlobalNamingOptions.set server_env.ServerEnv.tcopt; server_env.ServerEnv.tcopt -- 2.11.4.GIT