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