/// <inheritdoc />
        public void GlobalBeforeEnteringState <Key, Value>(
            SystemState next,
            FasterKV <Key, Value> faster)
        {
            switch (next.phase)
            {
            case Phase.PREPARE_GROW:
                // nothing to do
                break;

            case Phase.IN_PROGRESS_GROW:
                // Set up the transition to new version of HT
                var numChunks = (int)(faster.state[faster.resizeInfo.version].size / Constants.kSizeofChunk);
                if (numChunks == 0)
                {
                    numChunks = 1;                     // at least one chunk
                }
                faster.numPendingChunksToBeSplit = numChunks;
                faster.splitStatus = new long[numChunks];

                faster.Initialize(1 - faster.resizeInfo.version, faster.state[faster.resizeInfo.version].size * 2, faster.sectorSize);

                faster.resizeInfo.version = 1 - faster.resizeInfo.version;
                break;

            case Phase.REST:
                // nothing to do
                break;

            default:
                throw new FasterException("Invalid Enum Argument");
            }
        }