Search code examples
spring-batchgemfilegemfiregeode

Spring batch Gemfire 9.6 connection error - Caused by: java.io.IOException: Unable to write to deploy directory


I am using Spring batch to load data into gemfire using

@Bean
    public GemfireTemplate gemFireTemplate(ClientRegionFactory<Object, 
     Object> factory) {
        GemfireTemplate template = new GemfireTemplate();
        template.setRegion("regionName");
        return template;
    }

POM:

 <parent>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-parent</artifactId>
     <version>2.1.1.RELEASE</version>
     <relativePath /> <!-- lookup parent from repository -->
 </parent>


   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-batch</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-gemfire</artifactId>
        <version>1.5.16.RELEASE</version>
    </dependency>
   <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-geode</artifactId>
        <version>2.0.3.RELEASE</version>
      </dependency>
   <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-core</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-common</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-cq</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-wan</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-json</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
    <dependency>
      <groupId>io.pivotal.gemfire</groupId>
      <artifactId>geode-lucene</artifactId>
      <version>9.3.0</version>
      <scope>compile</scope>
    </dependency>
   <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>4.2.6.RELEASE</version>
      </dependency>
       <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.3.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.2.12.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.2.12.RELEASE</version>
    </dependency>
      <dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-core</artifactId>
        <version>4.0.0.RELEASE</version>
      </dependency>
      <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>5.0.3.RELEASE</version>
      </dependency>

Logs :

[info 2019/09/11 22:29:22.836 CDT <main> tid=0x1] GemFireCache[id = 892555958; isClosing = true; isShutDownAll = false; created = Wed Sep 11 22:29:20 CDT 2019; server = false; copyOnRead = false; lockLease = 120; lockTimeout = 60]: Now closing.

[error 2019/09/11 22:29:22.913 CDT <main> tid=0x1] java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader

java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader
        at org.apache.geode.internal.JarDeployer.loadPreviouslyDeployedJarsFromDisk(JarDeployer.java:410)
        at org.apache.geode.internal.cache.GemFireCacheImpl.initialize(GemFireCacheImpl.java:1191)
        at org.apache.geode.internal.cache.GemFireCacheImpl.basicCreate(GemFireCacheImpl.java:758)
        at org.apache.geode.internal.cache.GemFireCacheImpl.createClient(GemFireCacheImpl.java:731)
        at org.apache.geode.cache.client.ClientCacheFactory.basicCreate(ClientCacheFactory.java:262)
        at org.apache.geode.cache.client.ClientCacheFactory.create(ClientCacheFactory.java:212)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf.clientCache(FullBatchConf.java:205)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf$$EnhancerBySpringCGLIB$$749d49c1.CGLIB$clientCache$5(<generated>)
        at com.syf.gemfire.jdbc.dataloader.config.FullBatchConf$$EnhancerBySpringCGLIB$$749d49c1$$Fast

    Caused by: java.io.IOException: Unable to write to deploy directory: /data/khan/vaquar/dataloader
        at org.apache.geode.internal.JarDeployer.verifyWritableDeployDirectory(JarDeployer.java:333)
        at org.apache.geode.internal.JarDeployer.loadPreviouslyDeployedJarsFromDisk(JarDeployer.java:389)   

and

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.apache.geode.cache.client.ClientCache]: Factory method 'clientCache' threw exception; nested exception is java.lang.RuntimeException: java.io.IOException: Unable to write to deploy directory:/data/khan/vaquar/dataloader

Analysis:

Pivotal jars required write permissions when start geode connection with gemfire cluster .

Pivotal code :

Pivotal Doc: - https://gemfire.docs.pivotal.io/98/geode/configuring/cluster_config/deploying_application_jars.html

Pivotal doc says if we can remove "deploy-working-dir"inside "gefire.properties" will resolve issue else use "-Dgemfire.deploy-working-dir=/temp/

Problem : inside Spring batch we are not configuring any gemfire properties , how to fix it in GemfireTemplate code ?


Solution

  • The issue is clearly the same as the one described by the Geode Ticket you attached to the question, GEODE-5000. This particular ticket is fixed in Geode 1.6.0 and, according to the Pivotal GemFire User Guide, specifically the Release Notes, GemFire 9.5 is based on Geode 1.6.0, so you should be using that version instead of 9.3.0 to get rid of the problem.

    As a side note, you shouldn't be arbitrarily mixing and matching spring-data-gemfire and gemfire versions as several issues might rise, please follow the Spring Data for Pivotal GemFire Version Compatibility Matrix to avoid issues.

    Hope this helps. Cheers.