Jay,

Peer Assembly Loading feature only exists for Compute API.

- When you perform a ScanQuery the 1st time, the assembly does not exist on
the remote node and you get an error.
- After you run a Compute task, your entire assembly (including
SalaryFilter class) gets loaded on the remote node, and now this class can
be used for ScanQuery too.

Basically, Compute can be used as a workaround to pre-load any assemblies
on remote nodes.

Pavel

On Mon, Jan 23, 2023 at 8:29 PM <[email protected]> wrote:

> Dear Community,
>
>
>
> I’ve done quite a lot of testing and somehow remotely loading a cache
> entry filter from client to server only works after a compute-call was
> made.
>
> This appears somewhat strange – maybe someone can explain (/or reproduce
> the behaviour? Full code at the end of this mail).
>
>
>
> The setup: Ignite 2.14 with PeerAssemblyLoadingMode.CurrentAppDomain; .NET
> 5.0 with incremental assembly versioning; (Thick) .NET client running
> queries against a .NET-embedded server.
>
>
>
> Summary of the client code:
>
> - Create a cache and put some users
>
> - Run ScanQuery (1st time) -> Exception “No matching type found for object
> [typeId=327128514, typeName=SalaryFilter]. This usually indicates that
> assembly with specified type is not loaded on a node.”
>
> - Run (any) compute task
>
> - Run ScanQuery (2nd time) -> Works
>
> Same behaviour can be observed when restarting / recompiling in-between
> any of the above stages, repeating stages multiple times, and so on.
>
>
>
> Thank you for any input on this.
>
>
>
> Jay
>
>
>
>
>
>
>
> SERVER CODE:
>
>
>
> public static class Program
>
> {
>
>     public static async Task Main(string[] args)
>
>     {
>
>         IgniteConfiguration IgniteConfig = new IgniteConfiguration();
>
>         IgniteConfig.PeerAssemblyLoadingMode =
> PeerAssemblyLoadingMode.CurrentAppDomain;
>
>
>
>         var ignite = Ignition.Start(IgniteConfig);
>
>         ignite.GetCluster().SetActive(true);
>
>
>
>         Console.ReadLine();
>
>     }
>
> }
>
>
>
>
>
> CLIENT CODE:
>
>
>
> public static class Program
>
> {
>
>     public static async Task Main(string[] args)
>
>     {
>
>         IgniteConfiguration IgniteConfig = new IgniteConfiguration();
>
>         IgniteConfig.PeerAssemblyLoadingMode =
> PeerAssemblyLoadingMode.CurrentAppDomain;
>
>         IgniteConfig.ClientMode = true;
>
>
>
>         var ignite = Ignition.Start(IgniteConfig);
>
>
>
>         var cache = ignite.GetOrCreateCache<string, IBinaryObject>(
> "Name_User_Cache").WithKeepBinary<string, IBinaryObject>();
>
>
>
>         IBinaryObjectBuilder builder = ignite.GetBinary().GetBuilder(
> "User");
>
>         IBinaryObject user = builder.SetField<int>("Salary",
> 1001).Build();
>
>         cache.Put("First User", user);
>
>         user = builder.SetField<int>("Salary", 1000).Build();
>
>         cache.Put("Second User", user);
>
>         user = builder.SetField<int>("Salary", 1002).Build();
>
>         cache.Put("Third User", user);
>
>
>
>         Console.WriteLine("First search:");
>
>         RunScanQuery(cache);
>
>
>
>         Console.WriteLine("Broadcasting compute job");
>
>         ignite.GetCompute().Broadcast(new HelloAction());
>
>
>
>         Console.WriteLine("Second search:");
>
>         RunScanQuery(cache);
>
>
>
>         Console.ReadLine();
>
>     }
>
>
>
>     static void RunScanQuery(ICache<string, IBinaryObject> cache)
>
>     {
>
>         try
>
>         {
>
>             using (var cursor = cache.Query(new ScanQuery<string,
> IBinaryObject>(new SalaryFilter())))
>
>             {
>
>                 foreach (var entry in cursor)
>
>                {
>
>                     Console.WriteLine("Key = " + entry.Key + ",
> Value.Salary = " + entry.Value.GetField<int>("Salary").ToString());
>
>                 }
>
>             }
>
>         }
>
>         catch (Exception ex)
>
>         {
>
>             Console.WriteLine("Exception: " + ex.Message);
>
>         }
>
>     }
>
> }
>
>
>
> class HelloAction : IComputeAction
>
> {
>
>     public void Invoke()
>
>     {
>
>         Console.WriteLine("Hello, World!");
>
>     }
>
> }
>
>
>
> class SalaryFilter : ICacheEntryFilter<string, IBinaryObject>
>
> {
>
>     public bool Invoke(ICacheEntry<string, IBinaryObject> entry)
>
>     {
>
>         return entry.Value.GetField<int>("Salary") > 1000;
>
>     }
>
> }
>
>
>
>
>
> appreciate the help
>
>
>
>
>

Reply via email to