Ошибка приращения Process Builder - PullRequest
       0

Ошибка приращения Process Builder

0 голосов
/ 29 сентября 2011

Я написал программу для мониторинга состояния некоторых жестких дисков, подключенных к RAID в Linux. С помощью этой программы я выполняю несколько команд командной строки. Однако возникает интересная ошибка ... программа запускается добрых три минуты, прежде чем кажется, что она больше не может правильно выполнять команду, которую выполняла ранее (для многих итераций).

Он выдает ошибку индекса массива (моя переменная driveLetters [d]), потому что он, похоже, как-то пропустил диск (даже если он нашел его сотни раз раньше).

Другие вещи, на которые стоит обратить внимание ... если я скажу сбросить int "d" на "0", если он превысит количество дисков ... программа не будет аварийно завершена и вместо этого просто застрянет в бесконечном цикле , Кроме того, время, в которое происходит сбой программы, варьируется. По-видимому, он не падает после определенного количества интервалов. Наконец, я не получаю никаких ошибок утечки памяти.

Вот часть кода, который должен выявить ошибку:

public static void scsi_generic() throws IOException, InterruptedException
{
    int i =0;
    int d =0;

    int numberOfDrives = 8;

    char driveLetters[] = {'b','c','d','e','f','g','h','i','j','k','l','m'};

    String drive = "";

    while (i <= numberOfDrives)
    {
        System.out.println("position 1");
        List<String> commands = new ArrayList<String>();
        commands.add("cat");
        commands.add("/sys/class/scsi_generic/sg"+i+"/device/sas_address");


        SystemCommandExecutor commandExecutor = new SystemCommandExecutor(commands);
        int driveFound = commandExecutor.executeCommand();


        if (driveFound == 0)
        {
            System.out.println("Folder: sg" + i + " was found." );
            StringBuilder stdout = commandExecutor.getStandardOutputFromCommand();
            String data = stdout.toString();
            String sas = data.substring(11,12);
            int sasA = Integer.parseInt(sas,16);


            boolean matchedSG = false;

            while (matchedSG == false)
            {
                System.out.println("position2");      
                List<String> lookSD = new ArrayList<String>();
                lookSD.add("test");
                lookSD.add("-d");
                lookSD.add("/sys/class/scsi_generic/sg"+i+"/device/block:sd" + driveLetters[d]);
                SystemCommandExecutor commandSearch = new SystemCommandExecutor(lookSD);
                int sdFound = commandSearch.executeCommand();
                StringBuilder stdout3 = commandSearch.getStandardOutputFromCommand();
                StringBuilder stderr = commandSearch.getStandardErrorFromCommand();
                String sdFound2 = stdout3.toString();

                if (sdFound == 0)
                {
                    matchedSG = true;
                    System.out.println("Found the SD drive.");
                    drive = "sd"+driveLetters[d];
                    System.out.println(sasA);
                    hdsas.set(sasA , sas);
                    d = 0;
                    i++;
                    loadDrives(drive , sasA);
                }
             /*   else if (sdFound != )
                {
                    System.out.println("Error:" + sdFound);
                    System.out.println(d+  " "+ i);   
                }
                */
                else if ( d >= 8)
                {
                    System.out.println("Drive letter: " + driveLetters[d]);
                    System.out.println("Int: " + i);
                    // System.out.println(sdFound2);
                    System.out.println("sd error: "+ sdFound);
                    // System.out.println(stderr);
                    //System.out.println(sdFound2 + " m");
                }
                else 
                {
                    d++;
                }
            }
        }
        else 
        {
            System.out.println("Folder: sg" + i + " could not be found.");
            i++;
        }

        d =0;
    }
 }

Любая помощь или предложения будут великолепны! Благодаря.

EDIT:

Решение, которое я нашел, состояло в том, чтобы использовать библиотеку java для тестирования, если каталог существует, а не через командную строку linux.

Ex:

File location = new File("directory");
if (location.exists())
{

}

Понятия не имею, почему он работает и не падает, где, как это делала командная строка Linux через короткий промежуток времени, но это так.

Ответы [ 2 ]

1 голос
/ 29 сентября 2011

Это не прямой ответ на ваш вопрос, но он все равно может помочь вам:

Мне часто приходится находить ошибки в коде, подобном вашему (очень длинные методы с «глобальными» переменными, то есть с объявленными переменными).в начале метода и используется все потом).Просто путем правильного рефакторинга кода (короткие методы с единственной целью для каждого) причина ошибки становится сразу видимой для меня и устраняется в течение секунды (в то время как сам рефакторинг занимает намного больше времени).

Я полагаюэто то, что каждый пытается предложить вам помощь, делает в любом случае: рефакторинг вашего кода (возможно, только в голове), чтобы (намного) было легче понять, что происходит.

0 голосов
/ 29 сентября 2011

Решение, которое я нашел, состояло в том, чтобы использовать библиотеку java для тестирования, если каталог существует, вместо того, чтобы делать это через командную строку linux.

Пример:

File location = new File("directory");
if (location.exists())
{

}

Не знаю, почему он работает и не падает, где, как и в командной строке linux, через короткий промежуток времени, но это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...