sourcing a script run into problem when size is too big.

The following is a summary of the tests I have done.

In /etc/profile.local, I am sourcing 3 script files of mines :


source /backup_sys/000_COMMON/Bin/system_common_general_env_var
source /backup_sys/000_COMMON/Bin/system_common_function_3
source /backup_sys/000_COMMON/Bin/system_common_function

At the beginning, the code in file system_common_function_3 was contained in file system_common_function.
I have discovered the faulty function and have remove it and put it in the separate file “system_common_function_3”

1°) Changing source order of file N°2 and file N°3 does not make different behavior.

2-1°) The file “/system_common_general_env_var” start with :


DOLLAR_ZERO="${0}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_general_env_var   DOLLAR_ZERO : $DOLLAR_ZERO"

BASH__SOURCE="${BASH_SOURCE[0]}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_general_env_var   BASH_SOURCE : $BASH__SOURCE"

PARENT_CALLER="$(ps -f -p $PPID | tail -1 | awk '{print $F}')"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_general_env_var   PARENT_CALLER : $PARENT_CALLER"
#

2-2°) The file “/system_common_general_env_var” contains declarations like :



declare -i GENERAL_FAILURE=255 CUR_GENERAL_FAILURE=$GENERAL_FAILURE GLOB_ERR=$GENERAL_FAILURE GLOB_RETURN_CODE=$GENERAL_FAILURE RETURN_CODE=$GENERAL_FAILURE  CUR_ERR=$GENERAL_FAILURE CUR_RETURN_CODE=$GENERAL_FAILURE

export GENERAL_FAILURE  CUR_GENERAL_FAILURE  GLOB_ERR  GLOB_RETURN_CODE  RETURN_CODE  CUR_ERR  CUR_RETURN_CODE
#

2-3°) and contains some pair key=value declarations like :

G_STRING_RETURN="¤"
IS_CRYPTED="CRYPTED"
NO_SHELL_PATH="--shell /bin/false"
NO_CREATE_HOME="-M"
#
# --- FREENX VARIABLES ---
PTA_REPO="PLEASE_TRY_AGAIN"
MY_OPENSUSE_CUR_PTA="12.2"
PTA_REP=${PTA_REPO}_${MY_OPENSUSE_CUR_PTA}
#
SYSTEMD_DIR_FILE="/etc/systemd/system"
#
export G_STRING_RETURN  IS_CRYPTED  NO_SHELL_PATH  NO_CREATE_HOME  PTA_REPO  MY_OPENSUSE_CUR_PTA  PTA_REP  SYSTEMD_DIR_FILE


3-1°) Le fichier source /backup_sys/000_COMMON/Bin/system_common_function start with :

DOLLAR_ZERO="${0}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function   DOLLAR_ZERO : $DOLLAR_ZERO"

BASH__SOURCE="${BASH_SOURCE[0]}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function   BASH_SOURCE : $BASH__SOURCE"

PARENT_CALLER="$(ps -f -p $PPID | tail -1 | awk '{print $F}')"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function PARENT_CALLER : $PARENT_CALLER"
#

3-2°) Le fichier source /backup_sys/000_COMMON/Bin/system_common_function contains function declarations like :

function date2stamp_full  {
#    "016-11-27__14-14-04"
    date --date "$1" +%Y-%m-%d__%H-%M-%S
}

function my_get_salt  {
#    "1480252649890900860"
    date --date "$1" +%s%N
}

function ask_YyRr {
#
    local L_REPLY="" L_PARAM1=" "
#
    if  $# -gt 0 ]] ; then
        L_PARAM1="$1"
    fi
#
    read -n 1 -r -p "$L_PARAM1 [y]" L_REPLY
    if  -z $L_REPLY ]] ;  then
        echo
        return $ANSW_NULL    # 0=null
    elif  $L_REPLY =~ ^[Yy]$ ]] ;  then
        echo
        return $ANSW_Y    # 1=yes
    else
        if  $MY_DEBUG -ne 0 ]] ; then
            echo "  -->> Reject ..."
        fi
        return $ANSW_No    # 2=no ==> Not null and Not (Yy]
    fi
    echo
}

......................
......................
......................
......................

export -f  date2stamp_full  my_get_salt  ask_YyRr  .............

I started the final test with a small block of code in system_common_function_3 :

