@@ -316,6 +316,91 @@ public void testTupleAffixUpdateConsumer() {
316316 assertEquals (0 , results .size ());
317317 }
318318
319+ public void testAffixGroupUpdateConsumer () {
320+ String prefix = randomAlphaOfLength (3 ) + "foo." ;
321+ String intSuffix = randomAlphaOfLength (3 );
322+ String listSuffix = randomAlphaOfLength (4 );
323+ Setting .AffixSetting <Integer > intSetting = Setting .affixKeySetting (prefix , intSuffix ,
324+ (k ) -> Setting .intSetting (k , 1 , Property .Dynamic , Property .NodeScope ));
325+ Setting .AffixSetting <List <Integer >> listSetting = Setting .affixKeySetting (prefix , listSuffix ,
326+ (k ) -> Setting .listSetting (k , Arrays .asList ("1" ), Integer ::parseInt , Property .Dynamic , Property .NodeScope ));
327+ AbstractScopedSettings service = new ClusterSettings (Settings .EMPTY ,new HashSet <>(Arrays .asList (intSetting , listSetting )));
328+ Map <String , Settings > results = new HashMap <>();
329+ Function <String , String > listBuilder = g -> (prefix + g + "." + listSuffix );
330+ Function <String , String > intBuilder = g -> (prefix + g + "." + intSuffix );
331+ String group1 = randomAlphaOfLength (3 );
332+ String group2 = randomAlphaOfLength (4 );
333+ String group3 = randomAlphaOfLength (5 );
334+ BiConsumer <String , Settings > listConsumer = results ::put ;
335+
336+ service .addAffixGroupUpdateConsumer (Arrays .asList (intSetting , listSetting ), listConsumer );
337+ assertEquals (0 , results .size ());
338+ service .applySettings (Settings .builder ()
339+ .put (intBuilder .apply (group1 ), 2 )
340+ .put (intBuilder .apply (group2 ), 7 )
341+ .putList (listBuilder .apply (group1 ), "16" , "17" )
342+ .putList (listBuilder .apply (group2 ), "18" , "19" , "20" )
343+ .build ());
344+ Settings groupOneSettings = results .get (group1 );
345+ Settings groupTwoSettings = results .get (group2 );
346+ assertEquals (2 , intSetting .getConcreteSettingForNamespace (group1 ).get (groupOneSettings ).intValue ());
347+ assertEquals (7 , intSetting .getConcreteSettingForNamespace (group2 ).get (groupTwoSettings ).intValue ());
348+ assertEquals (Arrays .asList (16 , 17 ), listSetting .getConcreteSettingForNamespace (group1 ).get (groupOneSettings ));
349+ assertEquals (Arrays .asList (18 , 19 , 20 ), listSetting .getConcreteSettingForNamespace (group2 ).get (groupTwoSettings ));
350+ assertEquals (2 , groupOneSettings .size ());
351+ assertEquals (2 , groupTwoSettings .size ());
352+ assertEquals (2 , results .size ());
353+
354+ results .clear ();
355+
356+ service .applySettings (Settings .builder ()
357+ .put (intBuilder .apply (group1 ), 2 )
358+ .put (intBuilder .apply (group2 ), 7 )
359+ .putList (listBuilder .apply (group1 ), "16" , "17" )
360+ .putNull (listBuilder .apply (group2 )) // removed
361+ .build ());
362+
363+ assertNull (group1 + " wasn't changed" , results .get (group1 ));
364+ groupTwoSettings = results .get (group2 );
365+ assertEquals (7 , intSetting .getConcreteSettingForNamespace (group2 ).get (groupTwoSettings ).intValue ());
366+ assertEquals (Arrays .asList (1 ), listSetting .getConcreteSettingForNamespace (group2 ).get (groupTwoSettings ));
367+ assertEquals (1 , results .size ());
368+ assertEquals (2 , groupTwoSettings .size ());
369+ results .clear ();
370+
371+ service .applySettings (Settings .builder ()
372+ .put (intBuilder .apply (group1 ), 2 )
373+ .put (intBuilder .apply (group2 ), 7 )
374+ .putList (listBuilder .apply (group1 ), "16" , "17" )
375+ .putList (listBuilder .apply (group3 ), "5" , "6" ) // added
376+ .build ());
377+ assertNull (group1 + " wasn't changed" , results .get (group1 ));
378+ assertNull (group2 + " wasn't changed" , results .get (group2 ));
379+
380+ Settings groupThreeSettings = results .get (group3 );
381+ assertEquals (1 , intSetting .getConcreteSettingForNamespace (group3 ).get (groupThreeSettings ).intValue ());
382+ assertEquals (Arrays .asList (5 , 6 ), listSetting .getConcreteSettingForNamespace (group3 ).get (groupThreeSettings ));
383+ assertEquals (1 , results .size ());
384+ assertEquals (1 , groupThreeSettings .size ());
385+ results .clear ();
386+
387+ service .applySettings (Settings .builder ()
388+ .put (intBuilder .apply (group1 ), 4 ) // modified
389+ .put (intBuilder .apply (group2 ), 7 )
390+ .putList (listBuilder .apply (group1 ), "16" , "17" )
391+ .putList (listBuilder .apply (group3 ), "5" , "6" )
392+ .build ());
393+ assertNull (group2 + " wasn't changed" , results .get (group2 ));
394+ assertNull (group3 + " wasn't changed" , results .get (group3 ));
395+
396+ groupOneSettings = results .get (group1 );
397+ assertEquals (4 , intSetting .getConcreteSettingForNamespace (group1 ).get (groupOneSettings ).intValue ());
398+ assertEquals (Arrays .asList (16 , 17 ), listSetting .getConcreteSettingForNamespace (group1 ).get (groupOneSettings ));
399+ assertEquals (1 , results .size ());
400+ assertEquals (2 , groupOneSettings .size ());
401+ results .clear ();
402+ }
403+
319404 public void testAddConsumerAffix () {
320405 Setting .AffixSetting <Integer > intSetting = Setting .affixKeySetting ("foo." , "bar" ,
321406 (k ) -> Setting .intSetting (k , 1 , Property .Dynamic , Property .NodeScope ));
0 commit comments