Skip to content

Commit ceb05da

Browse files
authored
fix: Fixed Bigcache initialization to use NopCache (#409)
* fix: Fixed Bigcache initialization to use NopCache
1 parent fd8ee8e commit ceb05da

File tree

8 files changed

+63
-15
lines changed

8 files changed

+63
-15
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Changelog
22

3+
# 3.8.19 (February 11, 2026)
4+
5+
## Notes
6+
- Golang: **v1.24**
7+
8+
### Bug Fixes
9+
10+
- [PR #409](https://github.com/zscaler/zscaler-sdk-go/pull/409) - Fixed `bigcache` initialization to use `NopCache` when caching is disabled, preventing `unaligned 64-bit atomic operation` panic on 32-bit platforms (windows/386). Applied to ZTW, ZIA, ZPA, and OneAPI clients.
11+
312
# 3.8.18 (February 10, 2026)
413

514
## Notes

docs/guides/release-notes.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,19 @@ Track all Zscaler SDK GO releases. New resources, features, and bug fixes will b
1313

1414
---
1515

16-
``Last updated: v3.8.18``
16+
``Last updated: v3.8.19``
1717

1818
---
1919

20+
# 3.8.19 (February 11, 2026)
21+
22+
## Notes
23+
- Golang: **v1.24**
24+
25+
### Bug Fixes
26+
27+
- [PR #409](https://github.com/zscaler/zscaler-sdk-go/pull/409) - Fixed `bigcache` initialization to use `NopCache` when caching is disabled, preventing `unaligned 64-bit atomic operation` panic on 32-bit platforms (windows/386). Applied to ZTW, ZIA, ZPA, and OneAPI clients.
28+
2029
# 3.8.18 (February 10, 2026)
2130

2231
## Notes

zscaler/oneapiclient.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,12 @@ func WithCacheManager(cacheManager cache.Cache) ConfigSetter {
537537
}
538538

539539
func newCache(c *Configuration) cache.Cache {
540+
if !c.Zscaler.Client.Cache.Enabled {
541+
return cache.NewNopCache()
542+
}
540543
cche, err := cache.NewCache(time.Duration(c.Zscaler.Client.Cache.DefaultTtl), time.Duration(c.Zscaler.Client.Cache.DefaultTti), int(c.Zscaler.Client.Cache.DefaultCacheMaxSizeMB))
541544
if err != nil {
542-
cche = cache.NewNopCache()
545+
return cache.NewNopCache()
543546
}
544547
return cche
545548
}

zscaler/zia/v2_client.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,21 @@ func NewClient(config *Configuration) (*Client, error) {
9696
}
9797

9898
// Initialize the cache
99-
cche, err := cache.NewCache(cli.cacheTtl, cli.cacheCleanwindow, cli.cacheMaxSizeMB)
100-
if err != nil {
101-
logger.Printf("[WARN] Failed to initialize cache, using NopCache: %v", err)
102-
cche = cache.NewNopCache()
99+
// Only create bigcache when caching is explicitly enabled.
100+
// On 32-bit platforms (e.g., windows/386), bigcache uses atomic 64-bit operations
101+
// that require 8-byte alignment, which can cause panics if the struct fields
102+
// are not properly aligned. Using NopCache when disabled avoids this entirely.
103+
if cli.cacheEnabled {
104+
cche, err := cache.NewCache(cli.cacheTtl, cli.cacheCleanwindow, cli.cacheMaxSizeMB)
105+
if err != nil {
106+
logger.Printf("[WARN] Failed to initialize cache, using NopCache: %v", err)
107+
cli.cache = cache.NewNopCache()
108+
} else {
109+
cli.cache = cche
110+
}
111+
} else {
112+
cli.cache = cache.NewNopCache()
103113
}
104-
cli.cache = cche
105114

106115
// Start the session refresh ticker
107116
cli.startSessionTicker(ctx)

zscaler/zia/v2_config.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,13 +284,16 @@ func WithCacheManager(cacheManager cache.Cache) ConfigSetter {
284284
}
285285

286286
func newCache(c *Configuration) cache.Cache {
287+
if !c.ZIA.Client.Cache.Enabled {
288+
return cache.NewNopCache()
289+
}
287290
cche, err := cache.NewCache(
288291
time.Duration(c.ZIA.Client.Cache.DefaultTtl),
289292
time.Duration(c.ZIA.Client.Cache.DefaultTti),
290293
int(c.ZIA.Client.Cache.DefaultCacheMaxSizeMB),
291294
)
292295
if err != nil {
293-
cche = cache.NewNopCache()
296+
return cache.NewNopCache()
294297
}
295298
return cche
296299
}

zscaler/zpa/v2_config.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,12 @@ func WithCacheManager(cacheManager cache.Cache) ConfigSetter {
280280
}
281281

282282
func newCache(c *Configuration) cache.Cache {
283+
if !c.ZPA.Client.Cache.Enabled {
284+
return cache.NewNopCache()
285+
}
283286
cche, err := cache.NewCache(time.Duration(c.ZPA.Client.Cache.DefaultTtl), time.Duration(c.ZPA.Client.Cache.DefaultTti), int(c.ZPA.Client.Cache.DefaultCacheMaxSizeMB))
284287
if err != nil {
285-
cche = cache.NewNopCache()
288+
return cache.NewNopCache()
286289
}
287290
return cche
288291
}

zscaler/ztw/v2_client.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,21 @@ func NewClient(config *Configuration) (*Client, error) {
9898
}
9999

100100
// Initialize the cache
101-
cche, err := cache.NewCache(cli.cacheTtl, cli.cacheCleanwindow, cli.cacheMaxSizeMB)
102-
if err != nil {
103-
logger.Printf("[WARN] Failed to initialize cache, using NopCache: %v", err)
104-
cche = cache.NewNopCache()
101+
// Only create bigcache when caching is explicitly enabled.
102+
// On 32-bit platforms (e.g., windows/386), bigcache uses atomic 64-bit operations
103+
// that require 8-byte alignment, which can cause panics if the struct fields
104+
// are not properly aligned. Using NopCache when disabled avoids this entirely.
105+
if cli.cacheEnabled {
106+
cche, err := cache.NewCache(cli.cacheTtl, cli.cacheCleanwindow, cli.cacheMaxSizeMB)
107+
if err != nil {
108+
logger.Printf("[WARN] Failed to initialize cache, using NopCache: %v", err)
109+
cli.cache = cache.NewNopCache()
110+
} else {
111+
cli.cache = cche
112+
}
113+
} else {
114+
cli.cache = cache.NewNopCache()
105115
}
106-
cli.cache = cche
107116

108117
// Start the session refresh ticker
109118
cli.startSessionTicker(ctx)

zscaler/ztw/v2_config.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,12 @@ func WithCacheManager(cacheManager cache.Cache) ConfigSetter {
239239
}
240240

241241
func newCache(c *Configuration) cache.Cache {
242+
if !c.ZTW.Client.Cache.Enabled {
243+
return cache.NewNopCache()
244+
}
242245
cche, err := cache.NewCache(time.Duration(c.ZTW.Client.Cache.DefaultTtl), time.Duration(c.ZTW.Client.Cache.DefaultTti), int(c.ZTW.Client.Cache.DefaultCacheMaxSizeMB))
243246
if err != nil {
244-
cche = cache.NewNopCache()
247+
return cache.NewNopCache()
245248
}
246249
return cche
247250
}

0 commit comments

Comments
 (0)