On 9/25/16 6:59 PM, Chet Ramey wrote:
> On 9/25/16 3:51 PM, Sean Zha wrote:
>
>> Bash Version: 4.4
>> Patch Level: 0
>> Release Status: release
>>
>> Description:
>> I use a huge value for HISTSIZE (=999999999) to enable infinite
>> history items. The actural size of ~/.bash_history is only 4MB now.
>> Everything worked fine before the lastest upgrade. Now bash refuse
>> me to login due to memory allocation failure. After choosing
>> a smaller HISTSIZE, bash still eatup too much unnesssary memory.
>>
>> Repeat-By:
>> open a workable terminal with small HISTSIZE setting,
>> $ echo HISTSIZE=999999999 > ~/test.rc
>> $ bash --rcfile ~/test.rc
>> bash: xmalloc: cannot allocate 8000000008 bytes (114688 bytes
>> allocated)
>
> Since you've specified the desired history size, bash tries to allocate
> enough entries to hold all of the entries. The assumption is that this
> will reduce the number of allocations/reallocations and the number of
> times the history list has to be copied as it's reallocated. I suppose
> I should cap the maximum value for which that occurs instead of trusting
> the supplied max number of entries.
Try the attached patch and see whether or not it improves things.
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU [email protected] http://cnswww.cns.cwru.edu/~chet/
*** ../bash-4.4/lib/readline/history.c 2015-12-28 13:50:31.000000000 -0500
--- lib/readline/history.c 2016-09-30 14:28:40.000000000 -0400
***************
*** 58,61 ****
--- 58,63 ----
#define DEFAULT_HISTORY_INITIAL_SIZE 502
+ #define MAX_HISTORY_INITIAL_SIZE 8192
+
/* The number of slots to increase the_history by. */
#define DEFAULT_HISTORY_GROW_SIZE 50
***************
*** 308,312 ****
{
if (history_stifled && history_max_entries > 0)
! history_size = history_max_entries + 2;
else
history_size = DEFAULT_HISTORY_INITIAL_SIZE;
--- 310,316 ----
{
if (history_stifled && history_max_entries > 0)
! history_size = (history_max_entries > MAX_HISTORY_INITIAL_SIZE)
! ? MAX_HISTORY_INITIAL_SIZE
! : history_max_entries + 2;
else
history_size = DEFAULT_HISTORY_INITIAL_SIZE;