Gradle P4Java java.net.SocketTimeoutException: тайм-аут чтения

Я использую библиотеку P4Java в моем файле build.gradle для синхронизации большого zip-файла (>200 МБ), находящегося в удаленном репозитории Perforce, но я сталкиваюсь с ошибкой "java.net.SocketTimeoutException: Read timed out" либо во время процесса синхронизации, либо (в основном) при удалении временного клиента, созданного для операции синхронизации. Я имею в виду http://razgulyaev.blogspot.in/2011/08/p4-java-api-how-to-work-with-temporary.html для работы с временными клиентами с использованием API P4Java.

Я попытался увеличить время ожидания чтения сокета с 30 секунд по умолчанию, как было предложено в http://answers.perforce.com/articles/KB/8044 а также введя режим сна, но оба подхода не решили проблему. Проверка сервера на проверку соединения с помощью getServerInfo() непосредственно перед выполнением операций синхронизации или удаления приводит к успешной проверке соединения. Может кто-нибудь указать мне, где я должен искать ответы?

Спасибо.

Предоставление фрагмента кода:

void perforceSync(String srcPath, String destPath, String server) {

    // Generating the file(s) to sync-up
    String[] pathUnderDepot = [
            srcPath + "*"
        ]

    // Increasing timeout from default 30 sec to 60 sec
    Properties defaultProps = new Properties()
    defaultProps.put(PropertyDefs.PROG_NAME_KEY, "CustomBuildApp")
    defaultProps.put(PropertyDefs.PROG_VERSION_KEY, "tv_1.0")
    defaultProps.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000")

    // Instantiating the server
    IOptionsServer p4Server = ServerFactory.getOptionsServer("p4java://" + server, defaultProps)
    p4Server.connect()

    // Authorizing
    p4Server.setUserName("perforceUserName")
    p4Server.login("perforcePassword")

    // Just check if connected successfully
    IServerInfo serverInfo = p4Server.getServerInfo()
    println 'Server info: ' + serverInfo.getServerLicense()

    // Creating new client
    IClient tempClient = new Client()

    // Setting up the name and the root folder
    tempClient.setName("tempClient" + UUID.randomUUID().toString().replace("-", ""))
    tempClient.setRoot(destPath)
    tempClient.setServer(p4Server)

    // Setting the client as the current one for the server
    p4Server.setCurrentClient(tempClient)

    // Creating Client View entry
    ClientViewMapping tempMappingEntry = new ClientViewMapping()

    // Setting up the mapping properties
    tempMappingEntry.setLeft(srcPath + "...")
    tempMappingEntry.setRight("//" + tempClient.getName() + "/...")
    tempMappingEntry.setType(EntryType.INCLUDE)

    // Creating Client view
    ClientView tempClientView = new ClientView()

    // Attaching client view entry to client view
    tempClientView.addEntry(tempMappingEntry)
    tempClient.setClientView(tempClientView)

    // Registering the new client on the server
    println p4Server.createClient(tempClient)

    // Surrounding the underlying block with try as we want some action
    // (namely client removing) to be performed in any way
    try {

        // Forming the FileSpec collection to be synced-up
        List<IFileSpec> fileSpecsSet = FileSpecBuilder.makeFileSpecList(pathUnderDepot)

        // Syncing up the client
        println "Syncing..."
        tempClient.sync(FileSpecBuilder.getValidFileSpecs(fileSpecsSet), true, false, false, false)
    }
    catch (Exception e) {
        println "Sync failed.  Trying again..."
        sleep(60 * 1000)
        tempClient.sync(FileSpecBuilder.getValidFileSpecs(fileSpecsSet), true, false, false, false)
    }
    finally {
        println "Done syncing."

        try {
            p4Server.connect()

            IServerInfo serverInfo2 = p4Server.getServerInfo()
            println '\nServer info: ' + serverInfo2.getServerLicense()

            // Removing the temporary client from the server
            println p4Server.deleteClient(tempClient.getName(), false)
        }
        catch(Exception e) {
            println 'Ignoring exception caught while deleting tempClient!'

            /*sleep(60 * 1000)
            p4Server.connect()

            IServerInfo serverInfo3 = p4Server.getServerInfo()
            println '\nServer info: ' + serverInfo3.getServerLicense()

            sleep(60 * 1000)
            println p4Server.deleteClient(tempClient.getName(), false)*/
        }
    }
}

Одна необычная вещь, которую я заметил при удалении tempClient, это то, что он на самом деле удалял клиента, но по-прежнему выбрасывал "java.net.SocketTimeoutException: Read timed out", поэтому я закончил комментировать вторую попытку удаления во втором блоке catch.

1 ответ

Решение

Какую версию P4Java вы используете? Вы пробовали это с новейшей P4Java? Существуют заметные исправления, связанные с RPC-сокетами, начиная с версии 2013.2, как это видно из примечаний к выпуску:

http://www.perforce.com/perforce/doc.current/user/p4javanotes.txt

Вот некоторые варианты, которые вы можете попробовать, где у вас есть код, чтобы увеличить время ожидания и создание экземпляра сервера:

a] Вы пытались передать реквизит в своем собственном аргументе? Например:

  Properties prop = new Properties();
  prop.setProperty(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "300000");
  UsageOptions uop = new UsageOptions(prop);
  server = ServerFactory.getOptionsServer(ServerFactory.DEFAULT_PROTOCOL_NAME + "://" + serverPort, prop, uop);

Или что-то вроде следующего:

  IOptionsServer p4Server = ServerFactory.getOptionsServer("p4java://" + server, defaultProps)

Вы также можете установить тайм-аут на "0", чтобы не было тайм-аута.

б]

   props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");
   props.put(RpcPropertyDefs.RPC_SOCKET_POOL_SIZE_NICK, "5");

с]

Properties props = System.getProperties();
props.put(RpcPropertyDefs.RPC_SOCKET_SO_TIMEOUT_NICK, "60000");

IOptionsServer server =
ServerFactory.getOptionsServer("p4java://perforce:1666", props, null);

d] Если у вас есть пользователи Eclipse, использующие наш плагин P4Eclipse, это свойство можно установить в настройках плагина (Team->Perforce->Advanced) в разделе "Пользовательские свойства P4Java".

"sockSoTimeout": "3000000"

РЕКОМЕНДАЦИИ

Другие вопросы по тегам