Hi Ichiroh, thanks for looking at this and testing it.
Both points are good catches, here's an updated webrev: http://cr.openjdk.java.net/~clanger/webrevs/8221741.1/ Please test this and let me know if it solves your issues. Best regards Christoph > -----Original Message----- > From: Ichiroh Takiguchi <taki...@linux.vnet.ibm.com> > Sent: Donnerstag, 19. Dezember 2019 12:58 > To: Langer, Christoph <christoph.lan...@sap.com> > Cc: Phil Race <philip.r...@oracle.com>; 2d-dev@openjdk.java.net > Subject: RE: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen > when fontconfig.properties was used > > Hello Langer. > > I tested our HeadLess testcase. > (I used jdk11u based code.) > > I tried to install/uninstall X11.fnt.iso_T1 fileset. > > I found 2 issues: > 1. FontUtilities.getLogger() returns null unless sun.java2d.debugfonts > system property is specified properly. > So FontUtilities.isLogging() should be called to check logger can > use. > 2. "font2d" is not good for following code > + .warning("Font returned by findFont2D for > default font name " + > + defaultFontName + " is not a physical > font: " + font2d); > font2d.toString() calls getDefaultPhysialFont() again then > stackoverflow was happened > > Please let me know if you need additional testing. > > Thanks, > Ichiroh Takiguchi > > On 2019-12-18 23:31, Langer, Christoph wrote: > > Hi, > > > > sorry for the long time that it took me to come back to this item. > > > > I eventually spent quite a significant amount of time analyzing what's > > going wrong here. At least, I have a few AIX LPARs, where we would > > always encounter this type of Exception: > > > > Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: > > class sun.font.CompositeFont cannot be cast to class > > sun.font.PhysicalFont (sun.font.CompositeFont and > > sun.font.PhysicalFont are in module java.desktop of loader > > 'bootstrap') > > at > > > java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontMa > nager.java:1081) > > at > > > java.desktop/sun.font.SunFontManager.initialiseDeferredFont(SunFontMan > ager.java:960) > > at > > > java.desktop/sun.font.SunFontManager.findOtherDeferredFont(SunFontM > anager.java:898) > > at > > > java.desktop/sun.font.SunFontManager.findDeferredFont(SunFontManager > .java:914) > > at > > > java.desktop/sun.font.SunFontManager.findFont2D(SunFontManager.java:2 > 105) > > ... > > > > The problem on our systems is triggered by two factors. First is that > > the font configuration file contains paths to font files that don't > > exist. Secondly, the system's fontconfig has no TrueType Fonts > > installed. Now, during loading of fonts, it goes over these > > non-existing font files and tries to mark their initialization in > > sun.font.SunFontManager::initialiseDeferredFont(String fileNameKey) by > > adding the key into the initialisedFonts map. Since there is no font > > handle available because the font couldn't be loaded but the map's > > value must not be null, it wants to use the handle of the default > > physical font. So, calling getDefaultPhysicalFont at this place > > triggers findFont2D and then recursive calls into > > initialiseDeferredFont/getDefaultPhysicalFont/findFont2D until a > > matching default physical font was loaded. But it's quite > > indeterministic which font is returned at what place in findFont2D > > when the recursion is unwinded, so this ClassCastException occurs. > > > > I propose to fix this by adding a "NULL FONT HANDLE" to use in > > initialisedFonts for fonts that canโt be loaded. This will remove > > the recursion during loading of fonts. And afterwards a default > > physical font can then still be resolved, even if our font > > configuration contains less fonts (no true type fonts). > > > > In my change I also add small improvements to the exception cases when > > trying to load non-existent true type fonts and to method > > getDefaultPhysicalFont. > > > > The test exercises font loading and it would demonstrate the issue > > without the fix on several of our AIX systems. > > > > Here is the webrev: > > http://cr.openjdk.java.net/~clanger/webrevs/8221741.0/ > > > > @Ichiroh-san: Can you test this fix in your environment and let me > > know if it fixes your issue? > > > > I'll run a full platform test here at SAP, including JDK11. > > > > If this can get reviewed, I intend to push this fix to JDK14. > > > > Thanks & Best regards > > Christoph > > > >> -----Original Message----- > >> From: Phil Race <philip.r...@oracle.com> > >> Sent: Mittwoch, 30. Oktober 2019 17:07 > >> To: Langer, Christoph <christoph.lan...@sap.com>; Ichiroh Takiguchi > >> <taki...@linux.vnet.ibm.com> > >> Cc: 2d-dev@openjdk.java.net; Zeller, Arno <arno.zel...@sap.com> > >> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException happen > >> when fontconfig.properties was used > >> > >> Yes probably best if this is reviewed and approved by someone who > >> has access to AIX. I have no idea if the XLFDs are even correct ... > >> > >> -phil. > >> > >> On 10/30/19 8:00 AM, Langer, Christoph wrote: > >> > Hi Ichiroh, > >> > > >> > I'm currently observing a test issue on one of our AIX boxes with that > patch > >> in place. Please give me some time to have a closer look... > >> > > >> > Best regards > >> > Christoph > >> > > >> >> -----Original Message----- > >> >> From: 2d-dev <2d-dev-boun...@openjdk.java.net> On Behalf Of > Ichiroh > >> >> Takiguchi > >> >> Sent: Montag, 28. Oktober 2019 17:59 > >> >> To: Philip Race <philip.r...@oracle.com> > >> >> Cc: 2d-dev@openjdk.java.net; Zeller, Arno <arno.zel...@sap.com> > >> >> Subject: Re: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > happen > >> >> when fontconfig.properties was used > >> >> > >> >> Hello Phil and other reviewers. > >> >> > >> >> I appreciate if you give me your comment and suggestion. > >> >> > >> >> Thanks, > >> >> Ichiroh Takiguchi > >> >> > >> >> On 2019-10-15 20:33, Ichiroh Takiguchi wrote: > >> >>> Hello Phil. > >> >>> > >> >>> Sorry for bad response. > >> >>> > >> >>> AIX is following case, but physical font is not defined by default. > >> >>>> If you have fonts installed and have a custom fontconfig.properties > >> >>>> file for AIX > >> >>>> which references those, then you should be able to get a default > font > >> >>>> from that > >> >>>> set of known existent physical fonts. > >> >>> Please try following steps to emulate same kind this on linux (RHEL7). > >> >>> 1. Download DefaultFontTestA.java and fontconfig.properties files > >> >>> Please modify fontconfig.properties if c0419bt_.pfb is not in > >> >>> /usr/share/X11/fonts/Type1 directory. > >> >>> > >> >>> 2. Compile and run with following options and environment variable. > >> >>> $ javac --add-exports java.desktop/sun.font=ALL-UNNAMED > >> >>> DefaultFontTestA.java > >> >>> $ USE_J2D_FONTCONFIG=no java --add-opens > >> >>> java.desktop/sun.font=ALL-UNNAMED > >> >>> -Dsun.awt.fontconfigfontconfig.properties DefaultFontTestA > >> >>> defaultFontName=Dialog > >> >>> defaultFontFileName=/dialog.ttf > >> >>> Exception in thread "main" java.lang.ClassCastException: class > >> >>> sun.font.CompositeFont cannot be cast to class sun.font.PhysicalFont > >> >>> (sun.font.CompositeFont and sun.font.PhysicalFont are in module > >> >>> java.desktop of loader 'bootstrap') > >> >>> at > >> >>> > >> >> > >> > java.desktop/sun.font.SunFontManager.getDefaultPhysicalFont(SunFontMa > >> >> nager.java:1081) > >> >>> at DefaultFontTestA.main(DefaultFontTestA.java:48) > >> >>> > >> >>> Font2D font2d = > >> >>> findFont2D(getDefaultFontFaceName(), Font.PLAIN, > >> >>> NO_FALLBACK); > >> >>> Note: > >> >>> USE_J2D_FONTCONFIG is defined into > >> >>> src/java.desktop/unix/native/common/awt/fontpath.c > >> >>> Dialog and /dialog.ttf are defined into > >> >>> src/java.desktop/unix/classes/sun/awt/FcFontManager.java > >> >>> > >> >>> getDefaultFontFaceName returns defaultFontName, it's "Dialog". > >> >>> findFont2D() returns Dialog CompositeFont instead of physical font. > >> >>> I think we cannot control return value for > >> >>> physicalFonts.values().iterator(); > >> >>> "defaultPhysicalFont = ((CompositeFont) font2d).getSlotFont(0);" is > >> >>> useful. > >> >>> > >> >>> Please give me your comment. > >> >>> > >> >>> Thanks, > >> >>> Ichiroh Takiguchi > >> >>> > >> >>> On 2019-10-09 01:06, Philip Race wrote: > >> >>>> I think this needs a little bit more explanation first. > >> >>>> Systems without fontconfig ... meaning without libfontconfig. > >> >>>> So does that mean you just can't find fonts or have none installed ? > >> >>>> If you have fonts installed and have a custom fontconfig.properties > >> >>>> file for AIX > >> >>>> which references those, then you should be able to get a default > font > >> >>>> from that > >> >>>> set of known existent physical fonts. > >> >>>> > >> >>>> If you have neither .. then you have a system configuration problem > >> >>>> and without > >> >>>> a physical font installed avoiding an exception here isn't really > >> >>>> going to help you > >> >>>> get much further. Perhaps we should throw InternalError a bit > earlier. > >> >>>> I see no point in trying to survive .. > >> >>>> > >> >>>> -phil > >> >>>> > >> >>>> > >> >>>> On 10/8/19, 12:35 AM, Langer, Christoph wrote: > >> >>>>> Hi Ichiroh, > >> >>>>> > >> >>>>> thanks for the update. It looks good to me. I'll run it through test > >> >>>>> system tonight and let you know if we see issues by tomorrow. > >> Should > >> >>>>> you not hear back from me, consider it as reviewed and tested ๐ > >> >>>>> > >> >>>>> Thanks > >> >>>>> Christoph > >> >>>>> > >> >>>>>> -----Original Message----- > >> >>>>>> From: Ichiroh Takiguchi<taki...@linux.vnet.ibm.com> > >> >>>>>> Sent: Montag, 7. Oktober 2019 19:16 > >> >>>>>> To: Langer, Christoph<christoph.lan...@sap.com> > >> >>>>>> Cc: 2d-dev@openjdk.java.net; Zeller, > Arno<arno.zel...@sap.com> > >> >>>>>> Subject: RE: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > >> >> happen > >> >>>>>> when fontconfig.properties was used > >> >>>>>> > >> >>>>>> Hello Christoph. > >> >>>>>> > >> >>>>>> I appreciate your suggestion. > >> >>>>>> JTreg testcase could throw ClassCastException instead of > >> >>>>>> InvocationTargetException. > >> >>>>>> JTreg results were in JDK-8221741 > >> >>>>>> > >> >>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8221741 > >> >>>>>> Change: > >> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.05/ > >> >>>>>> > >> >>>>>> Could you review the fix ? > >> >>>>>> > >> >>>>>> Thanks, > >> >>>>>> Ichiroh Takiguchi > >> >>>>>> IBM Japan, Ltd. > >> >>>>>> > >> >>>>>> On 2019-10-07 22:53, Langer, Christoph wrote: > >> >>>>>>> Hi Ichiroh, > >> >>>>>>> > >> >>>>>>> this is great, thanks for doing this. We regularly see this and > >> >>>>>>> just > >> >>>>>>> stumbled over it the other day where the fontconfig of our test > >> >>>>>>> user > >> >>>>>>> was corrupted somehow. > >> >>>>>>> > >> >>>>>>> As for the test, I would reduce the amount of reflection a little > >> >>>>>>> bit. > >> >>>>>>> It should not be necessary to access SunFontManager via > >> >>>>>>> Class.forName, > >> >>>>>>> you already exported it to the test via the @modules > statement. > >> You > >> >>>>>>> can probably use this coding (please try as I didn't test it๐): > >> >>>>>>> > >> >>>>>>> SunFontManager sfm = SunFontManager.getInstance(); > >> >>>>>>> Field defaultFontName_fid = > >> >>>>>>> SunFontManager.class.getDeclaredField("defaultFontName"); > >> >>>>>>> defaultFontName_fid.setAccessible(true); > >> >>>>>>> defaultFontName_fid.set(sfm, "Dialog"); > >> >>>>>>> Method loadFonts_mid = > >> >>>>>>> SunFontManager.class.getDeclaredMethod("loadFonts"); > >> >>>>>>> loadFonts_mid.setAccessible(true); > >> >>>>>>> loadFonts_mid.invoke(sfm); > >> >>>>>>> PhysicalFont physicalFont = sfm.getDefaultPhysicalFont(); > >> >>>>>>> System.out.println(physicalFont); > >> >>>>>>> > >> >>>>>>> If you want, I can run your (updated) patch through our test > >> >>>>>>> system. > >> >>>>>>> > >> >>>>>>> Thanks > >> >>>>>>> Christoph > >> >>>>>>> > >> >>>>>>> > >> >>>>>>>> -----Original Message----- > >> >>>>>>>> From: 2d-dev<2d-dev-boun...@openjdk.java.net> On Behalf > Of > >> >>>>>>>> Ichiroh > >> >>>>>>>> Takiguchi > >> >>>>>>>> Sent: Montag, 7. Oktober 2019 09:33 > >> >>>>>>>> To: 2d-dev@openjdk.java.net > >> >>>>>>>> Subject: [OpenJDK 2D-Dev] RFR: 8221741 ClassCastException > >> happen > >> >>>>>> when > >> >>>>>>>> fontconfig.properties was used > >> >>>>>>>> > >> >>>>>>>> Hello. > >> >>>>>>>> > >> >>>>>>>> Could you review the fix ? > >> >>>>>>>> > >> >>>>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8221741 > >> >>>>>>>> Change: > >> >> https://cr.openjdk.java.net/~itakiguchi/8221741/webrev.04/ > >> >>>>>>>> JTreg testcase and results are including JDK-8221741 [1]. > >> >>>>>>>> > >> >>>>>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8221741 > >> >>>>>>>> > >> >>>>>>>> Thanks, > >> >>>>>>>> Ichiroh Takiguchi > >> >>>>>>>> IBM Japan, Ltd.