DOLLAR_ZERO="${0}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3   DOLLAR_ZERO : $DOLLAR_ZERO"

BASH__SOURCE="${BASH_SOURCE[0]}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3   BASH_SOURCE : $BASH__SOURCE"

PARENT_CALLER="$(ps -f -p $PPID | tail -1 | awk '{print $F}')"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3 PARENT_CALLER : $PARENT_CALLER"
#
#
# ===================================================================
#
# FUNCTION BEGIN
#
# ===================================================================

#set -x

#
#+++++++++++++++++++++++++++++++++++++++++++++
#
# print_var
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function print_var {

#set -x

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt



    chmod 777 /tmp/print_var_log.txt

#
#set +x

}

#
#+++++++++++++++++++++++++++++++++++++++++++++
#
# print_var_to_file
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function print_var_to_file {

    print_var
    TIMESTAMP=$(date2stamp2 now)
    cat /tmp/print_var_log.txt > "/tmp/000_system_common_server_env_var_log_$TIMESTAMP.txt"

}


#
export -f  print_var  print_var_to_file
#



Then I add a block of the same code, then reboot the system, then test if the problem exists or not.
If not, i add another block of code and repeat the process.

Finally when the file “system_common_function_3” is like this, the problem occure.

#!/bin/bash
#
############################
#                                    #
#    {config_jcd}                #
#                                    #
#    /backup_sys/000_COMMON/Bin/system_common_function_3
#                                    #
#    §2017_05_31§                #
#                                    #
#    ¨version:12¨                #
#                                    #
############################
#
# system common parameter and functions
#
########################################################
#
DOLLAR_ZERO="${0}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3   DOLLAR_ZERO : $DOLLAR_ZERO"

BASH__SOURCE="${BASH_SOURCE[0]}"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3   BASH_SOURCE : $BASH__SOURCE"

PARENT_CALLER="$(ps -f -p $PPID | tail -1 | awk '{print $F}')"
logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3 PARENT_CALLER : $PARENT_CALLER"
#
#
# ===================================================================
#
# FUNCTION BEGIN
#
# ===================================================================

#set -x

#
#+++++++++++++++++++++++++++++++++++++++++++++
#
# print_var
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function print_var {

#set -x

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt


    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt

    echo "echo        ARRAY_MAIN_REPO_LEAP         : ${ARRAY_MAIN_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_DISABLED_REPO_LEAP     : ${ARRAY_DISABLED_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_MY_OPENSUSE_REPO_LEAP  : ${ARRAY_MY_OPENSUSE_REPO_LEAP@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_PREFERED_MY_REPO  : ${ARRAY_LIST_PREFERED_MY_REPO@]} " >> /tmp/print_var_log.txt
    echo "echo        ARRAY_LIST_OTHER_MY_REPO  : ${ARRAY_LIST_OTHER_MY_REPO@]} " >> /tmp/print_var_log.txt


    chmod 777 /tmp/print_var_log.txt

#
#set +x

}

#
#+++++++++++++++++++++++++++++++++++++++++++++
#
# print_var_to_file
#
# ++++++++++++++++++++++++++++++++++++++++++++
#
function print_var_to_file {

    print_var
    TIMESTAMP=$(date2stamp2 now)
    cat /tmp/print_var_log.txt > "/tmp/000_system_common_server_env_var_log_$TIMESTAMP.txt"

}


#
export -f  print_var  print_var_to_file
#



#
# ==========================================================================================
#
# FUNCTION END
#
# ==========================================================================================
#
#

#set +x

#

logger  -t JCD_SYSTEM_COMMON_BIN "/backup_sys/000_COMMON/Bin/system_common_function_3 - END - USER : $USER "



