@kimchy I have now changed hasArray() to return true/false depending on whether the length is <= pagesize, and array() to return the first page or null. With the assert in SourceFieldMapper#344 removed and only the first change to hasArray() it ran through a full test. The second change causes a repeatable failure at the end of SourceFieldMapper#createParseField() for payloads >pagesize, which I don't understand how to fix due to interaction with compression & StoredFields. This can be recreated e.g. by running GetActionTests.realtimeGetWithCompress(). Creating copies in createParseField() does not help (different exception with Translog).
So all things considered I'd rather always delegate array() to toBytes() until we can dig further into this, since it seems to be a completely different problem and what I had before worked fine everywhere.
If you want to take a look I can commit the changes with comments where they fail in this branch.