When the problem occur :

  • Not all the functions exported are visible ( The code
env | grep BASH_ | sort 

does not show all functions.

  • On a system running leap 42.3, you cannot log in because of this error
Loading stage  "initial" 282
startkde: Starting up...
/usr/bin/kdeinit5: Bad address
startkde: Could not start kdeinit5. Check your installation.

Any help is welcome.

If you need more tests, asks.

Without taking a detailed look at what you posted,
In my experience the problem has generally been related to buffer limitations relating to running very large scripts in an interactive console.

My solutions…

  • Break the very large scripts into smaller scripts. But, this can be very inefficient so generally is my last resort.
  • Run things completely non-interactively. When you do this, then the script is generally processed iteratively and streaming, avoiding the “batch” properties associeated with passing the script through an interactive console.

So for example one thing that jumps out at me but on closer inspection might not be an issue are all those echoes. Invoking echo multiple times in a script is not the same as invoking echo multiple times through a loop. And, why all those echoes? Could appending to a logfile be a sastifactory alternative?

You should take a look at your code architecture.
Size limitations can often be avoided by good coding practices… like
Re-usable and numerous code modules instead of massive code blocks
Declarations and scoping functionality and variables

HTH,
TSU

You do not have (or at least show) any function that starts with BASH_.

And this should be in Programming forum, not here.

/etc/profile.local is 1,2 KiB

system_common_general_env_var is 2 KiB

system_common_function_3 is 7 KiB

system_common_function is 60 KiB

That is very small.

With no /etc/profile.local memory usage show :

superjc@linux-j302:~> expr `getconf ARG_MAX` - `env|wc -c` - `env|wc -l` \* 4 - 2048
2089349

superjc@linux-j302:~> getconf ARG_MAX
2097152

superjc@linux-j302:~> free
               total          used         free               shared    buffers     cached
Mem:      24641116    1646276   22994840      31132      59664     726572
-/+ buffers/cache:      860040     23781076
Swap:      8388604          0        8388604


With my /etc/profile.local memory usage show :

superjc@linux-j302:~> expr `getconf ARG_MAX` - `env|wc -c` - `env|egrep '^^ ]+='|wc -l` \* 4
2039475

superjc@linux-j302:~> getconf ARG_MAX
2097152

superjc@linux-j302:~> free
              total            used        free               shared    buffers     cached
Mem:      24641116    2447852   22193264      62820      73580    1074324
-/+ buffers/cache:      1299948   23341168                                                                                                             
Swap:      8388604          0        8388604                                                                                                             

/etc/profile.local is run in a non-interactive session

This is why I have one file for system-wide constant definition, and one file for system-wide function definition.
But I may wrong.

No function itself starts with BASH_, it is the way that bash exports functions.
To detect the problem I am speaking of, I just type the command :

env | grep BASH_ | sort

and count the function showed.

There is no problems in my scripts.
And with no /etc/profile.local, after log in, I can source the scripts from a terminal without problem.
It is a system limitation or somethings else.
And the problem arise during startup.
I think it is in the best place as there is no “system” forum.
But I may wrong.

Actually,
My impression is that you’re not running entirely in a non-interactive session, you may <initiate> in /etc/profile.local but that in turn appears to invoke script code that does things like “echo” which absolutely passes output to an interactive console.

So, you’re violating the issue I describe which should be avoided, or at least you are not respecting the buffer limits which come into play when you do what you are doing.

In any case,
your use to “source” is unique… or at least I have not seen that before if it’s recommended by anyone.
Typically, I’ve seen “source” used to apply system changes like environmental variables without a reboot…
I find it hard to understand why you are using it to invoke long running scripts… There are other “more safe” ways to run scripts automatically (Nowadays I’d create a systemd Unit file to invoke the script).
Note I’m not saying that sourcing is causing your buffer limitation problem but might be considered a contributing factor as an inadvisable approach to what you are doing.

Unless perhaps,
If you can provide a reference for your overall approach, I’d be willing to take a look at that.

TSU

Following your recommendation in https://forums.opensuse.org/showthread.php/525084-Setting-up-system-wide-bash-functions-for-every-users#7
I have read https://github.com/scop/bash-completion
Using the command “set”, I have discovered that a lot of functions are defined for git ( and for others ).
Then I have discovered that “/etc/bash.bashrc” sources all files like “/etc/bash_completion.d/*.sh”

So its look likes what I am trying to do.

The size of the source files of git functions are similar to mine.

The main difference I see :

  • They source in interactive session
  • The command echo seems to be used to fill some variable ( something like "some_variable=$(some_function param, param, …) but not to inform the operator (like I use the echo command).

I continue searching.

After reading your other recommendation : https://github.com/Bash-it/bash-it
This is far more complicated than what I am trying to do.
I may conclude that the size of what I am sourcing seems not to be the reason of my problems.

I have no idea how to solve my problem.